From 18467e7ea7c128df2175964cd68e78681eacea2c Mon Sep 17 00:00:00 2001 From: "audrey.chatillon" <audrey.chatillon@gmail.com> Date: Wed, 18 Dec 2024 12:38:16 +0100 Subject: [PATCH] add new detector for the EPIC project --- .../FissionChamberEPIC/CMakeLists.txt | 2 + .../FissionChamberEPIC/FissionChamberEPIC.cc | 437 ++++++++++++++++++ .../FissionChamberEPIC/FissionChamberEPIC.hh | 125 +++++ 3 files changed, 564 insertions(+) create mode 100644 NPSimulation/Detectors/FissionChamberEPIC/CMakeLists.txt create mode 100644 NPSimulation/Detectors/FissionChamberEPIC/FissionChamberEPIC.cc create mode 100644 NPSimulation/Detectors/FissionChamberEPIC/FissionChamberEPIC.hh diff --git a/NPSimulation/Detectors/FissionChamberEPIC/CMakeLists.txt b/NPSimulation/Detectors/FissionChamberEPIC/CMakeLists.txt new file mode 100644 index 000000000..ad2e7250e --- /dev/null +++ b/NPSimulation/Detectors/FissionChamberEPIC/CMakeLists.txt @@ -0,0 +1,2 @@ +add_library(NPSFissionChamberEPIC SHARED FissionChamberEPIC.cc) +target_link_libraries(NPSFissionChamberEPIC NPSCore ${ROOT_LIBRARIES} ${Geant4_LIBRARIES} ${NPLib_LIBRARIES} -lNPFissionChamber) diff --git a/NPSimulation/Detectors/FissionChamberEPIC/FissionChamberEPIC.cc b/NPSimulation/Detectors/FissionChamberEPIC/FissionChamberEPIC.cc new file mode 100644 index 000000000..28345f340 --- /dev/null +++ b/NPSimulation/Detectors/FissionChamberEPIC/FissionChamberEPIC.cc @@ -0,0 +1,437 @@ +/***************************************************************************** + * Copyright (C) 2009-2020 this file is part of the NPTool Project * + * * + * For the licensing terms see $NPTOOL/Licence/NPTool_Licence * + * For the list of contributors see $NPTOOL/Licence/Contributors * + *****************************************************************************/ + +/***************************************************************************** + * Original Author: Pierre Morfouace contact address: pierre.morfouace2@cea.fr * + * * + * Creation Date : September 2020 * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * This class describe FissionChamberEPIC simulation * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + *****************************************************************************/ + +// C++ headers +#include <sstream> +#include <cmath> +#include <limits> +//G4 Geometry object +#include "G4Tubs.hh" +#include "G4Box.hh" + +//G4 sensitive +#include "G4SDManager.hh" +#include "G4MultiFunctionalDetector.hh" + +//G4 various object +#include "G4Material.hh" +#include "G4Transform3D.hh" +#include "G4PVPlacement.hh" +#include "G4VisAttributes.hh" +#include "G4Colour.hh" +#include "G4SubtractionSolid.hh" + +// NPTool header +#include "FissionChamberEPIC.hh" +#include "CalorimeterScorers.hh" +#include "InteractionScorers.hh" +#include "RootOutput.h" +#include "MaterialManager.hh" +#include "NPSDetectorFactory.hh" +#include "NPOptionManager.h" +#include "NPSHitsMap.hh" +// CLHEP header +#include "CLHEP/Random/RandGauss.h" + +using namespace std; +using namespace CLHEP; + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +namespace FissionChamberEPIC_NS{ + // Energy and time Resolution + const double EnergyThreshold = 0.1*MeV; + const double ResoTime = 4.5*ns ; + const double ResoEnergy = 1.0*MeV ; + const double Radius = 50*mm ; + const double Width = 100*mm ; + const double Thickness = 300*mm ; + const string Material = "BC400"; + + // Fission Chamber + const double Cu_Thickness = 17*micrometer; + // const double Al_Thickness = 12*micrometer; + const double Kapton_Thickness = 50*micrometer; + + + +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +// FissionChamberEPIC Specific Method +FissionChamberEPIC::FissionChamberEPIC(){ + m_Event = new TFissionChamberData() ; + m_FissionChamberEPICScorer = 0; + m_AssemblyVolume = 0; + m_FissionChamberEPICVolume = 0; + + + // RGB Color + Transparency + m_VisFCWall = new G4VisAttributes(G4Colour(0.1,0.5,0.7,1)); + m_VisAl = new G4VisAttributes(G4Colour(0.839,0.803,0.803,1)); + m_VisTi = new G4VisAttributes(G4Colour(0.776,0.662,0.662,0.5)); + m_VisGas = new G4VisAttributes(G4Colour(0.576,0.662,0.662,0.3)); + m_VisCu = new G4VisAttributes(G4Colour(0.70, 0.40, 0. ,1)); + m_VisRogers4003C = new G4VisAttributes(G4Colour(0.60, 0.60, 0.2 ,1)); + + m_GasMaterial = "CF4"; + m_Pressure = 1.*bar; + +} + +FissionChamberEPIC::~FissionChamberEPIC(){ +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void FissionChamberEPIC::AddDetector(G4ThreeVector POS){ + // Convert the POS value to R theta Phi as Spherical coordinate is easier in G4 + m_R = POS.mag(); + m_Theta = POS.theta(); + m_Phi = POS.phi(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +// Virtual Method of NPS::VDetector class + +// Read stream at Configfile to pick-up parameters of detector (Position,...) +// Called in DetecorConstruction::ReadDetextorConfiguration Method +void FissionChamberEPIC::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("FissionChamberEPIC"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + vector<string> cart = {"POS","GasMaterial","Pressure"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(cart)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// FissionChamberEPIC " << i+1 << endl; + + G4ThreeVector Pos = NPS::ConvertVector(blocks[i]->GetTVector3("POS","mm")); + string GasMaterial = blocks[i]->GetString("GasMaterial"); + double Pressure = blocks[i]->GetDouble("Pressure","bar"); + AddDetector(Pos); + m_GasMaterial = GasMaterial; + m_Pressure = Pressure; + } + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); + } + } +} + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +// Construct detector and inialise sensitive part. +// Called After DetecorConstruction::AddDetector Method +void FissionChamberEPIC::ConstructDetector(G4LogicalVolume* world){ + + G4double wX = m_R * sin(m_Theta ) * cos(m_Phi ) ; + G4double wY = m_R * sin(m_Theta ) * sin(m_Phi ) ; + G4double wZ = m_R * cos(m_Theta ) ; + G4ThreeVector Det_pos = G4ThreeVector(wX, wY, wZ) ; + + // Building Detector reference frame + G4double ii = cos(m_Theta) * cos(m_Phi); + G4double jj = cos(m_Theta) * sin(m_Phi); + G4double kk = -sin(m_Theta); + G4ThreeVector Y(ii,jj,kk); + G4ThreeVector w = Det_pos.unit(); + G4ThreeVector u = w.cross(Y); + G4ThreeVector v = w.cross(u); + v = v.unit(); + u = u.unit(); + + G4RotationMatrix* Rot = new G4RotationMatrix(0,0,0); + BuildFissionChamberEPIC()->MakeImprint(world, Det_pos, Rot, 0); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +G4AssemblyVolume* FissionChamberEPIC::BuildFissionChamberEPIC(){ + m_FissionChamberEPICVolume = new G4AssemblyVolume(); + + G4RotationMatrix *Rv=new G4RotationMatrix(0,0,0); + G4ThreeVector Tv; + Tv.setX(0); Tv.setY(0); Tv.setZ(0); + + // Gas Volume // + double gas_height = 15.8*cm; + double gas_width = 14.8*cm; + double gas_length = 29.8*cm; + G4Box* gas_solid = new G4Box("Gas_solid", 0.5*gas_width, 0.5*gas_height, 0.5*gas_length); + + G4Material* gas_material = MaterialManager::getInstance()->GetGasFromLibrary(m_GasMaterial, m_Pressure, 300*kelvin); + G4LogicalVolume* gas_volume = new G4LogicalVolume(gas_solid, gas_material, "gas_logic", 0, 0, 0); + gas_volume->SetSensitiveDetector(m_FissionChamberEPICScorer); + //m_VisGas->SetForceWireframe(true); + gas_volume->SetVisAttributes(m_VisGas); + m_FissionChamberEPICVolume->AddPlacedVolume(gas_volume, Tv, Rv); + + + // Bottom PCB plate // + double PCB_width = 18.*cm; + double PCB_length = 33.*cm; + double PCB_Rogers_height = 1.6*mm; + double PCB_Cu_height = 6*35.*um; + double PCB_PosY = -8.5*cm; + // Cu layers + G4Box* PCB_Cu_solid = new G4Box("PCB_Cu_solid",0.5*PCB_width,0.5*PCB_Cu_height,0.5*PCB_length); + G4Material* Cu_material = MaterialManager::getInstance()->GetMaterialFromLibrary("Cu"); + G4LogicalVolume* PCB_Cu_vol = new G4LogicalVolume(PCB_Cu_solid, Cu_material,"PCB_Cu_logic",0,0,0); + PCB_Cu_vol->SetVisAttributes(m_VisCu); + Tv.setY(PCB_PosY); + m_FissionChamberEPICVolume->AddPlacedVolume(PCB_Cu_vol, Tv, Rv); + + // Rogers 4003C layers + G4Box* PCB_Rogers_solid = new G4Box("PCB_Rogers_solid",0.5*PCB_width,0.5*PCB_Rogers_height,0.5*PCB_length); + G4Material* Rogers_material = MaterialManager::getInstance()->GetMaterialFromLibrary("Rogers4003C"); + G4LogicalVolume* PCB_Rogers_vol = new G4LogicalVolume(PCB_Rogers_solid, Rogers_material,"PCB_Rogers_logic",0,0,0); + PCB_Rogers_vol->SetVisAttributes(m_VisRogers4003C); + Tv.setY(PCB_PosY + 0.5*PCB_Cu_height + 0.5*PCB_Rogers_height); + m_FissionChamberEPICVolume->AddPlacedVolume(PCB_Rogers_vol, Tv, Rv); + + // Al frame // + double frame1_width = 18.*cm; + double frame1_height = 5.*mm; + double frame1_length = 33.*cm; + double frame2_width = 15.2*cm; + double frame2_height = 5.1*mm; + double frame2_length = 30.2*cm; + + G4Box* frame1 = new G4Box("frame1", 0.5*frame1_width, 0.5*frame1_height, 0.5*frame1_length); + G4Box* frame2 = new G4Box("frame2", 0.5*frame2_width, 0.5*frame2_height, 0.5*frame2_length); + G4VSolid* Al_frame = (G4VSolid*) new G4SubtractionSolid("Al_frame",frame1,frame2,0,G4ThreeVector(0,0,0)); + G4Material* Al_material = MaterialManager::getInstance()->GetMaterialFromLibrary("Al"); + G4LogicalVolume* Al_frame_vol = new G4LogicalVolume(Al_frame,Al_material,"Al_frame_logic",0,0,0); + Al_frame_vol->SetVisAttributes(m_VisAl); + Tv.setY(PCB_PosY+ 0.5*PCB_Cu_height + PCB_Rogers_height + 0.5*frame1_height); + m_FissionChamberEPICVolume->AddPlacedVolume(Al_frame_vol, Tv, Rv); + Tv.setY(PCB_PosY- 0.5*PCB_Cu_height - 0.5*frame1_height); + m_FissionChamberEPICVolume->AddPlacedVolume(Al_frame_vol, Tv, Rv); + + double box1_width = 15.*cm; + double box1_height = 16.*cm; + double box1_length = 30.*cm; + double box2_width = 14.8*cm; + double box2_height = 15.8*cm; + double box2_length = 29.8*cm; + double box3_width = 12.5*cm; + double box3_height = 11.7*cm; + double box3_length = 30.1*cm; + double box4_width = 15.1*cm; + double box4_height = 11.8*cm; + double box4_length = 27.4*cm; + double box5_width = 12.4*cm; + double box5_height = 16.1*cm; + double box5_length = 27.4*cm; + + G4Box* box1 = new G4Box("box1", 0.5*box1_width, 0.5*box1_height, 0.5*box1_length); + G4Box* box2 = new G4Box("box2", 0.5*box2_width, 0.5*box2_height, 0.5*box2_length); + G4Box* box3 = new G4Box("box3", 0.5*box3_width, 0.5*box3_height, 0.5*box3_length); + G4Box* box4 = new G4Box("box4", 0.5*box4_width, 0.5*box4_height, 0.5*box4_length); + G4Box* box5 = new G4Box("box5", 0.5*box5_width, 0.5*box5_height, 0.5*box5_length); + + G4VSolid* box_int1 = (G4VSolid*) new G4SubtractionSolid("box_int1",box1,box2,0,G4ThreeVector(0,0,0)); + G4VSolid* box_int2 = (G4VSolid*) new G4SubtractionSolid("box_int2",box_int1,box3,0,G4ThreeVector(0,0,0)); + G4VSolid* box_int3 = (G4VSolid*) new G4SubtractionSolid("box_int3",box_int2,box4,0,G4ThreeVector(0,0,0)); + G4VSolid* box_int4 = (G4VSolid*) new G4SubtractionSolid("box_int4",box_int3,box5,0,G4ThreeVector(0,0,0)); + + G4LogicalVolume* full_box_vol = new G4LogicalVolume(box_int4, Al_material, "full_box_logic", 0,0,0); + full_box_vol->SetVisAttributes(m_VisAl); + Tv.setY(0); + m_FissionChamberEPICVolume->AddPlacedVolume(full_box_vol, Tv, Rv); + + // Ti foils // + double foil1_width = 13*cm; + double foil1_length = 29*cm; + double foil1_thickness = 100*um; + double foil2_width = 13*cm; + double foil2_height = 14*cm; + double foil2_thickness = 50*um; + + G4Material* Ti_material = MaterialManager::getInstance()->GetMaterialFromLibrary("Ti"); + G4Box* foil1_solid = new G4Box("foil1", 0.5*foil1_width, 0.5*foil1_thickness, 0.5*foil1_length); + G4LogicalVolume* foil1_vol = new G4LogicalVolume(foil1_solid, Ti_material, "foil1_logic", 0, 0, 0); + foil1_vol->SetVisAttributes(m_VisTi); + Tv.setY(0.5*box2_height); + m_FissionChamberEPICVolume->AddPlacedVolume(foil1_vol, Tv, Rv); + Tv.setY(0); + Tv.setX(-0.5*box2_width); + Rv->rotateZ(90*deg); + m_FissionChamberEPICVolume->AddPlacedVolume(foil1_vol, Tv, Rv); + Tv.setX(0.5*box2_width); + m_FissionChamberEPICVolume->AddPlacedVolume(foil1_vol, Tv, Rv); + + G4Box* foil2_solid = new G4Box("foil2", 0.5*foil2_width, 0.5*foil2_height, 0.5*foil2_thickness); + G4LogicalVolume* foil2_vol = new G4LogicalVolume(foil2_solid, Ti_material, "foil2_logic", 0, 0, 0); + foil2_vol->SetVisAttributes(m_VisTi); + Tv.setX(0);Tv.setY(0);Tv.setZ(-0.5*box2_length); + m_FissionChamberEPICVolume->AddPlacedVolume(foil2_vol, Tv, Rv); + Tv.setZ(0.5*box2_length); + m_FissionChamberEPICVolume->AddPlacedVolume(foil2_vol, Tv, Rv); + + // Cathode and Anode // + BuildCathode(-27.5); + double origine_anode = -25*mm; + double origine_cathode = -22.5*mm; + for(int i=0; i<11; i++){ + BuildAnode(origine_anode+i*5*mm); + } + for(int i=0; i<10; i++){ + BuildCathode(origine_cathode+i*5*mm); + } + + BuildCathode(27.5); + + + return m_FissionChamberEPICVolume; +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void FissionChamberEPIC::BuildCathode(double Zpos){ + // Al plate: 12 um + G4Tubs* Al_plate_solid = new G4Tubs("Al_plate",0,40*mm,12*micrometer,0,360*deg); + G4Material* Al_material = MaterialManager::getInstance()->GetMaterialFromLibrary("Al"); + G4LogicalVolume* Al_vol = new G4LogicalVolume(Al_plate_solid, Al_material,"logic_Al",0,0,0); + Al_vol->SetVisAttributes(m_VisAl); + + G4RotationMatrix *Rv=new G4RotationMatrix(0,0,0); + G4ThreeVector Tv; + Tv.setX(0); Tv.setY(0); Tv.setZ(0); + + Tv.setZ(Zpos); + m_FissionChamberEPICVolume->AddPlacedVolume(Al_vol, Tv, Rv); + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void FissionChamberEPIC::BuildAnode(double Zpos){ + // Cu plate: 17 um + G4Tubs* Cu_plate_solid = new G4Tubs("Cu_plate",0,40*mm,0.5*FissionChamberEPIC_NS::Cu_Thickness,0,360*deg); + G4Material* Cu_material = MaterialManager::getInstance()->GetMaterialFromLibrary("Cu"); + G4LogicalVolume* Cu_vol = new G4LogicalVolume(Cu_plate_solid, Cu_material,"logic_Cu",0,0,0); + Cu_vol->SetVisAttributes(m_VisCu); + + // Kapton: 50 um + G4Tubs* Kapton_solid = new G4Tubs("Kapton",0,40*mm,0.5*FissionChamberEPIC_NS::Kapton_Thickness,0,360*deg); + G4Material* Kapton_material = MaterialManager::getInstance()->GetMaterialFromLibrary("Kapton"); + G4LogicalVolume* Kapton_vol = new G4LogicalVolume(Kapton_solid, Kapton_material,"logic_Kapton",0,0,0); + Kapton_vol->SetVisAttributes(m_VisFCWall); + + G4RotationMatrix *Rv=new G4RotationMatrix(0,0,0); + G4ThreeVector Tv; + Tv.setX(0); Tv.setY(0); Tv.setZ(0); + + Tv.setZ(Zpos); + m_FissionChamberEPICVolume->AddPlacedVolume(Kapton_vol, Tv, Rv); + Tv.setZ(Zpos-0.5*FissionChamberEPIC_NS::Kapton_Thickness-0.5*FissionChamberEPIC_NS::Cu_Thickness); + m_FissionChamberEPICVolume->AddPlacedVolume(Cu_vol, Tv, Rv); + Tv.setZ(Zpos+0.5*FissionChamberEPIC_NS::Kapton_Thickness+0.5*FissionChamberEPIC_NS::Cu_Thickness); + m_FissionChamberEPICVolume->AddPlacedVolume(Cu_vol, Tv, Rv); + +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +// Add Detector branch to the EventTree. +// Called After DetecorConstruction::AddDetector Method +void FissionChamberEPIC::InitializeRootOutput(){ + RootOutput *pAnalysis = RootOutput::getInstance(); + TTree *pTree = pAnalysis->GetTree(); + if(!pTree->FindBranch("FissionChamber")){ + pTree->Branch("FissionChamber", "TFissionChamberData", &m_Event) ; + } + pTree->SetBranchAddress("FissionChamber", &m_Event) ; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +// Read sensitive part and fill the Root tree. +// Called at in the EventAction::EndOfEventAvtion +void FissionChamberEPIC::ReadSensitive(const G4Event* ){ + m_Event->Clear(); + + /////////// + // Calorimeter scorer + CalorimeterScorers::PS_Calorimeter* Scorer= (CalorimeterScorers::PS_Calorimeter*) m_FissionChamberEPICScorer->GetPrimitive(0); + + unsigned int size = Scorer->GetMult(); + for(unsigned int i = 0 ; i < size ; i++){ + vector<unsigned int> level = Scorer->GetLevel(i); + double Energy = RandGauss::shoot(Scorer->GetEnergy(i),FissionChamberEPIC_NS::ResoEnergy); + if(Energy>FissionChamberEPIC_NS::EnergyThreshold){ + double Time = RandGauss::shoot(Scorer->GetTime(i),FissionChamberEPIC_NS::ResoTime); + int DetectorNbr = level[0]; + m_Event->SetAnodeNbr(DetectorNbr); + m_Event->SetQ1(Energy); + m_Event->SetQ2(Energy); + m_Event->SetTime(Time); + m_Event->SetQmax(Energy); + m_Event->SetTimeHF(0); + m_Event->SetFakeFissionStatus(0); + } + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//////////////////////////////////////////////////////////////// +void FissionChamberEPIC::InitializeScorers() { + // This check is necessary in case the geometry is reloaded + bool already_exist = false; + m_FissionChamberEPICScorer = CheckScorer("FissionChamberEPICScorer",already_exist) ; + + if(already_exist) + return ; + + // Otherwise the scorer is initialised + vector<int> level; level.push_back(0); + G4VPrimitiveScorer* Calorimeter= new CalorimeterScorers::PS_Calorimeter("Calorimeter",level, 0) ; + //G4VPrimitiveScorer* Interaction= new InteractionScorers::PS_Interactions("Interaction",ms_InterCoord, 0) ; + //and register it to the multifunctionnal detector + m_FissionChamberEPICScorer->RegisterPrimitive(Calorimeter); + //m_FissionChamberEPICScorer->RegisterPrimitive(Interaction); + G4SDManager::GetSDMpointer()->AddNewDetector(m_FissionChamberEPICScorer) ; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//////////////////////////////////////////////////////////////////////////////// +// Construct Method to be pass to the DetectorFactory // +//////////////////////////////////////////////////////////////////////////////// +NPS::VDetector* FissionChamberEPIC::Construct(){ + return (NPS::VDetector*) new FissionChamberEPIC(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//////////////////////////////////////////////////////////////////////////////// +// Registering the construct method to the factory // +//////////////////////////////////////////////////////////////////////////////// +extern"C" { + class proxy_nps_FissionChamberEPIC{ + public: + proxy_nps_FissionChamberEPIC(){ + NPS::DetectorFactory::getInstance()->AddToken("FissionChamberEPIC","FissionChamberEPIC"); + NPS::DetectorFactory::getInstance()->AddDetector("FissionChamberEPIC",FissionChamberEPIC::Construct); + } + }; + + proxy_nps_FissionChamberEPIC p_nps_FissionChamberEPIC; +} diff --git a/NPSimulation/Detectors/FissionChamberEPIC/FissionChamberEPIC.hh b/NPSimulation/Detectors/FissionChamberEPIC/FissionChamberEPIC.hh new file mode 100644 index 000000000..fc35f22f4 --- /dev/null +++ b/NPSimulation/Detectors/FissionChamberEPIC/FissionChamberEPIC.hh @@ -0,0 +1,125 @@ +#ifndef FissionChamberEPIC_h +#define FissionChamberEPIC_h 1 +/***************************************************************************** + * Copyright (C) 2009-2020 this file is part of the NPTool Project * + * * + * For the licensing terms see $NPTOOL/Licence/NPTool_Licence * + * For the list of contributors see $NPTOOL/Licence/Contributors * + *****************************************************************************/ + +/***************************************************************************** + * Original Author: Pierre Morfouace contact address: pierre.morfouace2@cea.fr * + * * + * Creation Date : September 2020 * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * This class describe FissionChamberEPIC simulation * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + *****************************************************************************/ + +// C++ header +#include <string> +#include <vector> +using namespace std; + +// G4 headers +#include "G4ThreeVector.hh" +#include "G4RotationMatrix.hh" +#include "G4LogicalVolume.hh" +#include "G4MultiFunctionalDetector.hh" +#include "G4AssemblyVolume.hh" + +// NPTool header +#include "NPSVDetector.hh" +#include "TFissionChamberData.h" +#include "NPInputParser.h" + +class FissionChamberEPIC : public NPS::VDetector{ + //////////////////////////////////////////////////// + /////// Default Constructor and Destructor ///////// + //////////////////////////////////////////////////// + public: + FissionChamberEPIC() ; + virtual ~FissionChamberEPIC() ; + + //////////////////////////////////////////////////// + /////// Specific Function of this Class /////////// + //////////////////////////////////////////////////// + public: + // Cartesian + void AddDetector(G4ThreeVector POS); + // Spherical + void AddDetector(double R,double Theta,double Phi); + + + G4AssemblyVolume* BuildDetector(); + G4AssemblyVolume* BuildFissionChamberEPIC(); + void BuildAnode(double PosZ); + void BuildCathode(double PosZ); + + private: + G4LogicalVolume* m_Detector; + G4AssemblyVolume* m_AssemblyVolume; + + G4AssemblyVolume* m_FissionChamberEPICVolume; + + //////////////////////////////////////////////////// + ////// Inherite from NPS::VDetector class ///////// + //////////////////////////////////////////////////// + public: + // Read stream at Configfile to pick-up parameters of detector (Position,...) + // Called in DetecorConstruction::ReadDetextorConfiguration Method + void ReadConfiguration(NPL::InputParser) ; + + // Construct detector and inialise sensitive part. + // Called After DetecorConstruction::AddDetector Method + void ConstructDetector(G4LogicalVolume* world) ; + + // Add Detector branch to the EventTree. + // Called After DetecorConstruction::AddDetector Method + void InitializeRootOutput() ; + + // Read sensitive part and fill the Root tree. + // Called at in the EventAction::EndOfEventAvtion + void ReadSensitive(const G4Event* event) ; + + public: // Scorer + void InitializeScorers() ; + + // Associated Scorer + G4MultiFunctionalDetector* m_FissionChamberEPICScorer ; + //////////////////////////////////////////////////// + ///////////Event class to store Data//////////////// + //////////////////////////////////////////////////// + private: + TFissionChamberData* m_Event ; + + //////////////////////////////////////////////////// + ///////////////Private intern Data////////////////// + //////////////////////////////////////////////////// + private: // Geometry + // Detector Coordinate + double m_R; + double m_Theta; + double m_Phi; + + string m_GasMaterial; + double m_Pressure; + + // Visualisation Attribute + G4VisAttributes* m_VisFCWall; + G4VisAttributes* m_VisAl; + G4VisAttributes* m_VisCu; + G4VisAttributes* m_VisGas; + G4VisAttributes* m_VisTi; + G4VisAttributes* m_VisRogers4003C; + + // Needed for dynamic loading of the library + public: + static NPS::VDetector* Construct(); +}; +#endif -- GitLab