From 378759115f4a6729144130e8f3ee60d60740df94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Val=C3=A9rian=20Alcindor?= <valerian.alcindor@hotmail.fr> Date: Thu, 9 Sep 2021 13:46:05 +0200 Subject: [PATCH] Several updates. 1) enable possiblity to record more information from the tracks using Stepping Action. 2) Add to the p2p reaction the possibility for the heavy nucleus to decay using the ABLA deexcitation code included in G4. --- NPLib/Physics/CMakeLists.txt | 7 +- NPLib/Physics/NPFunction.cxx | 139 +++++++++++--------- NPLib/Physics/NPQFS.cxx | 5 +- NPLib/Physics/NPQFS.h | 2 + NPLib/Physics/TInteractionCoordinates.cxx | 8 ++ NPLib/Physics/TInteractionCoordinates.h | 62 ++++++++- NPLib/Physics/TTrackInfo.cxx | 83 ++++++++++++ NPLib/Physics/TTrackInfo.h | 144 +++++++++++++++++++++ NPSimulation/Core/CMakeLists.txt | 2 +- NPSimulation/Core/ParticleStack.cc | 2 +- NPSimulation/Core/SteppingAction.cc | 144 +++++++++++++++++---- NPSimulation/Core/SteppingAction.hh | 59 ++++++--- NPSimulation/Process/BeamReaction.cc | 59 +++++++-- NPSimulation/Process/BeamReaction.hh | 4 + NPSimulation/Scorers/InteractionScorers.cc | 40 ++++-- NPSimulation/Scorers/InteractionScorers.hh | 85 +++++++++++- 16 files changed, 706 insertions(+), 139 deletions(-) create mode 100644 NPLib/Physics/TTrackInfo.cxx create mode 100644 NPLib/Physics/TTrackInfo.h diff --git a/NPLib/Physics/CMakeLists.txt b/NPLib/Physics/CMakeLists.txt index 02cf69825..3a3487d33 100644 --- a/NPLib/Physics/CMakeLists.txt +++ b/NPLib/Physics/CMakeLists.txt @@ -14,6 +14,8 @@ add_custom_command(OUTPUT NPEnergyLossDict.cxx COMMAND ${CMAKE_BINARY_DIR}/scrip add_custom_command(OUTPUT TInitialConditionsDict.cxx COMMAND ${CMAKE_BINARY_DIR}/scripts/build_dict.sh TInitialConditions.h TInitialConditionsDict.cxx TInitialConditions.rootmap libNPInitialConditions.so DEPENDS TInitialConditions.h) +add_custom_command(OUTPUT TTrackInfoDict.cxx COMMAND ${CMAKE_BINARY_DIR}/scripts/build_dict.sh TTrackInfo.h TTrackInfoDict.cxx TTrackInfo.rootmap libNPTrackInfo.so DEPENDS TTrackInfo.h) + add_custom_command(OUTPUT TInteractionCoordinatesDict.cxx COMMAND ${CMAKE_BINARY_DIR}/scripts/build_dict.sh TInteractionCoordinates.h TInteractionCoordinatesDict.cxx TInteractionCoordinates.rootmap libNPInteractionCoordinates.so DEPENDS TInteractionCoordinates.h) add_custom_command(OUTPUT TReactionConditionsDict.cxx COMMAND ${CMAKE_BINARY_DIR}/scripts/build_dict.sh TReactionConditions.h TReactionConditionsDict.cxx TReactionConditions.rootmap libNPReactionConditions.so DEPENDS TReactionConditions.h) @@ -26,6 +28,9 @@ target_link_libraries(NPPhysics ${ROOT_LIBRARIES} Physics NPCore) add_library(NPInitialConditions SHARED TInitialConditions.cxx TInitialConditionsDict.cxx ) target_link_libraries(NPInitialConditions ${ROOT_LIBRARIES} ) +add_library(NPTrackInfo SHARED TTrackInfo.cxx TTrackInfoDict.cxx ) +target_link_libraries(NPTrackInfo ${ROOT_LIBRARIES} ) + add_library(NPInteractionCoordinates SHARED TInteractionCoordinates.cxx TInteractionCoordinatesDict.cxx) target_link_libraries(NPInteractionCoordinates ${ROOT_LIBRARIES} ) @@ -36,4 +41,4 @@ add_library(NPFissionConditions SHARED TFissionConditions.cxx TFissionConditions target_link_libraries(NPFissionConditions ${ROOT_LIBRARIES} ) -install(FILES GEF.h NPFissionDecay.h NPDecay.h NPBeam.h NPEnergyLoss.h NPFunction.h NPParticle.h NPNucleus.h NPReaction.h NPQFS.h TInitialConditions.h TInteractionCoordinates.h TReactionConditions.h TFissionConditions.h DESTINATION ${CMAKE_INCLUDE_OUTPUT_DIRECTORY}) +install(FILES GEF.h NPFissionDecay.h NPDecay.h NPBeam.h NPEnergyLoss.h NPFunction.h NPParticle.h NPNucleus.h NPReaction.h NPQFS.h TInitialConditions.h TTrackInfo.h TInteractionCoordinates.h TReactionConditions.h TFissionConditions.h DESTINATION ${CMAKE_INCLUDE_OUTPUT_DIRECTORY}) diff --git a/NPLib/Physics/NPFunction.cxx b/NPLib/Physics/NPFunction.cxx index 9de2b6662..5d59b7e8e 100644 --- a/NPLib/Physics/NPFunction.cxx +++ b/NPLib/Physics/NPFunction.cxx @@ -374,73 +374,88 @@ namespace NPL{ string NumberOfMass ; string Nucleid; + bool g4_exc = false; for (unsigned int i = 0; i < OriginalName.length(); i++) { ostringstream character; character << OriginalName[i]; - if (character.str()=="0") NumberOfMass+="0"; - else if (character.str()=="1") NumberOfMass+="1"; - else if (character.str()=="2") NumberOfMass+="2"; - else if (character.str()=="3") NumberOfMass+="3"; - else if (character.str()=="4") NumberOfMass+="4"; - else if (character.str()=="5") NumberOfMass+="5"; - else if (character.str()=="6") NumberOfMass+="6"; - else if (character.str()=="7") NumberOfMass+="7"; - else if (character.str()=="8") NumberOfMass+="8"; - else if (character.str()=="9") NumberOfMass+="9"; + // std::cout << OriginalName << " "<< OriginalName[i]<< std::endl; - else if (character.str()=="A") Nucleid+="A"; - else if (character.str()=="B") Nucleid+="B"; - else if (character.str()=="C") Nucleid+="C"; - else if (character.str()=="D") Nucleid+="D"; - else if (character.str()=="E") Nucleid+="E"; - else if (character.str()=="F") Nucleid+="F"; - else if (character.str()=="G") Nucleid+="G"; - else if (character.str()=="H") Nucleid+="H"; - else if (character.str()=="I") Nucleid+="I"; - else if (character.str()=="J") Nucleid+="J"; - else if (character.str()=="K") Nucleid+="K"; - else if (character.str()=="L") Nucleid+="L"; - else if (character.str()=="M") Nucleid+="M"; - else if (character.str()=="N") Nucleid+="N"; - else if (character.str()=="O") Nucleid+="O"; - else if (character.str()=="P") Nucleid+="P"; - else if (character.str()=="Q") Nucleid+="Q"; - else if (character.str()=="R") Nucleid+="R"; - else if (character.str()=="S") Nucleid+="S"; - else if (character.str()=="T") Nucleid+="T"; - else if (character.str()=="U") Nucleid+="U"; - else if (character.str()=="V") Nucleid+="V"; - else if (character.str()=="W") Nucleid+="W"; - else if (character.str()=="X") Nucleid+="X"; - else if (character.str()=="Y") Nucleid+="Y"; - else if (character.str()=="Z") Nucleid+="Z"; + // To remove Nuclei excitation from the name + if (character.str()=="["){ + g4_exc=true; + } + if (character.str()=="]"){ + g4_exc=false; + } - else if (character.str()=="a") Nucleid+="a"; - else if (character.str()=="b") Nucleid+="b"; - else if (character.str()=="c") Nucleid+="c"; - else if (character.str()=="d") Nucleid+="d"; - else if (character.str()=="e") Nucleid+="e"; - else if (character.str()=="f") Nucleid+="f"; - else if (character.str()=="g") Nucleid+="g"; - else if (character.str()=="h") Nucleid+="h"; - else if (character.str()=="i") Nucleid+="i"; - else if (character.str()=="j") Nucleid+="j"; - else if (character.str()=="k") Nucleid+="k"; - else if (character.str()=="l") Nucleid+="l"; - else if (character.str()=="m") Nucleid+="m"; - else if (character.str()=="n") Nucleid+="n"; - else if (character.str()=="o") Nucleid+="o"; - else if (character.str()=="p") Nucleid+="p"; - else if (character.str()=="q") Nucleid+="q"; - else if (character.str()=="r") Nucleid+="r"; - else if (character.str()=="s") Nucleid+="s"; - else if (character.str()=="t") Nucleid+="t"; - else if (character.str()=="u") Nucleid+="u"; - else if (character.str()=="v") Nucleid+="v"; - else if (character.str()=="w") Nucleid+="w"; - else if (character.str()=="x") Nucleid+="x"; - else if (character.str()=="y") Nucleid+="y"; - else if (character.str()=="z") Nucleid+="z"; + if(g4_exc == true){ + continue; + } + + if (character.str()=="0") NumberOfMass+="0"; + else if (character.str()=="1") NumberOfMass+="1"; + else if (character.str()=="2") NumberOfMass+="2"; + else if (character.str()=="3") NumberOfMass+="3"; + else if (character.str()=="4") NumberOfMass+="4"; + else if (character.str()=="5") NumberOfMass+="5"; + else if (character.str()=="6") NumberOfMass+="6"; + else if (character.str()=="7") NumberOfMass+="7"; + else if (character.str()=="8") NumberOfMass+="8"; + else if (character.str()=="9") NumberOfMass+="9"; + + else if (character.str()=="A") Nucleid+="A"; + else if (character.str()=="B") Nucleid+="B"; + else if (character.str()=="C") Nucleid+="C"; + else if (character.str()=="D") Nucleid+="D"; + else if (character.str()=="E") Nucleid+="E"; + else if (character.str()=="F") Nucleid+="F"; + else if (character.str()=="G") Nucleid+="G"; + else if (character.str()=="H") Nucleid+="H"; + else if (character.str()=="I") Nucleid+="I"; + else if (character.str()=="J") Nucleid+="J"; + else if (character.str()=="K") Nucleid+="K"; + else if (character.str()=="L") Nucleid+="L"; + else if (character.str()=="M") Nucleid+="M"; + else if (character.str()=="N") Nucleid+="N"; + else if (character.str()=="O") Nucleid+="O"; + else if (character.str()=="P") Nucleid+="P"; + else if (character.str()=="Q") Nucleid+="Q"; + else if (character.str()=="R") Nucleid+="R"; + else if (character.str()=="S") Nucleid+="S"; + else if (character.str()=="T") Nucleid+="T"; + else if (character.str()=="U") Nucleid+="U"; + else if (character.str()=="V") Nucleid+="V"; + else if (character.str()=="W") Nucleid+="W"; + else if (character.str()=="X") Nucleid+="X"; + else if (character.str()=="Y") Nucleid+="Y"; + else if (character.str()=="Z") Nucleid+="Z"; + + else if (character.str()=="a") Nucleid+="a"; + else if (character.str()=="b") Nucleid+="b"; + else if (character.str()=="c") Nucleid+="c"; + else if (character.str()=="d") Nucleid+="d"; + else if (character.str()=="e") Nucleid+="e"; + else if (character.str()=="f") Nucleid+="f"; + else if (character.str()=="g") Nucleid+="g"; + else if (character.str()=="h") Nucleid+="h"; + else if (character.str()=="i") Nucleid+="i"; + else if (character.str()=="j") Nucleid+="j"; + else if (character.str()=="k") Nucleid+="k"; + else if (character.str()=="l") Nucleid+="l"; + else if (character.str()=="m") Nucleid+="m"; + else if (character.str()=="n") Nucleid+="n"; + else if (character.str()=="o") Nucleid+="o"; + else if (character.str()=="p") Nucleid+="p"; + else if (character.str()=="q") Nucleid+="q"; + else if (character.str()=="r") Nucleid+="r"; + else if (character.str()=="s") Nucleid+="s"; + else if (character.str()=="t") Nucleid+="t"; + else if (character.str()=="u") Nucleid+="u"; + else if (character.str()=="v") Nucleid+="v"; + else if (character.str()=="w") Nucleid+="w"; + else if (character.str()=="x") Nucleid+="x"; + else if (character.str()=="y") Nucleid+="y"; + else if (character.str()=="z") Nucleid+="z"; } string FinalName=NumberOfMass+Nucleid; diff --git a/NPLib/Physics/NPQFS.cxx b/NPLib/Physics/NPQFS.cxx index 2f402568c..b19851ca6 100644 --- a/NPLib/Physics/NPQFS.cxx +++ b/NPLib/Physics/NPQFS.cxx @@ -87,7 +87,7 @@ QFS::QFS(){ fPerpMomentumHist = NULL; fParMomentumHist = NULL; - + fDeexcitation = false; } //////////////////////////////////////////////////////////////////////////////// @@ -174,6 +174,9 @@ void QFS::ReadConfigurationFile(NPL::InputParser parser){ TH1F* Partemp = Read1DProfile(file_par[0], file_par[1]); SetParMomentumHist(Partemp); } + if(blocks[i]->HasToken("Deexcitation")){ + fDeexcitation = blocks[i]->GetInt("Deexcitation"); + } } cout << "\033[0m" ; diff --git a/NPLib/Physics/NPQFS.h b/NPLib/Physics/NPQFS.h index 0ad758152..0afde4ccd 100644 --- a/NPLib/Physics/NPQFS.h +++ b/NPLib/Physics/NPQFS.h @@ -93,6 +93,7 @@ namespace NPL{ bool fshoot1; // shoot light ejectile & bool fshoot2; // shoot light ejectile 2 bool fUseExInGeant4; + bool fDeexcitation; public: Particle GetParticle(string name, NPL::InputParser parser); @@ -182,6 +183,7 @@ namespace NPL{ bool GetShoot1() const {return fshoot1;} bool GetShoot2() const {return fshoot2;} bool GetShootB() const {return fshootB;} + bool GetDeexcitation() const {return fDeexcitation;} double GetThetaCM() const {return fThetaCM;} double GetPhiCM() const {return fPhiCM;} double GetMomentumSigma() const {return fMomentumSigma;} diff --git a/NPLib/Physics/TInteractionCoordinates.cxx b/NPLib/Physics/TInteractionCoordinates.cxx index 340696b47..3914ff94f 100644 --- a/NPLib/Physics/TInteractionCoordinates.cxx +++ b/NPLib/Physics/TInteractionCoordinates.cxx @@ -35,6 +35,7 @@ TInteractionCoordinates::~TInteractionCoordinates() {} void TInteractionCoordinates::Clear(){ + fDetected_Index.clear(); // Incident particle properties (before interactions in the target) // Energy and Time fDetected_Energy.clear(); @@ -46,6 +47,13 @@ void TInteractionCoordinates::Clear(){ // Incident particle angles fDetected_Angle_Theta.clear(); fDetected_Angle_Phi.clear(); + + fDetected_Particle_Name.clear(); + fDetected_A.clear(); + fDetected_Z.clear(); + fDetected_Mass.clear(); + fDetected_Charge.clear(); + fDetected_Brho.clear(); } diff --git a/NPLib/Physics/TInteractionCoordinates.h b/NPLib/Physics/TInteractionCoordinates.h index 1ce1052cc..0867793c2 100644 --- a/NPLib/Physics/TInteractionCoordinates.h +++ b/NPLib/Physics/TInteractionCoordinates.h @@ -11,7 +11,8 @@ * Original Author: N. de Sereville contact address: deserevi@ipno.in2p3.fr * * * * Creation Date : 10/06/09 * - * Last update : * + * Last update : 01/09/2021 Valerian Alcindor adding particle name to * + * interaction coordinate for easier g4 analysis simulation * *---------------------------------------------------------------------------* * Decription: This class mainly records the coordinates of interaction * * between a particle and a detector. * @@ -25,14 +26,18 @@ +#include "NPFunction.h" #include <vector> #include "TObject.h" #include <iostream> + using namespace std ; class TInteractionCoordinates : public TObject{ private: + // TrackID or index for correlations + vector<int> fDetected_Index; // Detected particle properties (before interactions in the target) // Energy and Time vector<double> fDetected_Energy; @@ -44,6 +49,13 @@ class TInteractionCoordinates : public TObject{ // Particle angles vector<double> fDetected_Angle_Theta; vector<double> fDetected_Angle_Phi; + // Particle characteristics + vector<std::string> fDetected_Particle_Name; + vector<int> fDetected_A; + vector<int> fDetected_Z; + vector<double> fDetected_Mass; + vector<int> fDetected_Charge; + vector<double> fDetected_Brho; public: TInteractionCoordinates(); @@ -64,6 +76,37 @@ class TInteractionCoordinates : public TObject{ fDetected_Angle_Phi.push_back(Phi); } + void SetInteraction(const int& Index, const double& Energy, const double&Time, const double& PositionX, const double& PositionY, const double& PositionZ,const double& Theta, const double& Phi){ + fDetected_Index.push_back(Index); + fDetected_Energy.push_back(Energy); + fDetected_Time.push_back(Time); + fDetected_Position_X.push_back(PositionX); + fDetected_Position_Y.push_back(PositionY); + fDetected_Position_Z.push_back(PositionZ); + fDetected_Angle_Theta.push_back(Theta); + fDetected_Angle_Phi.push_back(Phi); + } + + void SetInteraction(const int& Index, const double& Energy, const double&Time, const double& PositionX, const double& PositionY, const double& PositionZ,const double& Theta, const double& Phi, const std::string &ParticleName, const int &A, const int &Z, const double &Mass, const int &Charge, const double &Brho){ + fDetected_Index.push_back(Index); + fDetected_Energy.push_back(Energy); + fDetected_Time.push_back(Time); + fDetected_Position_X.push_back(PositionX); + fDetected_Position_Y.push_back(PositionY); + fDetected_Position_Z.push_back(PositionZ); + fDetected_Angle_Theta.push_back(Theta); + fDetected_Angle_Phi.push_back(Phi); + if(ParticleName != "e-" && ParticleName != "e+") + fDetected_Particle_Name.push_back(NPL::ChangeNameFromG4Standard(ParticleName)); + else + fDetected_Particle_Name.push_back(ParticleName); + fDetected_A.push_back(A); + fDetected_Z.push_back(Z); + fDetected_Mass.push_back(Mass); + fDetected_Charge.push_back(Charge); + fDetected_Brho.push_back(Brho); + } + ///////////////////// SETTERS //////////////////////// // Incident particle properties (before interactions in the target) // Vertex of interaction @@ -74,11 +117,18 @@ class TInteractionCoordinates : public TObject{ void SetDetectedAngleTheta(const double& AngleTheta) {fDetected_Angle_Theta.push_back(AngleTheta);}//! void SetDetectedAnglePhi(const double& AnglePhi) {fDetected_Angle_Phi.push_back(AnglePhi);}//! + void SetDetectedParticleName(const std::string& ParticleName) {fDetected_Particle_Name.push_back(ParticleName);}//! + void SetDetectedA(const int& A) {fDetected_A.push_back(A);}//! + void SetDetectedZ(const int& Z) {fDetected_Z.push_back(Z);}//! + void SetDetectedMass(const double& Mass) {fDetected_Mass.push_back(Mass);}//! + void SetDetectedCharge(const int& Charge) {fDetected_Charge.push_back(Charge);}//! + void SetDetectedBrho(const double& Brho) {fDetected_Brho.push_back(Brho);}//! + ///////////////////// GETTERS //////////////////////// // Number of interactions (multiplicity) int GetDetectedMultiplicity() const {return fDetected_Position_X.size();} // Incident particle properties (before interactions in the target) - // Enery and Time + // Energy and Time double GetEnergy(const int& i) const {return fDetected_Energy[i];}//! double GetTime(const int& i) const {return fDetected_Time[i];}//! // Vertex of interaction @@ -89,6 +139,14 @@ class TInteractionCoordinates : public TObject{ double GetDetectedAngleTheta(const int& i) const {return fDetected_Angle_Theta[i];}//! double GetDetectedAnglePhi(const int& i) const {return fDetected_Angle_Phi[i];}//! + std::string GetParticleName(const int& i) const {return fDetected_Particle_Name[i];}//! + + int GetA(const int& i) const {return fDetected_A[i];}//! + int GetZ(const int& i) const {return fDetected_Z[i];}//! + double GetMass(const int& i) const {return fDetected_Mass[i];}//! + int GetCharge(const int& i) const {return fDetected_Charge[i];}//! + double GetBrho(const int& i) const {return fDetected_Brho[i];}//! + ClassDef(TInteractionCoordinates, 2) // InteractionCoordinates structure }; diff --git a/NPLib/Physics/TTrackInfo.cxx b/NPLib/Physics/TTrackInfo.cxx new file mode 100644 index 000000000..5ca389023 --- /dev/null +++ b/NPLib/Physics/TTrackInfo.cxx @@ -0,0 +1,83 @@ +/***************************************************************************** + * Copyright (C) 2009-2016 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: N. de Sereville contact address: deserevi@ipno.in2p3.fr * + * * + * Creation Date : 10/06/09 * + * Last update : 04/09/09 * + *---------------------------------------------------------------------------* + * Decription: This class records all the information concerning the event * + * generators, e.g. vertex of interaction, angles of emitted * + * particles... * + * This class derives from TObject (ROOT) and its aim is to be * + * stored in the output TTree of the G4 simulation * + *---------------------------------------------------------------------------* + * Comment: * + * + 04/09/09: Add private members for emittance (N. de Sereville) * + * * + * * + *****************************************************************************/ + +#include <iostream> +using namespace std; + +#include "TTrackInfo.h" + +ClassImp(TTrackInfo) +//////////////////////////////////////////////////////////////////////////////// +TTrackInfo::TTrackInfo(){ +} +//////////////////////////////////////////////////////////////////////////////// +TTrackInfo::~TTrackInfo(){ +} +//////////////////////////////////////////////////////////////////////////////// +void TTrackInfo::Clear(){ + + // emmitted particle + fTI_Particle_Name.clear(); + fTI_Volume_Name.clear(); + fTI_Kinetic_Energy.clear(); + fTI_Mass.clear(); + fTI_Charge.clear(); + fTI_Z.clear(); + fTI_A.clear(); + fTI_Brho.clear(); + fTI_Momentum.clear(); + fTI_Momentum_X.clear(); + fTI_Momentum_Y.clear(); + fTI_Momentum_Z.clear(); + fTI_PositionX.clear(); + fTI_PositionY.clear(); + fTI_PositionZ.clear(); + fTI_Index.clear(); + fTI_Theta.clear(); + fTI_Phi.clear(); +} +//////////////////////////////////////////////////////////////////////////////// +void TTrackInfo::Dump() const{ + cout << "--------- Initial Condition Dump ---------" << endl ; + + // emmitted particle + unsigned int size = fTI_Particle_Name.size(); + for(unsigned int i = 0 ; i < size; i ++){ + cout << "\t ---- Particle " << i << " ---- " << endl; + cout << "\t Particle Name" << fTI_Particle_Name[i] << endl; + cout << "\t Energy" << fTI_Kinetic_Energy[i] << endl; + cout << "\t Momentum Direction: ( " + << fTI_Momentum_X[i] << " ; " + << fTI_Momentum_Y[i] << " ; " + << fTI_Momentum_Z[i] << ")" << endl; + } +} +//////////////////////////////////////////////////////////////////////////////// +TVector3 TTrackInfo::GetParticleDirection (const int &i) const { + return TVector3( fTI_Momentum_X[i], + fTI_Momentum_Y[i], + fTI_Momentum_Z[i]).Unit(); +} + diff --git a/NPLib/Physics/TTrackInfo.h b/NPLib/Physics/TTrackInfo.h new file mode 100644 index 000000000..889da398f --- /dev/null +++ b/NPLib/Physics/TTrackInfo.h @@ -0,0 +1,144 @@ +#ifndef __TRACKINFO__ +#define __TRACKINFO__ +/***************************************************************************** + * Copyright (C) 2009-2016 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: N. de Sereville contact address: deserevi@ipno.in2p3.fr * + * * + * Creation Date : 10/06/09 * + * Last update : 04/09/09 * + *---------------------------------------------------------------------------* + * Decription: This class records all the information concerning the event * + * generators, e.g. vertex of interaction, angles of emitted * + * particles... * + * This class derives from TObject (ROOT) and its aim is to be * + * stored in the output TTree of the G4 simulation * + *---------------------------------------------------------------------------* + * Comment: * + * + 04/09/09: Add private members for emittance (N. de Sereville) * + * * + * * + *****************************************************************************/ + +// STL Header +#include <cmath> +#include <string> +#include <vector> +using namespace std; + +// Root Header +#include "TObject.h" +#include "TVector3.h" + +// NPTOOL headers +#include "NPGlobalSystemOfUnits.h" +#include "NPPhysicalConstants.h" +#ifdef NP_SYSTEM_OF_UNITS_H +using namespace NPUNITS; +#endif + +class TTrackInfo : public TObject { +private: + // Track info + +public: + // Particles info + vector<string> fTI_Particle_Name; + vector<string> fTI_Volume_Name; + vector<double> fTI_Kinetic_Energy; + vector<double> fTI_Theta; + vector<double> fTI_Phi; + + vector<double> fTI_Mass; + vector<double> fTI_Charge; + vector<double> fTI_Z; + vector<double> fTI_A; + vector<double> fTI_Brho; + + // vector<double> fTI_Spin; + + vector<TVector3> fTI_Momentum; + vector<double> fTI_Momentum_X; + vector<double> fTI_Momentum_Y; + vector<double> fTI_Momentum_Z; + + vector<double> fTI_PositionX; + vector<double> fTI_PositionY; + vector<double> fTI_PositionZ; + + vector<int> fTI_Index; + + // vector<double> fTI_; + +public: + TTrackInfo(); + virtual ~TTrackInfo(); + + void Clear(); + void Clear(const Option_t*) { Clear(); }; + void Dump() const; + + // emmitted particle + void SetParticleName(const string& Particle_Name) { + fTI_Particle_Name.push_back(Particle_Name); + } + void SetVolumeName(const string& Volume_Name) { + fTI_Volume_Name.push_back(Volume_Name); + } + void SetKineticEnergy(const double& Kinetic_Energy) { + fTI_Kinetic_Energy.push_back(Kinetic_Energy); + } + void SetTheta(const double& Theta) { + fTI_Theta.push_back(Theta); + } + void SetPhi(const double& Phi) { + fTI_Phi.push_back(Phi); + } + void SetMass(const double& Mass) { fTI_Mass.push_back(Mass); } + void SetCharge(const double& Charge) { fTI_Charge.push_back(Charge); } + void SetA(const double& A) { fTI_A.push_back(A); } + void SetZ(const double& Z) { fTI_Z.push_back(Z); } + void SetBrho(const double& Brho) { fTI_Brho.push_back(Brho); } + void SetMomentum(const TVector3& Momentum) { + fTI_Momentum.push_back(Momentum); + } + void SetMomentumX(const double& Momentum_X) { + fTI_Momentum_X.push_back(Momentum_X); + } + void SetMomentumY(const double& Momentum_Y) { + fTI_Momentum_Y.push_back(Momentum_Y); + } + void SetMomentumZ(const double& Momentum_Z) { + fTI_Momentum_Z.push_back(Momentum_Z); + } + void SetPositionX(const double& X) { fTI_PositionX.push_back(X); } + void SetPositionY(const double& Y) { fTI_PositionY.push_back(Y); } + void SetPositionZ(const double& Z) { fTI_PositionZ.push_back(Z); } + void SetIndex(const int& Index) { fTI_Index.push_back(Index); } + + // emmitted particle + int GetParticleMultiplicity() const { return fTI_Kinetic_Energy.size(); } + string GetParticleName(const int& i) const { return fTI_Particle_Name[i]; } + double GetKineticEnergy(const int& i) const { return fTI_Kinetic_Energy[i]; } + TVector3 GetMomentum(const int& i) const { return fTI_Momentum[i]; } + double GetMomentumX(const int& i) const { return fTI_Momentum_X[i]; } + double GetMomentumY(const int& i) const { return fTI_Momentum_Y[i]; } + double GetMomentumZ(const int& i) const { return fTI_Momentum_Z[i]; } + + TVector3 GetParticleDirection(const int& i) const; + + double GetThetaLab_WorldFrame(const int& i) const { + return (GetParticleDirection(i).Angle(TVector3(0, 0, 1))) / deg; + } + + unsigned int GetEmittedMult() const { return fTI_Particle_Name.size(); } + + ClassDef(TTrackInfo, 1) // TrackInfo structure +}; + +#endif diff --git a/NPSimulation/Core/CMakeLists.txt b/NPSimulation/Core/CMakeLists.txt index 3d096b55f..9493bc823 100644 --- a/NPSimulation/Core/CMakeLists.txt +++ b/NPSimulation/Core/CMakeLists.txt @@ -1,2 +1,2 @@ add_library(NPSCore SHARED $<TARGET_OBJECTS:NPSEventGenerator> $<TARGET_OBJECTS:NPSProcess> SteppingAction.cc EventAction.cc PrimaryGeneratorAction.cc Target.cc Chamber.cc PrimaryGeneratorActionMessenger.cc NPSVDetector.cc DetectorConstruction.cc MaterialManager.cc DetectorMessenger.cc MyMagneticField.cc SteppingVerbose.cc NPSDetectorFactory.cc RunAction.cc Particle.cc ParticleStack.cc NPSFunction.cc) -target_link_libraries(NPSCore ${ROOT_LIBRARIES} ${Geant4_LIBRARIES} ${NPLib_LIBRARIES} NPSScorers NPInitialConditions NPInteractionCoordinates NPReactionConditions NPFissionConditions ) +target_link_libraries(NPSCore ${ROOT_LIBRARIES} ${Geant4_LIBRARIES} ${NPLib_LIBRARIES} NPSScorers NPInitialConditions NPInteractionCoordinates NPReactionConditions NPFissionConditions NPTrackInfo) diff --git a/NPSimulation/Core/ParticleStack.cc b/NPSimulation/Core/ParticleStack.cc index 9d52f4024..9c30eba23 100644 --- a/NPSimulation/Core/ParticleStack.cc +++ b/NPSimulation/Core/ParticleStack.cc @@ -90,7 +90,7 @@ void ParticleStack::AddParticleToStack(Particle& particle){ // If the particle is the first one to be added, then the IC are cleared if(m_First) - m_InitialConditions->Clear(); + m_InitialConditions->Clear(); m_ParticleStack.push_back(particle); diff --git a/NPSimulation/Core/SteppingAction.cc b/NPSimulation/Core/SteppingAction.cc index 8d964bcf2..eb2e65e8b 100644 --- a/NPSimulation/Core/SteppingAction.cc +++ b/NPSimulation/Core/SteppingAction.cc @@ -6,12 +6,12 @@ *****************************************************************************/ /***************************************************************************** - * Original Author: Adrien MATTA contact address: matta@lpccaen.in2p3.fr * + * Original Author: ValerianAlcindor contact address: valcindor@@ikp.tu-darmstadt.de * * - * Creation Date : January 2021 * + * Creation Date : September 2021 * * Last update : * *---------------------------------------------------------------------------* - * Decription: * + * Decription: [] * * A quite Standard Geant4 EventAction class. * * Call the Fill method of the output tree. * *---------------------------------------------------------------------------* @@ -20,35 +20,125 @@ * * *****************************************************************************/ #include "SteppingAction.hh" +#include "G4UnitsTable.hh" +#include "NPFunction.h" #include "NPOptionManager.h" #include "RootOutput.h" - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -SteppingAction::SteppingAction(){ - m_record_track=NPOptionManager::getInstance()->GetRecordTrack(); - m_tree = RootOutput::getInstance()->GetTree(); - // Attach track info class to m_tree - } +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +SteppingAction::SteppingAction() { + m_record_track = false; + m_tree = RootOutput::getInstance()->GetTree(); + + m_First = true; + ParticleName = ""; + KineticEnergy = -1000; + Theta = -1000; + Phi = -1000; + Mass = -1000; + Charge = -1000; + Z = -1000; + A = -1000; + Momentum.setX(-1000); + Momentum.setY(-1000); + Momentum.setZ(-1000); + Position.setX(-1000); + Position.setY(-1000); + Position.setZ(-1000); + LastStepNumber = -1000; + VolumeName = ""; + nClear = 0; + TrackID = -1000; - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void SteppingAction::UserSteppingAction (const G4Step* /*step*/){ - if(m_record_track){ - //TrackRecording(step); - } + m_TrackInfo = new TTrackInfo(); + AttachTrackInfo(); + if (!RootOutput::getInstance()->GetTree()->FindBranch("TrackInfo")) + RootOutput::getInstance()->GetTree()->Branch("TrackInfo", "TTrackInfo", + &m_TrackInfo); + + // Attach track info class to m_tree } - + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void SteppingAction::TrackRecording(const G4Step* /*step*/){ -// Clear the tracks class -// m_Tracks->Clear(); -// unsigned int size = traj->size(); - // for(unsigned int i = 0 ; i < size ; i++){ - // FILL - // Particle name - // Interaction points - // Momentum - // Kinetic energy - // Volume Name - // } +void SteppingAction::AttachTrackInfo() { + // Reasssigned the branch address + if (RootOutput::getInstance()->GetTree()->FindBranch("TrackInfo")) + RootOutput::getInstance()->GetTree()->SetBranchAddress("TrackInfo", + &m_TrackInfo); +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void SteppingAction::UserSteppingAction(const G4Step* step) { + if (m_record_track) { + TrackRecording(step); } +} + +// FIXME Still underdeveloppement +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void SteppingAction::TrackRecording(const G4Step* step) { + if (m_First) + m_TrackInfo->Clear(); + m_First = false; + + G4Track* track = step->GetTrack(); + int StepNumber = track->GetCurrentStepNumber(); + + if (eventID + < G4RunManager::GetRunManager()->GetCurrentEvent()->GetEventID()) { + m_TrackInfo->Clear(); + nClear++; + } + + if (StepNumber == 1) { + ParticleName = track->GetParticleDefinition()->GetParticleName(); + KineticEnergy = track->GetDynamicParticle()->GetKineticEnergy(); + Mass = track->GetDynamicParticle()->GetMass(); + Charge = track->GetDynamicParticle()->GetCharge(); + Z = track->GetParticleDefinition()->GetAtomicNumber(); + A = track->GetParticleDefinition()->GetAtomicMass(); + Momentum = track->GetDynamicParticle()->GetMomentum(); + Theta = Momentum.theta() * 180. / M_PI; + Phi = Momentum.phi() * 180. / M_PI; + Position = track->GetPosition(); + G4VPhysicalVolume* volume = track->GetVolume(); + VolumeName = volume->GetName(); + TrackID = track->GetTrackID(); + + double c_light = 299.792458; // To go from T.m to MeV/e + double Brho = sqrt(KineticEnergy * KineticEnergy + 2 * KineticEnergy * Mass) + / (c_light * Charge); + + m_TrackInfo->SetKineticEnergy(KineticEnergy); + m_TrackInfo->SetTheta(Theta); + m_TrackInfo->SetPhi(Phi); + m_TrackInfo->SetMass(Mass); + m_TrackInfo->SetCharge(Charge); + m_TrackInfo->SetZ(Z); + m_TrackInfo->SetA(A); + m_TrackInfo->SetBrho(Brho); + TVector3 Mom; + Mom.SetX(Momentum.x()); + Mom.SetY(Momentum.y()); + Mom.SetZ(Momentum.z()); + + m_TrackInfo->SetMomentum(Mom); + + m_TrackInfo->SetMomentumX(Momentum.x()); + m_TrackInfo->SetMomentumY(Momentum.y()); + m_TrackInfo->SetMomentumZ(Momentum.z()); + + m_TrackInfo->SetPositionX(Position.x()); + m_TrackInfo->SetPositionY(Position.y()); + m_TrackInfo->SetPositionZ(Position.z()); + + m_TrackInfo->SetVolumeName(VolumeName); + m_TrackInfo->SetIndex(eventID + TrackID); + + if (ParticleName != "e-" && ParticleName != "e+") + m_TrackInfo->SetParticleName(NPL::ChangeNameFromG4Standard(ParticleName)); + else + m_TrackInfo->SetParticleName(ParticleName); + } + eventID = G4RunManager::GetRunManager()->GetCurrentEvent()->GetEventID(); +} diff --git a/NPSimulation/Core/SteppingAction.hh b/NPSimulation/Core/SteppingAction.hh index 9a2b9b55a..73ab8a184 100644 --- a/NPSimulation/Core/SteppingAction.hh +++ b/NPSimulation/Core/SteppingAction.hh @@ -24,27 +24,56 @@ // G4 header defining G4 types #include "globals.hh" +// NPL +#include "TTrackInfo.h" + // G4 header +#include "G4RunManager.hh" +#include "G4Track.hh" #include "G4UserSteppingAction.hh" -//Root +// Root #include "TTree.h" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -class SteppingAction : public G4UserSteppingAction{ - public: - SteppingAction(); - ~SteppingAction(){}; - - public: - void TrackRecording(const G4Step* step); - void UserSteppingAction (const G4Step* step); - - private: // tree - TTree* m_tree; - - private: - bool m_record_track; +class SteppingAction : public G4UserSteppingAction { +public: + SteppingAction(); + ~SteppingAction(){}; + +public: + void TrackRecording(const G4Step* step); + void UserSteppingAction(const G4Step* step); + + std::string ParticleName; + double KineticEnergy; + double Theta; + double Phi; + double Mass; + double Charge; + double A; + double Z; + G4ThreeVector Momentum; + G4ThreeVector Position; + std::string VolumeName; + int nClear; + int eventID; + int TrackID; + +private: // tree + TTree* m_tree; + bool m_First; + unsigned int LastStepNumber; + + // Host the Initial conditions TObject + TTrackInfo* m_TrackInfo; + +private: + bool m_record_track; + +public: + // Attach the TrackInfo object to the tree + void AttachTrackInfo(); }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/NPSimulation/Process/BeamReaction.cc b/NPSimulation/Process/BeamReaction.cc index ef429ff28..189d397dc 100644 --- a/NPSimulation/Process/BeamReaction.cc +++ b/NPSimulation/Process/BeamReaction.cc @@ -47,6 +47,8 @@ NPS::BeamReaction::BeamReaction(G4String modelName, G4Region* envelope) m_shoot=false; m_rand=0; m_Z=0; + + ABLA = new G4AblaInterface(); } //////////////////////////////////////////////////////////////////////////////// @@ -149,17 +151,17 @@ G4bool NPS::BeamReaction::ModelTrigger(const G4FastTrack& fastTrack) { bool is_first = (to_entrance==0); if(is_first && m_shoot){ - /* Does occur rarely when event is tangent to the target surface and scatters out - std::cout << "Something went wrong in beam reaction, m_shoot and is_first variables cannot be true simultaneously" << std::endl; - std::cout << "m_shoot: " << m_shoot << std::endl; - std::cout << "rand: " << m_rand << std::endl; - std::cout << "to_entrance: " << to_entrance << std::endl; - std::cout << "to_exit: " << to_exit << std::endl; - std::cout << "length: " << m_length << std::endl; - std::cout << "step: " << m_StepSize << std::endl; - std::cout << "Z: " << m_Z << std::endl; - std::cout << "S: " << m_S << std::endl; - */ + /* Does occur rarely when event is tangent to the target surface and scatters out + std::cout << "Something went wrong in beam reaction, m_shoot and is_first variables cannot be true simultaneously" << std::endl; + std::cout << "m_shoot: " << m_shoot << std::endl; + std::cout << "rand: " << m_rand << std::endl; + std::cout << "to_entrance: " << to_entrance << std::endl; + std::cout << "to_exit: " << to_exit << std::endl; + std::cout << "length: " << m_length << std::endl; + std::cout << "step: " << m_StepSize << std::endl; + std::cout << "Z: " << m_Z << std::endl; + std::cout << "S: " << m_S << std::endl; + */ m_shoot = false; } @@ -556,8 +558,39 @@ void NPS::BeamReaction::DoIt(const G4FastTrack& fastTrack, fastStep.CreateSecondaryTrack(particle2, localPosition, time); } if (m_QFS.GetShootB()) { - G4DynamicParticle particleB(HeavyName, momentum_kineB_world, TKEB); - fastStep.CreateSecondaryTrack(particleB, localPosition, time); + if(m_QFS.GetDeexcitation()){ + double P_B2 = P_B->Px()*P_B->Px() + P_B->Py()*P_B->Py() + P_B->Pz()*P_B->Pz(); + double scaling = 1; + if(P_B2>0.0){ + double P_Bnew2 = TKEB*TKEB + 2 * TKEB * m_QFS.GetParticleB()->Mass(); + scaling = sqrt(P_Bnew2)/sqrt(P_B2); + } + G4LorentzVector G4HeavyMomentum; + G4HeavyMomentum.setE(P_B->Energy()); + G4HeavyMomentum.setPx(P_B->X()); + G4HeavyMomentum.setPy(P_B->Y()); + G4HeavyMomentum.setPz(P_B->Z()); + G4Fragment HeavyFragment(HeavyName->GetAtomicMass(), HeavyName->GetAtomicNumber(), G4HeavyMomentum); + G4ReactionProductVector* HeavyDeexcitation = ABLA->DeExcite(HeavyFragment); + + unsigned int sizeFrag = HeavyDeexcitation->size(); + G4ThreeVector Momsum(0,0,0); + for(unsigned int i = 0 ; i < sizeFrag ; i++){ + const G4ParticleDefinition* HeavyFragName = HeavyDeexcitation->at(i)->GetDefinition(); + G4ThreeVector HeavyFragMomentum = HeavyDeexcitation->at(i)->GetMomentum(); + double TKEFrag = HeavyDeexcitation->at(i)->GetKineticEnergy(); + double HeavyFragModule = sqrt(TKEFrag*TKEFrag + 2*TKEFrag*HeavyDeexcitation->at(i)->GetMass()); + G4ThreeVector HeavyFragMomentumDirection(HeavyFragMomentum.x()/HeavyFragModule, + HeavyFragMomentum.y()/HeavyFragModule, + HeavyFragMomentum.z()/HeavyFragModule); + G4DynamicParticle particleFrag(HeavyFragName, HeavyFragMomentumDirection, TKEFrag); + fastStep.CreateSecondaryTrack(particleFrag, localPosition, time); + } + } + else{ + G4DynamicParticle particleB(HeavyName, momentum_kineB_world, TKEB); + fastStep.CreateSecondaryTrack(particleB, localPosition, time); + } } /////////////////////////////////// diff --git a/NPSimulation/Process/BeamReaction.hh b/NPSimulation/Process/BeamReaction.hh index e127c74c2..9e24725e0 100644 --- a/NPSimulation/Process/BeamReaction.hh +++ b/NPSimulation/Process/BeamReaction.hh @@ -25,6 +25,9 @@ #define BeamReaction_h #include "G4VFastSimulationModel.hh" +#include "G4Abla.hh" +#include "G4AblaInterface.hh" +#include "G4Fragment.hh" #include "PhysicsList.hh" #include "NPReaction.h" #include "NPQFS.h" @@ -54,6 +57,7 @@ namespace NPS{ NPL::QFS m_QFS; string m_BeamName; int m_ReactionType; + G4AblaInterface* ABLA; bool m_active;// is the process active bool m_shoot; diff --git a/NPSimulation/Scorers/InteractionScorers.cc b/NPSimulation/Scorers/InteractionScorers.cc index 00f040f1e..4f0966282 100644 --- a/NPSimulation/Scorers/InteractionScorers.cc +++ b/NPSimulation/Scorers/InteractionScorers.cc @@ -24,7 +24,7 @@ using namespace InteractionScorers ; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... vector<InteractionData>::iterator InteractionDataVector::find(const unsigned int& index){ - for(vector<InteractionData>::iterator it= m_Data.begin() ; it !=m_Data.end() ; it++){ + for(vector<InteractionData>::iterator it= m_Data.begin() ; it !=m_Data.end() ; it++){ if((*it).GetIndex()==index) return it; } @@ -35,8 +35,8 @@ vector<InteractionData>::iterator InteractionDataVector::find(const unsigned int //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... PS_Interactions::PS_Interactions(G4String name,TInteractionCoordinates* Inter, int depth) :G4VPrimitiveScorer(name, depth){ - m_Level = depth; - m_InterractionCoordinates=Inter; + m_Level = depth; + m_InterractionCoordinates=Inter; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -46,26 +46,34 @@ G4bool PS_Interactions::ProcessHits(G4Step* aStep, G4TouchableHistory*){ t_Energy = aStep->GetTotalEnergyDeposit(); t_Time = point->GetGlobalTime(); t_Position = point->GetPosition(); - + t_Index = aStep->GetTrack()->GetTrackID(); + t_ParticleName = aStep->GetTrack()->GetParticleDefinition()->GetParticleName(); + t_A = aStep->GetTrack()->GetParticleDefinition()->GetAtomicMass(); + t_Z = aStep->GetTrack()->GetParticleDefinition()->GetAtomicNumber(); + t_Mass = aStep->GetTrack()->GetDynamicParticle()->GetMass(); + t_Charge = aStep->GetTrack()->GetDynamicParticle()->GetCharge(); + double KineticEnergy = aStep->GetTrack()->GetDynamicParticle()->GetKineticEnergy(); + t_Brho = sqrt(KineticEnergy * KineticEnergy + 2 * KineticEnergy * t_Mass) + / (c_light * t_Charge); + // add it to check the theta of momentum // MOMENT = aStep->GetPreStepPoint()->GetMomentumDirection(); - - t_Index = aStep->GetTrack()->GetTrackID(); + vector<InteractionData>::iterator it; it = m_DataVector.find(t_Index); if(it!=m_DataVector.end()) it->Add(t_Energy); else - { m_DataVector.Set(t_Index,t_Energy,t_Time,t_Position.x(),t_Position.y(),t_Position.z(), /*MOMENT*/ t_Position.theta(),t_Position.phi()); - -} + { m_DataVector.Set(t_Index,t_Energy,t_Time,t_Position.x(),t_Position.y(),t_Position.z(), /*MOMENT*/ t_Position.theta(),t_Position.phi(), t_ParticleName, t_A, t_Z, t_Mass, t_Charge, t_Brho); + + } return TRUE; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void PS_Interactions::Initialize(G4HCofThisEvent*){ - // Clear is called by EventAction + // Clear is called by EventAction clear(); } @@ -73,9 +81,15 @@ void PS_Interactions::Initialize(G4HCofThisEvent*){ void PS_Interactions::EndOfEvent(G4HCofThisEvent*){ unsigned int size = m_DataVector.size(); - for(unsigned int i = 0 ; i < size ; i++) - m_InterractionCoordinates->SetInteraction(m_DataVector[i]->GetEnergy(),m_DataVector[i]->GetTime(),m_DataVector[i]->GetPositionX(),m_DataVector[i]->GetPositionY(),m_DataVector[i]->GetPositionZ(),m_DataVector[i]->GetTheta()/deg,m_DataVector[i]->GetPhi()/deg); - + for(unsigned int i = 0 ; i < size ; i++){ + int eventID = G4RunManager::GetRunManager()->GetCurrentEvent()->GetEventID(); + int Index = t_Index + eventID; + m_InterractionCoordinates->SetInteraction(Index,m_DataVector[i]->GetEnergy(),m_DataVector[i]->GetTime(), + m_DataVector[i]->GetPositionX(),m_DataVector[i]->GetPositionY(),m_DataVector[i]->GetPositionZ(), + m_DataVector[i]->GetTheta()/deg,m_DataVector[i]->GetPhi()/deg, m_DataVector[i]->GetParticleName(), + m_DataVector[i]->GetA(), m_DataVector[i]->GetZ(), m_DataVector[i]->GetMass(), m_DataVector[i]->GetCharge(), + m_DataVector[i]->GetBrho()); + } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/NPSimulation/Scorers/InteractionScorers.hh b/NPSimulation/Scorers/InteractionScorers.hh index f5b096c7e..f6a3789eb 100644 --- a/NPSimulation/Scorers/InteractionScorers.hh +++ b/NPSimulation/Scorers/InteractionScorers.hh @@ -21,6 +21,7 @@ * * *****************************************************************************/ #include "G4VPrimitiveScorer.hh" +#include "G4RunManager.hh" #include "TInteractionCoordinates.h" #include "NPImage.h" #include <map> @@ -44,6 +45,27 @@ namespace InteractionScorers { m_Phi = Phi; } + InteractionData(const unsigned int& Index ,const double& Energy, const double& Time , + const double& PositionX, const double& PositionY, const double& PositionZ, + const double& Theta, const double& Phi, const std::string &ParticleName, + const int &A, const int &Z, const double &Mass, const int &Charge, const double &Brho){ + m_Index = Index; + m_Energy = Energy; + m_Time = Time; + m_PositionX = PositionX;; + m_PositionY = PositionY; + m_PositionZ = PositionZ; + m_Theta = Theta; + m_Phi = Phi; + m_ParticleName = ParticleName; + m_A = A; + m_Z = Z; + m_Mass = Mass; + m_Charge = Charge; + m_Brho = Brho; + + } + ~InteractionData(){}; private: @@ -55,7 +77,12 @@ namespace InteractionScorers { double m_PositionZ; double m_Theta; double m_Phi; - + std::string m_ParticleName; + int m_A; + int m_Z; + double m_Mass; + int m_Charge; + double m_Brho; public: unsigned int GetIndex() const{return m_Index;}; @@ -66,10 +93,19 @@ namespace InteractionScorers { double GetPositionZ() const{return m_PositionZ;}; double GetTheta() const{return m_Theta;}; double GetPhi() const{return m_Phi;}; + std::string GetParticleName() const{return m_ParticleName;}; + int GetA() const{return m_A;}; + int GetZ() const{return m_Z;}; + double GetMass() const{return m_Mass;}; + int GetCharge() const{return m_Charge;}; + double GetBrho() const{return m_Brho;}; public: - void Set(const unsigned int& Index, const double& Energy, const double& Time , const double& PositionX, const double& PositionY, const double& PositionZ, const double& Theta, const double& Phi){ + void Set(const unsigned int& Index, const double& Energy, const double& Time , + const double& PositionX, const double& PositionY, const double& PositionZ, + const double& Theta, const double& Phi){ + m_Index = Index; m_Energy = Energy; m_Time = Time; @@ -79,6 +115,28 @@ namespace InteractionScorers { m_Theta = Theta; m_Phi = Phi; } + + void Set(const unsigned int& Index, const double& Energy, const double& Time , + const double& PositionX, const double& PositionY, const double& PositionZ, + const double& Theta, const double& Phi, const std::string &ParticleName, + const int &A, const int &Z, const double &Mass, const int &Charge, const double &Brho){ + + m_Index = Index; + m_Energy = Energy; + m_Time = Time; + m_PositionX = PositionX;; + m_PositionY = PositionY; + m_PositionZ = PositionZ; + m_Theta = Theta; + m_Phi = Phi; + m_ParticleName = ParticleName; + m_A = A; + m_Z = Z; + m_Mass = Mass; + m_Charge = Charge; + m_Brho = Brho; + + } void Add(const double& Energy){m_Energy+=Energy;}; unsigned int GetIndex(){return m_Index;}; }; @@ -100,7 +158,22 @@ namespace InteractionScorers { vector<InteractionData>::iterator begin() {return m_Data.begin();}; unsigned int size() {return m_Data.size();}; void Add(const unsigned int& index,const double& Energy) {find(index)->Add(Energy);}; - void Set(const unsigned int& index,const double& Energy, const double& Time , const double& PositionX, const double& PositionY, const double& PositionZ, const double& Theta, const double& Phi) {m_Data.push_back(InteractionData(index,Energy,Time,PositionX,PositionY,PositionZ,Theta,Phi));}; + + void Set(const unsigned int& index,const double& Energy, const double& Time , + const double& PositionX, const double& PositionY, const double& PositionZ, + const double& Theta, const double& Phi) { + + m_Data.push_back(InteractionData(index,Energy,Time,PositionX,PositionY,PositionZ,Theta,Phi)); + + }; + + void Set(const unsigned int& index,const double& Energy, const double& Time , + const double& PositionX, const double& PositionY, const double& PositionZ, + const double& Theta, const double& Phi, const std::string &ParticleName, + const int &A, const int &Z, const double &Mass, const int &Charge, const double &Brho){ + m_Data.push_back(InteractionData(index,Energy,Time,PositionX,PositionY,PositionZ,Theta,Phi,ParticleName, A, Z, Mass, Charge, Brho)); + }; + InteractionData* operator[](const unsigned int& i){return &m_Data[i];}; }; @@ -132,6 +205,12 @@ namespace InteractionScorers { double t_Energy; double t_Time; G4ThreeVector t_Position; + std::string t_ParticleName; + int t_A; + int t_Z; + double t_Mass; + int t_Charge; + double t_Brho; //G4ThreeVector MOMENT; }; -- GitLab