diff --git a/Inputs/EventGenerator/11Li.beam b/Inputs/EventGenerator/11Li.beam index cd92cf20ee125da3baa228a1304b6f3f139cea6a..61a540b386fec099b7d953d4c41d687d115f6d1c 100644 --- a/Inputs/EventGenerator/11Li.beam +++ b/Inputs/EventGenerator/11Li.beam @@ -2,17 +2,17 @@ %%%%%%%%% Reaction file for 11Li(d,3He)10He reaction %%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Beam - Particle= 10He - Energy= 553 + Particle= 11Li + Energy= 553 SigmaEnergy= 20 SigmaThetaX= 0.6138 SigmaPhiY= 0.3812 SigmaX= 6.216 SigmaY= 6.109 - MeanThetaX= 0 - MeanPhiY= 0 - MeanX= 1.773 - MeanY= -0.1375 - %EnergyProfilePath= - %XThetaXProfilePath= - %YPhiYProfilePath= + MeanThetaX= 0 + MeanPhiY= 0 + MeanX= 1.773 + MeanY= -0.1375 + %EnergyProfilePath= + %XThetaXProfilePath= + %YPhiYProfilePath= diff --git a/NPLib/Detectors/Minos/TMinosData.cxx b/NPLib/Detectors/Minos/TMinosData.cxx index 03e795c65fc322626579936b71ef439cf5f7ab2d..d59dc0eaf7e9463ad8dbbb0f7979033d55642229 100644 --- a/NPLib/Detectors/Minos/TMinosData.cxx +++ b/NPLib/Detectors/Minos/TMinosData.cxx @@ -123,6 +123,16 @@ Z.clear(); trackID.clear(); parentID.clear(); + //For take fitpar values +MINOSx_0.clear(); +MINOSy_0.clear(); +MINOSz_0.clear(); + MINOS_D_min.clear(); + MINOS_Radius.clear(); + MINOS_NumberTracks.clear(); + theta0.clear(); + phi0.clear(); +energy0.clear(); diff --git a/NPLib/Detectors/Minos/TMinosData.h b/NPLib/Detectors/Minos/TMinosData.h index 01ba60dbd6feaa16db905c24c375fed468bfac54..b6773407bb8ce00bd757b8d5d97c7c5fc83ec0b4 100644 --- a/NPLib/Detectors/Minos/TMinosData.h +++ b/NPLib/Detectors/Minos/TMinosData.h @@ -68,7 +68,7 @@ vector<double> x0, y0, z0, theta0, phi0, energy0; vector<bool> detection; int event; */ - + vector<Double_t> MINOSx_0, MINOSy_0, MINOSz_0, MINOS_D_min, MINOS_Radius, MINOS_NumberTracks, theta0, phi0, energy0; //For take fitpar values ////////////////////////////////////////////////////////////// // Constructor and destructor @@ -111,6 +111,33 @@ int event; };//! // + + + //Setters for position vertex and obsv in experiment analysis + + // Position + inline void SetVertexPos(const Double_t& x,const Double_t& y,const Double_t& z) { + MINOSx_0.push_back(x); + MINOSy_0.push_back(y); + MINOSz_0.push_back(z); + };//! + +// Min Distance + inline void SetD_min(const Double_t& dmin) { + MINOS_D_min.push_back(dmin); + };//! + + + + + + + + + + + + ////////////////////// GETTERS //////////////////////// // Energy inline UShort_t GetMultEnergy() const @@ -129,6 +156,20 @@ int event; {return fMinos_Time[i];}//! + // Position + inline Double_t GetVertexPos() const + {return MINOSz_0[0] ; }//! + inline Double_t GetVertexPosX() const + {return MINOSx_0[0] ; }//! + inline Double_t GetVertexPosY() const + {return MINOSy_0[0] ; }//! + inline Double_t GetVertexPosZ() const + {return MINOSz_0[0] ; }//! + + // Min Distance + inline Double_t GetD_min() const + {return MINOS_D_min[0] ; }//! + ////////////////////////////////////////////////////////////// // Required for ROOT dictionnary ClassDef(TMinosData,1) // MinosData structure diff --git a/NPSimulation/Core/Chamber.cc b/NPSimulation/Core/Chamber.cc index e5c39608f6a621394d243e39a4252b214e561485..8f1d79f1334b2e742c113fa44db7d492edbc8c30 100644 --- a/NPSimulation/Core/Chamber.cc +++ b/NPSimulation/Core/Chamber.cc @@ -2300,7 +2300,7 @@ void Chamber::InitializeRootOutput() {} // Read sensitive part and fill the Root tree. -// Called at in the EventAction::EndOfEventAvtion +// Called at in the EventAction::EndOfEventAction void Chamber::ReadSensitive(const G4Event*) {} diff --git a/NPSimulation/Core/Target.cc b/NPSimulation/Core/Target.cc index 1664079998d0a2680d6b13402e4f14398735febf..c11bb2fb2523aa1fabcf89eee6af23301541d49b 100644 --- a/NPSimulation/Core/Target.cc +++ b/NPSimulation/Core/Target.cc @@ -457,7 +457,7 @@ void Target::InitializeRootOutput() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // Read sensitive part and fill the Root tree. -// Called at in the EventAction::EndOfEventAvtion +// Called at in the EventAction::EndOfEventAction void Target::ReadSensitive(const G4Event*) {} diff --git a/NPSimulation/Core/Target.hh b/NPSimulation/Core/Target.hh index 8dee4b73c73ad951ab8e9932404287d6b8212d13..7f0b6e1e3a40b74aec6faa50a7d287e3615b9415 100644 --- a/NPSimulation/Core/Target.hh +++ b/NPSimulation/Core/Target.hh @@ -66,7 +66,7 @@ public: void InitializeRootOutput(); // Read sensitive part and fill the Root tree. - // Called at in the EventAction::EndOfEventAvtion + // Called at in the EventAction::EndOfEventAction void ReadSensitive(const G4Event* event); public: diff --git a/NPSimulation/Detectors/Dali/Dali.cc b/NPSimulation/Detectors/Dali/Dali.cc index 9edf97cc0a90f3bc12ac2c3831394eb3460cf458..f034fc081b4751e9ae19d852db59a3c7095070ec 100644 --- a/NPSimulation/Detectors/Dali/Dali.cc +++ b/NPSimulation/Detectors/Dali/Dali.cc @@ -1,18 +1,19 @@ /***************************************************************************** - * Copyright (C) 2009-2018 this file is part of the NPTool Project * + * Copyright (C) 2009-2018 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: Elidiano Tronchin contact address: elidiano.tronchin@studenti.unipd.it * + * Original Author: E. Tronchin * + * contact address: elidiano.tronchin@studenti.unipd.it * * * * Creation Date : septembre 2018 * * Last update : * *---------------------------------------------------------------------------* * Decription: * - * This class describe Dali simulation * + * This class describe Dali simulation * * * *---------------------------------------------------------------------------* * Comment: * @@ -23,9 +24,21 @@ #include <sstream> #include <cmath> #include <limits> +using namespace std; + //G4 Geometry object #include "G4Tubs.hh" #include "G4Box.hh" +#include "G4ExtrudedSolid.hh" +#include "G4VSolid.hh" +// #ifndef G4UEXTRUDEDSOLID_hh +// #define G4UEXTRUDEDSOLID_hh +// #include "G4USolid.hh" +// #if ( defined(G4GEOM_USE_USOLIDS) || defined(G4GEOM_USE_PARTIAL_USOLIDS) ) + +//#include "G4UExtrudedSolid.hh" +#include "G4TwoVector.hh" +#include "G4TessellatedSolid.hh" //G4 sensitive #include "G4SDManager.hh" @@ -52,13 +65,9 @@ // CLHEP header #include "CLHEP/Random/RandGauss.h" -using namespace std; using namespace CLHEP; - - - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... namespace Dali_NS{ // Energy and time Resolution @@ -69,6 +78,7 @@ namespace Dali_NS{ const double Width = 49.76*mm ; const double Hight = 84.81*mm ; const double Thickness = 164.82*mm ; + const double LengthPMT = 152.62*mm ; const string Material = "NaI"; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -86,8 +96,8 @@ Dali::Dali(){ Logic_ArrayDali_1 =0; // RGB Color + Transparency - m_VisSquare = new G4VisAttributes(G4Colour(0, 1, 0, 0.5)); - m_VisCylinder = new G4VisAttributes(G4Colour(0, 0, 1, 0.5)); + m_VisSquare = new G4VisAttributes(G4Colour(0, 1, 1, 0.3)); + m_VisCylinder = new G4VisAttributes(G4Colour(0, 0, 1, 0.3)); } @@ -166,23 +176,62 @@ G4LogicalVolume* Dali::BuildSquareDetector(){ - - - G4Box* box_3can = new G4Box("Dali_3BoxCan", Dali_NS::Hight*0.5, - Dali_NS::Width*0.5*3, Dali_NS::Thickness*0.5); + Dali_NS::Width*0.5*3, Dali_NS::Thickness*0.5 + Dali_NS::LengthPMT/2.+11.5/2.*mm /*last part is PMTVolume*/ ); G4Material* Aria = MaterialManager::getInstance()->GetMaterialFromLibrary("Air"); Logic_ArrayDali_1 = new G4LogicalVolume(box_3can,Aria,"logic_ArrayDali",0,0,0); - + + Logic_ArrayDali_1->SetVisAttributes(G4VisAttributes(G4Colour(1,1,1, 0.01))); G4Box* box_can = new G4Box("Dali_BoxCan", Dali_NS::Hight*0.5, Dali_NS::Width*0.5, Dali_NS::Thickness*0.5); + + G4Box* box_canandPMT = new G4Box("Dali_BoxCan", Dali_NS::Hight*0.5, + Dali_NS::Width*0.5, Dali_NS::Thickness*0.5 + Dali_NS::LengthPMT/2.+11.5/2.*mm /*last part is PMTVolume*/ ); + + std::vector<G4TwoVector> polygon; + polygon.push_back(G4TwoVector(Dali_NS::Hight*0.5, Dali_NS::Width*0.5*3. ) ) ; + polygon.push_back(G4TwoVector(Dali_NS::Hight*0.5, -Dali_NS::Width*0.5*3. ) ) ; + polygon.push_back(G4TwoVector(-Dali_NS::Hight*0.5, -Dali_NS::Width*0.5*3. ) ) ; + polygon.push_back(G4TwoVector(-Dali_NS::Hight*0.5, Dali_NS::Width*0.5*3. ) ) ; + + // std::vector<ZSection> zsection; + // zsection.push_back(ZSection (Dali_NS::Thickness*0.5, {0,0}, 1. ) ); + // zsection.push_back(ZSection (-Dali_NS::Thickness*0.5-19.5*2.*mm , {0,0}, 1. ) ); + + + G4Box* Extrudedbox_can = new G4Box("Dali_BoxCan", Dali_NS::Hight*0.5,Dali_NS::Width*0.5, Dali_NS::LengthPMT/2.+11.5/2.*mm); + + AriaExtrude = new G4LogicalVolume(Extrudedbox_can,Aria, "logic_Ariaextrude",0,0,0); + G4Material* DetectorCanMaterial = MaterialManager::getInstance()->GetMaterialFromLibrary("Al"); m_SquareDetector_Can = new G4LogicalVolume(box_can,DetectorCanMaterial,"logic_Dali_Can",0,0,0); - G4VisAttributes* Can_Attributes = new G4VisAttributes(G4Colour(0.5,0.5,0.5)); + m_Square2Detector_Can = new G4LogicalVolume(box_canandPMT, Aria,"logic_Dali_CanandPMT",0,0,0); + + + //THE PMT + G4Tubs* AlPMT = new G4Tubs("AlPMT",16.5*mm, 19.5*mm,Dali_NS::LengthPMT/2.,0*deg,360*deg); + G4Tubs* MuPMT = new G4Tubs("MuPMT",16.5*mm,20.*mm,Dali_NS::LengthPMT/2.,0*deg,360*deg); + G4Box* TopPlatePMT = new G4Box("TopPlatePMT", Dali_NS::Hight*0.5-1*mm, + Dali_NS::Width*0.5-1*mm, 11.5/2.*mm ); + G4Tubs* GlassPMT = new G4Tubs("GlassPMT", 0. , 16.5*mm , 11.5/2.*mm ,0*deg,360*deg); + + lAlPMT = new G4LogicalVolume(AlPMT, DetectorCanMaterial ,"lAlPMT",0,0,0); + lMuPMT = new G4LogicalVolume(MuPMT, DetectorCanMaterial ,"lMuPMT",0,0,0); + lTopPlatePMT = new G4LogicalVolume(TopPlatePMT, DetectorCanMaterial ,"lTopPlatePMT",0,0,0); + lGlassPMT = new G4LogicalVolume(GlassPMT , MaterialManager::getInstance()->GetMaterialFromLibrary("Borosillicate_Glass") ,"lGlassPMT",0,0,0); + + + G4VisAttributes* Can_Attributes = new G4VisAttributes(G4Colour(0.5,0.5,0.5, .3)); m_SquareDetector_Can->SetVisAttributes(Can_Attributes); - + m_Square2Detector_Can->SetVisAttributes(G4VisAttributes(G4Colour(1,1,1,0.1))); + + //Extrudedbox_can->SetVisAttributes(Can_Attributes); + lAlPMT->SetVisAttributes(Can_Attributes); + lMuPMT->SetVisAttributes(Can_Attributes); + lTopPlatePMT->SetVisAttributes(Can_Attributes); + G4Box* box_MgO = new G4Box("Dali_BoxMgO", Dali_NS::Hight*0.5-1*mm, Dali_NS::Width*0.5-1*mm, Dali_NS::Thickness*0.5-1*mm); @@ -194,6 +243,60 @@ G4LogicalVolume* Dali::BuildSquareDetector(){ m_SquareDetector_Crystal = new G4LogicalVolume(box_crystal,NaI_Tl,"logic_Dali_Box",0,0,0); G4ThreeVector positionnull = G4ThreeVector(0,0,0); + + + // PMT Volume - + new G4PVPlacement(0, positionnull, + lAlPMT , + "AlPMT", + lMuPMT, + false, + 0); + new G4PVPlacement(0, G4ThreeVector(0,0, -11.5/2.*mm ), + lMuPMT , + "MuPMT", + AriaExtrude, + false, + 0); + + + new G4PVPlacement(0, positionnull, + lGlassPMT, + "GlassPMT", + lTopPlatePMT, + false, + 0); + new G4PVPlacement(0, G4ThreeVector(0,0, Dali_NS::LengthPMT/2. ), + lTopPlatePMT, + "TopPlatePMT", + AriaExtrude, + false, + 0); + + + + new G4PVPlacement(0, G4ThreeVector(0,0, -Dali_NS::Thickness*0.5 ), + AriaExtrude, + "PMTVolume", + m_Square2Detector_Can, + false, + 0); + + + + + new G4PVPlacement(0, G4ThreeVector(0,0, Dali_NS::LengthPMT/2.+11.5/2.*mm ), + m_SquareDetector_Can, + "DetectorVolume", + m_Square2Detector_Can, + false, + 0); + + + + + + // MgO Volume - new G4PVPlacement(0, positionnull, @@ -202,14 +305,15 @@ G4LogicalVolume* Dali::BuildSquareDetector(){ m_SquareDetector_Can, false, 0); - G4VisAttributes* MgO_Attributes = new G4VisAttributes(G4Colour(0.0,1.0,0.5)); + G4VisAttributes* MgO_Attributes = new G4VisAttributes(G4Colour(1,1,1, .3)); m_SquareDetector_CanMgO->SetVisAttributes(MgO_Attributes); + AriaExtrude->SetVisAttributes(MgO_Attributes); // NaI Volume - new G4PVPlacement(0, positionnull, m_SquareDetector_Crystal, - "Crystal NaI", + "CrystalNaI", m_SquareDetector_CanMgO, false, 0); @@ -217,8 +321,18 @@ G4LogicalVolume* Dali::BuildSquareDetector(){ m_SquareDetector_Crystal->SetVisAttributes(m_VisSquare); m_SquareDetector_Crystal->SetSensitiveDetector(m_DaliScorer); - new G4PVReplica("ArrayDali_1", - m_SquareDetector_Can, + + new G4PVPlacement(0, positionnull, + m_SquareDetector_Crystal, + "CrystalNaI", + m_SquareDetector_CanMgO, + false, + 0); + + + + new G4PVReplica("DaliArrayElement", + m_Square2Detector_Can, Logic_ArrayDali_1 , kYAxis, 3, @@ -227,8 +341,6 @@ G4LogicalVolume* Dali::BuildSquareDetector(){ - - } return Logic_ArrayDali_1; @@ -312,6 +424,8 @@ void Dali::ConstructDetector(G4LogicalVolume* world){ G4double wX = m_R[i] * cos(m_Alpha[i] ) ; G4double wY = m_R[i] * sin(m_Alpha[i] ) ; G4double wZ = m_Zeta[i]; + if(m_Zeta[i]<0) wZ = wZ - Dali_NS::LengthPMT/2.+11.5/2.*mm; + else wZ = wZ + Dali_NS::LengthPMT/2.+11.5/2.*mm; G4ThreeVector Det_pos = G4ThreeVector(wX, wY, wZ) ; @@ -321,8 +435,8 @@ void Dali::ConstructDetector(G4LogicalVolume* world){ - - if(m_Zeta[i]>0){ + Rot->rotateX(180*deg); + if(m_Zeta[i]<0){ Rot->rotateY(180*deg); Rot->rotateZ(m_Alpha[i]); } else{Rot->rotateZ(m_Alpha[i]);} @@ -337,6 +451,8 @@ void Dali::ConstructDetector(G4LogicalVolume* world){ new G4PVPlacement(G4Transform3D(*Rot,Det_pos), BuildSquareDetector(), "Dali",world,false,i+1); + + } } } @@ -379,8 +495,6 @@ void Dali::ReadSensitive(const G4Event* ){ int DetectorNbr = (ArrayNbr-1)*3+DetectinsArrayNbr; m_Event->SetEnergy(DetectorNbr,Energy); m_Event->SetTime(DetectorNbr,Time); - - } } } @@ -390,17 +504,17 @@ void Dali::ReadSensitive(const G4Event* ){ void Dali::InitializeScorers() { // This check is necessary in case the geometry is reloaded bool already_exist = false; - vector<G4int> NestingLevel; - NestingLevel.push_back(2); + vector<int> NestingLevel; NestingLevel.push_back(3); + NestingLevel.push_back(4); m_DaliScorer = CheckScorer("DaliScorer",already_exist) ; - //if(already_exist) - // return ; + if(already_exist) //Necessary? + return ; //Necessary? // Otherwise the scorer is initialised - vector<int> level; level.push_back(0); +// vector<int> level; level.push_back(0); G4VPrimitiveScorer* Calorimeter= new CalorimeterScorers::PS_Calorimeter("Calorimeter", NestingLevel) ; G4VPrimitiveScorer* Interaction= new InteractionScorers::PS_Interactions("Interaction",ms_InterCoord, 0) ; //and register it to the multifunctionnal detector diff --git a/NPSimulation/Detectors/Dali/Dali.cc.~14~ b/NPSimulation/Detectors/Dali/Dali.cc.~14~ deleted file mode 100644 index cedb27ac763944c87dda97b14fc53dc120f35c57..0000000000000000000000000000000000000000 --- a/NPSimulation/Detectors/Dali/Dali.cc.~14~ +++ /dev/null @@ -1,417 +0,0 @@ -/***************************************************************************** - * Copyright (C) 2009-2018 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: Elidiano Tronchin contact address: elidiano.tronchin@studenti.unipd.it * - * * - * Creation Date : septembre 2018 * - * Last update : * - *---------------------------------------------------------------------------* - * Decription: * - * This class describe Dali 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 "G4VPhysicalVolume.hh" -#include "G4PVReplica.hh" -#include "G4VisAttributes.hh" -#include "G4Colour.hh" - -// NPTool header -#include "Dali.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 Dali_NS{ - // Energy and time Resolution - const double EnergyThreshold = 0*MeV; - const double ResoTime = 4.5*ns ; - const double ResoEnergy = 0.001*MeV ; - const double Radius = 50*mm ; - const double Width = 49.76*mm ; - const double Hight = 84.81*mm ; - const double Thickness = 164.82*mm ; - const string Material = "NaI"; //Change to drug it with Tl -} -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -// Dali Specific Method -Dali::Dali(){ - m_Event = new TDaliData() ; - m_DaliScorer = 0; - m_SquareDetector = 0; - m_SquareDetector_Can = 0; - m_SquareDetector_CanMgO =0; - m_CylindricalDetector = 0; - m_SquareDetector_Crystal = 0; - Logic_ArrayDali_1 =0; - - // RGB Color + Transparency - m_VisSquare = new G4VisAttributes(G4Colour(0, 1, 0, 0.5)); - m_VisCylinder = new G4VisAttributes(G4Colour(0, 0, 1, 0.5)); - -} - -Dali::~Dali(){ -} -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void Dali::AddDetector(G4ThreeVector POS, string Shape){ - // Convert the POS value to R theta Phi as Cylindrical coordinate is easier in G4 - m_R.push_back(POS.perp()); - m_Alpha.push_back(POS.phi()); - m_Zeta.push_back(POS.y()); - m_Shape.push_back(Shape); -} - - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void Dali::AddDetector(double R, double Theta, double Phi, string Shape){ - - double m_r, m_alpha, m_zeta; - - m_r = R*cos(Phi); - m_alpha = Theta; - m_zeta = R*sin(Phi); - - m_R.push_back(m_r); - m_Alpha.push_back(m_alpha); - m_Zeta.push_back(m_zeta); - m_Shape.push_back(Shape); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -void Dali::AddDetector2(double R, double Alpha, double Zeta, string Shape){ - m_R.push_back(R); - m_Alpha.push_back(Alpha); - m_Zeta.push_back(Zeta); - m_Shape.push_back(Shape); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - - - -G4LogicalVolume* Dali::BuildSquareDetector(){ - if(!m_SquareDetector){ - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - - - G4Element* H = new G4Element("Hydrogen","H" , 1., 1.01*g/mole); - - G4Isotope* Mg24 = new G4Isotope ("Mg24", 12, 24, 23.985041*g/mole); - G4Isotope* Mg25 = new G4Isotope ("Mg25", 12, 25, 24.985836*g/mole); - G4Isotope* Mg26 = new G4Isotope ("Mg26", 12, 26, 25.982592*g/mole); - G4Element* Mg= new G4Element("elMagnesium","Mg",3); - Mg->AddIsotope(Mg24, 78.99*perCent); - Mg->AddIsotope(Mg25, 10*perCent); - Mg->AddIsotope(Mg26, 11.01*perCent); - - G4Isotope* O16 = new G4Isotope ("O16", 8, 16, 15.99*g/mole); - G4Isotope* O17 = new G4Isotope ("O17", 8, 17, 17.00*g/mole); - G4Isotope* O18 = new G4Isotope ("O18", 8, 18, 18.00*g/mole); - G4Element* O= new G4Element("elOxygen","O",3); - O->AddIsotope(O16, 99.76*perCent); - O->AddIsotope(O17, 0.04*perCent); - O->AddIsotope(O18, 0.20*perCent); - - G4Material* MgO = new G4Material("MgO",3.6*g/cm3,2); - MgO->AddElement(Mg,1); - MgO->AddElement(O, 1); - - G4Element *elTl = new G4Element("Thallium","Tl",81.,204.383*g/mole ); - G4Material* NaI_Tl = new G4Material("NaI_Tl",3.6667*g/cm3, 2); - NaI_Tl->AddMaterial(MaterialManager::getInstance()->GetMaterialFromLibrary("NaI"),99.6*perCent); - NaI_Tl->AddElement(elTl,0.4*perCent); - - - - - - - G4Box* box_3can = new G4Box("Dali_3BoxCan", Dali_NS::Hight*0.5, - Dali_NS::Width*0.5*3, Dali_NS::Thickness*0.5); - G4Material* Aria = MaterialManager::getInstance()->GetMaterialFromLibrary("Air"); - Logic_ArrayDali_1 = new G4LogicalVolume(box_3can,Aria,"logic_ArrayDali",0,0,0); - - - - G4Box* box_can = new G4Box("Dali_BoxCan", Dali_NS::Hight*0.5, - Dali_NS::Width*0.5, Dali_NS::Thickness*0.5); - G4Material* DetectorCanMaterial = MaterialManager::getInstance()->GetMaterialFromLibrary("Al"); - m_SquareDetector_Can = new G4LogicalVolume(box_can,Aria,"logic_Dali_Can",0,0,0); - G4VisAttributes* Can_Attributes = new G4VisAttributes(G4Colour(0.5,0.5,0.5)); - m_SquareDetector_Can->SetVisAttributes(Can_Attributes); - - G4Box* box_MgO = new G4Box("Dali_BoxMgO", Dali_NS::Hight*0.5-1*mm, - Dali_NS::Width*0.5-1*mm, Dali_NS::Thickness*0.5-1*mm); - - m_SquareDetector_CanMgO = new G4LogicalVolume(box_MgO,Aria,"logic_Dali_CanMg0",0,0,0); - - G4Box* box_crystal = new G4Box("Dali_BoxNaI", Dali_NS::Hight*0.5-2.4*mm, - Dali_NS::Width*0.5-2.4*mm, Dali_NS::Thickness*0.5-2.4*mm); - G4Material* DetectorMaterial = MaterialManager::getInstance()->GetMaterialFromLibrary(Dali_NS::Material); - m_SquareDetector_Crystal = new G4LogicalVolume(box_crystal,NaI_Tl,"logic_Dali_Box",0,0,0); - - G4ThreeVector positionnull = G4ThreeVector(0,0,0); - - // MgO Volume - - G4PVPlacement* physi_MgO = new G4PVPlacement(0, positionnull, - m_SquareDetector_CanMgO, - "MgO", - m_SquareDetector_Can, - false, - 0); - G4VisAttributes* MgO_Attributes = new G4VisAttributes(G4Colour(0.0,1.0,0.5)); - m_SquareDetector_CanMgO->SetVisAttributes(MgO_Attributes); - - - // NaI Volume - - G4PVPlacement* physi_NaI = new G4PVPlacement(0, positionnull, - m_SquareDetector_Crystal, - "Crystal NaI", - m_SquareDetector_CanMgO, - false, - 0); - m_SquareDetector_Crystal->SetVisAttributes(m_VisSquare); - m_SquareDetector_Crystal->SetSensitiveDetector(m_DaliScorer); - - G4VPhysicalVolume* ArrayDali_1 = new G4PVReplica("ArrayDali_1", - m_SquareDetector_Can, - Logic_ArrayDali_1 , - kYAxis, - 3, - Dali_NS::Width, //????????? - 0); - - } - - return Logic_ArrayDali_1; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4LogicalVolume* Dali::BuildCylindricalDetector(){ - if(!m_CylindricalDetector){ - G4Tubs* tub = new G4Tubs("Dali_Cyl",0,Dali_NS::Radius, Dali_NS::Thickness*0.5,0,360*deg); - - G4Material* DetectorMaterial = MaterialManager::getInstance()->GetMaterialFromLibrary(Dali_NS::Material); - m_CylindricalDetector = new G4LogicalVolume(tub,DetectorMaterial,"logic_Dali_tub",0,0,0); - m_CylindricalDetector->SetVisAttributes(m_VisSquare); - m_CylindricalDetector->SetSensitiveDetector(m_DaliScorer); - - } - return m_CylindricalDetector; -} - -//....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 Dali::ReadConfiguration(NPL::InputParser parser){ - vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("Dali"); - if(NPOptionManager::getInstance()->GetVerboseLevel()) - cout << "//// " << blocks.size() << " detectors found " << endl; - - vector<string> cart = {"POS","Shape"}; - vector<string> sphe = {"R","Theta","Phi","Shape"}; - vector<string> cyli = {"R","Alpha","Zeta","Shape"}; - - for(unsigned int i = 0 ; i < blocks.size() ; i++){ - if(blocks[i]->HasTokenList(cart)){ - if(NPOptionManager::getInstance()->GetVerboseLevel()) - cout << endl << "//// Dali " << i+1 << endl; - - G4ThreeVector Pos = NPS::ConvertVector(blocks[i]->GetTVector3("POS","mm")); - string Shape = blocks[i]->GetString("Shape"); - AddDetector(Pos,Shape); - } - else if(blocks[i]->HasTokenList(sphe)){ - if(NPOptionManager::getInstance()->GetVerboseLevel()) - cout << endl << "//// Dali " << i+1 << endl; - double R = blocks[i]->GetDouble("R","mm"); - double Theta = blocks[i]->GetDouble("Theta","deg"); - double Phi = blocks[i]->GetDouble("Phi","deg"); - string Shape = blocks[i]->GetString("Shape"); - AddDetector(R,Theta,Phi,Shape); - } - else if(blocks[i]->HasTokenList(cyli)){ - if(NPOptionManager::getInstance()->GetVerboseLevel()) - cout << endl << "//// Dali " << i+1 << endl; - double R = blocks[i]->GetDouble("R","mm"); - double Alpha = blocks[i]->GetDouble("Alpha","deg"); - double Zeta = blocks[i]->GetDouble("Zeta","mm"); - string Shape = blocks[i]->GetString("Shape"); - AddDetector2(R,Alpha,Zeta,Shape); - } - 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 Dali::ConstructDetector(G4LogicalVolume* world){ - - for (unsigned short i = 0 ; i < m_R.size() ; i++) { - - G4double wX = m_R[i] * cos(m_Alpha[i] ) ; - G4double wY = m_R[i] * sin(m_Alpha[i] ) ; - G4double wZ = m_Zeta[i]; - G4ThreeVector Det_pos = G4ThreeVector(wX, wY, wZ) ; - - G4RotationMatrix* Rot = new G4RotationMatrix(); - - if(m_Zeta[i]>0){ - Rot->rotateX(180*deg); Rot->rotateZ(m_Alpha[i]); - } else{Rot->rotateZ(m_Alpha[i]);} - - - if(m_Shape[i] == "Cylindrical"){ - new G4PVPlacement(G4Transform3D(*Rot,Det_pos), - BuildCylindricalDetector(), - "Dali",world,false,i+1); - } - - else if(m_Shape[i] == "Square"){ - new G4PVPlacement(G4Transform3D(*Rot,Det_pos), - BuildSquareDetector(), - "Dali",world,false,i+1); - } - } -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -// Add Detector branch to the EventTree. -// Called After DetecorConstruction::AddDetector Method -void Dali::InitializeRootOutput(){ - RootOutput *pAnalysis = RootOutput::getInstance(); - TTree *pTree = pAnalysis->GetTree(); - if(!pTree->FindBranch("Dali")){ - pTree->Branch("Dali", "TDaliData", &m_Event) ; - } - pTree->SetBranchAddress("Dali", &m_Event) ; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -// Read sensitive part and fill the Root tree. -// Called at in the EventAction::EndOfEventAvtion -void Dali::ReadSensitive(const G4Event* ){ - m_Event->Clear(); - - /////////// - // Calorimeter scorer - CalorimeterScorers::PS_Calorimeter* Scorer= (CalorimeterScorers::PS_Calorimeter*) m_DaliScorer->GetPrimitive(0); - - unsigned int size = Scorer->GetMult(); - // cout << "size " << size << endl; - for(unsigned int i = 0 ; i < size ; i++){ - vector<unsigned int> level = Scorer->GetLevel(i); - double Energy = RandGauss::shoot(Scorer->GetEnergy(i),Dali_NS::ResoEnergy); - // cout << Energy << endl; - if(Energy>Dali_NS::EnergyThreshold){ - double Time = RandGauss::shoot(Scorer->GetTime(i),Dali_NS::ResoTime); - int DetectorNbr = level[0]; - int InsideDetectNbr = level[1]; - m_Event->SetEnergy(DetectorNbr,Energy); - m_Event->SetTime(DetectorNbr,Time); - } - } -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//////////////////////////////////////////////////////////////// -void Dali::InitializeScorers() { - // This check is necessary in case the geometry is reloaded - bool already_exist = false; - vector<G4int> NestingLevel; - NestingLevel.push_back(0); - NestingLevel.push_back(1); - - m_DaliScorer = CheckScorer("DaliScorer",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",NestingLevel) ; - G4VPrimitiveScorer* Interaction= new InteractionScorers::PS_Interactions("Interaction",ms_InterCoord, 0) ; - //and register it to the multifunctionnal detector - m_DaliScorer->RegisterPrimitive(Calorimeter); - m_DaliScorer->RegisterPrimitive(Interaction); - G4SDManager::GetSDMpointer()->AddNewDetector(m_DaliScorer) ; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//////////////////////////////////////////////////////////////////////////////// -// Construct Method to be pass to the DetectorFactory // -//////////////////////////////////////////////////////////////////////////////// -NPS::VDetector* Dali::Construct(){ - return (NPS::VDetector*) new Dali(); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//////////////////////////////////////////////////////////////////////////////// -// Registering the construct method to the factory // -//////////////////////////////////////////////////////////////////////////////// -extern"C" { - class proxy_nps_Dali{ - public: - proxy_nps_Dali(){ - NPS::DetectorFactory::getInstance()->AddToken("Dali","Dali"); - NPS::DetectorFactory::getInstance()->AddDetector("Dali",Dali::Construct); - } - }; - - proxy_nps_Dali p_nps_Dali; -} diff --git a/NPSimulation/Detectors/Dali/Dali.cc.~15~ b/NPSimulation/Detectors/Dali/Dali.cc.~15~ deleted file mode 100644 index 360a3f6598772c96e27e343ada11d4186820ede1..0000000000000000000000000000000000000000 --- a/NPSimulation/Detectors/Dali/Dali.cc.~15~ +++ /dev/null @@ -1,420 +0,0 @@ -/***************************************************************************** - * Copyright (C) 2009-2018 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: Elidiano Tronchin contact address: elidiano.tronchin@studenti.unipd.it * - * * - * Creation Date : septembre 2018 * - * Last update : * - *---------------------------------------------------------------------------* - * Decription: * - * This class describe Dali 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 "G4VPhysicalVolume.hh" -#include "G4PVReplica.hh" -#include "G4VisAttributes.hh" -#include "G4Colour.hh" - -// NPTool header -#include "Dali.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 Dali_NS{ - // Energy and time Resolution - const double EnergyThreshold = 0*MeV; - const double ResoTime = 4.5*ns ; - const double ResoEnergy = 0.001*MeV ; - const double Radius = 50*mm ; - const double Width = 49.76*mm ; - const double Hight = 84.81*mm ; - const double Thickness = 164.82*mm ; - const string Material = "NaI"; //Change to drug it with Tl -} -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -// Dali Specific Method -Dali::Dali(){ - m_Event = new TDaliData() ; - m_DaliScorer = 0; - m_SquareDetector = 0; - m_SquareDetector_Can = 0; - m_SquareDetector_CanMgO =0; - m_CylindricalDetector = 0; - m_SquareDetector_Crystal = 0; - Logic_ArrayDali_1 =0; - - // RGB Color + Transparency - m_VisSquare = new G4VisAttributes(G4Colour(0, 1, 0, 0.5)); - m_VisCylinder = new G4VisAttributes(G4Colour(0, 0, 1, 0.5)); - -} - -Dali::~Dali(){ -} -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void Dali::AddDetector(G4ThreeVector POS, string Shape){ - // Convert the POS value to R theta Phi as Cylindrical coordinate is easier in G4 - m_R.push_back(POS.perp()); - m_Alpha.push_back(POS.phi()); - m_Zeta.push_back(POS.y()); - m_Shape.push_back(Shape); -} - - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void Dali::AddDetector(double R, double Theta, double Phi, string Shape){ - - double m_r, m_alpha, m_zeta; - - m_r = R*cos(Phi); - m_alpha = Theta; - m_zeta = R*sin(Phi); - - m_R.push_back(m_r); - m_Alpha.push_back(m_alpha); - m_Zeta.push_back(m_zeta); - m_Shape.push_back(Shape); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -void Dali::AddDetector2(double R, double Alpha, double Zeta, string Shape){ - m_R.push_back(R); - m_Alpha.push_back(Alpha); - m_Zeta.push_back(Zeta); - m_Shape.push_back(Shape); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - - - -G4LogicalVolume* Dali::BuildSquareDetector(){ - if(!m_SquareDetector){ - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - - - G4Element* H = new G4Element("Hydrogen","H" , 1., 1.01*g/mole); - - G4Isotope* Mg24 = new G4Isotope ("Mg24", 12, 24, 23.985041*g/mole); - G4Isotope* Mg25 = new G4Isotope ("Mg25", 12, 25, 24.985836*g/mole); - G4Isotope* Mg26 = new G4Isotope ("Mg26", 12, 26, 25.982592*g/mole); - G4Element* Mg= new G4Element("elMagnesium","Mg",3); - Mg->AddIsotope(Mg24, 78.99*perCent); - Mg->AddIsotope(Mg25, 10*perCent); - Mg->AddIsotope(Mg26, 11.01*perCent); - - G4Isotope* O16 = new G4Isotope ("O16", 8, 16, 15.99*g/mole); - G4Isotope* O17 = new G4Isotope ("O17", 8, 17, 17.00*g/mole); - G4Isotope* O18 = new G4Isotope ("O18", 8, 18, 18.00*g/mole); - G4Element* O= new G4Element("elOxygen","O",3); - O->AddIsotope(O16, 99.76*perCent); - O->AddIsotope(O17, 0.04*perCent); - O->AddIsotope(O18, 0.20*perCent); - - G4Material* MgO = new G4Material("MgO",3.6*g/cm3,2); - MgO->AddElement(Mg,1); - MgO->AddElement(O, 1); - - G4Element *elTl = new G4Element("Thallium","Tl",81.,204.383*g/mole ); - G4Material* NaI_Tl = new G4Material("NaI_Tl",3.6667*g/cm3, 2); - NaI_Tl->AddMaterial(MaterialManager::getInstance()->GetMaterialFromLibrary("NaI"),99.6*perCent); - NaI_Tl->AddElement(elTl,0.4*perCent); - - - - - - - G4Box* box_3can = new G4Box("Dali_3BoxCan", Dali_NS::Hight*0.5, - Dali_NS::Width*0.5*3, Dali_NS::Thickness*0.5); - G4Material* Aria = MaterialManager::getInstance()->GetMaterialFromLibrary("Air"); - Logic_ArrayDali_1 = new G4LogicalVolume(box_3can,Aria,"logic_ArrayDali",0,0,0); - - - - G4Box* box_can = new G4Box("Dali_BoxCan", Dali_NS::Hight*0.5, - Dali_NS::Width*0.5, Dali_NS::Thickness*0.5); - G4Material* DetectorCanMaterial = MaterialManager::getInstance()->GetMaterialFromLibrary("Al"); - m_SquareDetector_Can = new G4LogicalVolume(box_can,Aria,"logic_Dali_Can",0,0,0); - G4VisAttributes* Can_Attributes = new G4VisAttributes(G4Colour(0.5,0.5,0.5)); - m_SquareDetector_Can->SetVisAttributes(Can_Attributes); - - G4Box* box_MgO = new G4Box("Dali_BoxMgO", Dali_NS::Hight*0.5-1*mm, - Dali_NS::Width*0.5-1*mm, Dali_NS::Thickness*0.5-1*mm); - - m_SquareDetector_CanMgO = new G4LogicalVolume(box_MgO,Aria,"logic_Dali_CanMg0",0,0,0); - - G4Box* box_crystal = new G4Box("Dali_BoxNaI", Dali_NS::Hight*0.5-2.4*mm, - Dali_NS::Width*0.5-2.4*mm, Dali_NS::Thickness*0.5-2.4*mm); - G4Material* DetectorMaterial = MaterialManager::getInstance()->GetMaterialFromLibrary(Dali_NS::Material); - m_SquareDetector_Crystal = new G4LogicalVolume(box_crystal,NaI_Tl,"logic_Dali_Box",0,0,0); - - G4ThreeVector positionnull = G4ThreeVector(0,0,0); - - // MgO Volume - - G4PVPlacement* physi_MgO = new G4PVPlacement(0, positionnull, - m_SquareDetector_CanMgO, - "MgO", - m_SquareDetector_Can, - false, - 0); - G4VisAttributes* MgO_Attributes = new G4VisAttributes(G4Colour(0.0,1.0,0.5)); - m_SquareDetector_CanMgO->SetVisAttributes(MgO_Attributes); - - - // NaI Volume - - G4PVPlacement* physi_NaI = new G4PVPlacement(0, positionnull, - m_SquareDetector_Crystal, - "Crystal NaI", - m_SquareDetector_CanMgO, - false, - 0); //this is the num detect level[0]?? - - m_SquareDetector_Crystal->SetVisAttributes(m_VisSquare); - m_SquareDetector_Crystal->SetSensitiveDetector(m_DaliScorer); - - G4VPhysicalVolume* ArrayDali_1 = new G4PVReplica("ArrayDali_1", - m_SquareDetector_Can, - Logic_ArrayDali_1 , - kYAxis, - 3, - Dali_NS::Width, //????????? - 0); - - } - - return Logic_ArrayDali_1; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4LogicalVolume* Dali::BuildCylindricalDetector(){ - if(!m_CylindricalDetector){ - G4Tubs* tub = new G4Tubs("Dali_Cyl",0,Dali_NS::Radius, Dali_NS::Thickness*0.5,0,360*deg); - - G4Material* DetectorMaterial = MaterialManager::getInstance()->GetMaterialFromLibrary(Dali_NS::Material); - m_CylindricalDetector = new G4LogicalVolume(tub,DetectorMaterial,"logic_Dali_tub",0,0,0); - m_CylindricalDetector->SetVisAttributes(m_VisSquare); - m_CylindricalDetector->SetSensitiveDetector(m_DaliScorer); - - } - return m_CylindricalDetector; -} - -//....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 Dali::ReadConfiguration(NPL::InputParser parser){ - vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("Dali"); - if(NPOptionManager::getInstance()->GetVerboseLevel()) - cout << "//// " << blocks.size() << " detectors found " << endl; - - vector<string> cart = {"POS","Shape"}; - vector<string> sphe = {"R","Theta","Phi","Shape"}; - vector<string> cyli = {"R","Alpha","Zeta","Shape"}; - - for(unsigned int i = 0 ; i < blocks.size() ; i++){ - if(blocks[i]->HasTokenList(cart)){ - if(NPOptionManager::getInstance()->GetVerboseLevel()) - cout << endl << "//// Dali " << i+1 << endl; - - G4ThreeVector Pos = NPS::ConvertVector(blocks[i]->GetTVector3("POS","mm")); - string Shape = blocks[i]->GetString("Shape"); - AddDetector(Pos,Shape); - } - else if(blocks[i]->HasTokenList(sphe)){ - if(NPOptionManager::getInstance()->GetVerboseLevel()) - cout << endl << "//// Dali " << i+1 << endl; - double R = blocks[i]->GetDouble("R","mm"); - double Theta = blocks[i]->GetDouble("Theta","deg"); - double Phi = blocks[i]->GetDouble("Phi","deg"); - string Shape = blocks[i]->GetString("Shape"); - AddDetector(R,Theta,Phi,Shape); - } - else if(blocks[i]->HasTokenList(cyli)){ - if(NPOptionManager::getInstance()->GetVerboseLevel()) - cout << endl << "//// Dali " << i+1 << endl; - double R = blocks[i]->GetDouble("R","mm"); - double Alpha = blocks[i]->GetDouble("Alpha","deg"); - double Zeta = blocks[i]->GetDouble("Zeta","mm"); - string Shape = blocks[i]->GetString("Shape"); - AddDetector2(R,Alpha,Zeta,Shape); - } - 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 Dali::ConstructDetector(G4LogicalVolume* world){ - - for (unsigned short i = 0 ; i < m_R.size() ; i++) { - - G4double wX = m_R[i] * cos(m_Alpha[i] ) ; - G4double wY = m_R[i] * sin(m_Alpha[i] ) ; - G4double wZ = m_Zeta[i]; - G4ThreeVector Det_pos = G4ThreeVector(wX, wY, wZ) ; - - G4RotationMatrix* Rot = new G4RotationMatrix(); - - if(m_Zeta[i]>0){ - Rot->rotateY(180*deg); Rot->rotateZ(m_Alpha[i]); - } else{Rot->rotateZ(m_Alpha[i]);} - - - if(m_Shape[i] == "Cylindrical"){ - new G4PVPlacement(G4Transform3D(*Rot,Det_pos), - BuildCylindricalDetector(), - "Dali",world,false,i+1); - } - - else if(m_Shape[i] == "Square"){ - new G4PVPlacement(G4Transform3D(*Rot,Det_pos), - BuildSquareDetector(), - "Dali",world,false,i+1); - } - } -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -// Add Detector branch to the EventTree. -// Called After DetecorConstruction::AddDetector Method -void Dali::InitializeRootOutput(){ - RootOutput *pAnalysis = RootOutput::getInstance(); - TTree *pTree = pAnalysis->GetTree(); - if(!pTree->FindBranch("Dali")){ - pTree->Branch("Dali", "TDaliData", &m_Event) ; - } - pTree->SetBranchAddress("Dali", &m_Event) ; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -// Read sensitive part and fill the Root tree. -// Called at in the EventAction::EndOfEventAvtion -void Dali::ReadSensitive(const G4Event* ){ - m_Event->Clear(); - /////////// - // Calorimeter scorer - CalorimeterScorers::PS_Calorimeter* Scorer= (CalorimeterScorers::PS_Calorimeter*) m_DaliScorer->GetPrimitive(0); - - - - unsigned int size = Scorer->GetMult(); - // cout << "size " << size << endl; - for(unsigned int i = 0 ; i < size ; i++){ - vector<unsigned int> level = Scorer->GetLevel(i); - double Energy = RandGauss::shoot(Scorer->GetEnergy(i),Dali_NS::ResoEnergy); - // cout << Energy << endl; - if(Energy>Dali_NS::EnergyThreshold){ - double Time = RandGauss::shoot(Scorer->GetTime(i),Dali_NS::ResoTime); - int ArrayNbr = level[1]; - int DetectinsArrayNbr = level[0]+1; - int DetectorNbr = (ArrayNbr-1)*3+DetectinsArrayNbr; - m_Event->SetEnergy(DetectorNbr,Energy); - m_Event->SetTime(DetectorNbr,Time); - } - } -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//////////////////////////////////////////////////////////////// -void Dali::InitializeScorers() { - // This check is necessary in case the geometry is reloaded - bool already_exist = false; - vector<G4int> NestingLevel; - NestingLevel.push_back(2); - NestingLevel.push_back(3); - - m_DaliScorer = CheckScorer("DaliScorer",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", NestingLevel) ; - G4VPrimitiveScorer* Interaction= new InteractionScorers::PS_Interactions("Interaction",ms_InterCoord, 0) ; - //and register it to the multifunctionnal detector - m_DaliScorer->RegisterPrimitive(Calorimeter); - m_DaliScorer->RegisterPrimitive(Interaction); - G4SDManager::GetSDMpointer()->AddNewDetector(m_DaliScorer) ; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//////////////////////////////////////////////////////////////////////////////// -// Construct Method to be pass to the DetectorFactory // -//////////////////////////////////////////////////////////////////////////////// -NPS::VDetector* Dali::Construct(){ - return (NPS::VDetector*) new Dali(); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//////////////////////////////////////////////////////////////////////////////// -// Registering the construct method to the factory // -//////////////////////////////////////////////////////////////////////////////// -extern"C" { - class proxy_nps_Dali{ - public: - proxy_nps_Dali(){ - NPS::DetectorFactory::getInstance()->AddToken("Dali","Dali"); - NPS::DetectorFactory::getInstance()->AddDetector("Dali",Dali::Construct); - } - }; - - proxy_nps_Dali p_nps_Dali; -} diff --git a/NPSimulation/Detectors/Dali/Dali.cc.~16~ b/NPSimulation/Detectors/Dali/Dali.cc.~16~ deleted file mode 100644 index 9631a93e6092365d2d9e196583e8d322055bb832..0000000000000000000000000000000000000000 --- a/NPSimulation/Detectors/Dali/Dali.cc.~16~ +++ /dev/null @@ -1,432 +0,0 @@ -/***************************************************************************** - * Copyright (C) 2009-2018 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: Elidiano Tronchin contact address: elidiano.tronchin@studenti.unipd.it * - * * - * Creation Date : septembre 2018 * - * Last update : * - *---------------------------------------------------------------------------* - * Decription: * - * This class describe Dali 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 "G4VPhysicalVolume.hh" -#include "G4PVReplica.hh" -#include "G4VisAttributes.hh" -#include "G4Colour.hh" - -// NPTool header -#include "Dali.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 Dali_NS{ - // Energy and time Resolution - const double EnergyThreshold = 0*MeV; - const double ResoTime = 4.5*ns ; - const double ResoEnergy = 0.001*MeV ; - const double Radius = 50*mm ; - const double Width = 49.76*mm ; - const double Hight = 84.81*mm ; - const double Thickness = 164.82*mm ; - const string Material = "NaI"; //Change to drug it with Tl -} -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -// Dali Specific Method -Dali::Dali(){ - m_Event = new TDaliData() ; - m_DaliScorer = 0; - m_SquareDetector = 0; - m_SquareDetector_Can = 0; - m_SquareDetector_CanMgO =0; - m_CylindricalDetector = 0; - m_SquareDetector_Crystal = 0; - Logic_ArrayDali_1 =0; - - // RGB Color + Transparency - m_VisSquare = new G4VisAttributes(G4Colour(0, 1, 0, 0.5)); - m_VisCylinder = new G4VisAttributes(G4Colour(0, 0, 1, 0.5)); - -} - -Dali::~Dali(){ -} -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void Dali::AddDetector(G4ThreeVector POS, string Shape){ - // Convert the POS value to R theta Phi as Cylindrical coordinate is easier in G4 - m_R.push_back(POS.perp()); - m_Alpha.push_back(POS.phi()); - m_Zeta.push_back(POS.y()); - m_Shape.push_back(Shape); -} - - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void Dali::AddDetector(double R, double Theta, double Phi, string Shape){ - - double m_r, m_alpha, m_zeta; - - m_r = R*cos(Phi); - m_alpha = Theta; - m_zeta = R*sin(Phi); - - m_R.push_back(m_r); - m_Alpha.push_back(m_alpha); - m_Zeta.push_back(m_zeta); - m_Shape.push_back(Shape); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -void Dali::AddDetector2(double R, double Alpha, double Zeta, string Shape){ - m_R.push_back(R); - m_Alpha.push_back(Alpha); - m_Zeta.push_back(Zeta); - m_Shape.push_back(Shape); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - - - -G4LogicalVolume* Dali::BuildSquareDetector(){ - if(!m_SquareDetector){ - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - - - G4Element* H = new G4Element("Hydrogen","H" , 1., 1.01*g/mole); - - G4Isotope* Mg24 = new G4Isotope ("Mg24", 12, 24, 23.985041*g/mole); - G4Isotope* Mg25 = new G4Isotope ("Mg25", 12, 25, 24.985836*g/mole); - G4Isotope* Mg26 = new G4Isotope ("Mg26", 12, 26, 25.982592*g/mole); - G4Element* Mg= new G4Element("elMagnesium","Mg",3); - Mg->AddIsotope(Mg24, 78.99*perCent); - Mg->AddIsotope(Mg25, 10*perCent); - Mg->AddIsotope(Mg26, 11.01*perCent); - - G4Isotope* O16 = new G4Isotope ("O16", 8, 16, 15.99*g/mole); - G4Isotope* O17 = new G4Isotope ("O17", 8, 17, 17.00*g/mole); - G4Isotope* O18 = new G4Isotope ("O18", 8, 18, 18.00*g/mole); - G4Element* O= new G4Element("elOxygen","O",3); - O->AddIsotope(O16, 99.76*perCent); - O->AddIsotope(O17, 0.04*perCent); - O->AddIsotope(O18, 0.20*perCent); - - G4Material* MgO = new G4Material("MgO",3.6*g/cm3,2); - MgO->AddElement(Mg,1); - MgO->AddElement(O, 1); - - G4Element *elTl = new G4Element("Thallium","Tl",81.,204.383*g/mole ); - G4Material* NaI_Tl = new G4Material("NaI_Tl",3.6667*g/cm3, 2); - NaI_Tl->AddMaterial(MaterialManager::getInstance()->GetMaterialFromLibrary("NaI"),99.6*perCent); - NaI_Tl->AddElement(elTl,0.4*perCent); - - - - - - - G4Box* box_3can = new G4Box("Dali_3BoxCan", Dali_NS::Hight*0.5, - Dali_NS::Width*0.5*3, Dali_NS::Thickness*0.5); - G4Material* Aria = MaterialManager::getInstance()->GetMaterialFromLibrary("Air"); - Logic_ArrayDali_1 = new G4LogicalVolume(box_3can,Aria,"logic_ArrayDali",0,0,0); - - - - G4Box* box_can = new G4Box("Dali_BoxCan", Dali_NS::Hight*0.5, - Dali_NS::Width*0.5, Dali_NS::Thickness*0.5); - G4Material* DetectorCanMaterial = MaterialManager::getInstance()->GetMaterialFromLibrary("Al"); - m_SquareDetector_Can = new G4LogicalVolume(box_can,DetectorCanMaterial,"logic_Dali_Can",0,0,0); - G4VisAttributes* Can_Attributes = new G4VisAttributes(G4Colour(0.5,0.5,0.5)); - m_SquareDetector_Can->SetVisAttributes(Can_Attributes); - - G4Box* box_MgO = new G4Box("Dali_BoxMgO", Dali_NS::Hight*0.5-1*mm, - Dali_NS::Width*0.5-1*mm, Dali_NS::Thickness*0.5-1*mm); - - m_SquareDetector_CanMgO = new G4LogicalVolume(box_MgO,MgO,"logic_Dali_CanMg0",0,0,0); - - G4Box* box_crystal = new G4Box("Dali_BoxNaI", Dali_NS::Hight*0.5-2.4*mm, - Dali_NS::Width*0.5-2.4*mm, Dali_NS::Thickness*0.5-2.4*mm); - G4Material* DetectorMaterial = MaterialManager::getInstance()->GetMaterialFromLibrary(Dali_NS::Material); - m_SquareDetector_Crystal = new G4LogicalVolume(box_crystal,NaI_Tl,"logic_Dali_Box",0,0,0); - - G4ThreeVector positionnull = G4ThreeVector(0,0,0); - - // MgO Volume - - G4PVPlacement* physi_MgO = new G4PVPlacement(0, positionnull, - m_SquareDetector_CanMgO, - "MgO", - m_SquareDetector_Can, - false, - 0); - G4VisAttributes* MgO_Attributes = new G4VisAttributes(G4Colour(0.0,1.0,0.5)); - m_SquareDetector_CanMgO->SetVisAttributes(MgO_Attributes); - - - // NaI Volume - - G4PVPlacement* physi_NaI = new G4PVPlacement(0, positionnull, - m_SquareDetector_Crystal, - "Crystal NaI", - m_SquareDetector_CanMgO, - false, - 0); - - m_SquareDetector_Crystal->SetVisAttributes(m_VisSquare); - m_SquareDetector_Crystal->SetSensitiveDetector(m_DaliScorer); - - G4VPhysicalVolume* ArrayDali_1 = new G4PVReplica("ArrayDali_1", - m_SquareDetector_Can, - Logic_ArrayDali_1 , - kYAxis, - 3, - Dali_NS::Width, //????????? - 0); - - - - - - } - - return Logic_ArrayDali_1; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4LogicalVolume* Dali::BuildCylindricalDetector(){ - if(!m_CylindricalDetector){ - G4Tubs* tub = new G4Tubs("Dali_Cyl",0,Dali_NS::Radius, Dali_NS::Thickness*0.5,0,360*deg); - - G4Material* DetectorMaterial = MaterialManager::getInstance()->GetMaterialFromLibrary(Dali_NS::Material); - m_CylindricalDetector = new G4LogicalVolume(tub,DetectorMaterial,"logic_Dali_tub",0,0,0); - m_CylindricalDetector->SetVisAttributes(m_VisSquare); - m_CylindricalDetector->SetSensitiveDetector(m_DaliScorer); - - } - return m_CylindricalDetector; -} - -//....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 Dali::ReadConfiguration(NPL::InputParser parser){ - vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("Dali"); - if(NPOptionManager::getInstance()->GetVerboseLevel()) - cout << "//// " << blocks.size() << " detectors found " << endl; - - vector<string> cart = {"POS","Shape"}; - vector<string> sphe = {"R","Theta","Phi","Shape"}; - vector<string> cyli = {"R","Alpha","Zeta","Shape"}; - - for(unsigned int i = 0 ; i < blocks.size() ; i++){ - if(blocks[i]->HasTokenList(cart)){ - if(NPOptionManager::getInstance()->GetVerboseLevel()) - cout << endl << "//// Dali " << i+1 << endl; - - G4ThreeVector Pos = NPS::ConvertVector(blocks[i]->GetTVector3("POS","mm")); - string Shape = blocks[i]->GetString("Shape"); - AddDetector(Pos,Shape); - } - else if(blocks[i]->HasTokenList(sphe)){ - if(NPOptionManager::getInstance()->GetVerboseLevel()) - cout << endl << "//// Dali " << i+1 << endl; - double R = blocks[i]->GetDouble("R","mm"); - double Theta = blocks[i]->GetDouble("Theta","deg"); - double Phi = blocks[i]->GetDouble("Phi","deg"); - string Shape = blocks[i]->GetString("Shape"); - AddDetector(R,Theta,Phi,Shape); - } - else if(blocks[i]->HasTokenList(cyli)){ - if(NPOptionManager::getInstance()->GetVerboseLevel()) - cout << endl << "//// Dali " << i+1 << endl; - double R = blocks[i]->GetDouble("R","mm"); - double Alpha = blocks[i]->GetDouble("Alpha","deg"); - double Zeta = blocks[i]->GetDouble("Zeta","mm"); - string Shape = blocks[i]->GetString("Shape"); - AddDetector2(R,Alpha,Zeta,Shape); - } - 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 Dali::ConstructDetector(G4LogicalVolume* world){ - - - - for (unsigned short i = 0 ; i < m_R.size() ; i++) { - - G4double wX = m_R[i] * cos(m_Alpha[i] ) ; - G4double wY = m_R[i] * sin(m_Alpha[i] ) ; - G4double wZ = m_Zeta[i]; - G4ThreeVector Det_pos = G4ThreeVector(wX, wY, wZ) ; - - - - G4RotationMatrix* Rot = new G4RotationMatrix(); - - - - - - if(m_Zeta[i]>0){ - Rot->rotateY(180*deg); Rot->rotateZ(m_Alpha[i]); - } else{Rot->rotateZ(m_Alpha[i]);} - - - if(m_Shape[i] == "Cylindrical"){ - new G4PVPlacement(G4Transform3D(*Rot,Det_pos), - BuildCylindricalDetector(), - "Dali",world,false,i+1); - } - - else if(m_Shape[i] == "Square"){ - new G4PVPlacement(G4Transform3D(*Rot,Det_pos), - BuildSquareDetector(), - "Dali",world,false,i+1); - } - } -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -// Add Detector branch to the EventTree. -// Called After DetecorConstruction::AddDetector Method -void Dali::InitializeRootOutput(){ - RootOutput *pAnalysis = RootOutput::getInstance(); - TTree *pTree = pAnalysis->GetTree(); - if(!pTree->FindBranch("Dali")){ - pTree->Branch("Dali", "TDaliData", &m_Event) ; - } - pTree->SetBranchAddress("Dali", &m_Event) ; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -// Read sensitive part and fill the Root tree. -// Called at in the EventAction::EndOfEventAvtion -void Dali::ReadSensitive(const G4Event* ){ - m_Event->Clear(); - /////////// - // Calorimeter scorer - CalorimeterScorers::PS_Calorimeter* Scorer= (CalorimeterScorers::PS_Calorimeter*) m_DaliScorer->GetPrimitive(0); - - - - unsigned int size = Scorer->GetMult(); - // cout << "size " << size << endl; - for(unsigned int i = 0 ; i < size ; i++){ - vector<unsigned int> level = Scorer->GetLevel(i); - double Energy = RandGauss::shoot(Scorer->GetEnergy(i),Dali_NS::ResoEnergy); - // cout << Energy << endl; - if(Energy>Dali_NS::EnergyThreshold){ - double Time = RandGauss::shoot(Scorer->GetTime(i),Dali_NS::ResoTime); - int ArrayNbr = level[1]; - int DetectinsArrayNbr = level[0]+1; - int DetectorNbr = (ArrayNbr-1)*3+DetectinsArrayNbr; - m_Event->SetEnergy(DetectorNbr,Energy); - m_Event->SetTime(DetectorNbr,Time); - } - } -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//////////////////////////////////////////////////////////////// -void Dali::InitializeScorers() { - // This check is necessary in case the geometry is reloaded - bool already_exist = false; - vector<G4int> NestingLevel; - NestingLevel.push_back(2); - NestingLevel.push_back(3); - - m_DaliScorer = CheckScorer("DaliScorer",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", NestingLevel) ; - G4VPrimitiveScorer* Interaction= new InteractionScorers::PS_Interactions("Interaction",ms_InterCoord, 0) ; - //and register it to the multifunctionnal detector - m_DaliScorer->RegisterPrimitive(Calorimeter); - m_DaliScorer->RegisterPrimitive(Interaction); - G4SDManager::GetSDMpointer()->AddNewDetector(m_DaliScorer) ; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//////////////////////////////////////////////////////////////////////////////// -// Construct Method to be pass to the DetectorFactory // -//////////////////////////////////////////////////////////////////////////////// -NPS::VDetector* Dali::Construct(){ - return (NPS::VDetector*) new Dali(); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//////////////////////////////////////////////////////////////////////////////// -// Registering the construct method to the factory // -//////////////////////////////////////////////////////////////////////////////// -extern"C" { - class proxy_nps_Dali{ - public: - proxy_nps_Dali(){ - NPS::DetectorFactory::getInstance()->AddToken("Dali","Dali"); - NPS::DetectorFactory::getInstance()->AddDetector("Dali",Dali::Construct); - } - }; - - proxy_nps_Dali p_nps_Dali; -} diff --git a/NPSimulation/Detectors/Dali/Dali.cc.~1~ b/NPSimulation/Detectors/Dali/Dali.cc.~1~ deleted file mode 100644 index f81da00736576d00f5df26274f3785123725ae43..0000000000000000000000000000000000000000 --- a/NPSimulation/Detectors/Dali/Dali.cc.~1~ +++ /dev/null @@ -1,292 +0,0 @@ -/***************************************************************************** - * Copyright (C) 2009-2018 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: Elidiano Tronchin contact address: elidiano.tronchin@studenti.unipd.it * - * * - * Creation Date : septembre 2018 * - * Last update : * - *---------------------------------------------------------------------------* - * Decription: * - * This class describe Dali 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" - -// NPTool header -#include "Dali.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 Dali_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 = "NaI"; -} -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -// Dali Specific Method -Dali::Dali(){ - m_Event = new TDaliData() ; - m_DaliScorer = 0; - m_SquareDetector = 0; - m_CylindricalDetector = 0; - - - // RGB Color + Transparency - m_VisSquare = new G4VisAttributes(G4Colour(0, 1, 0, 0.5)); - m_VisCylinder = new G4VisAttributes(G4Colour(0, 0, 1, 0.5)); - -} - -Dali::~Dali(){ -} -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void Dali::AddDetector(G4ThreeVector POS, string Shape){ - // Convert the POS value to R theta Phi as Spherical coordinate is easier in G4 - m_R.push_back(POS.mag()); - m_Theta.push_back(POS.theta()); - m_Phi.push_back(POS.phi()); - m_Shape.push_back(Shape); -} - - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void Dali::AddDetector(double R, double Theta, double Phi, string Shape){ - m_R.push_back(R); - m_Theta.push_back(Theta); - m_Phi.push_back(Phi); - m_Shape.push_back(Shape); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4LogicalVolume* Dali::BuildSquareDetector(){ - if(!m_SquareDetector){ - G4Box* box = new G4Box("Dali_Box",Dali_NS::Width*0.5, - Dali_NS::Width*0.5,Dali_NS::Thickness*0.5); - - G4Material* DetectorMaterial = MaterialManager::getInstance()->GetMaterialFromLibrary(Dali_NS::Material); - m_SquareDetector = new G4LogicalVolume(box,DetectorMaterial,"logic_Dali_Box",0,0,0); - m_SquareDetector->SetVisAttributes(m_VisSquare); - m_SquareDetector->SetSensitiveDetector(m_DaliScorer); - } - return m_SquareDetector; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4LogicalVolume* Dali::BuildCylindricalDetector(){ - if(!m_CylindricalDetector){ - G4Tubs* tub = new G4Tubs("Dali_Cyl",0,Dali_NS::Radius,Dali_NS::Thickness*0.5,0,360*deg); - - G4Material* DetectorMaterial = MaterialManager::getInstance()->GetMaterialFromLibrary(Dali_NS::Material); - m_CylindricalDetector = new G4LogicalVolume(tub,DetectorMaterial,"logic_Dali_tub",0,0,0); - m_CylindricalDetector->SetVisAttributes(m_VisSquare); - m_CylindricalDetector->SetSensitiveDetector(m_DaliScorer); - - } - return m_CylindricalDetector; -} - -//....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 Dali::ReadConfiguration(NPL::InputParser parser){ - vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("Dali"); - if(NPOptionManager::getInstance()->GetVerboseLevel()) - cout << "//// " << blocks.size() << " detectors found " << endl; - - vector<string> cart = {"POS","Shape"}; - vector<string> sphe = {"R","Theta","Phi","Shape"}; - - for(unsigned int i = 0 ; i < blocks.size() ; i++){ - if(blocks[i]->HasTokenList(cart)){ - if(NPOptionManager::getInstance()->GetVerboseLevel()) - cout << endl << "//// Dali " << i+1 << endl; - - G4ThreeVector Pos = NPS::ConvertVector(blocks[i]->GetTVector3("POS","mm")); - string Shape = blocks[i]->GetString("Shape"); - AddDetector(Pos,Shape); - } - else if(blocks[i]->HasTokenList(sphe)){ - if(NPOptionManager::getInstance()->GetVerboseLevel()) - cout << endl << "//// Dali " << i+1 << endl; - double R = blocks[i]->GetDouble("R","mm"); - double Theta = blocks[i]->GetDouble("Theta","deg"); - double Phi = blocks[i]->GetDouble("Phi","deg"); - string Shape = blocks[i]->GetString("Shape"); - AddDetector(R,Theta,Phi,Shape); - } - 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 Dali::ConstructDetector(G4LogicalVolume* world){ - for (unsigned short i = 0 ; i < m_R.size() ; i++) { - - G4double wX = m_R[i] * sin(m_Theta[i] ) * cos(m_Phi[i] ) ; - G4double wY = m_R[i] * sin(m_Theta[i] ) * sin(m_Phi[i] ) ; - G4double wZ = m_R[i] * cos(m_Theta[i] ) ; - G4ThreeVector Det_pos = G4ThreeVector(wX, wY, wZ) ; - // So the face of the detector is at R instead of the middle - Det_pos+=Det_pos.unit()*Dali_NS::Thickness*0.5; - // Building Detector reference frame - G4double ii = cos(m_Theta[i]) * cos(m_Phi[i]); - G4double jj = cos(m_Theta[i]) * sin(m_Phi[i]); - G4double kk = -sin(m_Theta[i]); - 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(u,v,w); - - if(m_Shape[i] == "Cylindrical"){ - new G4PVPlacement(G4Transform3D(*Rot,Det_pos), - BuildCylindricalDetector(), - "Dali",world,false,i+1); - } - - else if(m_Shape[i] == "Square"){ - new G4PVPlacement(G4Transform3D(*Rot,Det_pos), - BuildSquareDetector(), - "Dali",world,false,i+1); - } - } -} -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -// Add Detector branch to the EventTree. -// Called After DetecorConstruction::AddDetector Method -void Dali::InitializeRootOutput(){ - RootOutput *pAnalysis = RootOutput::getInstance(); - TTree *pTree = pAnalysis->GetTree(); - if(!pTree->FindBranch("Dali")){ - pTree->Branch("Dali", "TDaliData", &m_Event) ; - } - pTree->SetBranchAddress("Dali", &m_Event) ; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -// Read sensitive part and fill the Root tree. -// Called at in the EventAction::EndOfEventAvtion -void Dali::ReadSensitive(const G4Event* ){ - m_Event->Clear(); - - /////////// - // Calorimeter scorer - CalorimeterScorers::PS_Calorimeter* Scorer= (CalorimeterScorers::PS_Calorimeter*) m_DaliScorer->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),Dali_NS::ResoEnergy); - if(Energy>Dali_NS::EnergyThreshold){ - double Time = RandGauss::shoot(Scorer->GetTime(i),Dali_NS::ResoTime); - int DetectorNbr = level[0]; - m_Event->SetEnergy(DetectorNbr,Energy); - m_Event->SetTime(DetectorNbr,Time); - } - } -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//////////////////////////////////////////////////////////////// -void Dali::InitializeScorers() { - // This check is necessary in case the geometry is reloaded - bool already_exist = false; - m_DaliScorer = CheckScorer("DaliScorer",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_DaliScorer->RegisterPrimitive(Calorimeter); - m_DaliScorer->RegisterPrimitive(Interaction); - G4SDManager::GetSDMpointer()->AddNewDetector(m_DaliScorer) ; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//////////////////////////////////////////////////////////////////////////////// -// Construct Method to be pass to the DetectorFactory // -//////////////////////////////////////////////////////////////////////////////// -NPS::VDetector* Dali::Construct(){ - return (NPS::VDetector*) new Dali(); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//////////////////////////////////////////////////////////////////////////////// -// Registering the construct method to the factory // -//////////////////////////////////////////////////////////////////////////////// -extern"C" { - class proxy_nps_Dali{ - public: - proxy_nps_Dali(){ - NPS::DetectorFactory::getInstance()->AddToken("Dali","Dali"); - NPS::DetectorFactory::getInstance()->AddDetector("Dali",Dali::Construct); - } - }; - - proxy_nps_Dali p_nps_Dali; -} diff --git a/NPSimulation/Detectors/Dali/Dali.cc.~2~ b/NPSimulation/Detectors/Dali/Dali.cc.~2~ deleted file mode 100644 index 5923ec94df6825c9cdb5ede5b892988bb5034191..0000000000000000000000000000000000000000 --- a/NPSimulation/Detectors/Dali/Dali.cc.~2~ +++ /dev/null @@ -1,294 +0,0 @@ -/***************************************************************************** - * Copyright (C) 2009-2018 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: Elidiano Tronchin contact address: elidiano.tronchin@studenti.unipd.it * - * * - * Creation Date : septembre 2018 * - * Last update : * - *---------------------------------------------------------------------------* - * Decription: * - * This class describe Dali 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" - -// NPTool header -#include "Dali.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 Dali_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 = 44.96*mm ; - const double Hight = 160.02*mm ; - const double Thickness = 80.01*mm ; - const string Material = "NaI(Tl)"; -} -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -// Dali Specific Method -Dali::Dali(){ - m_Event = new TDaliData() ; - m_DaliScorer = 0; - m_SquareDetector = 0; - m_CylindricalDetector = 0; - - - // RGB Color + Transparency - m_VisSquare = new G4VisAttributes(G4Colour(0, 1, 0, 0.5)); - m_VisCylinder = new G4VisAttributes(G4Colour(0, 0, 1, 0.5)); - -} - -Dali::~Dali(){ -} -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void Dali::AddDetector(G4ThreeVector POS, string Shape){ - // Convert the POS value to R theta Phi as Spherical coordinate is easier in G4 - m_R.push_back(POS.mag()); - m_Theta.push_back(POS.theta()); - m_Phi.push_back(POS.phi()); - m_Shape.push_back(Shape); -} - - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void Dali::AddDetector(double R, double Theta, double Phi, string Shape){ - m_R.push_back(R); - m_Theta.push_back(Theta); - m_Phi.push_back(Phi); - m_Shape.push_back(Shape); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4LogicalVolume* Dali::BuildSquareDetector(){ - if(!m_SquareDetector){ - G4Box* box = new G4Box("Dali_Box", Dali_NS::Width*0.5, - Dali_NS::Hight*0.5, Dali_NS::Thickness*0.5); - - G4Material* DetectorMaterial = MaterialManager::getInstance()->GetMaterialFromLibrary(Dali_NS::Material); - m_SquareDetector = new G4LogicalVolume(box,DetectorMaterial,"logic_Dali_Box",0,0,0); - m_SquareDetector_Can = new G4LogicalVolume(box,DetectorMaterial,"logic_Dali_Can",0,0,0); - m_SquareDetector->SetVisAttributes(m_VisSquare); - m_SquareDetector->SetSensitiveDetector(m_DaliScorer); - } - return m_SquareDetector; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4LogicalVolume* Dali::BuildCylindricalDetector(){ - if(!m_CylindricalDetector){ - G4Tubs* tub = new G4Tubs("Dali_Cyl",0,Dali_NS::Radius, Dali_NS::Thickness*0.5,0,360*deg); - - G4Material* DetectorMaterial = MaterialManager::getInstance()->GetMaterialFromLibrary(Dali_NS::Material); - m_CylindricalDetector = new G4LogicalVolume(tub,DetectorMaterial,"logic_Dali_tub",0,0,0); - m_CylindricalDetector->SetVisAttributes(m_VisSquare); - m_CylindricalDetector->SetSensitiveDetector(m_DaliScorer); - - } - return m_CylindricalDetector; -} - -//....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 Dali::ReadConfiguration(NPL::InputParser parser){ - vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("Dali"); - if(NPOptionManager::getInstance()->GetVerboseLevel()) - cout << "//// " << blocks.size() << " detectors found " << endl; - - vector<string> cart = {"POS","Shape"}; - vector<string> sphe = {"R","Theta","Phi","Shape"}; - - for(unsigned int i = 0 ; i < blocks.size() ; i++){ - if(blocks[i]->HasTokenList(cart)){ - if(NPOptionManager::getInstance()->GetVerboseLevel()) - cout << endl << "//// Dali " << i+1 << endl; - - G4ThreeVector Pos = NPS::ConvertVector(blocks[i]->GetTVector3("POS","mm")); - string Shape = blocks[i]->GetString("Shape"); - AddDetector(Pos,Shape); - } - else if(blocks[i]->HasTokenList(sphe)){ - if(NPOptionManager::getInstance()->GetVerboseLevel()) - cout << endl << "//// Dali " << i+1 << endl; - double R = blocks[i]->GetDouble("R","mm"); - double Theta = blocks[i]->GetDouble("Theta","deg"); - double Phi = blocks[i]->GetDouble("Phi","deg"); - string Shape = blocks[i]->GetString("Shape"); - AddDetector(R,Theta,Phi,Shape); - } - 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 Dali::ConstructDetector(G4LogicalVolume* world){ - for (unsigned short i = 0 ; i < m_R.size() ; i++) { - - G4double wX = m_R[i] * sin(m_Theta[i] ) * cos(m_Phi[i] ) ; - G4double wY = m_R[i] * sin(m_Theta[i] ) * sin(m_Phi[i] ) ; - G4double wZ = m_R[i] * cos(m_Theta[i] ) ; - G4ThreeVector Det_pos = G4ThreeVector(wX, wY, wZ) ; - // So the face of the detector is at R instead of the middle - Det_pos+=Det_pos.unit()*Dali_NS::Thickness*0.5; - // Building Detector reference frame - G4double ii = cos(m_Theta[i]) * cos(m_Phi[i]); - G4double jj = cos(m_Theta[i]) * sin(m_Phi[i]); - G4double kk = -sin(m_Theta[i]); - 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(u,v,w); - - if(m_Shape[i] == "Cylindrical"){ - new G4PVPlacement(G4Transform3D(*Rot,Det_pos), - BuildCylindricalDetector(), - "Dali",world,false,i+1); - } - - else if(m_Shape[i] == "Square"){ - new G4PVPlacement(G4Transform3D(*Rot,Det_pos), - BuildSquareDetector(), - "Dali",world,false,i+1); - } - } -} -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -// Add Detector branch to the EventTree. -// Called After DetecorConstruction::AddDetector Method -void Dali::InitializeRootOutput(){ - RootOutput *pAnalysis = RootOutput::getInstance(); - TTree *pTree = pAnalysis->GetTree(); - if(!pTree->FindBranch("Dali")){ - pTree->Branch("Dali", "TDaliData", &m_Event) ; - } - pTree->SetBranchAddress("Dali", &m_Event) ; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -// Read sensitive part and fill the Root tree. -// Called at in the EventAction::EndOfEventAvtion -void Dali::ReadSensitive(const G4Event* ){ - m_Event->Clear(); - - /////////// - // Calorimeter scorer - CalorimeterScorers::PS_Calorimeter* Scorer= (CalorimeterScorers::PS_Calorimeter*) m_DaliScorer->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),Dali_NS::ResoEnergy); - if(Energy>Dali_NS::EnergyThreshold){ - double Time = RandGauss::shoot(Scorer->GetTime(i),Dali_NS::ResoTime); - int DetectorNbr = level[0]; - m_Event->SetEnergy(DetectorNbr,Energy); - m_Event->SetTime(DetectorNbr,Time); - } - } -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//////////////////////////////////////////////////////////////// -void Dali::InitializeScorers() { - // This check is necessary in case the geometry is reloaded - bool already_exist = false; - m_DaliScorer = CheckScorer("DaliScorer",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_DaliScorer->RegisterPrimitive(Calorimeter); - m_DaliScorer->RegisterPrimitive(Interaction); - G4SDManager::GetSDMpointer()->AddNewDetector(m_DaliScorer) ; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//////////////////////////////////////////////////////////////////////////////// -// Construct Method to be pass to the DetectorFactory // -//////////////////////////////////////////////////////////////////////////////// -NPS::VDetector* Dali::Construct(){ - return (NPS::VDetector*) new Dali(); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//////////////////////////////////////////////////////////////////////////////// -// Registering the construct method to the factory // -//////////////////////////////////////////////////////////////////////////////// -extern"C" { - class proxy_nps_Dali{ - public: - proxy_nps_Dali(){ - NPS::DetectorFactory::getInstance()->AddToken("Dali","Dali"); - NPS::DetectorFactory::getInstance()->AddDetector("Dali",Dali::Construct); - } - }; - - proxy_nps_Dali p_nps_Dali; -} diff --git a/NPSimulation/Detectors/Dali/Dali.hh b/NPSimulation/Detectors/Dali/Dali.hh index 601a021de82e2e32760ac010b6e9a2370b928c79..2da7f65861611b9157b8b92a4a9ecf012c10de54 100644 --- a/NPSimulation/Detectors/Dali/Dali.hh +++ b/NPSimulation/Detectors/Dali/Dali.hh @@ -63,9 +63,15 @@ class Dali : public NPS::VDetector{ private: G4LogicalVolume* m_SquareDetector; G4LogicalVolume* m_SquareDetector_Can; + G4LogicalVolume* m_Square2Detector_Can; G4LogicalVolume* m_CylindricalDetector; G4LogicalVolume* m_SquareDetector_CanMgO; G4LogicalVolume* m_SquareDetector_Crystal; + G4LogicalVolume* lAlPMT; + G4LogicalVolume* lMuPMT; + G4LogicalVolume* lTopPlatePMT; + G4LogicalVolume* lGlassPMT; + G4LogicalVolume* AriaExtrude; G4LogicalVolume* Logic_ArrayDali_1; //////////////////////////////////////////////////// diff --git a/NPSimulation/Detectors/Dali/Dali.hh.~1~ b/NPSimulation/Detectors/Dali/Dali.hh.~1~ deleted file mode 100644 index 2a0df874836328a57c77b2c38903d99fc026a850..0000000000000000000000000000000000000000 --- a/NPSimulation/Detectors/Dali/Dali.hh.~1~ +++ /dev/null @@ -1,117 +0,0 @@ -#ifndef Dali_h -#define Dali_h 1 -/***************************************************************************** - * Copyright (C) 2009-2018 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: Elidiano Tronchin contact address: elidiano.tronchin@studenti.unipd.it * - * * - * Creation Date : septembre 2018 * - * Last update : * - *---------------------------------------------------------------------------* - * Decription: * - * This class describe Dali 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" - -// NPTool header -#include "NPSVDetector.hh" -#include "TDaliData.h" -#include "NPInputParser.h" - -class Dali : public NPS::VDetector{ - //////////////////////////////////////////////////// - /////// Default Constructor and Destructor ///////// - //////////////////////////////////////////////////// - public: - Dali() ; - virtual ~Dali() ; - - //////////////////////////////////////////////////// - /////// Specific Function of this Class /////////// - //////////////////////////////////////////////////// - public: - // Cartesian - void AddDetector(G4ThreeVector POS, string Shape); - // Spherical - void AddDetector(double R,double Theta,double Phi,string Shape); - - - G4LogicalVolume* BuildSquareDetector(); - G4LogicalVolume* BuildCylindricalDetector(); - - private: - G4LogicalVolume* m_SquareDetector; - G4LogicalVolume* m_CylindricalDetector; - - //////////////////////////////////////////////////// - ////// 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 - // Initialize all Scorer used by the MUST2Array - void InitializeScorers() ; - - // Associated Scorer - G4MultiFunctionalDetector* m_DaliScorer ; - //////////////////////////////////////////////////// - ///////////Event class to store Data//////////////// - //////////////////////////////////////////////////// - private: - TDaliData* m_Event ; - - //////////////////////////////////////////////////// - ///////////////Private intern Data////////////////// - //////////////////////////////////////////////////// - private: // Geometry - // Detector Coordinate - vector<double> m_R; - vector<double> m_Theta; - vector<double> m_Phi; - - // Shape type - vector<string> m_Shape ; - - // Visualisation Attribute - G4VisAttributes* m_VisSquare; - G4VisAttributes* m_VisCylinder; - - // Needed for dynamic loading of the library - public: - static NPS::VDetector* Construct(); -}; -#endif diff --git a/NPSimulation/Detectors/Dali/Dali.hh.~2~ b/NPSimulation/Detectors/Dali/Dali.hh.~2~ deleted file mode 100644 index ddbb44ac30f6946bda987e15c099cce89f2a1c20..0000000000000000000000000000000000000000 --- a/NPSimulation/Detectors/Dali/Dali.hh.~2~ +++ /dev/null @@ -1,119 +0,0 @@ -#ifndef Dali_h -#define Dali_h 1 -/***************************************************************************** - * Copyright (C) 2009-2018 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: Elidiano Tronchin contact address: elidiano.tronchin@studenti.unipd.it * - * * - * Creation Date : septembre 2018 * - * Last update : * - *---------------------------------------------------------------------------* - * Decription: * - * This class describe Dali 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" - -// NPTool header -#include "NPSVDetector.hh" -#include "TDaliData.h" -#include "NPInputParser.h" - -class Dali : public NPS::VDetector{ - //////////////////////////////////////////////////// - /////// Default Constructor and Destructor ///////// - //////////////////////////////////////////////////// - public: - Dali() ; - virtual ~Dali() ; - - //////////////////////////////////////////////////// - /////// Specific Function of this Class /////////// - //////////////////////////////////////////////////// - public: - // Cartesian - void AddDetector(G4ThreeVector POS, string Shape); - // Spherical - void AddDetector(double R,double Theta,double Phi,string Shape); - - - G4LogicalVolume* BuildSquareDetector(); - G4LogicalVolume* BuildCylindricalDetector(); - - private: - G4LogicalVolume* m_SquareDetector; - G4LogicalVolume* m_SquareDetector_Can; - G4LogicalVolume* m_CylindricalDetector; - G4LogicalVolume* m_SquareDetector_CanMgO; - - //////////////////////////////////////////////////// - ////// 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 - // Initialize all Scorer used by the MUST2Array - void InitializeScorers() ; - - // Associated Scorer - G4MultiFunctionalDetector* m_DaliScorer ; - //////////////////////////////////////////////////// - ///////////Event class to store Data//////////////// - //////////////////////////////////////////////////// - private: - TDaliData* m_Event ; - - //////////////////////////////////////////////////// - ///////////////Private intern Data////////////////// - //////////////////////////////////////////////////// - private: // Geometry - // Detector Coordinate - vector<double> m_R; - vector<double> m_Theta; - vector<double> m_Phi; - - // Shape type - vector<string> m_Shape ; - - // Visualisation Attribute - G4VisAttributes* m_VisSquare; - G4VisAttributes* m_VisCylinder; - - // Needed for dynamic loading of the library - public: - static NPS::VDetector* Construct(); -}; -#endif diff --git a/NPSimulation/Detectors/Dali/Dali.hh.~3~ b/NPSimulation/Detectors/Dali/Dali.hh.~3~ deleted file mode 100644 index 3e37e84519fd2c0c15e6a47409b7b7f97fdb166b..0000000000000000000000000000000000000000 --- a/NPSimulation/Detectors/Dali/Dali.hh.~3~ +++ /dev/null @@ -1,121 +0,0 @@ -#ifndef Dali_h -#define Dali_h 1 -/***************************************************************************** - * Copyright (C) 2009-2018 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: Elidiano Tronchin contact address: elidiano.tronchin@studenti.unipd.it * - * * - * Creation Date : septembre 2018 * - * Last update : * - *---------------------------------------------------------------------------* - * Decription: * - * This class describe Dali 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" - -// NPTool header -#include "NPSVDetector.hh" -#include "TDaliData.h" -#include "NPInputParser.h" - -class Dali : public NPS::VDetector{ - //////////////////////////////////////////////////// - /////// Default Constructor and Destructor ///////// - //////////////////////////////////////////////////// - public: - Dali() ; - virtual ~Dali() ; - - //////////////////////////////////////////////////// - /////// Specific Function of this Class /////////// - //////////////////////////////////////////////////// - public: - // Cartesian - void AddDetector(G4ThreeVector POS, string Shape); - // Spherical - void AddDetector(double R,double Theta,double Phi,string Shape); - - - G4LogicalVolume* BuildSquareDetector(); - G4LogicalVolume* BuildCylindricalDetector(); - - private: - G4LogicalVolume* m_SquareDetector; - G4LogicalVolume* m_SquareDetector_Can; - G4LogicalVolume* m_CylindricalDetector; - G4LogicalVolume* m_SquareDetector_CanMgO; - G4LogicalVolume* m_SquareDetector_Crystal; - G4LogicalVolume* Logic_ArrayDali_1; - - //////////////////////////////////////////////////// - ////// 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 - // Initialize all Scorer used by the MUST2Array - void InitializeScorers() ; - - // Associated Scorer - G4MultiFunctionalDetector* m_DaliScorer ; - //////////////////////////////////////////////////// - ///////////Event class to store Data//////////////// - //////////////////////////////////////////////////// - private: - TDaliData* m_Event ; - - //////////////////////////////////////////////////// - ///////////////Private intern Data////////////////// - //////////////////////////////////////////////////// - private: // Geometry - // Detector Coordinate - vector<double> m_R; - vector<double> m_Theta; - vector<double> m_Phi; - - // Shape type - vector<string> m_Shape ; - - // Visualisation Attribute - G4VisAttributes* m_VisSquare; - G4VisAttributes* m_VisCylinder; - - // Needed for dynamic loading of the library - public: - static NPS::VDetector* Construct(); -}; -#endif diff --git a/NPSimulation/Detectors/Dali/Dali.hh.~4~ b/NPSimulation/Detectors/Dali/Dali.hh.~4~ deleted file mode 100644 index 3bb254f29d76ccc7639fc1c716998c230b0f6cd2..0000000000000000000000000000000000000000 --- a/NPSimulation/Detectors/Dali/Dali.hh.~4~ +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef Dali_h -#define Dali_h 1 -/***************************************************************************** - * Copyright (C) 2009-2018 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: Elidiano Tronchin contact address: elidiano.tronchin@studenti.unipd.it * - * * - * Creation Date : septembre 2018 * - * Last update : * - *---------------------------------------------------------------------------* - * Decription: * - * This class describe Dali 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" - -// NPTool header -#include "NPSVDetector.hh" -#include "TDaliData.h" -#include "NPInputParser.h" - -class Dali : public NPS::VDetector{ - //////////////////////////////////////////////////// - /////// Default Constructor and Destructor ///////// - //////////////////////////////////////////////////// - public: - Dali() ; - virtual ~Dali() ; - - //////////////////////////////////////////////////// - /////// Specific Function of this Class /////////// - //////////////////////////////////////////////////// - public: - // Cartesian - void AddDetector(G4ThreeVector POS, string Shape); - // Spherical - void AddDetector(double R,double Theta,double Phi,string Shape); - //Cylindrical - void AddDetector(double R,double Alpha,double Zeta,string Shape); - - G4LogicalVolume* BuildSquareDetector(); - G4LogicalVolume* BuildCylindricalDetector(); - - private: - G4LogicalVolume* m_SquareDetector; - G4LogicalVolume* m_SquareDetector_Can; - G4LogicalVolume* m_CylindricalDetector; - G4LogicalVolume* m_SquareDetector_CanMgO; - G4LogicalVolume* m_SquareDetector_Crystal; - G4LogicalVolume* Logic_ArrayDali_1; - - //////////////////////////////////////////////////// - ////// 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 - // Initialize all Scorer used by the MUST2Array - void InitializeScorers() ; - - // Associated Scorer - G4MultiFunctionalDetector* m_DaliScorer ; - //////////////////////////////////////////////////// - ///////////Event class to store Data//////////////// - //////////////////////////////////////////////////// - private: - TDaliData* m_Event ; - - //////////////////////////////////////////////////// - ///////////////Private intern Data////////////////// - //////////////////////////////////////////////////// - private: // Geometry - // Detector Coordinate - vector<double> m_R; - vector<double> m_Zeta; - vector<double> m_Alpha; - - // Shape type - vector<string> m_Shape ; - - // Visualisation Attribute - G4VisAttributes* m_VisSquare; - G4VisAttributes* m_VisCylinder; - - // Needed for dynamic loading of the library - public: - static NPS::VDetector* Construct(); -}; -#endif diff --git a/NPSimulation/Detectors/Dali/Dali.hh.~5~ b/NPSimulation/Detectors/Dali/Dali.hh.~5~ deleted file mode 100644 index e33d910378e3b3b0ef8d92ad5a87a69404d29142..0000000000000000000000000000000000000000 --- a/NPSimulation/Detectors/Dali/Dali.hh.~5~ +++ /dev/null @@ -1,123 +0,0 @@ -#ifndef Dali_h -#define Dali_h 1 -/***************************************************************************** - * Copyright (C) 2009-2018 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: Elidiano Tronchin contact address: elidiano.tronchin@studenti.unipd.it * - * * - * Creation Date : septembre 2018 * - * Last update : * - *---------------------------------------------------------------------------* - * Decription: * - * This class describe Dali simulation * - * * - *---------------------------------------------------------------------------* - * Comment: * - * * - *****************************************************************************/ - -// C++ header -#include <string> -#include <vector> -#include <cmath> -using namespace std; - -// G4 headers -#include "G4ThreeVector.hh" -#include "G4RotationMatrix.hh" -#include "G4LogicalVolume.hh" -#include "G4MultiFunctionalDetector.hh" - -// NPTool header -#include "NPSVDetector.hh" -#include "TDaliData.h" -#include "NPInputParser.h" - -class Dali : public NPS::VDetector{ - //////////////////////////////////////////////////// - /////// Default Constructor and Destructor ///////// - //////////////////////////////////////////////////// - public: - Dali() ; - virtual ~Dali() ; - - //////////////////////////////////////////////////// - /////// Specific Function of this Class /////////// - //////////////////////////////////////////////////// - public: - // Cartesian - void AddDetector(G4ThreeVector POS, string Shape); - // Spherical - void AddDetector(double R,double Theta,double Phi,string Shape); - //Cylindrical - void AddDetector2(double R,double Alpha,double Zeta,string Shape); - - G4LogicalVolume* BuildSquareDetector(); - G4LogicalVolume* BuildCylindricalDetector(); - - private: - G4LogicalVolume* m_SquareDetector; - G4LogicalVolume* m_SquareDetector_Can; - G4LogicalVolume* m_CylindricalDetector; - G4LogicalVolume* m_SquareDetector_CanMgO; - G4LogicalVolume* m_SquareDetector_Crystal; - G4LogicalVolume* Logic_ArrayDali_1; - - //////////////////////////////////////////////////// - ////// 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 - // Initialize all Scorer used by the MUST2Array - void InitializeScorers() ; - - // Associated Scorer - G4MultiFunctionalDetector* m_DaliScorer ; - //////////////////////////////////////////////////// - ///////////Event class to store Data//////////////// - //////////////////////////////////////////////////// - private: - TDaliData* m_Event ; - - //////////////////////////////////////////////////// - ///////////////Private intern Data////////////////// - //////////////////////////////////////////////////// - private: // Geometry - // Detector Coordinate - vector<double> m_Zeta; - vector<double> m_R; - vector<double> m_Alpha; - - // Shape type - vector<string> m_Shape ; - - // Visualisation Attribute - G4VisAttributes* m_VisSquare; - G4VisAttributes* m_VisCylinder; - - // Needed for dynamic loading of the library - public: - static NPS::VDetector* Construct(); -}; -#endif diff --git a/NPSimulation/Detectors/Dali/nomeoke.C b/NPSimulation/Detectors/Dali/nomeoke.C deleted file mode 100644 index 472031271a0da973e246a78598b2b09feaac2fcb..0000000000000000000000000000000000000000 --- a/NPSimulation/Detectors/Dali/nomeoke.C +++ /dev/null @@ -1,4 +0,0 @@ -void nomeoke() -{ - TEveManager::Create(); -} diff --git a/NPSimulation/Detectors/Minos/Minos.cc b/NPSimulation/Detectors/Minos/Minos.cc index b6e47eb399edd72c63440126052c5a2c4ba1234f..bd1407a50cba2f0ef11e609b949ff018adaa53f5 100644 --- a/NPSimulation/Detectors/Minos/Minos.cc +++ b/NPSimulation/Detectors/Minos/Minos.cc @@ -1,18 +1,18 @@ /***************************************************************************** - * Copyright (C) 2009-2018 this file is part of the NPTool Project * + * Copyright (C) 2009-2018 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: Elidiano Tronchin contact address: tronchin@lpccaen.in2p3.fr * + * Original Author: E. Tronchin contact address: tronchin@lpccaen.in2p3.fr * * * - * Creation Date : October 2018 * + * Creation Date : October 2018 * * Last update : * *---------------------------------------------------------------------------* * Decription: * - * This class describe Minos simulation * + * This class describe Minos simulation * * * *---------------------------------------------------------------------------* * Comment: * @@ -42,6 +42,8 @@ #include "Minos.hh" #include "CalorimeterScorers.hh" #include "InteractionScorers.hh" +#include "TPCScorers.hh" + #include "RootOutput.h" #include "MaterialManager.hh" #include "NPSDetectorFactory.hh" @@ -72,14 +74,33 @@ namespace Minos_NS{ // Minos Specific Method Minos::Minos(){ m_Event = new TMinosData() ; - m_MinosScorer = 0; + m_MinosTargetScorer = 0; + m_MinosTPCScorer = 0; m_SquareDetector = 0; m_CylindricalDetector = 0; - + m_ReactionRegion=NULL; // RGB Color + Transparency m_VisSquare = new G4VisAttributes(G4Colour(0, 1, 0, 0.5)); m_VisCylinder = new G4VisAttributes(G4Colour(0, 0, 1, 0.5)); + solidTarget=0; + logicTarget=0; + solidChamber=0; + logicChamber=0; + solidTPC=0; + logicTPC=0; + solidWindow0=0; + logicWindow0=0; + solidWindow1=0; + logicWindow1=0; + solidWindow2=0; + logicWindow2=0; + solidInnerRohacell=0; + logicInnerRohacell=0; + solidOuterRohacell=0; + logicOuterRohacell=0; + solidKapton=0; + logicKapton=0; } @@ -104,18 +125,18 @@ void Minos::AddDetector(double R, double Theta, double Phi, string Shape){ } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4LogicalVolume* Minos::BuildSquareDetector(){ - if(!m_SquareDetector){ - G4Box* box = new G4Box("Minos_Box",Minos_NS::Width*0.5, - Minos_NS::Width*0.5,Minos_NS::Thickness*0.5); - - G4Material* DetectorMaterial = MaterialManager::getInstance()->GetMaterialFromLibrary(Minos_NS::Material); - m_SquareDetector = new G4LogicalVolume(box,DetectorMaterial,"logic_Minos_Box",0,0,0); - m_SquareDetector->SetVisAttributes(m_VisSquare); - m_SquareDetector->SetSensitiveDetector(m_MinosScorer); - } - return m_SquareDetector; -} +// G4LogicalVolume* Minos::BuildSquareDetector(){ +// if(!m_SquareDetector){ +// G4Box* box = new G4Box("Minos_Box",Minos_NS::Width*0.5, +// Minos_NS::Width*0.5,Minos_NS::Thickness*0.5); + +// G4Material* DetectorMaterial = MaterialManager::getInstance()->GetMaterialFromLibrary(Minos_NS::Material); +// m_SquareDetector = new G4LogicalVolume(box,DetectorMaterial,"logic_Minos_Box",0,0,0); +// m_SquareDetector->SetVisAttributes(m_VisSquare); +// m_SquareDetector->SetSensitiveDetector(m_MinosTargetScorer); +// } +// return m_SquareDetector; +// } @@ -124,18 +145,18 @@ G4LogicalVolume* Minos::BuildSquareDetector(){ void Minos::DefineMaterials() { //This function illustrates the possible ways to define materials - + G4String symbol; //a=mass of a mole; G4double a, z, density; //z=mean number of protons; - + G4int ncomponents, natoms; G4double fractionmass; - + // // define Elements // - + G4Element* H = new G4Element("Hydrogen",symbol="H" , z= 1., a= 1.01*g/mole); G4Element* C = new G4Element("Carbon" ,symbol="C" , z= 6., a= 12.01*g/mole); G4Element* F = new G4Element("Fluorin" ,symbol="F" , z= 9., a= 19.0*g/mole); @@ -144,16 +165,16 @@ void Minos::DefineMaterials() G4Element* Ar = new G4Element("Argon", symbol="Ar", z=18, a=39.948*g/mole); G4Element* Fe = new G4Element("Fer",symbol="Fe" , z= 26., a= 55.9*g/mole); G4Element* Cr = new G4Element("Chrome",symbol="Cr" , z= 24., a= 52.*g/mole); - - + + new G4Material("Aluminium", z=13., a=26.98*g/mole, density=2.700*g/cm3); new G4Material("liquidArgon", z=18., a= 39.95*g/mole, density= 1.390*g/cm3); new G4Material("Lead" , z=82., a= 207.19*g/mole, density= 11.35*g/cm3); new G4Material("Silicium", z=14., a=28.09*g/mole, density=2.330*g/cm3); new G4Material("Titanium", z=22., a=47.87*g/mole, density=4.510*g/cm3); - - + + G4Material* iso = new G4Material("isobutane", density=0.002506*g/cm3, ncomponents=2); iso->AddElement(C, natoms=4); iso->AddElement(H, natoms=10); @@ -170,35 +191,35 @@ void Minos::DefineMaterials() mix->AddElement(Ar, fractionmass=82.*perCent); // overwrite computed meanExcitationEnergy with ICRU recommended value mix->GetIonisation()->SetMeanExcitationEnergy(25.0*eV); - + G4Material* Ar_CF4_95_5 = new G4Material("Ar_CF4_95_5", density= 0.0017611*g/cm3, ncomponents=2); Ar_CF4_95_5->AddMaterial(CF4, fractionmass=5.*perCent); Ar_CF4_95_5->AddElement(Ar, fractionmass=95.*perCent); Ar_CF4_95_5->GetIonisation()->SetMeanExcitationEnergy(30.0*eV); - + G4Material* Ar_CF4_90_10 = new G4Material("Ar_CF4_90_10", density= 0.0018610*g/cm3, ncomponents=2); Ar_CF4_90_10->AddMaterial(CF4, fractionmass=10.*perCent); Ar_CF4_90_10->AddElement(Ar, fractionmass=90.*perCent); Ar_CF4_90_10->GetIonisation()->SetMeanExcitationEnergy(25.0*eV); - + G4Material* Ar_iso_97_3 = new G4Material("Ar_iso_97_3", density= 0.0016838*g/cm3, ncomponents=2); Ar_iso_97_3->AddMaterial(iso, fractionmass=3.*perCent); Ar_iso_97_3->AddElement(Ar, fractionmass=97.*perCent); Ar_iso_97_3->GetIonisation()->SetMeanExcitationEnergy(25.0*eV); - + G4Material* Ar_iso_95_5 = new G4Material("Ar_iso_95_5", density= 0.0016990*g/cm3, ncomponents=2); Ar_iso_95_5->AddMaterial(iso, fractionmass=5.*perCent); Ar_iso_95_5->AddElement(Ar, fractionmass=95.*perCent); Ar_iso_95_5->GetIonisation()->SetMeanExcitationEnergy(25.0*eV); - + G4Material* LH2 = new G4Material("LH2", density= 0.0715*g/cm3, ncomponents=1); LH2->AddElement(H, natoms=2); - + G4Material* Myl = new G4Material("Mylar", density= 1.397*g/cm3, ncomponents=3); Myl->AddElement(C, natoms=10); @@ -210,45 +231,45 @@ void Minos::DefineMaterials() Epo->AddElement(C, natoms=18); Epo->AddElement(H, natoms= 20); Epo->AddElement(O, natoms= 3); - + G4Material* Air = new G4Material("Air" , density= 1.290*mg/cm3, ncomponents=3); Air->AddElement(N, fractionmass=0.781); Air->AddElement(O, fractionmass=0.21); Air->AddElement(Ar, fractionmass=0.009); - - + + G4Material* Vacuum = new G4Material("Galactic", z=1., a=1.01*g/mole,density= universe_mean_density, - kStateGas, 2.73*kelvin, 3.e-18*pascal); - + kStateGas, 2.73*kelvin, 3.e-18*pascal); + G4Material* beam = new G4Material("Beam", density= 1.e-5*g/cm3, ncomponents=1, - kStateGas, STP_Temperature, 2.e-2*bar); + kStateGas, STP_Temperature, 2.e-2*bar); beam->AddMaterial(Air, fractionmass=1.); - + G4Material* Inox = new G4Material("Inox", density= 8.02*g/cm3, ncomponents=3); Inox->AddElement(C, fractionmass=0.001); Inox->AddElement(Fe, fractionmass=0.829); Inox->AddElement(Cr, fractionmass=0.17); - + G4Material* Kapton = new G4Material("Kapton", density= 1.42*g/cm3, ncomponents=4); Kapton->AddElement(C, fractionmass=0.691133); Kapton->AddElement(H, fractionmass=0.026362); Kapton->AddElement(O, fractionmass=0.209235); Kapton->AddElement(N, fractionmass=0.073270); - + G4Material* Rohacell = new G4Material("Rohacell", density= 0.075*g/cm3, ncomponents=4); Rohacell->AddElement(C, fractionmass=0.6014); Rohacell->AddElement(H, fractionmass=0.0805); Rohacell->AddElement(O, fractionmass=0.3154); Rohacell->AddElement(N, fractionmass=0.00276); - + //G4cout << *(G4Material::GetMaterialTable()) << G4endl; - + //default materials of the World defaultMaterial = Vacuum; } @@ -303,20 +324,15 @@ void Minos::SetKaptonMaterial(G4String materialChoice) G4LogicalVolume* Minos::BuildCylindricalDetector(){ if(!m_CylindricalDetector){ /* - G4Tubs* tub = new G4Tubs("Minos_Cyl",0,Minos_NS::Radius,Minos_NS::Thickness*0.5,0,360*deg); + G4Tubs* tub = new G4Tubs("Minos_Cyl",0,Minos_NS::Radius,Minos_NS::Thickness*0.5,0,360*deg); - G4Material* DetectorMaterial = MaterialManager::getInstance()->GetMaterialFromLibrary(Minos_NS::Material); - m_CylindricalDetector = new G4LogicalVolume(tub,DetectorMaterial,"logic_Minos_tub",0,0,0); - m_CylindricalDetector->SetVisAttributes(m_VisSquare); - m_CylindricalDetector->SetSensitiveDetector(m_MinosScorer); - */ - - + G4Material* DetectorMaterial = MaterialManager::getInstance()->GetMaterialFromLibrary(Minos_NS::Material); + m_CylindricalDetector = new G4LogicalVolume(tub,DetectorMaterial,"logic_Minos_tub",0,0,0); + m_CylindricalDetector->SetVisAttributes(m_VisSquare); + m_CylindricalDetector->SetSensitiveDetector(m_MinosScorer); + */ - - - } return m_CylindricalDetector; } @@ -327,69 +343,71 @@ G4LogicalVolume* Minos::BuildCylindricalDetector(){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // Below are vis attributes that permits someone to test / play - // with the interactive expansion / contraction geometry system of the - // vis/OpenInventor driver : +// with the interactive expansion / contraction geometry system of the +// vis/OpenInventor driver : //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4LogicalVolume* Minos::BuildTarget(){ if(!logicTarget){ -// - // Target - // - solidTarget=0; logicTarget=0; physiTarget=0; - solidChamber=0; logicChamber=0; physiChamber=0; - solidTPC=0; logicTPC=0; physiTPC=0; - - solidTarget = new G4Tubs("Target", //its name - 0.,TargetRadius,TargetLength,0,360.);//size - - logicTarget = new G4LogicalVolume(solidTarget, //its solid - TargetMaterial, //its material - "Target"); //its name - + // + // Target + // + solidTarget=0; logicTarget=0; /*physiTarget=0;*/ + solidChamber=0; logicChamber=0; /*physiChamber=0;*/ + solidTPC=0; logicTPC=0; /*physiTPC=0;*/ + + solidTarget = new G4Tubs("Target", //its name + 0.,TargetRadius,TargetLength,0,360.);//size - {G4VisAttributes* atb= new G4VisAttributes(G4Colour(0.6,1.,1.)); - atb->SetForceSolid(true); - logicTarget->SetVisAttributes(atb);} - + logicTarget = new G4LogicalVolume(solidTarget, //its solid + TargetMaterial, //its material + "Target"); //its name - } + + {G4VisAttributes* atb= new G4VisAttributes(G4Colour(0.6,1.,1., .4)); + atb->SetForceSolid(true); + logicTarget->SetVisAttributes(atb);} + logicTarget->SetSensitiveDetector(m_MinosTargetScorer); + + + } return logicTarget; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4LogicalVolume* Minos::BuildChamber(){ if(!logicChamber){ -// - // Chamber - // - solidChamber = new G4Tubs("Chamber", //its name - ChamberInnerRadius,ChamberInnerRadius+ChamberThickness,ChamberLength,0,360.); //size - - logicChamber = new G4LogicalVolume(solidChamber, //its solid - ChamberMaterial, //its material - "Chamber"); //its name - -{G4VisAttributes* simpleBoxVisAtt= new G4VisAttributes(G4Colour(0,1,0)); - simpleBoxVisAtt->SetVisibility(true); - logicChamber->SetVisAttributes(simpleBoxVisAtt);} + // + // Chamber + // + solidChamber = new G4Tubs("Chamber", //its name + ChamberInnerRadius,ChamberInnerRadius+ChamberThickness,ChamberLength,0,360.); //size + + logicChamber = new G4LogicalVolume(solidChamber, //its solid + ChamberMaterial, //its material + "Chamber"); //its name - } + {G4VisAttributes* simpleBoxVisAtt= new G4VisAttributes(G4Colour(0,1,0,.4)); + simpleBoxVisAtt->SetVisibility(true); + logicChamber->SetVisAttributes(simpleBoxVisAtt);} + + } return logicChamber; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4LogicalVolume* Minos::BuildInnerRohacell(){ if(!logicInnerRohacell){ // - // Inner Rohacell - // - solidInnerRohacell = new G4Tubs("InnerRohacell", //its name - ChamberInnerRadius + ChamberThickness,ChamberInnerRadius + ChamberThickness+InnerRohacellThickness,ChamberLength,0,360.); //size - - logicInnerRohacell = new G4LogicalVolume(solidInnerRohacell, //its solid - InnerRohacellMaterial, //its material - "InnerRohacell"); //its name - - + // Inner Rohacell + // + solidInnerRohacell = new G4Tubs("InnerRohacell", //its name + ChamberInnerRadius /*+ ChamberThickness*/,ChamberInnerRadius + ChamberThickness+InnerRohacellThickness,ChamberLength,0,360.); //size + + logicInnerRohacell = new G4LogicalVolume(solidInnerRohacell, //its solid + InnerRohacellMaterial, //its material + "InnerRohacell"); //its name + + G4VisAttributes* atb= new G4VisAttributes(G4Colour(1.,1.,1., .4)); + logicInnerRohacell->SetVisAttributes(atb); } @@ -398,15 +416,20 @@ G4LogicalVolume* Minos::BuildInnerRohacell(){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4LogicalVolume* Minos::BuildOuterRohacell(){ if(!logicOuterRohacell){ -// - // Outer Rohacell - // - solidOuterRohacell = new G4Tubs("OuterRohacell", //its name - ChamberInnerRadius + ChamberThickness + InnerRohacellThickness + KaptonThickness,ChamberInnerRadius + ChamberThickness + InnerRohacellThickness + KaptonThickness+OuterRohacellThickness,ChamberLength,0,360.); //size - - logicOuterRohacell = new G4LogicalVolume(solidOuterRohacell, //its solid - OuterRohacellMaterial, //its material - "OuterRohacell"); //its name + // + // Outer Rohacell + // + solidOuterRohacell = new G4Tubs("OuterRohacell", //its name + ChamberInnerRadius /*+ ChamberThickness + InnerRohacellThickness + KaptonThickness*/,ChamberInnerRadius + ChamberThickness + InnerRohacellThickness + KaptonThickness+OuterRohacellThickness,ChamberLength,0,360.); //size + + logicOuterRohacell = new G4LogicalVolume(solidOuterRohacell, //its solid + OuterRohacellMaterial, //its material + "OuterRohacell"); //its name + + G4VisAttributes* atb= new G4VisAttributes(G4Colour(1.,1.,1., .4)); + logicOuterRohacell->SetVisAttributes(atb); + + } return logicOuterRohacell; } @@ -414,93 +437,100 @@ G4LogicalVolume* Minos::BuildOuterRohacell(){ G4LogicalVolume* Minos::BuildKapton(){ if(!logicKapton){ // - // Kapton - // - solidKapton = new G4Tubs("Kapton", //its name - ChamberInnerRadius + ChamberThickness+InnerRohacellThickness,ChamberInnerRadius + ChamberThickness+InnerRohacellThickness+KaptonThickness,ChamberLength,0,360.); //size - - logicKapton = new G4LogicalVolume(solidKapton, //its solid - KaptonMaterial, //its material - "Kapton"); //its name + // Kapton + // + solidKapton = new G4Tubs("Kapton", //its name + ChamberInnerRadius+ ChamberThickness +InnerRohacellThickness ,ChamberInnerRadius + ChamberThickness+InnerRohacellThickness+KaptonThickness,ChamberLength,0,360.); //size + + logicKapton = new G4LogicalVolume(solidKapton, //its solid + KaptonMaterial, //its material + "Kapton"); //its name + + + G4VisAttributes* atb= new G4VisAttributes(G4Colour(1.,1.,1., .4)); + logicKapton->SetVisAttributes(atb); } + + return logicKapton; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4LogicalVolume* Minos::BuildTPC(){ if(!logicTPC){ - // - // TPC - - solidTPC = new G4Tubs("TPC", //its name - ChamberInnerRadius + ChamberThickness + InnerRohacellThickness + KaptonThickness + OuterRohacellThickness,TPCRadiusExt,ChamberLength,0,360.); - - logicTPC = new G4LogicalVolume(solidTPC, //its solid - TPCMaterial, //its material - "TPC"); //name + // + // TPC + + solidTPC = new G4Tubs("TPC", //its name + ChamberInnerRadius /*+ ChamberThickness + InnerRohacellThickness + KaptonThickness + OuterRohacellThickness*/,TPCRadiusExt,ChamberLength,0,360.); + + logicTPC = new G4LogicalVolume(solidTPC, //its solid + TPCMaterial, //its material + "TPC"); //name + - - {G4VisAttributes* atb= new G4VisAttributes(G4Colour(1.,1.,0.6)); - logicTPC->SetVisAttributes(atb);} + {G4VisAttributes* atb= new G4VisAttributes(G4Colour(1.,1.,0.6)); + logicTPC->SetVisAttributes(atb);} + logicTPC->SetSensitiveDetector(m_MinosTPCScorer); - } + } return logicTPC; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - // - // windows - // +// +// windows +// //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4LogicalVolume* Minos::BuildWindow0(){ if(!logicWindow0){ -solidWindow0 = new G4Tubs("WindowTube", //its name - TargetRadius,TargetRadius+WindowThickness*2.,TargetLength,0,360.); - - logicWindow0 = new G4LogicalVolume(solidWindow0, //its solid - WindowMaterial, //its material - "WindowTube"); //name - - {G4VisAttributes* atb= new G4VisAttributes(G4Colour(0,0,1)); - atb->SetForceSolid(true); - logicWindow0->SetVisAttributes(atb);} + solidWindow0 = new G4Tubs("WindowTube", //its name + 0./*TargetRadius*/,TargetRadius+WindowThickness*2.,TargetLength+WindowThickness*2.,0,360.); + logicWindow0 = new G4LogicalVolume(solidWindow0, //its solid + WindowMaterial, //its material + "WindowTube"); //name + {G4VisAttributes* atb= new G4VisAttributes(G4Colour(0,0,1, .4)); + atb->SetForceSolid(true); + logicWindow0->SetVisAttributes(atb);} - } + + + } return logicWindow0; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4LogicalVolume* Minos::BuildWindow1(){ if(!logicWindow1){ - solidWindow1 = new G4Tubs("WindowEntrance", //its name - 0.,TargetRadius+2.*WindowThickness,WindowThickness,0,360.); - - logicWindow1 = new G4LogicalVolume(solidWindow1, //its solid - WindowMaterial, //its material - "WindowEntrance"); //name - - {G4VisAttributes* atb= new G4VisAttributes(G4Colour(0,0,1)); - atb->SetForceSolid(true); - logicWindow1->SetVisAttributes(atb);} - - - } + solidWindow1 = new G4Tubs("WindowEntrance", //its name + 0.,TargetRadius+2.*WindowThickness,WindowThickness,0,360.); + + logicWindow1 = new G4LogicalVolume(solidWindow1, //its solid + WindowMaterial, //its material + "WindowEntrance"); //name + + {G4VisAttributes* atb= new G4VisAttributes(G4Colour(0,0,1, .4)); + atb->SetForceSolid(true); + logicWindow1->SetVisAttributes(atb);} + + + } return logicWindow1; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4LogicalVolume* Minos::BuildWindow2(){ if(!logicWindow2){ -solidWindow2 = new G4Tubs("WindowOutcoming", //its name - 0.,TargetRadius+2.*WindowThickness,WindowThickness,0,360.); - - logicWindow2 = new G4LogicalVolume(solidWindow2, //its solid - WindowMaterial, //its material - "WindowOutcoming"); //name - - {G4VisAttributes* atb= new G4VisAttributes(G4Colour(0,0,1)); - atb->SetForceSolid(true); - logicWindow2->SetVisAttributes(atb);} - + solidWindow2 = new G4Tubs("WindowOutcoming", //its name + 0.,TargetRadius+2.*WindowThickness,WindowThickness,0,360.); + + logicWindow2 = new G4LogicalVolume(solidWindow2, //its solid + WindowMaterial, //its material + "WindowOutcoming"); //name + + {G4VisAttributes* atb= new G4VisAttributes(G4Colour(0,0,1, .4)); + atb->SetForceSolid(true); + logicWindow2->SetVisAttributes(atb);} + } return logicWindow2; } @@ -522,7 +552,7 @@ void Minos::ReadConfiguration(NPL::InputParser parser){ if(blocks[i]->HasTokenList(cart)){ if(NPOptionManager::getInstance()->GetVerboseLevel()) cout << endl << "//// Minos " << i+1 << endl; - + G4ThreeVector Pos = NPS::ConvertVector(blocks[i]->GetTVector3("POS","mm")); string Shape = blocks[i]->GetString("Shape"); AddDetector(Pos,Shape); @@ -550,13 +580,12 @@ void Minos::ReadConfiguration(NPL::InputParser parser){ // Called After DetecorConstruction::AddDetector Method void Minos::ConstructDetector(G4LogicalVolume* world){ for (unsigned short i = 0 ; i < m_R.size() ; i++) { + TargetRadius = 28.*mm; TargetLength = 152.76/2.*mm; + ChamberInnerRadius = 37.*mm; ChamberThickness = 1.*mm; + ChamberLength = 300./2.*mm; + InnerRohacellThickness = 1.*mm; KaptonThickness = 0.125*mm; OuterRohacellThickness = 2.*mm; + TPCRadiusExt = 100.*mm; WindowThickness = 0.150/2.*mm; - TargetRadius = 28.*mm; TargetLength = 150./2.*mm; - ChamberInnerRadius = 37.*mm; ChamberThickness = 1.*mm; - ChamberLength = 300./2.*mm; - InnerRohacellThickness = 1.*mm; KaptonThickness = 0.125*mm; OuterRohacellThickness = 2.*mm; - TPCRadiusExt = 100.*mm; WindowThickness = 0.150/2.*mm; - DefineMaterials(); SetTargetMaterial("LH2"); @@ -566,13 +595,13 @@ void Minos::ConstructDetector(G4LogicalVolume* world){ SetKaptonMaterial("Kapton"); SetInnerRohacellMaterial("Rohacell"); SetOuterRohacellMaterial("Rohacell"); - + G4double wX = m_R[i] * sin(m_Theta[i] ) * cos(m_Phi[i] ) ; G4double wY = m_R[i] * sin(m_Theta[i] ) * sin(m_Phi[i] ) ; G4double wZ = m_R[i] * cos(m_Theta[i] ) ; G4ThreeVector Det_pos = G4ThreeVector(wX, wY, wZ) ; // So the face of the detector is at R instead of the middle - Det_pos+=Det_pos.unit()*Minos_NS::Thickness*0.5; + Det_pos+=Det_pos.unit()*Minos_NS::Thickness*0.5; // Building Detector reference frame G4double ii = cos(m_Theta[i]) * cos(m_Phi[i]); G4double jj = cos(m_Theta[i]) * sin(m_Phi[i]); @@ -586,85 +615,128 @@ void Minos::ConstructDetector(G4LogicalVolume* world){ G4RotationMatrix* Rot = new G4RotationMatrix(u,v,w); - if(m_Shape[i] == "Cylindrical"){ - // new G4PVPlacement(G4Transform3D(*Rot,Det_pos), - // BuildCylindricalDetector(), - // "Minos",world,false,i+1); + // if(m_Shape[i] == "Cylindrical"){ + // // new G4PVPlacement(G4Transform3D(*Rot,Det_pos), + // // BuildCylindricalDetector(), + // // "Minos",world,false,i+1); + // } + // else if(m_Shape[i] == "Square"){ + + + // } + + new G4PVPlacement(0,//its name + G4ThreeVector(wX,wY, wZ + ChamberLength - TargetLength-WindowThickness*2. - 10*mm ), // Z positioning putting TPC and Target at just difference of 10mm + BuildTPC(), //its logical volume + "TPC", //its name + world, //its mother volume + false, //no boolean operation + 0); //copy number + + new G4PVPlacement(0, //its name + G4ThreeVector(0,0,0/*ChamberLength*/), //at (0,0,0) + BuildOuterRohacell(), //its logical volume + "Rohacell"/*"OuterRohacell"*/, //its name + logicTPC/*world*/, //its mother volume + false, //no boolean operation + 0); //copy number + + new G4PVPlacement(0,//its name + G4ThreeVector(0,0,0/*ChamberLength*/), //at (0,0,0) + BuildChamber(), //its logical volume + "Chamber", //its name + logicOuterRohacell, //its mother volume + false, //no boolean operation + 0); //copy number + + /*new G4PVPlacement(0, //its name + G4ThreeVector(0,0,ChamberLength), //at (0,0,0) + BuildInnerRohacell(), //its logical volume + "InnerRohacell", //its name + world, //its mother volume + false, //no boolean operation + 0);*/ + + + new G4PVPlacement(0, //its name + G4ThreeVector(0,0,0/*ChamberLength*/), //at (0,0,0) + BuildKapton(), //its logical volume + "Kapton", //its name + logicOuterRohacell, //its mother volume + false, //no boolean operation + 0); //copy number + + + new G4PVPlacement(0, //its name + G4ThreeVector(wX,wY, wZ ), //at (0,0,0) + BuildWindow0(), //its logical volume + "WindowTube", //its name + world, //its mother volume + false, //no boolean operation + 0); + + /*new G4PVPlacement(0, //its name + G4ThreeVector(0,0, -1.*(TargetLength+WindowThickness)), //at (0,0,0) + BuildWindow1(), //its logical volume + "WindowEntrance", //its name + logicWindow0, //its mother volume + false, //no boolean operation + 0); new G4PVPlacement(0, //its name + G4ThreeVector(0,0, (TargetLength+WindowThickness)), //at (0,0,0) + BuildWindow2(), //its logical volume + "WindowOutcoming", //its name + logicWindow0, //its mother volume + false, //no boolean operation + 0); //copy number + */ + + new G4PVPlacement(0,//no rotation + G4ThreeVector(0,0,0/*TargetLength*/), //at (0,0,0) + BuildTarget(), //its logical volume + "Target", //its name + logicWindow0, //its mother volume + false, //no boolean operation + 0); //copy number + + + // G4ProductionCuts* ecut = new G4ProductionCuts(); + //G4ProductionCuts* pcut = new G4ProductionCuts(); + if(!m_ReactionRegion){ + + + // ecut->SetProductionCut(1000,"e-"); + // pcut->SetProductionCut(1,"p"); + + m_ReactionRegion= new G4Region("NPSimulationProcess"); + m_ReactionRegion -> AddRootLogicalVolume(logicTarget); + + // logicTPC -> SetRegion(m_ReactionRegion); + //m_ReactionRegion->SetProductionCuts(ecut); + //m_ReactionRegion->SetProductionCuts(ecut); + // m_ReactionRegion -> AddRootLogicalVolume(logicTPC); + + m_ReactionRegion->SetUserLimits(new G4UserLimits(1.2*mm)); //??? } - else if(m_Shape[i] == "Square"){ - + G4FastSimulationManager* mng = m_ReactionRegion->GetFastSimulationManager(); + unsigned int size = m_ReactionModel.size(); + for(unsigned int o = 0 ; o < size ; o++){ + mng->RemoveFastSimulationModel(m_ReactionModel[o]); } + m_ReactionModel.clear(); + G4VFastSimulationModel* fsm; + fsm = new NPS::BeamReaction("BeamReaction",m_ReactionRegion); + ((NPS::BeamReaction*) fsm)->SetStepSize(1.2*mm); + m_ReactionModel.push_back(fsm); + fsm = new NPS::Decay("Decay",m_ReactionRegion); + m_ReactionModel.push_back(fsm); + + // G4Region* Region_cut = new G4Region("RegionCut"); + // logicTPC->SetRegion(Region_cut); + // Region_cut->SetProductionCuts(ecut); + // Region_cut->SetProductionCuts(pcut); + // Region_cut->AddRootLogicalVolume(logicTPC); - - physiTarget = new G4PVPlacement(0, //no rotation - G4ThreeVector(0,0,TargetLength), //at (0,0,0) - BuildTarget(), //its logical volume - "Target", //its name - world, //its mother volume - false, //no boolean operation - 0); //copy number - - physiChamber = new G4PVPlacement(0, //its name - G4ThreeVector(0,0,ChamberLength), //at (0,0,0) - BuildChamber(), //its logical volume - "Chamber", //its name - world, //its mother volume - false, //no boolean operation - 0); //copy number - - physiInnerRohacell = new G4PVPlacement(0, //its name - G4ThreeVector(0,0,ChamberLength), //at (0,0,0) - BuildInnerRohacell(), //its logical volume - "InnerRohacell", //its name - world, //its mother volume - false, //no boolean operation - 0); physiOuterRohacell = new G4PVPlacement(0, //its name - G4ThreeVector(0,0,ChamberLength), //at (0,0,0) - BuildOuterRohacell(), //its logical volume - "OuterRohacell", //its name - world, //its mother volume - false, //no boolean operation - 0); //copy number - - physiKapton = new G4PVPlacement(0, //its name - G4ThreeVector(0,0,ChamberLength), //at (0,0,0) - BuildKapton(), //its logical volume - "Kapton", //its name - world, //its mother volume - false, //no boolean operation - 0); //copy number - - physiTPC = new G4PVPlacement(0, //its name - G4ThreeVector(0,0,ChamberLength), //at (0,0,0) - BuildTPC(), //its logical volume - "TPC", //its name - world, //its mother volume - false, //no boolean operation - 0); //copy number - - physiWindow0 = new G4PVPlacement(0, //its name - G4ThreeVector(0,0,TargetLength), //at (0,0,0) - BuildWindow0(), //its logical volume - "WindowTube", //its name - world, //its mother volume - false, //no boolean operation - 0); physiWindow1 = new G4PVPlacement(0, //its name - G4ThreeVector(0,0,-1.*WindowThickness), //at (0,0,0) - BuildWindow1(), //its logical volume - "WindowEntrance", //its name - world, //its mother volume - false, //no boolean operation - 0); physiWindow2 = new G4PVPlacement(0, //its name - G4ThreeVector(0,0,2.*TargetLength+WindowThickness), //at (0,0,0) - BuildWindow2(), //its logical volume - "WindowOutcoming", //its name - world, //its mother volume - false, //no boolean operation - 0); //copy number - G4Region* aRegion = new G4Region("TPCLog"); - logicTPC -> SetRegion(aRegion); - aRegion -> AddRootLogicalVolume(logicTPC); } // // Visualization attributes @@ -686,13 +758,14 @@ void Minos::InitializeRootOutput(){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // Read sensitive part and fill the Root tree. -// Called at in the EventAction::EndOfEventAvtion +// Called at in the EventAction::EndOfEventAction void Minos::ReadSensitive(const G4Event* ){ m_Event->Clear(); /////////// // Calorimeter scorer - CalorimeterScorers::PS_Calorimeter* Scorer= (CalorimeterScorers::PS_Calorimeter*) m_MinosScorer->GetPrimitive(0); + CalorimeterScorers::PS_Calorimeter* Scorer= (CalorimeterScorers::PS_Calorimeter*) m_MinosTargetScorer->GetPrimitive(0); + unsigned int size = Scorer->GetMult(); for(unsigned int i = 0 ; i < size ; i++){ @@ -711,20 +784,36 @@ void Minos::ReadSensitive(const G4Event* ){ //////////////////////////////////////////////////////////////// void Minos::InitializeScorers() { // This check is necessary in case the geometry is reloaded - bool already_exist = false; - m_MinosScorer = CheckScorer("MinosScorer",already_exist) ; + bool already_exist = false; + bool already_exist2 = false; - if(already_exist) - return ; + + m_MinosTargetScorer = CheckScorer("MinosTargetScorer",already_exist) ; + m_MinosTPCScorer = CheckScorer("MinosTPCScorer",already_exist2) ; + + if(already_exist && already_exist2 ) + 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) ; + G4VPrimitiveScorer* CalorimeterMinosTargetScorer= new CalorimeterScorers::PS_Calorimeter("CalorimeterMinosTargetScore",level, 0) ; + G4VPrimitiveScorer* InteractionMinosTargetScorer= new InteractionScorers::PS_Interactions("InteractionMinosTargetScore",ms_InterCoord, 0) ; + //and register it to the multifunctionnal detector - m_MinosScorer->RegisterPrimitive(Calorimeter); - m_MinosScorer->RegisterPrimitive(Interaction); - G4SDManager::GetSDMpointer()->AddNewDetector(m_MinosScorer) ; + m_MinosTargetScorer->RegisterPrimitive(CalorimeterMinosTargetScorer); + m_MinosTargetScorer->RegisterPrimitive(InteractionMinosTargetScorer); + + G4VPrimitiveScorer* TPCScorer= new TPCScorers::PS_TPCCathode("MinosTPC", 0); + //G4VPrimitiveScorer* TPCCalScorer= new CalorimeterScorers::PS_Calorimeter("TPCCalScorer",level, 0); + G4VPrimitiveScorer* TPCInterScorer= new InteractionScorers::PS_Interactions("TPCInterScorer",ms_InterCoord, 0); + + m_MinosTPCScorer->RegisterPrimitive(TPCScorer); + // m_MinosTPCScorer->RegisterPrimitive(TPCCalScorer); + m_MinosTPCScorer->RegisterPrimitive(TPCInterScorer); + + + G4SDManager::GetSDMpointer()->AddNewDetector(m_MinosTPCScorer) ; + G4SDManager::GetSDMpointer()->AddNewDetector(m_MinosTargetScorer) ; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/NPSimulation/Detectors/Minos/Minos.hh b/NPSimulation/Detectors/Minos/Minos.hh index e77ee2f8e6bbea51028a1840afa306582795a302..2454cf05a6342da8d4e8b961c96011fad42ceaa6 100644 --- a/NPSimulation/Detectors/Minos/Minos.hh +++ b/NPSimulation/Detectors/Minos/Minos.hh @@ -31,11 +31,16 @@ using namespace std; #include "G4RotationMatrix.hh" #include "G4LogicalVolume.hh" #include "G4MultiFunctionalDetector.hh" +#include "G4VFastSimulationModel.hh" +#include "G4UserLimits.hh" +#include "G4FastSimulationManager.hh" // NPTool header #include "NPSVDetector.hh" #include "TMinosData.h" #include "NPInputParser.h" +#include "Decay.hh" +#include "BeamReaction.hh" class Minos : public NPS::VDetector{ //////////////////////////////////////////////////// @@ -86,7 +91,8 @@ class Minos : public NPS::VDetector{ G4Material* GetTargetMaterial() {return TargetMaterial;}; G4double GetTargetRadius() {return TargetRadius;}; - + + /* const G4VPhysicalVolume* GetphysiWorld() {return physiWorld;}; const G4VPhysicalVolume* GetTarget() {return physiTarget;}; const G4VPhysicalVolume* GetChamber() {return physiChamber;}; @@ -97,7 +103,8 @@ class Minos : public NPS::VDetector{ const G4VPhysicalVolume* GetInnerRohacell() {return physiInnerRohacell;}; const G4VPhysicalVolume* GetOuterRohacell() {return physiOuterRohacell;}; const G4VPhysicalVolume* GetKapton() {return physiKapton;}; - + */ + private: G4Material* TargetMaterial; G4double TargetRadius; @@ -131,45 +138,45 @@ class Minos : public NPS::VDetector{ G4LogicalVolume* m_SquareDetector; G4LogicalVolume* m_CylindricalDetector; - G4Box* solidWorld; //pointer to the solid World - G4LogicalVolume* logicWorld; //pointer to the logical World - G4VPhysicalVolume* physiWorld; //pointer to the physical World + // G4Box* solidWorld; //pointer to the solid World + // G4LogicalVolume* logicWorld; //pointer to the logical World + // G4VPhysicalVolume* physiWorld; //pointer to the physical World G4Tubs* solidTarget; G4LogicalVolume* logicTarget; - G4VPhysicalVolume* physiTarget; + // G4VPhysicalVolume* physiTarget; G4Tubs* solidChamber; G4LogicalVolume* logicChamber; - G4VPhysicalVolume* physiChamber; + // G4VPhysicalVolume* physiChamber; G4Tubs* solidTPC; G4LogicalVolume* logicTPC; - G4VPhysicalVolume* physiTPC; + // G4VPhysicalVolume* physiTPC; G4Tubs* solidWindow0; G4LogicalVolume* logicWindow0; - G4VPhysicalVolume* physiWindow0; + // G4VPhysicalVolume* physiWindow0; G4Tubs* solidWindow1; G4LogicalVolume* logicWindow1; - G4VPhysicalVolume* physiWindow1; + // G4VPhysicalVolume* physiWindow1; G4Tubs* solidWindow2; G4LogicalVolume* logicWindow2; - G4VPhysicalVolume* physiWindow2; + // G4VPhysicalVolume* physiWindow2; G4Tubs* solidInnerRohacell; G4LogicalVolume* logicInnerRohacell; - G4VPhysicalVolume* physiInnerRohacell; + // G4VPhysicalVolume* physiInnerRohacell; G4Tubs* solidOuterRohacell; G4LogicalVolume* logicOuterRohacell; - G4VPhysicalVolume* physiOuterRohacell; + // G4VPhysicalVolume* physiOuterRohacell; G4Tubs* solidKapton; G4LogicalVolume* logicKapton; - G4VPhysicalVolume* physiKapton; + // G4VPhysicalVolume* physiKapton; @@ -199,7 +206,9 @@ class Minos : public NPS::VDetector{ void InitializeScorers() ; // Associated Scorer - G4MultiFunctionalDetector* m_MinosScorer ; + G4MultiFunctionalDetector* m_MinosTargetScorer ; + G4MultiFunctionalDetector* m_MinosTPCScorer ; + //////////////////////////////////////////////////// ///////////Event class to store Data//////////////// //////////////////////////////////////////////////// @@ -222,6 +231,13 @@ class Minos : public NPS::VDetector{ G4VisAttributes* m_VisSquare; G4VisAttributes* m_VisCylinder; + + private: + // Region were reaction can occure: + G4Region* m_ReactionRegion; + vector<G4VFastSimulationModel*> m_ReactionModel; + + // Needed for dynamic loading of the library public: static NPS::VDetector* Construct(); diff --git a/NPSimulation/EventGenerator/EventGeneratorMultipleParticle.cc b/NPSimulation/EventGenerator/EventGeneratorMultipleParticle.cc index a4d56722a91d56f54bf050fde75d7de519c3457a..e2e561c2ccada3ef88bbcdf868e8edaa51b6cb11 100644 --- a/NPSimulation/EventGenerator/EventGeneratorMultipleParticle.cc +++ b/NPSimulation/EventGenerator/EventGeneratorMultipleParticle.cc @@ -51,7 +51,7 @@ EventGeneratorMultipleParticle::EventGeneratorMultipleParticle(){ m_SigmaX = 0; m_SigmaY = 0; m_Events = 0; - m_File = StandardPath; + m_File = ""; m_particleName.clear(); m_ParticleStack = ParticleStack::getInstance(); m_Event.clear(); diff --git a/NPSimulation/Process/Decay.cc b/NPSimulation/Process/Decay.cc index bfd7ee212ffc083712e4f466a68c5292ae593e67..0cf06236cf02389534e9ffe637a56b2746058357 100644 --- a/NPSimulation/Process/Decay.cc +++ b/NPSimulation/Process/Decay.cc @@ -85,8 +85,9 @@ G4bool Decay::IsApplicable( const G4ParticleDefinition& particleType) { } //////////////////////////////////////////////////////////////////////////////// -G4bool Decay::ModelTrigger(const G4FastTrack& ) { +G4bool Decay::ModelTrigger(const G4FastTrack& fastTrack) { //FIXME: Solve the issue of long lived decay + m_PreviousEnergy=fastTrack.GetPrimaryTrack()->GetKineticEnergy(); // Check that a decay is possible: return m_Decay.AnyAboveThreshold(NPL::ChangeNameFromG4Standard(m_CurrentName),m_ExcitationEnergy); } diff --git a/NPSimulation/Process/G4DETransport.cc b/NPSimulation/Process/G4DETransport.cc index 1f501a7bc8e1e420c4ecf3b716c3d21e3e53f318..66f3e83aed555b88229bc387349834a49220dd6d 100644 --- a/NPSimulation/Process/G4DETransport.cc +++ b/NPSimulation/Process/G4DETransport.cc @@ -106,7 +106,6 @@ G4DETransport::PostStepDoIt(const G4Track& aTrack, const G4Step& aStep) G4ThreeVector x0 = pPreStepPoint->GetPosition(); G4ThreeVector p0 = aStep.GetDeltaPosition().unit(); G4double t0 = pPreStepPoint->GetGlobalTime(); - G4double Energy = pPreStepPoint->GetKineticEnergy(); // The time scale is imposed by the distance travelled @@ -152,10 +151,14 @@ G4DETransport::PostStepDoIt(const G4Track& aTrack, const G4Step& aStep) G4double sigmaTrans = sqrt(2*step_length*aMaterialPropertiesTable->GetConstProperty("DE_TRANSVERSALSPREAD")/v_drift); G4double sigmaLong = sqrt(2*step_length*aMaterialPropertiesTable->GetConstProperty("DE_LONGITUDINALSPREAD")/v_drift); - - G4double d_long = G4RandGauss::shoot(0,sigmaLong); + G4double d_trans = G4RandGauss::shoot(0,sigmaTrans); - G4double d_drift = step_length+d_long; + G4double d_long=0; + G4double d_drift=-1; + while(d_drift<0){ + d_long = G4RandGauss::shoot(0,sigmaLong); + d_drift = step_length+d_long; + } G4ThreeVector trans(G4RandGauss::shoot(0,d_trans),0,0); trans.rotateY(twopi*G4UniformRand()); diff --git a/NPSimulation/Scorers/CalorimeterScorers.cc b/NPSimulation/Scorers/CalorimeterScorers.cc index 4c77e6e24a75af5be2c1320420e79e8a43d4555d..f4afd2856b58d5039327472980e5238855571453 100644 --- a/NPSimulation/Scorers/CalorimeterScorers.cc +++ b/NPSimulation/Scorers/CalorimeterScorers.cc @@ -58,13 +58,13 @@ PS_Calorimeter::~PS_Calorimeter(){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4bool PS_Calorimeter::ProcessHits(G4Step* aStep, G4TouchableHistory*){ // Contain Energy, Time + as many copy number as nested volume - static unsigned int mysize = m_NestingLevel.size(); + unsigned int mysize = m_NestingLevel.size(); t_Energy = aStep->GetTotalEnergyDeposit(); t_Time = aStep->GetPreStepPoint()->GetGlobalTime(); t_Level.clear(); for(unsigned int i = 0 ; i < mysize ; i++){ - t_Level.push_back(aStep->GetPreStepPoint()->GetTouchableHandle()->GetCopyNumber(m_NestingLevel[i])); - } + t_Level.push_back(aStep->GetPreStepPoint()->GetTouchableHandle()->GetCopyNumber(m_NestingLevel[i])); +} // Check if the particle has interact before, if yes, add up the energies. vector<CalorimeterData>::iterator it; it = m_Data.find(CalorimeterData::CalculateIndex(t_Level)); diff --git a/Projects/Dali/Dali.detector b/Projects/Dali/Dali.detector new file mode 100644 index 0000000000000000000000000000000000000000..faab7e259bd3400da50a7e6c33143b4879f9da45 --- /dev/null +++ b/Projects/Dali/Dali.detector @@ -0,0 +1,97 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Target + THICKNESS= 20 mm + RADIUS= 20 mm + MATERIAL= CD2 + ANGLE= 0 deg + X= 0 mm + Y= 0 mm + Z= 220 mm +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = 240 deg + Zeta = -90.03 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = 180 deg + Zeta = -90.03 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = 120 deg + Zeta = -90.03 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = 60 deg + Zeta = -90.03 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = 0 deg + Zeta = -90.03 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = -60 deg + Zeta = -90.03 mm + Shape = Square + Material = NaI(Tl) + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = 240 deg + Zeta = 90.03 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = 180 deg + Zeta = 90.03 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = 120 deg + Zeta = 90.03 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = 60 deg + Zeta = 90.03 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = 0 deg + Zeta = 90.03 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = -60 deg + Zeta = 90.03 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Projects/Dali/DaliMinos.detector b/Projects/Dali/DaliMinos.detector new file mode 100644 index 0000000000000000000000000000000000000000..2e7a5323209344aa9282d2d17640f8f5c6a77110 --- /dev/null +++ b/Projects/Dali/DaliMinos.detector @@ -0,0 +1,94 @@ +Minos + R= 35 mm + THETA= 90 deg + POS = 0 0 -307.07 mm + PHI= 63 deg + Shape= Cylindrical +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = 240 deg + Zeta = -90.03 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = 180 deg + Zeta = -90.03 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = 120 deg + Zeta = -90.03 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = 60 deg + Zeta = -90.03 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = 0 deg + Zeta = -90.03 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = -60 deg + Zeta = -90.03 mm + Shape = Square + Material = NaI(Tl) + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = 240 deg + Zeta = 90.03 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = 180 deg + Zeta = 90.03 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = 120 deg + Zeta = 90.03 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = 60 deg + Zeta = 90.03 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = 0 deg + Zeta = 90.03 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = -60 deg + Zeta = 90.03 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Projects/Dali/DaliWithHTarget.detector b/Projects/Dali/DaliWithHTarget.detector new file mode 100644 index 0000000000000000000000000000000000000000..f8cc1470513e4eeaa981ba61b2cbed344df0f9d5 --- /dev/null +++ b/Projects/Dali/DaliWithHTarget.detector @@ -0,0 +1,97 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Target + THICKNESS= 150 mm + RADIUS= 19.5 mm + MATERIAL= H2 + ANGLE= 0 deg + X= 0 mm + Y= 0 mm + Z= -90.03 mm +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = 240 deg + Zeta = -90.03 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = 180 deg + Zeta = -90.03 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = 120 deg + Zeta = -90.03 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = 60 deg + Zeta = -90.03 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = 0 deg + Zeta = -90.03 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = -60 deg + Zeta = -90.03 mm + Shape = Square + Material = NaI(Tl) + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = 240 deg + Zeta = 90.03 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = 180 deg + Zeta = 90.03 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = 120 deg + Zeta = 90.03 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = 60 deg + Zeta = 90.03 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = 0 deg + Zeta = 90.03 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = -60 deg + Zeta = 90.03 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Projects/Dali/OneRingDali.detector b/Projects/Dali/OneRingDali.detector new file mode 100644 index 0000000000000000000000000000000000000000..89fa58598ac0bff3c189a4c0262a32e896570e1f --- /dev/null +++ b/Projects/Dali/OneRingDali.detector @@ -0,0 +1,52 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Target + THICKNESS= 20 mm + RADIUS= 20 mm + MATERIAL= CD2 + ANGLE= 0 deg + X= 0 mm + Y= 0 mm + Z= 220 mm +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = 240 deg + Zeta = 0 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = 180 deg + Zeta = 0 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = 120 deg + Zeta = 0 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = 60 deg + Zeta = 0 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = 0 deg + Zeta = 0 mm + Shape = Square + Material = NaI(Tl) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Dali + R = 212.4 mm + Alpha = -60 deg + Zeta = 0 mm + Shape = Square + Material = NaI(Tl) + diff --git a/Projects/Dali/carbon.reaction b/Projects/Dali/carbon.reaction index eade1aafcae76a25f3a3af467b8304746fd78605..c67344707f24a36a1e628d93f49084c4c84a4701 100644 --- a/Projects/Dali/carbon.reaction +++ b/Projects/Dali/carbon.reaction @@ -2,19 +2,19 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Beam Particle= 1H - ExcitationEnergy= 0 - Energy= 170 - SigmaEnergy= 0.448 - SigmaThetaX= 0.01 - SigmaPhiY= 0.01 - SigmaX= 0.01 + ExcitationEnergy= 0 MeV + Energy= 170 MeV + SigmaEnergy= 0.448 MeV + SigmaThetaX= 0.01 deg + SigmaPhiY= 0.01 deg + SigmaX= 0.01 mm %0.5 - SigmaY= 0.01 + SigmaY= 0.01 mm %0.5 - MeanThetaX= 0 - MeanPhiY= 0 - MeanX= 0 - MeanY= 0 + MeanThetaX= 0 deg + MeanPhiY= 0 deg + MeanX= 0 mm + MeanY= 0 mm %EnergyProfilePath= %XThetaXProfilePath= %YPhiYProfilePath= @@ -24,8 +24,8 @@ TwoBodyReaction Target= 12C Light= 12C Heavy= 1H - ExcitationEnergyLight= 0.0 - ExcitationEnergyHeavy= 0.0 + ExcitationEnergyLight= 0.0 MeV + ExcitationEnergyHeavy= 0.0 MeV CrossSectionPath= flat.txt CSR ShootLight= 1 ShootHeavy= 1 diff --git a/Projects/Minos/Minos.detector b/Projects/Minos/Minos.detector index 0fee81996115e2f83ef1ee05d5bf267f04bb0abc..03f4402a113411b88d434ba36e226d1c5e24a6bb 100644 --- a/Projects/Minos/Minos.detector +++ b/Projects/Minos/Minos.detector @@ -16,7 +16,7 @@ Minos R= 35 mm THETA= 90 deg - POS = 100 100 100 cm + POS = 0 0 -50 cm PHI= 63 deg Shape= Cylindrical %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%