diff --git a/Inputs/DetectorConfiguration/AnnularS1.detector b/Inputs/DetectorConfiguration/AnnularS1.detector index 145d0667d91151ae2d72c5224ae92b75eb9cfccf..1a910320f40a5ebaf9471c6096553266ef0b5940 100644 --- a/Inputs/DetectorConfiguration/AnnularS1.detector +++ b/Inputs/DetectorConfiguration/AnnularS1.detector @@ -11,8 +11,8 @@ Target %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% AnnularS1 Z= 100 - VIS= all + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% AnnularS1 Z= -100 - VIS= all + VIS= all diff --git a/Inputs/DetectorConfiguration/Sharc.detector b/Inputs/DetectorConfiguration/Sharc.detector index 2ede44d27e097a2cb889741571e43ce67d79de7c..3884cf6fa9852ce4aa72d92b25cc4b42ed12ec9d 100644 --- a/Inputs/DetectorConfiguration/Sharc.detector +++ b/Inputs/DetectorConfiguration/Sharc.detector @@ -1,8 +1,10 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% GeneralTarget %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%0.5mg/cm2 Target - THICKNESS= 0.001 + THICKNESS= 4.8 RADIUS= 5 MATERIAL= CD2 ANGLE= 0 @@ -18,30 +20,30 @@ Sharc Z= -66 R= 0 Phi= 0 - ThicknessDector= 100 + ThicknessDector= 500 SharcQQQ Z= -66 R= 0 Phi= 90 - ThicknessDector= 100 + ThicknessDector= 500 SharcQQQ Z= -66 R= 0 Phi= 180 - ThicknessDector= 100 + ThicknessDector= 500 SharcQQQ Z= -66 R= 0 Phi= 270 - ThicknessDector= 100 + ThicknessDector= 500 %%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Upstream Box SharcBOX Z= -30.775 - ThicknessDector1= 100 - ThicknessDector2= 100 - ThicknessDector3= 100 - ThicknessDector4= 100 + ThicknessDector1= 500 + ThicknessDector2= 500 + ThicknessDector3= 500 + ThicknessDector4= 500 ThicknessPAD1= 0 ThicknessPAD2= 0 ThicknessPAD3= 0 @@ -50,34 +52,34 @@ Sharc %Down Stream Box SharcBOX Z= 34.3 - ThicknessDector1= 100 - ThicknessDector2= 100 - ThicknessDector3= 100 - ThicknessDector4= 100 - ThicknessPAD1= 1000 - ThicknessPAD2= 1000 - ThicknessPAD3= 1000 - ThicknessPAD4= 1000 + ThicknessDector1= 1000 + ThicknessDector2= 1000 + ThicknessDector3= 1000 + ThicknessDector4= 1000 + ThicknessPAD1= 0 + ThicknessPAD2= 0 + ThicknessPAD3= 0 + ThicknessPAD4= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%% - %Downstream CD +%Downstream CD %SharcQQQ - Z= 66 + Z= 70 R= 0 Phi= 0 - ThicknessDector= 100 + ThicknessDector= 500 %SharcQQQ - Z= 66 + Z= 70 R= 0 Phi= 90 - ThicknessDector= 100 - % SharcQQQ - Z= 66 + ThicknessDector= 500 + %SharcQQQ + Z= 70 R= 0 Phi= 180 - ThicknessDector= 100 + ThicknessDector= 500 %SharcQQQ - Z= 66 + Z= 70 R= 0 Phi= 270 - ThicknessDector= 100 + ThicknessDector= 500 diff --git a/Inputs/EventGenerator/10He.reaction b/Inputs/EventGenerator/10He.reaction index d453d5fa38b465a95b50d1d399cc950e0fc63787..a4fedfb4000e66f2d84374576e285bdf2c6d6ed0 100644 --- a/Inputs/EventGenerator/10He.reaction +++ b/Inputs/EventGenerator/10He.reaction @@ -13,13 +13,13 @@ ExcitationEnergy= 1.4 Beam - Particle= 7Li - Energy= 20 - SigmaEnergy= 20 - SigmaThetaX= 25 - SigmaPhiY= 25 - SigmaX= 5 - SigmaY= 5 + Particle= 11Li + Energy= 550 + SigmaEnergy= 0 + SigmaThetaX= 1 + SigmaPhiY= 1 + SigmaX= 1 + SigmaY= 1 MeanThetaX= 0 MeanPhiY= 0 MeanX= 0 @@ -31,19 +31,19 @@ Beam %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TwoBodyReaction - Beam= 9Li + Beam= 11Li Target= 2H Light= 3He - Heavy= 8He + Heavy= 10He ExcitationEnergyLight= 0.0 - ExcitationEnergyHeavy= 0.0 + ExcitationEnergyHeavy= 3.0 CrossSectionPath= flat.txt CS10He - ShootLight= 0 + ShootLight= 1 ShootHeavy= 1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%ParticleDecay 10He +ParticleDecay 10He Daughter= 9He n ExcitationEnergy= 0 0 DifferentialCrossSection= 11Li(d,3He)10He.txt particle9He @@ -51,9 +51,9 @@ TwoBodyReaction %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%GammaDecay 10He +GammaDecay 10He Cascade - BranchingRatio= 100 + BranchingRatio= 30 Energies= 0.1 DifferentialCrossSection= 11Li(d,3He)10He.txt Gamma9He Cascade @@ -62,7 +62,7 @@ TwoBodyReaction %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%ParticleDecay 9He +ParticleDecay 9He Daughter= 8He n DifferentialCrossSection= flat.txt shoot= 1 1 diff --git a/NPAnalysis/pMakePhysicalTree/DataProcessor.cxx b/NPAnalysis/pMakePhysicalTree/DataProcessor.cxx index dd2769ae600be11e9df019763b72afed5741d330..e005c995602d8984cdc8443da4f7cae81ef15047 100644 --- a/NPAnalysis/pMakePhysicalTree/DataProcessor.cxx +++ b/NPAnalysis/pMakePhysicalTree/DataProcessor.cxx @@ -6,7 +6,7 @@ ClassImp(DataProcessor); DataProcessor::DataProcessor(){ m_InputChain = 0 ; m_OutputTree = 0 ; - m_ProofFile = 0 ; + m_ProofFile = 0 ; m_OutputFile = 0 ; } @@ -17,8 +17,6 @@ DataProcessor::~DataProcessor(){ //_____________________________________________________________________________ void DataProcessor::SlaveBegin(TTree*){ - - TString NPLPath = gSystem->Getenv("NPTOOL"); gROOT->ProcessLine(Form(".x %s/NPLib/scripts/NPToolLogon.C+", NPLPath.Data())); @@ -47,9 +45,9 @@ void DataProcessor::SlaveBegin(TTree*){ m_OutputTree = RootOutput::getInstance()->GetTree(); //Merging via file: - UInt_t opt = TProofOutputFile::kRegister | TProofOutputFile::kOverwrite | TProofOutputFile::kVerify; - m_ProofFile = new TProofOutputFile("Local.root",TProofOutputFile::kDataset, opt ); - m_OutputFile = m_ProofFile->OpenFile("RECREATE"); + UInt_t opt = TProofOutputFile::kRegister | TProofOutputFile::kOverwrite | TProofOutputFile::kVerify; + m_ProofFile = new TProofOutputFile("Local.root",TProofOutputFile::kDataset, opt ); + m_OutputFile = m_ProofFile->OpenFile("RECREATE"); m_OutputTree->SetDirectory(m_OutputFile); m_OutputTree->AutoSave(); @@ -98,7 +96,7 @@ void DataProcessor::SlaveTerminate(){ m_OutputFile->cd(); m_OutputTree->Write(); m_OutputFile->Flush(); - GetOutputList()->Add(m_ProofFile); + GetOutputList()->Add(m_ProofFile); m_OutputFile->Close(); RootOutput::getInstance()->Destroy(); RootInput::getInstance()->Destroy(); diff --git a/NPAnalysis/pMakePhysicalTree/RunToTreat.txt b/NPAnalysis/pMakePhysicalTree/RunToTreat.txt index 4d110fe07df6045069832b0236653227109e352f..c77677c0e4a5e1295ae3f772bbe0ee372849e0e6 100644 --- a/NPAnalysis/pMakePhysicalTree/RunToTreat.txt +++ b/NPAnalysis/pMakePhysicalTree/RunToTreat.txt @@ -1,4 +1,4 @@ TTreeName S1107Data RootFileName - /Volumes/S1107/RootData/data2253*.root + /Volumes/S1107/RootData/data2*.root diff --git a/NPLib/InitialConditions/TInitialConditions.cxx b/NPLib/InitialConditions/TInitialConditions.cxx index 8baf85729801de3b6286872394b024687240fc00..774247afbb726e1e31b1f81ee3118ed3eef73f8f 100644 --- a/NPLib/InitialConditions/TInitialConditions.cxx +++ b/NPLib/InitialConditions/TInitialConditions.cxx @@ -113,16 +113,6 @@ TVector3 TInitialConditions::GetParticleDirection (const int &i) const { } -double TInitialConditions::GetThetaLab_WorldFrame (const int &i) const { - return (GetParticleDirection(i).Angle(TVector3(0,0,1)))/deg; - -} - -double TInitialConditions::GetThetaLab_IncidentFrame (const int &i) const{ - return (GetParticleDirection(i).Angle(GetBeamDirection()))/deg; -} - - diff --git a/NPLib/InitialConditions/TInitialConditions.h b/NPLib/InitialConditions/TInitialConditions.h index 2e4eb9cd0350837f5dd0bd87fab0ec7799f2f0f4..5d059424b7e7ef5eeb70c4cb744d18fa54e5cbb5 100644 --- a/NPLib/InitialConditions/TInitialConditions.h +++ b/NPLib/InitialConditions/TInitialConditions.h @@ -124,8 +124,14 @@ public: TVector3 GetBeamDirection () const ; TVector3 GetParticleDirection (const int &i) const ; - double GetThetaLab_WorldFrame (const int &i) const ; - double GetThetaLab_IncidentFrame (const int &i) const ; + + double GetThetaLab_WorldFrame (const int &i) const { + return (GetParticleDirection(i).Angle(TVector3(0,0,1)))/deg; + } + + double GetThetaLab_IncidentFrame (const int &i) const{ + return (GetParticleDirection(i).Angle(GetBeamDirection()))/deg; + } unsigned int GetEmittedMult() const {return fIC_Particle_Name.size();} diff --git a/NPLib/Physics/NPBeam.cxx b/NPLib/Physics/NPBeam.cxx index 1269606f76b21b3478fce4a2ed7ecaf68c077489..5cc7839100563b2a8b3b762a01011b7c52456b4e 100644 --- a/NPLib/Physics/NPBeam.cxx +++ b/NPLib/Physics/NPBeam.cxx @@ -78,6 +78,38 @@ Beam::Beam(){ fXThetaXHist = new TH2F(Form("XThetaXHis_%i",offset),"XThetaXHis",1,0,1,1,0,1); fYPhiYHist = new TH2F(Form("YPhiYHist_%i",offset),"YPhiYHist",1,0,1,1,0,1); } +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +Beam::Beam(string isotope){ + SetUp(isotope); + fEnergy = 0; + fSigmaEnergy = -1 ; + fMeanX = 0 ; + fMeanY = 0 ; + fSigmaX = -1; + fSigmaY = -0; + fMeanThetaX = 0 ; + fMeanPhiY = 0 ; + fSigmaThetaX = -1 ; + fSigmaPhiY = -1 ; + fTargetSize = 0 ; + fEffectiveTargetSize = 0 ; + fTargetThickness = 0 ; + fEffectiveTargetThickness = 0 ; + fTargetAngle = 0 ; + fTargetZ = 0 ; + fVerboseLevel = NPOptionManager::getInstance()->GetVerboseLevel(); + + // case of user given distribution + // do that to avoid warning from multiple Hist with same name... + int offset = 0; + while(gDirectory->FindObjectAny(Form("EnergyHist_%i",offset))!=0) + ++offset; + + fEnergyHist = new TH1F(Form("EnergyHist_%i",offset),"EnergyHist",1,0,1); + fXThetaXHist = new TH2F(Form("XThetaXHis_%i",offset),"XThetaXHis",1,0,1,1,0,1); + fYPhiYHist = new TH2F(Form("YPhiYHist_%i",offset),"YPhiYHist",1,0,1,1,0,1); +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... Beam::~Beam(){ diff --git a/NPLib/Physics/NPBeam.h b/NPLib/Physics/NPBeam.h index 8c1659eb14fd4e440fb2a3981fb50d6825e5e11a..1c712f01f57d66cab29690f3f71d9437a9b891e7 100755 --- a/NPLib/Physics/NPBeam.h +++ b/NPLib/Physics/NPBeam.h @@ -45,6 +45,7 @@ namespace NPL{ public: // Constructors and Destructors Beam(); + Beam(string); ~Beam(); public: // Various Method diff --git a/NPLib/Physics/NPNucleus.cxx b/NPLib/Physics/NPNucleus.cxx index e16ebd17540353bbd9889d8a6e9c17426378f9d0..89c5a90311ef9aa20b3dcbb1b12a1456d0e24d12 100644 --- a/NPLib/Physics/NPNucleus.cxx +++ b/NPLib/Physics/NPNucleus.cxx @@ -69,6 +69,12 @@ void Nucleus::SetUp(string isotope){ //----------- Constructor Using nubtab03.asc by name---------- // open the file to read and check if it is open + // Replace the p,d,t,a by there standard name: + if(isotope=="p") isotope="1H"; + else if(isotope=="d") isotope="2H"; + else if(isotope=="t") isotope="3H"; + else if(isotope=="a") isotope="4He"; + const char* Isotope = isotope.c_str(); ifstream inFile; diff --git a/NPLib/Physics/NPReaction.cxx b/NPLib/Physics/NPReaction.cxx index 3a153d3bca608fc4f773eadd552d2bef69dceb1d..f1086e9bc86a6666e39230159c5e53a2301328a8 100644 --- a/NPLib/Physics/NPReaction.cxx +++ b/NPLib/Physics/NPReaction.cxx @@ -58,6 +58,11 @@ ClassImp(Reaction) Reaction::Reaction(){ //------------- Default Constructor ------------- + // Need to be done before initializePrecomputeVariable + fKineLine3 = 0 ; + fKineLine4 = 0 ; + + // fNuclei1 = new Beam(); fNuclei2 = new Nucleus(); fNuclei3 = new Nucleus(); @@ -78,8 +83,71 @@ Reaction::Reaction(){ fCrossSectionHist = new TH1F(Form("EnergyHist_%i",offset),"Reaction_CS",1,0,180); fshoot3=true; fshoot4=true; + +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +// This constructor aim to provide a fast way to instantiate a reaction without input file +// The string should be of the form "A(b,c)D@E" with E the ernegy of the beam in MeV +Reaction::Reaction(string reaction){ + // Instantiate the parameter to default + // Analyse the reaction and extract revelant information + string A,b,c,D,E; + unsigned int i=0; + for(; i < reaction.length() ; i++){ + if(reaction.compare(i,1,"(")!=0) A.push_back(reaction[i]); + else break; + } + + i++; + for(; i < reaction.length() ; i++){ + if(reaction.compare(i,1,",")!=0) b.push_back(reaction[i]); + else break; + } + + i++; + for(; i < reaction.length() ; i++){ + if(reaction.compare(i,1,")")!=0) c.push_back(reaction[i]); + else break; + } + + i++; + for(; i < reaction.length() ; i++){ + if(reaction.compare(i,1,"@")!=0) D.push_back(reaction[i]); + else break; + } + + i++; + for(; i < reaction.length() ; i++){ + E.push_back(reaction[i]); + } + + fKineLine3 = 0 ; + fKineLine4 = 0 ; + fNuclei1 = new Beam(A); + fNuclei2 = new Nucleus(b); + fNuclei3 = new Nucleus(c); + fNuclei4 = new Nucleus(D); + fBeamEnergy = atof(E.c_str()); + fThetaCM = 0; + fExcitation3 = 0; + fExcitation4 = 0; + fQValue = 0; + fVerboseLevel = NPOptionManager::getInstance()->GetVerboseLevel(); + initializePrecomputeVariable(); + + // do that to avoid warning from multiple Hist with same name... int offset = 0; + int offset = 0; + while(gDirectory->FindObjectAny(Form("EnergyHist_%i",offset))!=0) + ++offset; + + fCrossSectionHist = new TH1F(Form("EnergyHist_%i",offset),"Reaction_CS",1,0,180); + fshoot3=true; + fshoot4=true; + + + + initializePrecomputeVariable(); } - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... Reaction::~Reaction(){ //------------- Default Destructor ------------ @@ -363,6 +431,10 @@ void Reaction::ReadConfigurationFile(string Path){ //////////////////////////////////////////////////////////////////////////////////////////// void Reaction::initializePrecomputeVariable(){ + // delete the previously calculated kinematical line: + if(fKineLine3!=0) {delete fKineLine3 ; fKineLine3 = 0;} + if(fKineLine4!=0) {delete fKineLine4 ; fKineLine4 = 0;} + m1 = fNuclei1->Mass(); m2 = fNuclei2->Mass(); m3 = fNuclei3->Mass() + fExcitation3; @@ -416,46 +488,51 @@ void Reaction::SetNuclei3(double EnergyLab, double ThetaLab){ //////////////////////////////////////////////////////////////////////////////////////////// TGraph* Reaction::GetKinematicLine3(){ - int size = 360; - double x[size]; - double y[size]; - double theta3,E3,theta4,E4; - - for (int i = 0; i < size; ++i){ - SetThetaCM(((double)i)/2*deg); - KineRelativistic(theta3, E3, theta4, E4); - fNuclei3->SetKineticEnergy(E3); - - x[i] = theta3/deg; - y[i] = E3; - } - TGraph* KineLine3 = new TGraph(size,x,y); - KineLine3->SetTitle("Kinematic Line of particule 3"); - return(KineLine3); + if(fKineLine3==0){ + int size = 360; + double x[size]; + double y[size]; + double theta3,E3,theta4,E4; + + for (int i = 0; i < size; ++i){ + SetThetaCM(((double)i)/2*deg); + KineRelativistic(theta3, E3, theta4, E4); + fNuclei3->SetKineticEnergy(E3); + + x[i] = theta3/deg; + y[i] = E3; + } + + fKineLine3 = new TGraph(size,x,y); + // fKineLine3->SetTitle("Kinematic Line of particule 3"); + } + return(fKineLine3); } //////////////////////////////////////////////////////////////////////////////////////////// TGraph* Reaction::GetKinematicLine4(){ - int size = 360; - double x[size]; - double y[size]; - double theta3,E3,theta4,E4; - - for (int i = 0; i < size; ++i) + if(fKineLine4==0){ + int size = 360; + double x[size]; + double y[size]; + double theta3,E3,theta4,E4; + + for (int i = 0; i < size; ++i) { - SetThetaCM(((double)i)/2*deg); - KineRelativistic(theta3, E3, theta4, E4); - fNuclei4->SetKineticEnergy(E4); - - x[i] = theta4/deg; - y[i] = E4; + SetThetaCM(((double)i)/2*deg); + KineRelativistic(theta3, E3, theta4, E4); + fNuclei4->SetKineticEnergy(E4); + + x[i] = theta4/deg; + y[i] = E4; } - TGraph* KineLine4= new TGraph(size,x,y); - KineLine4->SetTitle("Kinematic Line of particule 4"); - return(KineLine4); + fKineLine4= new TGraph(size,x,y); + // fKineLine4->SetTitle("Kinematic Line of particule 4"); + } + return(fKineLine4); } //////////////////////////////////////////////////////////////////////////////////////////// diff --git a/NPLib/Physics/NPReaction.h b/NPLib/Physics/NPReaction.h index 969e6ba3edfcb0ec13906c006b0a19e61b5b51a8..f419e9595739f53fa83bcc77aa2905b8b1ace38a 100644 --- a/NPLib/Physics/NPReaction.h +++ b/NPLib/Physics/NPReaction.h @@ -58,6 +58,9 @@ namespace NPL{ public: // Constructors and Destructors Reaction(); + // This constructor aim to provide a fast way to instantiate a reaction without input file + // The string should be of the form "A(b,c)D@E" with E the ernegy of the beam in MeV + Reaction(string); virtual ~Reaction(); public: // Various Method @@ -70,11 +73,14 @@ namespace NPL{ bool fshoot3; bool fshoot4; + private: // use to display the kinematical line + TGraph* fKineLine3 ; + TGraph* fKineLine4 ; private: - Beam *fNuclei1; // Beam - Nucleus *fNuclei2; // Target - Nucleus *fNuclei3; // Light ejectile - Nucleus *fNuclei4; // Heavy ejectile + Beam* fNuclei1; // Beam + Nucleus* fNuclei2; // Target + Nucleus* fNuclei3; // Light ejectile + Nucleus* fNuclei4; // Heavy ejectile double fQValue; // Q-value in MeV double fBeamEnergy; // Beam energy in MeV double fThetaCM; // Center-of-mass angle in radian diff --git a/NPLib/Sharc/TSharcPhysics.cxx b/NPLib/Sharc/TSharcPhysics.cxx index d2d76932d2441b73e5c3ac2fcde944ea829e3625..040b268ca76245b91cf69c91d0926f3baa3a386c 100644 --- a/NPLib/Sharc/TSharcPhysics.cxx +++ b/NPLib/Sharc/TSharcPhysics.cxx @@ -695,14 +695,14 @@ void TSharcPhysics::AddBoxDetector(double Z) m_NumberOfDetector++; if(Z<0){// Up Stream - if(i==0) {U=TVector3(1,0,0);V=TVector3(0,0,1); Strip_1_1=TVector3(-36.,42.5,-56.) ;} + if(i==0) {U=TVector3(1,0,0);V=TVector3(0,0,1); Strip_1_1=TVector3(-36.,42.5,-56.) ;} else if(i==1) {U=TVector3(0,1,0);V=TVector3(0,0,1); Strip_1_1=TVector3(-42.5,-36.,-56.) ;} else if(i==2) {U=TVector3(-1,0,0);V=TVector3(0,0,1); Strip_1_1=TVector3(36.,-42.5,-56.) ;} else if(i==3) {U=TVector3(0,-1,0);V=TVector3(0,0,1); Strip_1_1=TVector3(42.5,36.,-56.) ;} } if(Z>0){//Down Stream - if(i==0) {U=TVector3(-1,0,0);V=TVector3(0,0,-1); Strip_1_1=TVector3(36.,40.5,60.) ;} + if(i==0) {U=TVector3(-1,0,0);V=TVector3(0,0,-1); Strip_1_1=TVector3(36.,40.5,60.) ;} else if(i==1) {U=TVector3(0,-1,0);V=TVector3(0,0,-1); Strip_1_1=TVector3(-40.5,36.,60.) ;} else if(i==2) {U=TVector3(1,0,0);V=TVector3(0,0,-1); Strip_1_1=TVector3(-36.,-40.5,60.) ;} else if(i==3) {U=TVector3(0,1,0);V=TVector3(0,0,-1); Strip_1_1=TVector3(40.5,-36.,60.) ;} @@ -742,13 +742,12 @@ void TSharcPhysics::AddBoxDetector(double Z) void TSharcPhysics::AddQQQDetector( double R,double Phi,double Z){ - double QQQ_R_Min = 9.+R-R; - double QQQ_R_Max = 41.0; + double QQQ_R_Min = 9.+R; + double QQQ_R_Max = 41.0+R; double QQQ_Phi_Min = 2.0*M_PI/180. ; double QQQ_Phi_Max = 83.6*M_PI/180. ; Phi= Phi*M_PI/180.; - Z= -63.5; int QQQ_Radial_NumberOfStrip = 16 ; int QQQ_Sector_NumberOfStrip = 24 ; @@ -776,7 +775,7 @@ void TSharcPhysics::AddQQQDetector( double R,double Phi,double Z){ for(int b = 0 ; b < QQQ_Sector_NumberOfStrip ; b++){ StripCenter = Strip_1_1; - StripCenter.SetY(QQQ_R_Max-StripPitchRadial*f); + StripCenter.SetY(QQQ_R_Max-f*StripPitchRadial); StripCenter.SetZ(Z); StripCenter.RotateZ(Phi+QQQ_Phi_Min+b*StripPitchSector); lineX.push_back( StripCenter.X() ); diff --git a/NPSimulation/include/Sharc.hh b/NPSimulation/include/Sharc.hh index 8a8fafe3bf25a7f985e4d27c928b2786bf0a6faf..c2f14653e963e63e086d58fa3a5b1245e01e4708 100644 --- a/NPSimulation/include/Sharc.hh +++ b/NPSimulation/include/Sharc.hh @@ -46,7 +46,10 @@ namespace SHARC // Energy and time Resolution const G4double ResoTime = 0 ; const G4double ResoEnergy = 0.035*MeV ;// = zzkeV of Resolution // Unit is MeV/2.35 - const G4double EnergyThreshold = 0.4*MeV; + //const G4double EnergyThreshold = 0.4*MeV; + + // Change for TRex simulations + const G4double EnergyThreshold = 0.5*MeV; // Geometry // BOX // @@ -124,7 +127,7 @@ namespace SHARC // QQQ Wafer const G4double QQQ_Wafer_Outer_Radius = 42.63*mm; - const G4double QQQ_Wafer_Inner_Radius = 7.8*mm; + const G4double QQQ_Wafer_Inner_Radius = 9.0*mm; const G4double QQQ_Wafer_Starting_Phi = 8*deg; const G4double QQQ_Wafer_Stopping_Phi = 162*deg; const G4int QQQ_Wafer_NumberOf_RadialStrip = 16 ; diff --git a/NPSimulation/include/SharcScorers.hh b/NPSimulation/include/SharcScorers.hh index 6bae9a21d304a677e3c6abefefc0adce5a2c25b7..08c59c9e9729e921364182517eb94e5f3508d53d 100644 --- a/NPSimulation/include/SharcScorers.hh +++ b/NPSimulation/include/SharcScorers.hh @@ -26,15 +26,17 @@ *****************************************************************************/ #include "G4VPrimitiveScorer.hh" #include "G4THitsMap.hh" + +#include <map> +using namespace std; + namespace SHARC { //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - // This Threshold is used in the above scorer. Any energy deposit under this threshold will not create an entry. - const double TriggerThreshold = 0.1*keV ; class PS_Silicon_Rectangle : public G4VPrimitiveScorer{ public: // with description - PS_Silicon_Rectangle(G4String name, G4double StripPlaneLength, G4double StripPlaneWidth, G4int NumberOfStripLength,G4int NumberOfStripWidth,G4double TriggerThreshold,G4int depth=0); + PS_Silicon_Rectangle(G4String name, G4double StripPlaneLength, G4double StripPlaneWidth, G4int NumberOfStripLength,G4int NumberOfStripWidth,G4int depth=0); ~PS_Silicon_Rectangle(); protected: // with description @@ -74,7 +76,7 @@ namespace SHARC { class PS_Silicon_Annular : public G4VPrimitiveScorer{ public: // with description - PS_Silicon_Annular(G4String name, G4double StripPlaneInnerRadius, G4double StripPlaneOuterRadius, G4double DeltaTheta, G4int NumberOfStripRadial,G4int NumberOfStripTheta,G4double TriggerThreshold,G4int depth=0); + PS_Silicon_Annular(G4String name, G4double StripPlaneInnerRadius, G4double StripPlaneOuterRadius, G4double PhiStart,G4double PhiStop, G4int NumberOfStripRadial,G4int NumberOfStripTheta,G4int depth=0); ~PS_Silicon_Annular(); protected: // with description @@ -93,7 +95,8 @@ namespace SHARC { private: // Geometry of the detector G4double m_StripPlaneInnerRadius; G4double m_StripPlaneOuterRadius; - G4double m_DeltaTheta; + G4double m_PhiStart; + G4double m_PhiStop; G4int m_NumberOfStripRadial; G4int m_NumberOfStripTheta; G4double m_StripPitchRadial; @@ -102,13 +105,13 @@ namespace SHARC { private: // inherited from G4VPrimitiveScorer G4int HCID; G4THitsMap<G4double*>* EvtMap; - + private: // Needed for intermediate calculation (avoid multiple instantiation in Processing Hit) G4ThreeVector m_Position ; - G4ThreeVector m_uz; + G4ThreeVector m_uz ; G4int m_DetectorNumber ; G4int m_StripRadialNumber ; - G4int m_StripThetaNumber ; + G4int m_StripThetaNumber ; G4int m_Index ; }; diff --git a/NPSimulation/src/DetectorConstruction.cc b/NPSimulation/src/DetectorConstruction.cc index 2e4531c593ff07f39bd8a97b18f04a2778f222bd..42d212417c1f709a2fa40d68ca345f0e48fa2263 100644 --- a/NPSimulation/src/DetectorConstruction.cc +++ b/NPSimulation/src/DetectorConstruction.cc @@ -63,6 +63,7 @@ #include "ThinSi.hh" #include "Sharc.hh" #include "Shield.hh" +#include "Tigress.hh" #include "W1.hh" // STL @@ -187,7 +188,8 @@ void DetectorConstruction::ReadConfigurationFile(string Path){ bool cParis = false; bool cS1 = false; bool cSharc = false; - bool cShield = false; + bool cShield = false; + bool cTigress = false; bool cW1 = false; bool cHelios = false; @@ -463,9 +465,30 @@ void DetectorConstruction::ReadConfigurationFile(string Path){ AddDetector(myDetector); #endif } + + //////////////////////////////////////////// + ////////// Search for Tigress /////////// + //////////////////////////////////////////// + else if (LineBuffer.compare(0,7, "Tigress") == 0 && cTigress == false) { +#ifdef INC_TIGRESS + cTigress = true ; + if(VerboseLevel==1) cout << endl << "//////// Tigress ////////" << endl << endl ; + + // Instantiate the new array as a VDetector Object + VDetector* myDetector = new Tigress(); + + // Read Position of detector + ConfigFile.close(); + myDetector->ReadConfiguration(Path); + ConfigFile.open(Path.c_str()); + + // Add array to the VDetector Vector + AddDetector(myDetector); +#endif + } //////////////////////////////////////////// - ////////// Search for Plastic /////////// + ////////// Search for Plastic /////////// //////////////////////////////////////////// else if (LineBuffer.compare(0, 19, "ScintillatorPlastic") == 0 && cPlastic == false) { #ifdef INC_PLASTIC diff --git a/NPSimulation/src/Sharc.cc b/NPSimulation/src/Sharc.cc index c1d34f433d1f0c8c85a23ed69779eb3f6fe0eb17..09e0ec913ce1f3c1dd7fc7158ee9c4a9f635bfae 100644 --- a/NPSimulation/src/Sharc.cc +++ b/NPSimulation/src/Sharc.cc @@ -200,7 +200,7 @@ void Sharc::ReadConfiguration(string Path){ check_Thickness = true; ConfigFile >> DataBuffer ; Thickness= atof(DataBuffer.c_str())*um; - if(VerboseLevel==1) cout << " ThicknessDetector= " << Thickness/um << "mm" << endl; + if(VerboseLevel==1) cout << " ThicknessDetector= " << Thickness/um << "um" << endl; } /////////////////////////////////////////////////// @@ -245,56 +245,56 @@ void Sharc::ReadConfiguration(string Path){ check_Thickness1 = true; ConfigFile >> DataBuffer ; Thickness1= atof(DataBuffer.c_str())*um; - if(VerboseLevel==1) cout << " ThicknessDetector1= " << Thickness1/um << "mm" << endl; + if(VerboseLevel==1) cout << " ThicknessDetector1= " << Thickness1/um << "um" << endl; } else if (DataBuffer == "ThicknessDector2=") { check_Thickness2 = true; ConfigFile >> DataBuffer ; Thickness2= atof(DataBuffer.c_str())*um; - if(VerboseLevel==1) cout << " ThicknessDetector2= " << Thickness2/um << "mm" << endl; + if(VerboseLevel==1) cout << " ThicknessDetector2= " << Thickness2/um << "um" << endl; } else if (DataBuffer == "ThicknessDector3=") { check_Thickness3 = true; ConfigFile >> DataBuffer ; Thickness3= atof(DataBuffer.c_str())*um; - if(VerboseLevel==1) cout << " ThicknessDetector3= " << Thickness3/um << "mm" << endl; + if(VerboseLevel==1) cout << " ThicknessDetector3= " << Thickness3/um << "um" << endl; } else if (DataBuffer == "ThicknessDector4=") { check_Thickness4 = true; ConfigFile >> DataBuffer ; Thickness4= atof(DataBuffer.c_str())*um; - if(VerboseLevel==1) cout << " ThicknessDetector4= " << Thickness4/um << "mm" << endl; + if(VerboseLevel==1) cout << " ThicknessDetector4= " << Thickness4/um << "um" << endl; } else if (DataBuffer == "ThicknessPAD1=") { check_PAD1 = true; ConfigFile >> DataBuffer ; ThicknessPAD1= atof(DataBuffer.c_str())*um; - if(VerboseLevel==1) cout << " ThicknessPAD1= " << ThicknessPAD1 << endl; + if(VerboseLevel==1) cout << " ThicknessPAD1= " << ThicknessPAD1<< "um" << endl; } else if (DataBuffer == "ThicknessPAD2=") { check_PAD2 = true; ConfigFile >> DataBuffer ; ThicknessPAD2= atof(DataBuffer.c_str())*um; - if(VerboseLevel==1) cout << " ThicknessPAD2= " << ThicknessPAD2 << endl; + if(VerboseLevel==1) cout << " ThicknessPAD2= " << ThicknessPAD2<< "um" << endl; } else if (DataBuffer == "ThicknessPAD3=") { check_PAD3 = true; ConfigFile >> DataBuffer ; ThicknessPAD3= atof(DataBuffer.c_str())*um; - if(VerboseLevel==1) cout << " ThicknessPAD3= " << ThicknessPAD3 << endl; + if(VerboseLevel==1) cout << " ThicknessPAD3= " << ThicknessPAD3<< "um" << endl; } else if (DataBuffer == "ThicknessPAD4=") { check_PAD4 = true; ConfigFile >> DataBuffer ; ThicknessPAD4= atof(DataBuffer.c_str())*um; - if(VerboseLevel==1) cout << " ThicknessPAD4= " << ThicknessPAD4 << endl; + if(VerboseLevel==1) cout << " ThicknessPAD4= " << ThicknessPAD4<< "um" << endl; } /////////////////////////////////////////////////// @@ -633,8 +633,8 @@ void Sharc::ReadSensitive(const G4Event* event){ /////////// // BOX - G4THitsMap<G4double*>* BOXHitMap; - std::map<G4int, G4double**>::iterator BOX_itr; + G4THitsMap<G4double*>* BOXHitMap; + std::map<G4int, G4double**>::iterator BOX_itr; G4int BOXCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("Sharc_BOXScorer/SharcBOX"); BOXHitMap = (G4THitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(BOXCollectionID)); @@ -644,34 +644,35 @@ void Sharc::ReadSensitive(const G4Event* event){ G4double* Info = *(BOX_itr->second); - double Energy = Info[0]; - double Time = Info[1]; - int DetNbr = (int) Info[2]; - int StripFront = (int) Info[3]; - int StripBack = (int) Info[4]; - - m_Event->SetFront_DetectorNbr(DetNbr); - m_Event->SetFront_StripNbr(StripFront); - m_Event->SetFront_Energy(RandGauss::shoot(Energy, ResoEnergy)); - m_Event->SetFront_TimeCFD(RandGauss::shoot(Time, ResoTime)); - m_Event->SetFront_TimeLED(RandGauss::shoot(Time, ResoTime)); - - m_Event->SetBack_DetectorNbr(DetNbr); - m_Event->SetBack_StripNbr(StripBack); - m_Event->SetBack_Energy(RandGauss::shoot(Energy, ResoEnergy)); - m_Event->SetBack_TimeCFD(RandGauss::shoot(Time, ResoTime)); - m_Event->SetBack_TimeLED(RandGauss::shoot(Time, ResoTime)); - - - // Interraction Coordinates - ms_InterCoord->SetDetectedPositionX(Info[5]) ; - ms_InterCoord->SetDetectedPositionY(Info[6]) ; - ms_InterCoord->SetDetectedPositionZ(Info[7]) ; - ms_InterCoord->SetDetectedAngleTheta(Info[8]/deg) ; - ms_InterCoord->SetDetectedAnglePhi(Info[9]/deg) ; + double Energy = Info[0]; + if(Energy>EnergyThreshold){ + double Time = Info[1]; + int DetNbr = (int) Info[2]; + int StripFront = (int) Info[3]; + int StripBack = (int) Info[4]; + + m_Event->SetFront_DetectorNbr(DetNbr); + m_Event->SetFront_StripNbr(StripFront); + m_Event->SetFront_Energy(RandGauss::shoot(Energy, ResoEnergy)); + m_Event->SetFront_TimeCFD(RandGauss::shoot(Time, ResoTime)); + m_Event->SetFront_TimeLED(RandGauss::shoot(Time, ResoTime)); + + m_Event->SetBack_DetectorNbr(DetNbr); + m_Event->SetBack_StripNbr(StripBack); + m_Event->SetBack_Energy(RandGauss::shoot(Energy, ResoEnergy)); + m_Event->SetBack_TimeCFD(RandGauss::shoot(Time, ResoTime)); + m_Event->SetBack_TimeLED(RandGauss::shoot(Time, ResoTime)); + + // Interraction Coordinates + ms_InterCoord->SetDetectedPositionX(Info[5]) ; + ms_InterCoord->SetDetectedPositionY(Info[6]) ; + ms_InterCoord->SetDetectedPositionZ(Info[7]) ; + ms_InterCoord->SetDetectedAngleTheta(Info[8]/deg) ; + ms_InterCoord->SetDetectedAnglePhi(Info[9]/deg) ; + + } } - // clear map for next event BOXHitMap->clear(); @@ -689,14 +690,15 @@ void Sharc::ReadSensitive(const G4Event* event){ G4double* Info = *(PAD_itr->second); double Energy = Info[0]; - double Time = Info[1]; - int DetNbr = (int) Info[2]; - - m_Event->SetPAD_DetectorNbr(DetNbr); - m_Event->SetPAD_Energy(RandGauss::shoot(Energy, ResoEnergy)); - m_Event->SetPAD_TimeCFD(RandGauss::shoot(Time, ResoTime)); - m_Event->SetPAD_TimeLED(RandGauss::shoot(Time, ResoTime)); - + if(Energy>EnergyThreshold){ + double Time = Info[1]; + int DetNbr = (int) Info[2]; + + m_Event->SetPAD_DetectorNbr(DetNbr); + m_Event->SetPAD_Energy(RandGauss::shoot(Energy, ResoEnergy)); + m_Event->SetPAD_TimeCFD(RandGauss::shoot(Time, ResoTime)); + m_Event->SetPAD_TimeLED(RandGauss::shoot(Time, ResoTime)); + } } // clear map for next event @@ -704,8 +706,8 @@ void Sharc::ReadSensitive(const G4Event* event){ /////////// // QQQ - G4THitsMap<G4double*>* QQQHitMap; - std::map<G4int, G4double**>::iterator QQQ_itr; + G4THitsMap<G4double*>* QQQHitMap; + std::map<G4int, G4double**>::iterator QQQ_itr; G4int QQQCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("Sharc_QQQScorer/SharcQQQ"); QQQHitMap = (G4THitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(QQQCollectionID)); @@ -716,30 +718,31 @@ void Sharc::ReadSensitive(const G4Event* event){ G4double* Info = *(QQQ_itr->second); double Energy = Info[0]; - double Time = Info[1]; - int DetNbr = (int) Info[2]; - int StripFront = (int) Info[3]; - int StripBack = (int) Info[4]; - - m_Event->SetFront_DetectorNbr(DetNbr); - m_Event->SetFront_StripNbr(StripFront); - m_Event->SetFront_Energy(RandGauss::shoot(Energy, ResoEnergy)); - m_Event->SetFront_TimeCFD(RandGauss::shoot(Time, ResoTime)); - m_Event->SetFront_TimeLED(RandGauss::shoot(Time, ResoTime)); - - m_Event->SetBack_DetectorNbr(DetNbr); - m_Event->SetBack_StripNbr(StripBack); - m_Event->SetBack_Energy(RandGauss::shoot(Energy, ResoEnergy)); - m_Event->SetBack_TimeCFD(RandGauss::shoot(Time, ResoTime)); - m_Event->SetBack_TimeLED(RandGauss::shoot(Time, ResoTime)); - - // Interraction Coordinates - ms_InterCoord->SetDetectedPositionX(Info[5]) ; - ms_InterCoord->SetDetectedPositionY(Info[6]) ; - ms_InterCoord->SetDetectedPositionZ(Info[7]) ; - ms_InterCoord->SetDetectedAngleTheta(Info[8]/deg) ; - ms_InterCoord->SetDetectedAnglePhi(Info[9]/deg) ; - + if(Energy>EnergyThreshold){ + double Time = Info[1]; + int DetNbr = (int) Info[2]; + int StripFront = (int) Info[3]; + int StripBack = (int) Info[4]; + + m_Event->SetFront_DetectorNbr(DetNbr); + m_Event->SetFront_StripNbr(StripFront); + m_Event->SetFront_Energy(RandGauss::shoot(Energy, ResoEnergy)); + m_Event->SetFront_TimeCFD(RandGauss::shoot(Time, ResoTime)); + m_Event->SetFront_TimeLED(RandGauss::shoot(Time, ResoTime)); + + m_Event->SetBack_DetectorNbr(DetNbr); + m_Event->SetBack_StripNbr(StripBack); + m_Event->SetBack_Energy(RandGauss::shoot(Energy, ResoEnergy)); + m_Event->SetBack_TimeCFD(RandGauss::shoot(Time, ResoTime)); + m_Event->SetBack_TimeLED(RandGauss::shoot(Time, ResoTime)); + + // Interraction Coordinates + ms_InterCoord->SetDetectedPositionX(Info[5]) ; + ms_InterCoord->SetDetectedPositionY(Info[6]) ; + ms_InterCoord->SetDetectedPositionZ(Info[7]) ; + ms_InterCoord->SetDetectedAngleTheta(Info[8]/deg) ; + ms_InterCoord->SetDetectedAnglePhi(Info[9]/deg) ; + } } // clear map for next event @@ -760,27 +763,23 @@ void Sharc::InitializeScorers(){ BOX_Wafer_Length, BOX_Wafer_Width, BOX_Wafer_Back_NumberOfStrip , - BOX_Wafer_Front_NumberOfStrip, - EnergyThreshold); + BOX_Wafer_Front_NumberOfStrip); G4VPrimitiveScorer* PADScorer = new SHARC::PS_Silicon_Rectangle("SharcPAD", PAD_Wafer_Length, PAD_Wafer_Width, 1 , - 1, - EnergyThreshold); + 1); G4VPrimitiveScorer* QQQScorer = new SHARC::PS_Silicon_Annular("SharcQQQ", QQQ_Wafer_Inner_Radius, QQQ_Wafer_Outer_Radius, - QQQ_Wafer_Stopping_Phi-QQQ_Wafer_Starting_Phi, + QQQ_Wafer_Starting_Phi, + QQQ_Wafer_Stopping_Phi, QQQ_Wafer_NumberOf_RadialStrip, - QQQ_Wafer_NumberOf_AnnularStrip, - EnergyThreshold); - - + QQQ_Wafer_NumberOf_AnnularStrip); //and register it to the multifunctionnal detector m_BOXScorer->RegisterPrimitive(BOXScorer); diff --git a/NPSimulation/src/SharcScorers.cc b/NPSimulation/src/SharcScorers.cc index 8cda2113c16b50ebe2c631d05118eb74f86ce8a5..62612c22430461aaf48e5c480ff1dd9fd2ce4810 100644 --- a/NPSimulation/src/SharcScorers.cc +++ b/NPSimulation/src/SharcScorers.cc @@ -24,8 +24,8 @@ using namespace SHARC ; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -PS_Silicon_Rectangle::PS_Silicon_Rectangle(G4String name, G4double StripPlaneLength, G4double StripPlaneWidth, G4int NumberOfStripLength,G4int NumberOfStripWidth,G4double TriggerThreshold,G4int depth) -:G4VPrimitiveScorer(name, depth), m_TriggerThreshold(TriggerThreshold),HCID(-1){ +PS_Silicon_Rectangle::PS_Silicon_Rectangle(G4String name, G4double StripPlaneLength, G4double StripPlaneWidth, G4int NumberOfStripLength,G4int NumberOfStripWidth,G4int depth) +:G4VPrimitiveScorer(name, depth),HCID(-1){ m_StripPlaneLength = StripPlaneLength; m_StripPlaneWidth = StripPlaneWidth; m_NumberOfStripLength = NumberOfStripLength; @@ -51,11 +51,7 @@ G4bool PS_Silicon_Rectangle::ProcessHits(G4Step* aStep, G4TouchableHistory*){ G4double* EnergyAndTime = new G4double[10]; EnergyAndTime[0] = aStep->GetTotalEnergyDeposit(); - // If the energy deposit is below the threshold, the deposit is ignored - if (EnergyAndTime[0] < m_TriggerThreshold){ - delete EnergyAndTime; - return FALSE; - } + EnergyAndTime[1] = aStep->GetPreStepPoint()->GetGlobalTime(); @@ -74,6 +70,10 @@ G4bool PS_Silicon_Rectangle::ProcessHits(G4Step* aStep, G4TouchableHistory*){ m_StripLengthNumber = (int)((m_Position.x() + m_StripPlaneLength / 2.) / m_StripPitchLength ) + 1 ; m_StripWidthNumber = (int)((m_Position.y() + m_StripPlaneWidth / 2.) / m_StripPitchWidth ) + 1 ; + m_StripLengthNumber = m_NumberOfStripLength - m_StripLengthNumber + 1 ; + m_StripWidthNumber = m_NumberOfStripWidth - m_StripWidthNumber + 1 ; + + EnergyAndTime[2] = m_DetectorNumber; EnergyAndTime[3] = m_StripLengthNumber; EnergyAndTime[4] = m_StripWidthNumber; @@ -84,6 +84,15 @@ G4bool PS_Silicon_Rectangle::ProcessHits(G4Step* aStep, G4TouchableHistory*){ if (m_StripWidthNumber == m_NumberOfStripWidth+1) m_StripWidthNumber = m_StripWidthNumber; m_Index = aStep->GetTrack()->GetTrackID() + m_DetectorNumber * 1e3 + m_StripLengthNumber * 1e6 + m_StripWidthNumber * 1e9; + + // Check if the particle has interact before, if yes, add up the energies. + map<G4int, G4double**>::iterator it; + it= EvtMap->GetMap()->find(m_Index); + if(it!=EvtMap->GetMap()->end()){ + G4double* dummy = *(it->second); + EnergyAndTime[0]+=dummy[0]; + } + EvtMap->set(m_Index, EnergyAndTime); return TRUE; } @@ -126,15 +135,16 @@ void PS_Silicon_Rectangle::PrintAll(){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -PS_Silicon_Annular::PS_Silicon_Annular(G4String name, G4double StripPlaneInnerRadius, G4double StripPlaneOuterRadius, G4double DeltaTheta, G4int NumberOfStripRadial,G4int NumberOfStripTheta,G4double TriggerThreshold,G4int depth) -:G4VPrimitiveScorer(name, depth), m_TriggerThreshold(TriggerThreshold),HCID(-1){ +PS_Silicon_Annular::PS_Silicon_Annular(G4String name, G4double StripPlaneInnerRadius, G4double StripPlaneOuterRadius, G4double PhiStart,G4double PhiStop, G4int NumberOfStripRadial,G4int NumberOfStripTheta,G4int depth) +:G4VPrimitiveScorer(name, depth),HCID(-1){ m_StripPlaneInnerRadius = StripPlaneInnerRadius; m_StripPlaneOuterRadius = StripPlaneOuterRadius; - m_DeltaTheta = DeltaTheta; + m_PhiStart = PhiStart; + m_PhiStop = PhiStop; m_NumberOfStripRadial = NumberOfStripRadial; m_NumberOfStripTheta = NumberOfStripTheta; - m_StripPitchRadial = DeltaTheta/m_NumberOfStripTheta; + m_StripPitchRadial = (m_PhiStop-m_PhiStart)/m_NumberOfStripTheta; m_StripPitchTheta = (m_StripPlaneOuterRadius-m_StripPlaneInnerRadius)/m_NumberOfStripRadial; m_Position = G4ThreeVector(-1000,-1000,-1000); @@ -151,33 +161,26 @@ PS_Silicon_Annular::~PS_Silicon_Annular(){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4bool PS_Silicon_Annular::ProcessHits(G4Step* aStep, G4TouchableHistory*){ - // contain Energy Time, DetNbr, StripFront and StripBack G4double* EnergyAndTime = new G4double[10]; EnergyAndTime[0] = aStep->GetTotalEnergyDeposit(); - // If the energy deposit is below the threshold, the deposit is ignored - if (EnergyAndTime[0] < m_TriggerThreshold){ - delete EnergyAndTime; - return FALSE; - } - EnergyAndTime[1] = aStep->GetPreStepPoint()->GetGlobalTime(); m_DetectorNumber = aStep->GetPreStepPoint()->GetTouchableHandle()->GetCopyNumber(0); m_Position = aStep->GetPreStepPoint()->GetPosition(); - + // Interaction coordinates (used to fill the InteractionCoordinates branch) EnergyAndTime[5] = m_Position.x(); EnergyAndTime[6] = m_Position.y(); EnergyAndTime[7] = m_Position.z(); EnergyAndTime[8] = m_Position.theta(); EnergyAndTime[9] = m_Position.phi(); - + m_Position = aStep->GetPreStepPoint()->GetTouchableHandle()->GetHistory()->GetTopTransform().TransformPoint(m_Position); - - m_StripRadialNumber = (int)((m_Position.angle(m_uz) - m_DeltaTheta*0.5) / m_StripPitchRadial ) + 1 ; - m_StripThetaNumber = (int)((m_Position.rho()-m_StripPlaneInnerRadius) / m_StripPitchTheta ) + 1 ; + m_StripRadialNumber = (int) ((m_StripPlaneOuterRadius - m_Position.rho()) / m_StripPitchTheta ) + 1 ; + + m_StripThetaNumber = (int) ((m_Position.phi() - m_PhiStart*0.5) / m_StripPitchRadial ) + 1 ; EnergyAndTime[2] = m_DetectorNumber; EnergyAndTime[3] = m_StripRadialNumber; @@ -188,6 +191,15 @@ G4bool PS_Silicon_Annular::ProcessHits(G4Step* aStep, G4TouchableHistory*){ if (m_StripThetaNumber == m_NumberOfStripTheta+1) m_StripThetaNumber = m_NumberOfStripTheta; m_Index = aStep->GetTrack()->GetTrackID() + m_DetectorNumber * 1e3 + m_StripRadialNumber * 1e6 + m_NumberOfStripTheta * 1e9; + + // Check if the particle has interact before, if yes, add up the energies. + map<G4int, G4double**>::iterator it; + it= EvtMap->GetMap()->find(m_Index); + if(it!=EvtMap->GetMap()->end()){ + G4double* dummy = *(it->second); + EnergyAndTime[0]+=dummy[0]; + } + EvtMap->set(m_Index, EnergyAndTime); return TRUE; } diff --git a/NPSimulation/src/Target.cc b/NPSimulation/src/Target.cc index b935a374299d5bc97d9305446d1bfeb1e76a89d2..1ccdaa85d4b3c7878ffd615de642b4c4eaca286e 100644 --- a/NPSimulation/src/Target.cc +++ b/NPSimulation/src/Target.cc @@ -616,7 +616,7 @@ void Target::WriteDEDXTable(G4ParticleDefinition* Particle ,G4double Emin,G4doub G4EmCalculator emCalculator; - for (G4double E=Emin; E < Emax; E+=(Emax-Emin)/10.){ + for (G4double E=Emin; E < Emax; E+=(Emax-Emin)/1000.){ G4double dedx = emCalculator.ComputeTotalDEDX(E, Particle, m_TargetMaterial); File << E/MeV << "\t" << dedx/(MeV/micrometer) << endl ; } diff --git a/NPSimulation/vis.mac b/NPSimulation/vis.mac index 96d2fc4a6a0d6fdee5cd2a7d6c279f383601f2d4..9150d12e36fbabcfe951c94dd7357592d0517075 100644 --- a/NPSimulation/vis.mac +++ b/NPSimulation/vis.mac @@ -40,7 +40,7 @@ /vis/viewer/set/style surface # # Draw coordinate axes: -/vis/scene/add/axes 0 0 0 20 cm +#/vis/scene/add/axes 0 0 0 20 cm # # Draw smooth trajectories at end of event, showing trajectory points # as markers 2 pixels wide: @@ -67,7 +67,7 @@ #/vis/modeling/trajectories/drawByParticleID-0/set e- blue # # To superimpose all of the events from a given run: -#/vis/scene/endOfEventAction accumulate +/vis/scene/endOfEventAction accumulate # # Re-establish auto refreshing and verbosity: /vis/viewer/set/autoRefresh true