From ad528b7143b1d1f6716db7eabd17a5975b0a86ac Mon Sep 17 00:00:00 2001 From: adrien matta <matta@lpccaen.in2p3.fr> Date: Tue, 1 Oct 2019 17:30:52 +0200 Subject: [PATCH] * Adding custom level decay option - User can add a level decay file in geant4 format - this is done in the event generator file - the level scheme file should be saved in the tree -> to be done --- NPSimulation/Process/PhysicsList.cc | 778 ++++++++++++++------------ NPSimulation/Process/PhysicsList.hh | 2 +- Projects/e748/Analysis.cxx | 388 ++++++------- Projects/e748/Analysis.h | 8 +- Projects/e748/configs/ConfigMust2.dat | 0 Projects/e748/e748.detector | 2 +- 6 files changed, 607 insertions(+), 571 deletions(-) mode change 100644 => 100755 Projects/e748/configs/ConfigMust2.dat mode change 100644 => 100755 Projects/e748/e748.detector diff --git a/NPSimulation/Process/PhysicsList.cc b/NPSimulation/Process/PhysicsList.cc index ee7b76530..2b58820af 100644 --- a/NPSimulation/Process/PhysicsList.cc +++ b/NPSimulation/Process/PhysicsList.cc @@ -23,6 +23,10 @@ //NPS #include "PhysicsList.hh" +//NPL +#include "NPInputParser.h" +#include "NPOptionManager.h" +#include "NPNucleus.h" // Local physic directly implemented from the Hadronthrapy example // Physic dedicated to the ion-ion inelastic processes @@ -44,7 +48,8 @@ #include "G4IonParametrisedLossModel.hh" #include "G4UniversalFluctuation.hh" #include "G4UImanager.hh" - +#include "G4NuclearLevelData.hh" +#include "G4LevelManager.hh" #include "G4PAIModel.hh" #include "G4PAIPhotModel.hh" #include "menate_R.hh" @@ -55,227 +60,227 @@ PhysicsList::PhysicsList() : G4VUserPhysicsList(){ // UI commands to activate one or more High Energy Processes // G4UImanager* UI = G4UImanager::GetUIpointer(); // UI->ApplyCommand("/physics_list/em/MuonNuclear true"); - - m_EmList = "Option4"; - defaultCutValue = 1*mm;//0.2*mm; - opticalPhysicsList = NULL; - driftElectronPhysicsList = NULL; - ReadConfiguration("PhysicsListOption.txt"); - G4LossTableManager::Instance(); - SetVerboseLevel(0); - - // ****** Definition of defaults for the physics processes ***** - // ****** in case no physics is called by the macro file ***** - // - // The default physics corresponds to the actual QGSP_BIC_HP list - // but with the following differences: - // --> G4EmStandardPhysics_option4 for the electromagnetic processes - // is used n place of the less accurate G4EmStandardPhysics - // --> The G4RadioactiveDecayPhysics is add - // --> G4HadronPhysicsQGSP_BIC is used in place of G4HadronPhysicsQGSP_BIC_HP - // --> G4HadronElasticPhysics is used in place of G4HadronElasticPhysics_HP - - // Elecromagnetic physics - // Using the more accurate option4 - - emPhysicsList=NULL; - if(m_EmList == "Option4"){ - emPhysicsList = new G4EmStandardPhysics_option4(); - cout << "//// Using G4EmStandardPhysics_option4 Physics List ////" << endl; - } - else if(m_EmList== "Option1"){ - emPhysicsList = new G4EmStandardPhysics_option1(); - cout << "//// Using G4EmStandardPhysics_option1 Physics List ////" << endl; - } - else if(m_EmList== "Option2"){ - emPhysicsList = new G4EmStandardPhysics_option2(); - cout << "//// Using G4EmStandardPhysics_option2 Physics List ////" << endl; - } - else if(m_EmList== "Option3"){ - emPhysicsList = new G4EmStandardPhysics_option3(); - cout << "//// Using G4EmStandardPhysics_option3 Physics List ////" << endl; - } - else if(m_EmList== "Standard"){ - emPhysicsList = new G4EmStandardPhysics(); - cout << "//// Using G4EmStandardPhysics default EM constructor Physics List ////" << endl; - } - else if(m_EmList== "Livermore"){ - emPhysicsList = new G4EmLivermorePhysics(); - cout << "//// Using G4EmLivermorePhysics Physics List ////" << endl; - } - - else if( m_EmList == "Penelope"){ - emPhysicsList = new G4EmPenelopePhysics(); - cout << "//// Using G4EmPenelopePhysics Physics List ////" << endl; - } - - else{ - std::cout << "\r\033[1;31mERROR: User given physics list " << m_EmList << " is not supported, option are Option4 Livermore Penelope\033[0m" <<std::endl; - exit(1); - } - emConfig = G4LossTableManager::Instance()->EmConfigurator(); - - // Hadronic physics - if(m_IonBinaryCascadePhysics){ - m_PhysList["IonBinaryCascadePhysics"] = new G4IonBinaryCascadePhysics(); - cout << "//// Using G4IonBinaryCascadePhysics Physics List ////" << endl; - } - if(m_EmExtraPhysics) - m_PhysList["EmExtraPhysics"]=new G4EmExtraPhysics(); - - if(m_HadronElasticPhysics){ - m_PhysList["G4HadronElasticPhysics"]=new G4HadronElasticPhysics(); - m_PhysList["G4IonElasticPhysics"]=new G4IonElasticPhysics(); - cout << "//// Using G4HadronElasticPhysics Physics List ////" << endl; - cout << "//// Using G4IonElasticPhysics Physics List ////" << endl; - } - - if(m_NPIonInelasticPhysics){ - m_PhysList["NPIonInelasticPhysics"]=new NPIonIonInelasticPhysic(); - cout << "//// Using NPIonIonInelasticPhysic Physics List ////" << endl; - } - - if(m_StoppingPhysics){ - m_PhysList["StoppingPhysics"]=new G4StoppingPhysics(); - cout << "//// Using G4StoppingPhysics Physics List ////" << endl; - } - - if(m_HadronPhysicsINCLXX){ - m_PhysList["HadronPhysicsINCLXX"] = new G4HadronPhysicsINCLXX(); - m_PhysList["IonPhysicsINCLXX"] = new G4IonINCLXXPhysics(); - cout << "//// Using INCLXX Physics List ////" << endl; - } - - if(m_HadronPhysicsQGSP_BIC_HP){ + + m_EmList = "Option4"; + defaultCutValue = 1*mm;//0.2*mm; + opticalPhysicsList = NULL; + driftElectronPhysicsList = NULL; + ReadConfiguration("PhysicsListOption.txt"); + G4LossTableManager::Instance(); + SetVerboseLevel(0); + + // ****** Definition of defaults for the physics processes ***** + // ****** in case no physics is called by the macro file ***** + // + // The default physics corresponds to the actual QGSP_BIC_HP list + // but with the following differences: + // --> G4EmStandardPhysics_option4 for the electromagnetic processes + // is used n place of the less accurate G4EmStandardPhysics + // --> The G4RadioactiveDecayPhysics is add + // --> G4HadronPhysicsQGSP_BIC is used in place of G4HadronPhysicsQGSP_BIC_HP + // --> G4HadronElasticPhysics is used in place of G4HadronElasticPhysics_HP + + // Elecromagnetic physics + // Using the more accurate option4 + + emPhysicsList=NULL; + if(m_EmList == "Option4"){ + emPhysicsList = new G4EmStandardPhysics_option4(); + cout << "//// Using G4EmStandardPhysics_option4 Physics List ////" << endl; + } + else if(m_EmList== "Option1"){ + emPhysicsList = new G4EmStandardPhysics_option1(); + cout << "//// Using G4EmStandardPhysics_option1 Physics List ////" << endl; + } + else if(m_EmList== "Option2"){ + emPhysicsList = new G4EmStandardPhysics_option2(); + cout << "//// Using G4EmStandardPhysics_option2 Physics List ////" << endl; + } + else if(m_EmList== "Option3"){ + emPhysicsList = new G4EmStandardPhysics_option3(); + cout << "//// Using G4EmStandardPhysics_option3 Physics List ////" << endl; + } + else if(m_EmList== "Standard"){ + emPhysicsList = new G4EmStandardPhysics(); + cout << "//// Using G4EmStandardPhysics default EM constructor Physics List ////" << endl; + } + else if(m_EmList== "Livermore"){ + emPhysicsList = new G4EmLivermorePhysics(); + cout << "//// Using G4EmLivermorePhysics Physics List ////" << endl; + } + + else if( m_EmList == "Penelope"){ + emPhysicsList = new G4EmPenelopePhysics(); + cout << "//// Using G4EmPenelopePhysics Physics List ////" << endl; + } + + else{ + std::cout << "\r\033[1;31mERROR: User given physics list " << m_EmList << " is not supported, option are Option4 Livermore Penelope\033[0m" <<std::endl; + exit(1); + } + emConfig = G4LossTableManager::Instance()->EmConfigurator(); + + // Hadronic physics + if(m_IonBinaryCascadePhysics){ + m_PhysList["IonBinaryCascadePhysics"] = new G4IonBinaryCascadePhysics(); + cout << "//// Using G4IonBinaryCascadePhysics Physics List ////" << endl; + } + if(m_EmExtraPhysics) + m_PhysList["EmExtraPhysics"]=new G4EmExtraPhysics(); + + if(m_HadronElasticPhysics){ + m_PhysList["G4HadronElasticPhysics"]=new G4HadronElasticPhysics(); + m_PhysList["G4IonElasticPhysics"]=new G4IonElasticPhysics(); + cout << "//// Using G4HadronElasticPhysics Physics List ////" << endl; + cout << "//// Using G4IonElasticPhysics Physics List ////" << endl; + } + + if(m_NPIonInelasticPhysics){ + m_PhysList["NPIonInelasticPhysics"]=new NPIonIonInelasticPhysic(); + cout << "//// Using NPIonIonInelasticPhysic Physics List ////" << endl; + } + + if(m_StoppingPhysics){ + m_PhysList["StoppingPhysics"]=new G4StoppingPhysics(); + cout << "//// Using G4StoppingPhysics Physics List ////" << endl; + } + + if(m_HadronPhysicsINCLXX){ + m_PhysList["HadronPhysicsINCLXX"] = new G4HadronPhysicsINCLXX(); + m_PhysList["IonPhysicsINCLXX"] = new G4IonINCLXXPhysics(); + cout << "//// Using INCLXX Physics List ////" << endl; + } + + if(m_HadronPhysicsQGSP_BIC_HP){ #if NPS_GEANT4_VERSION_MAJOR > 9 - m_PhysList["HadronPhysicsQGSP_BIC_HP"] = new G4HadronPhysicsQGSP_BIC_HP(); - cout << "//// Using QGSP_BIC_HP Physics List ////" << endl; - + m_PhysList["HadronPhysicsQGSP_BIC_HP"] = new G4HadronPhysicsQGSP_BIC_HP(); + cout << "//// Using QGSP_BIC_HP Physics List ////" << endl; + #else - std::cout << "\r\032[1;31m Warning: physics list HadronPhysicsQGSP_BIC_HP require Geant4 10, process not activated \033[0m" <<std::endl; + std::cout << "\r\032[1;31m Warning: physics list HadronPhysicsQGSP_BIC_HP require Geant4 10, process not activated \033[0m" <<std::endl; #endif - } - // Optical Photon for scintillator simulation - if(m_OpticalPhysics){ - opticalPhysicsList = new G4OpticalPhysics(0); - opticalPhysicsList->SetMaxNumPhotonsPerStep(100); - opticalPhysicsList->SetScintillationYieldFactor(0.1); - opticalPhysicsList->SetTrackSecondariesFirst(kScintillation,true); - opticalPhysicsList->SetTrackSecondariesFirst(kCerenkov,true); - - cout << "//// Using Optical Photon Physics List ////" << endl; - } - - // Drift electron for gazeous detector simulation - if(m_DriftElectronPhysics){ - driftElectronPhysicsList = new G4DriftElectronPhysics(0); - driftElectronPhysicsList->SetMaxNumDriftElectronPerStep(1e6); - cout << "//// Using Drift Electron Physics List ////" << endl; - } - if(m_IonGasModels){ - AddIonGasModels(); - cout << "//// Using Ion Gas Model Physics List ////" << endl; - } - - if(m_pai){ - AddPAIModel("pai"); - cout << "//// Using PAI Model Physics List ////" << endl; - } - if(m_pai_photon){ - AddPAIModel("pai_photon"); - cout << "//// Using PAI PHOTON Model Physics List ////" << endl; - } - - // Decay physics - // Add Radioactive decay - // Gamma decay of known states - if(m_Decay){ - decay_List = new G4DecayPhysics(); - radioactiveDecay_List = new G4RadioactiveDecayPhysics() ; - m_PhysList["decay_list"]= decay_List; - m_PhysList["radioactiveDecay"]=radioactiveDecay_List; - } - - else{ - decay_List = 0; - radioactiveDecay_List = 0; - } - + } + // Optical Photon for scintillator simulation + if(m_OpticalPhysics){ + opticalPhysicsList = new G4OpticalPhysics(0); + opticalPhysicsList->SetMaxNumPhotonsPerStep(100); + opticalPhysicsList->SetScintillationYieldFactor(0.1); + opticalPhysicsList->SetTrackSecondariesFirst(kScintillation,true); + opticalPhysicsList->SetTrackSecondariesFirst(kCerenkov,true); + + cout << "//// Using Optical Photon Physics List ////" << endl; + } + + // Drift electron for gazeous detector simulation + if(m_DriftElectronPhysics){ + driftElectronPhysicsList = new G4DriftElectronPhysics(0); + driftElectronPhysicsList->SetMaxNumDriftElectronPerStep(1e6); + cout << "//// Using Drift Electron Physics List ////" << endl; + } + if(m_IonGasModels){ + AddIonGasModels(); + cout << "//// Using Ion Gas Model Physics List ////" << endl; + } + + if(m_pai){ + AddPAIModel("pai"); + cout << "//// Using PAI Model Physics List ////" << endl; + } + if(m_pai_photon){ + AddPAIModel("pai_photon"); + cout << "//// Using PAI PHOTON Model Physics List ////" << endl; + } + + // Decay physics + // Add Radioactive decay + // Gamma decay of known states + if(m_Decay){ + decay_List = new G4DecayPhysics(); + radioactiveDecay_List = new G4RadioactiveDecayPhysics() ; + m_PhysList["decay_list"]= decay_List; + m_PhysList["radioactiveDecay"]=radioactiveDecay_List; + } + + else{ + decay_List = 0; + radioactiveDecay_List = 0; + } + } //////////////////////////////////////////////////////////////////////////////// void PhysicsList::ReadConfiguration(std::string filename){ - m_IonBinaryCascadePhysics = 0; - m_EmExtraPhysics = 0; - m_HadronElasticPhysics = 0; - m_NPIonInelasticPhysics = 0; - m_StoppingPhysics = 0; - m_OpticalPhysics = 0; - m_DriftElectronPhysics = 0; - m_HadronPhysicsQGSP_BIC_HP = 0; - m_HadronPhysicsINCLXX = 0; - m_Decay = 0; - m_IonGasModels = 0; - m_pai= 0; - m_pai_photon= 0; - m_Menate_R = 0; - - std::ifstream file(filename.c_str()); - if(!file.is_open()){ - std::cout << "WARNING: Could not find Physics List option file " << filename << " | Using default Physics List" << std::endl; - return; - } - - std::cout << "Reading Physics list option file " << filename << std::endl; - - std::string name; - std::string str_value; - double value; - while(file >> name >> str_value){ - value = std::atof(str_value.c_str()); - if(name == "EmPhysicsList") - m_EmList = str_value; - else if(name == "DefaultCutOff") - defaultCutValue = value*mm; - else if(name == "IonBinaryCascadePhysics") - m_IonBinaryCascadePhysics = value; - else if(name == "NPIonInelasticPhysics") - m_NPIonInelasticPhysics = value; - else if (name == "EmExtraPhysics") - m_EmExtraPhysics= value; - else if (name == "HadronElasticPhysics") - m_HadronElasticPhysics= value; - else if (name == "StoppingPhysics") - m_StoppingPhysics= value; - else if (name == "OpticalPhysics") - m_OpticalPhysics= value; - else if (name == "DriftElectronPhysics") - m_DriftElectronPhysics= value; - else if (name == "HadronPhysicsQGSP_BIC_HP") - m_HadronPhysicsQGSP_BIC_HP= value; - else if (name == "HadronPhysicsINCLXX") - m_HadronPhysicsINCLXX= value; - else if (name == "Decay") - m_Decay = value; - else if (name == "IonGasModels") - m_IonGasModels= value; - else if (name == "pai") - m_pai = value; - else if (name == "pai_photon") - m_pai_photon = value; - else if (name == "Menate_R") - m_Menate_R = value; - else - std::cout <<"WARNING: Physics List Token '" << name << "' unknown. Token is ignored." << std::endl; - } - - // Most special process need decay to be activated - if( (m_IonBinaryCascadePhysics || m_EmExtraPhysics || m_HadronElasticPhysics || m_NPIonInelasticPhysics - || m_StoppingPhysics || m_HadronPhysicsQGSP_BIC_HP || m_HadronPhysicsINCLXX) && !m_Decay){ - m_Decay = true; - std::cout << "Information: Selected process require Decay to be activated." << std::endl; - } - + m_IonBinaryCascadePhysics = 0; + m_EmExtraPhysics = 0; + m_HadronElasticPhysics = 0; + m_NPIonInelasticPhysics = 0; + m_StoppingPhysics = 0; + m_OpticalPhysics = 0; + m_DriftElectronPhysics = 0; + m_HadronPhysicsQGSP_BIC_HP = 0; + m_HadronPhysicsINCLXX = 0; + m_Decay = 0; + m_IonGasModels = 0; + m_pai= 0; + m_pai_photon= 0; + m_Menate_R = 0; + + std::ifstream file(filename.c_str()); + if(!file.is_open()){ + std::cout << "WARNING: Could not find Physics List option file " << filename << " | Using default Physics List" << std::endl; + return; + } + + std::cout << "Reading Physics list option file " << filename << std::endl; + + std::string name; + std::string str_value; + double value; + while(file >> name >> str_value){ + value = std::atof(str_value.c_str()); + if(name == "EmPhysicsList") + m_EmList = str_value; + else if(name == "DefaultCutOff") + defaultCutValue = value*mm; + else if(name == "IonBinaryCascadePhysics") + m_IonBinaryCascadePhysics = value; + else if(name == "NPIonInelasticPhysics") + m_NPIonInelasticPhysics = value; + else if (name == "EmExtraPhysics") + m_EmExtraPhysics= value; + else if (name == "HadronElasticPhysics") + m_HadronElasticPhysics= value; + else if (name == "StoppingPhysics") + m_StoppingPhysics= value; + else if (name == "OpticalPhysics") + m_OpticalPhysics= value; + else if (name == "DriftElectronPhysics") + m_DriftElectronPhysics= value; + else if (name == "HadronPhysicsQGSP_BIC_HP") + m_HadronPhysicsQGSP_BIC_HP= value; + else if (name == "HadronPhysicsINCLXX") + m_HadronPhysicsINCLXX= value; + else if (name == "Decay") + m_Decay = value; + else if (name == "IonGasModels") + m_IonGasModels= value; + else if (name == "pai") + m_pai = value; + else if (name == "pai_photon") + m_pai_photon = value; + else if (name == "Menate_R") + m_Menate_R = value; + else + std::cout <<"WARNING: Physics List Token '" << name << "' unknown. Token is ignored." << std::endl; + } + + // Most special process need decay to be activated + if( (m_IonBinaryCascadePhysics || m_EmExtraPhysics || m_HadronElasticPhysics || m_NPIonInelasticPhysics + || m_StoppingPhysics || m_HadronPhysicsQGSP_BIC_HP || m_HadronPhysicsINCLXX) && !m_Decay){ + m_Decay = true; + std::cout << "Information: Selected process require Decay to be activated." << std::endl; + } + } ///////////////////////////////////////////////////////////////////////////// PhysicsList::~PhysicsList(){ @@ -284,199 +289,230 @@ PhysicsList::~PhysicsList(){ ///////////////////////////////////////////////////////////////////////////// void PhysicsList::AddIonGasModels() { - G4ParticleTable::G4PTblDicIterator* particleIterator = G4ParticleTable::GetParticleTable()->GetIterator(); - particleIterator->reset(); - while ((*particleIterator)()) - { - G4ParticleDefinition* particle = particleIterator->value(); - G4String partname = particle->GetParticleName(); - if(partname == "p" || partname == "proton" || partname == "alpha" || partname == "He3" || partname == "GenericIon") { - G4BraggIonGasModel* mod1 = new G4BraggIonGasModel(); - G4BetheBlochIonGasModel* mod2 = new G4BetheBlochIonGasModel(); - G4double eth = 2.*MeV*particle->GetPDGMass()/proton_mass_c2; - emConfig->SetExtraEmModel(partname,"ionIoni",mod1,"",0.0,eth,new G4IonFluctuations()); - emConfig->SetExtraEmModel(partname,"ionIoni",mod2,"",eth,100*TeV,new G4UniversalFluctuation()); - } - } + G4ParticleTable::G4PTblDicIterator* particleIterator = G4ParticleTable::GetParticleTable()->GetIterator(); + particleIterator->reset(); + while ((*particleIterator)()) + { + G4ParticleDefinition* particle = particleIterator->value(); + G4String partname = particle->GetParticleName(); + if(partname == "p" || partname == "proton" || partname == "alpha" || partname == "He3" || partname == "GenericIon") { + G4BraggIonGasModel* mod1 = new G4BraggIonGasModel(); + G4BetheBlochIonGasModel* mod2 = new G4BetheBlochIonGasModel(); + G4double eth = 2.*MeV*particle->GetPDGMass()/proton_mass_c2; + emConfig->SetExtraEmModel(partname,"ionIoni",mod1,"",0.0,eth,new G4IonFluctuations()); + emConfig->SetExtraEmModel(partname,"ionIoni",mod2,"",eth,100*TeV,new G4UniversalFluctuation()); + } + } } ///////////////////////////////////////////////////////////////////////////// void PhysicsList::AddPAIModel(const G4String& modname) { - G4ParticleTable::G4PTblDicIterator* particleIterator = G4ParticleTable::GetParticleTable()->GetIterator(); - particleIterator->reset(); - while ((*particleIterator)()) - { - G4ParticleDefinition* particle = particleIterator->value(); - G4String partname = particle->GetParticleName(); - if(partname == "e-" || partname == "e+") { - NewPAIModel(particle, modname, "eIoni"); - - } else if(partname == "mu-" || partname == "mu+") { - NewPAIModel(particle, modname, "muIoni"); - - } else if(partname == "proton" || - partname == "pi+" || - partname == "pi-" - ) { - NewPAIModel(particle, modname, "hIoni"); - } + G4ParticleTable::G4PTblDicIterator* particleIterator = G4ParticleTable::GetParticleTable()->GetIterator(); + particleIterator->reset(); + while ((*particleIterator)()) + { + G4ParticleDefinition* particle = particleIterator->value(); + G4String partname = particle->GetParticleName(); + if(partname == "e-" || partname == "e+") { + NewPAIModel(particle, modname, "eIoni"); + + } else if(partname == "mu-" || partname == "mu+") { + NewPAIModel(particle, modname, "muIoni"); + + } else if(partname == "proton" || + partname == "pi+" || + partname == "pi-" + ) { + NewPAIModel(particle, modname, "hIoni"); } + } } ///////////////////////////////////////////////////////////////////////////// void PhysicsList::NewPAIModel(const G4ParticleDefinition* part, - const G4String& modname, - const G4String& procname) + const G4String& modname, + const G4String& procname) { - G4String partname = part->GetParticleName(); - if(modname == "pai"){ - G4PAIModel* pai = new G4PAIModel(part,"PAIModel"); - emConfig->SetExtraEmModel(partname,procname,pai,"GasDetector",0.0,100.*TeV,pai); - } - - else if(modname == "pai_photon") { - G4PAIPhotModel* pai = new G4PAIPhotModel(part,"PAIPhotModel"); - emConfig->SetExtraEmModel(partname,procname,pai,"GasDetector",0.0,100.*TeV,pai); - } + G4String partname = part->GetParticleName(); + if(modname == "pai"){ + G4PAIModel* pai = new G4PAIModel(part,"PAIModel"); + emConfig->SetExtraEmModel(partname,procname,pai,"GasDetector",0.0,100.*TeV,pai); + } + + else if(modname == "pai_photon") { + G4PAIPhotModel* pai = new G4PAIPhotModel(part,"PAIPhotModel"); + emConfig->SetExtraEmModel(partname,procname,pai,"GasDetector",0.0,100.*TeV,pai); + } } ///////////////////////////////////////////////////////////////////////////// void PhysicsList::ConstructParticle(){ - if(m_OpticalPhysics){ - //G4OpticalPhoton::OpticalPhotonDefinition(); - ((G4VPhysicsConstructor*) opticalPhysicsList)->ConstructParticle(); - - } - - if(m_DriftElectronPhysics){ - ((G4VPhysicsConstructor*) driftElectronPhysicsList)->ConstructParticle(); - } - - if(decay_List){ - decay_List -> ConstructParticle(); - radioactiveDecay_List->ConstructParticle(); - } - - else{ - // If decay is not activated we have to declare the particle ourself - G4He3::He3Definition(); - G4Deuteron::DeuteronDefinition(); - G4Triton::TritonDefinition(); - G4Alpha::AlphaDefinition(); - G4Proton::ProtonDefinition(); - G4AntiProton::AntiProtonDefinition(); - G4Neutron::NeutronDefinition(); - G4Electron::ElectronDefinition(); - G4Positron::PositronDefinition(); - G4NeutrinoE::NeutrinoEDefinition(); - G4MuonPlus::MuonPlusDefinition(); - G4MuonMinus::MuonMinusDefinition(); - G4AntiNeutrinoE::AntiNeutrinoEDefinition(); - G4Geantino::GeantinoDefinition(); - G4ChargedGeantino::ChargedGeantinoDefinition(); - G4Gamma::GammaDefinition(); - // mesons - G4PionPlus ::PionPlusDefinition(); - G4PionMinus ::PionMinusDefinition(); - G4PionZero ::PionZeroDefinition(); - G4Eta ::EtaDefinition(); - G4EtaPrime ::EtaPrimeDefinition(); - // G4RhoZero ::RhoZeroDefinition(); - G4KaonPlus ::KaonPlusDefinition(); - G4KaonMinus ::KaonMinusDefinition(); - G4KaonZero ::KaonZeroDefinition(); - G4AntiKaonZero ::AntiKaonZeroDefinition(); - G4KaonZeroLong ::KaonZeroLongDefinition(); - G4KaonZeroShort::KaonZeroShortDefinition(); - // Ion - G4IonConstructor ionConstructor ; - ionConstructor.ConstructParticle() ; - } + if(m_OpticalPhysics){ + //G4OpticalPhoton::OpticalPhotonDefinition(); + ((G4VPhysicsConstructor*) opticalPhysicsList)->ConstructParticle(); + + } + + if(m_DriftElectronPhysics){ + ((G4VPhysicsConstructor*) driftElectronPhysicsList)->ConstructParticle(); + } + + if(decay_List){ + decay_List -> ConstructParticle(); + radioactiveDecay_List->ConstructParticle(); + } + + else{ + // If decay is not activated we have to declare the particle ourself + G4He3::He3Definition(); + G4Deuteron::DeuteronDefinition(); + G4Triton::TritonDefinition(); + G4Alpha::AlphaDefinition(); + G4Proton::ProtonDefinition(); + G4AntiProton::AntiProtonDefinition(); + G4Neutron::NeutronDefinition(); + G4Electron::ElectronDefinition(); + G4Positron::PositronDefinition(); + G4NeutrinoE::NeutrinoEDefinition(); + G4MuonPlus::MuonPlusDefinition(); + G4MuonMinus::MuonMinusDefinition(); + G4AntiNeutrinoE::AntiNeutrinoEDefinition(); + G4Geantino::GeantinoDefinition(); + G4ChargedGeantino::ChargedGeantinoDefinition(); + G4Gamma::GammaDefinition(); + // mesons + G4PionPlus ::PionPlusDefinition(); + G4PionMinus ::PionMinusDefinition(); + G4PionZero ::PionZeroDefinition(); + G4Eta ::EtaDefinition(); + G4EtaPrime ::EtaPrimeDefinition(); + // G4RhoZero ::RhoZeroDefinition(); + G4KaonPlus ::KaonPlusDefinition(); + G4KaonMinus ::KaonMinusDefinition(); + G4KaonZero ::KaonZeroDefinition(); + G4AntiKaonZero ::AntiKaonZeroDefinition(); + G4KaonZeroLong ::KaonZeroLongDefinition(); + G4KaonZeroShort::KaonZeroShortDefinition(); + // Ion + G4IonConstructor ionConstructor ; + ionConstructor.ConstructParticle() ; + } } ///////////////////////////////////////////////////////////////////////////// void PhysicsList::ConstructProcess(){ - // Transportation - AddTransportation(); - - // Electromagnetic physics - emPhysicsList -> ConstructProcess(); - if(opticalPhysicsList){ - ((G4VPhysicsConstructor*) opticalPhysicsList)->ConstructProcess(); - } - if(driftElectronPhysicsList){ - ((G4VPhysicsConstructor*) driftElectronPhysicsList)->ConstructProcess(); - } - - // Hadronic physics - std::map<std::string,G4VPhysicsConstructor*>::iterator it; - for(it = m_PhysList.begin(); it!= m_PhysList.end(); it++){ - it->second -> ConstructProcess(); - } - BiasCrossSectionByFactor(m_IonBinaryCascadePhysics); - - em_option.SetBuildCSDARange(true); - em_option.SetDEDXBinningForCSDARange(10*10); - em_option.SetFluo(true); - em_option.SetAuger(true); - - AddParametrisation(); - - return; + // Transportation + AddTransportation(); + + // Electromagnetic physics + emPhysicsList -> ConstructProcess(); + if(opticalPhysicsList){ + ((G4VPhysicsConstructor*) opticalPhysicsList)->ConstructProcess(); + } + if(driftElectronPhysicsList){ + ((G4VPhysicsConstructor*) driftElectronPhysicsList)->ConstructProcess(); + } + + // Hadronic physics + std::map<std::string,G4VPhysicsConstructor*>::iterator it; + for(it = m_PhysList.begin(); it!= m_PhysList.end(); it++){ + it->second -> ConstructProcess(); + } + BiasCrossSectionByFactor(m_IonBinaryCascadePhysics); + + em_option.SetBuildCSDARange(true); + em_option.SetDEDXBinningForCSDARange(10*10); + em_option.SetFluo(true); + em_option.SetAuger(true); + + AddParametrisation(); + AddLevelData(); + return; } ///////////////////////////////////////////////////////////////////////////// void PhysicsList::AddStepMax(){ } ///////////////////////////////////////////////////////////////////////////// void PhysicsList::AddParametrisation(){ - G4FastSimulationManagerProcess* BeamReaction = + G4FastSimulationManagerProcess* BeamReaction = new G4FastSimulationManagerProcess("NPSimulationProcess"); - - // For 10.3 and higher + + // For 10.3 and higher #ifndef theParticleIterator - G4ParticleTable::G4PTblDicIterator* theParticleIterator = GetParticleIterator(); + G4ParticleTable::G4PTblDicIterator* theParticleIterator = GetParticleIterator(); #endif - - theParticleIterator->reset(); - while ((*theParticleIterator)()){ - G4ParticleDefinition* particle = theParticleIterator->value(); - G4ProcessManager* pmanager = particle->GetProcessManager(); - std::string name = particle->GetParticleName(); - pmanager->AddDiscreteProcess(BeamReaction); - // Add a Step limiter to the beam particle. - // This will be used to limit the step of the beam in the target - pmanager->AddProcess(new G4StepLimiter,-1,-1,5); - - // Add menate R to the process manager for neutrons - // (if selected as a option) - if(m_Menate_R > 0 && name == "neutron") { - menate_R* theMenate = new menate_R("menateR_neutron"); - theMenate->SetMeanFreePathCalcMethod("ORIGINAL"); - pmanager->AddDiscreteProcess(theMenate); - std::cout <<"||--------------------------------------------------||" << std::endl; - std::cout <<" MENATE_R Added to Process Manager " << std::endl; - std::cout <<"||--------------------------------------------------||" << std::endl; - } - } + + theParticleIterator->reset(); + while ((*theParticleIterator)()){ + G4ParticleDefinition* particle = theParticleIterator->value(); + G4ProcessManager* pmanager = particle->GetProcessManager(); + std::string name = particle->GetParticleName(); + pmanager->AddDiscreteProcess(BeamReaction); + // Add a Step limiter to the beam particle. + // This will be used to limit the step of the beam in the target + pmanager->AddProcess(new G4StepLimiter,-1,-1,5); + + // Add menate R to the process manager for neutrons + // (if selected as a option) + if(m_Menate_R > 0 && name == "neutron") { + menate_R* theMenate = new menate_R("menateR_neutron"); + theMenate->SetMeanFreePathCalcMethod("ORIGINAL"); + pmanager->AddDiscreteProcess(theMenate); + std::cout <<"||--------------------------------------------------||" << std::endl; + std::cout <<" MENATE_R Added to Process Manager " << std::endl; + std::cout <<"||--------------------------------------------------||" << std::endl; + } + } } +//////////////////////////////////////////////////////////////////////////////// +void PhysicsList::AddLevelData(){ + NPL::InputParser parser(NPOptionManager::getInstance()->GetReactionFile()); + vector<NPL::InputBlock*> blocks; + blocks = parser.GetAllBlocksWithToken("LevelData"); + // Loop over all blocks + if (blocks.size()>0 && NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Reading user level data " << endl; + + for (unsigned int i = 0; i < blocks.size(); i++) { + NPL::Nucleus N(blocks[i]->GetMainValue()); + int Z =N.GetZ() ; int A=N.GetA(); + cout << " Nuclei: " << N.GetName() << endl; + string level_path = blocks[i]->GetString("Path"); + G4IonTable* ionTable = G4IonTable::GetIonTable(); + G4NuclearLevelData* levelData = G4NuclearLevelData::GetInstance(); + levelData->AddPrivateData(Z, A, level_path); + const G4LevelManager* levelManager = levelData->GetLevelManager(Z, A); + G4int Nentries = levelManager->NumberOfTransitions()+1; + for(G4int j = 1; j < Nentries; j++){ // Excited states + cout << " - Level " << j + << " energy = " << levelManager->LevelEnergy(j) + << endl; + G4ParticleDefinition* excitedState + = ionTable->GetIon(Z,A,levelManager->LevelEnergy(j)); + excitedState->SetPDGStable(false); + excitedState->SetPDGLifeTime(levelManager->LifeTime(j)); + } + } + +} ///////////////////////////////////////////////////////////////////////////// void PhysicsList::SetCuts(){ - - if (verboseLevel >0){ - G4cout << "PhysicsList::SetCuts:"; - G4cout << "CutLength : " << G4BestUnit(defaultCutValue,"Length") << G4endl; - } - - // Special Cut for optical photon to be emmitted - SetCutsWithDefault(); + + if (verboseLevel >0){ + G4cout << "PhysicsList::SetCuts:"; + G4cout << "CutLength : " << G4BestUnit(defaultCutValue,"Length") << G4endl; + } + + // Special Cut for optical photon to be emmitted + SetCutsWithDefault(); } //////////////////////////////////////////////////////////////////////////////// /////// Friend Method for CS biasing //////////////////////////////////////////////////////////////////////////////// void PhysicsList::BiasCrossSectionByFactor(double factor){ - factor++; + factor++; } diff --git a/NPSimulation/Process/PhysicsList.hh b/NPSimulation/Process/PhysicsList.hh index 33f7eb807..5a7b488b3 100644 --- a/NPSimulation/Process/PhysicsList.hh +++ b/NPSimulation/Process/PhysicsList.hh @@ -89,7 +89,7 @@ class PhysicsList: public G4VUserPhysicsList{ void AddIonGasModels(); void AddPAIModel(const G4String& modname); void NewPAIModel(const G4ParticleDefinition* part, const G4String& modname,const G4String& procname); - + void AddLevelData(); private: std::map<std::string,G4VPhysicsConstructor*> m_PhysList; G4EmConfigurator em_config; diff --git a/Projects/e748/Analysis.cxx b/Projects/e748/Analysis.cxx index e837582a9..376c1dd90 100644 --- a/Projects/e748/Analysis.cxx +++ b/Projects/e748/Analysis.cxx @@ -22,7 +22,6 @@ #include<iostream> using namespace std; #include"Analysis.h" -#include"NPFunction.h" #include"NPAnalysisFactory.h" #include"NPDetectorManager.h" #include"NPOptionManager.h" @@ -60,16 +59,14 @@ void Analysis::Init(){ ZTarget = 0; TimeCorr=0; TargetThickness = m_DetectorManager->GetTargetThickness(); - string TargetMaterial = m_DetectorManager->GetTargetMaterial(); - // energy losses - string light=NPL::ChangeNameToG4Standard(myReaction->GetNucleus3()->GetName()); - string beam=NPL::ChangeNameToG4Standard(myReaction->GetNucleus1()->GetName()); - LightTarget = NPL::EnergyLoss(light+"_"+TargetMaterial+".G4table","G4Table",10 ); - LightAl = NPL::EnergyLoss(light+"_Al.G4table","G4Table",10); - LightSi = NPL::EnergyLoss(light+"_Si.G4table","G4Table",10); - BeamTarget = NPL::EnergyLoss(beam+"_"+TargetMaterial+".G4table","G4Table",10); - BeamMylar= NPL::EnergyLoss(beam+"_Mylar.G4table","G4Table",10); - BeamIsobutane = EnergyLoss(beam+"_iC4H10.G4table","G4Table",10); + // Energy loss table: the G4Table are generated by the simulation + He3CD2 = EnergyLoss("Example/He3_CD2.G4table","G4Table",10 ); + He3Al = EnergyLoss("Example/He3_Al.G4table","G4Table",10); + He3Si = EnergyLoss("Example/He3_Si.G4table","G4Table",10); + BeamCD2 = EnergyLoss("Be12_CD2.G4table","G4Table",10); + BeamMylar = EnergyLoss("Be12_Mylar.G4table","G4Table",10); + BeamIsobutane = EnergyLoss("Be12_iC4H10.G4table","G4Table",10); + } //////////////////////////////////////////////////////////////////////////////// @@ -85,7 +82,7 @@ void Analysis::TreatEvent(){ filename = filename.substr(0,minor_pos); size_t major_pos = filename.rfind("_"); run_major = atoi(filename.substr(major_pos+1,4).c_str()); - // Get the Init information on beam position and energy + // Get the Init information on beam position and energy // and apply by hand the experimental resolution // This is because the beam diagnosis are not simulated // PPAC position resolution on target is assumed to be 1mm @@ -96,124 +93,127 @@ void Analysis::TreatEvent(){ // Beam energy is measured using F3 and F2 plastic TOF //double BeamEnergy= myReaction-> GetBeamEnergy()* MeV; //////////////////////////// LOOP on MUST2 Hit ////////////////// - for(unsigned int countMust2 = 0 ; countMust2 < M2->Si_E.size() ; countMust2++){ + for(unsigned int countMust2 = 0 ; countMust2 < M2->Si_E.size() ; countMust2++){ /* //Part 0 : Get the usefull Data */ - // MUST2 */ - int X = M2->Si_X[countMust2]; - int Y = M2->Si_Y[countMust2]; - int TelescopeNumber = M2->TelescopeNumber[countMust2]; - Si_X_M2 = X ; - Si_Y_M2 = Y ; - // Beam Energy from Cav Time of Flight // - double BeamSpeed = 138.898 - 14765.1/ ModularLeaf->GetCalibratedValue("T_CATS1_CAV") ; // mm/ns - // Beam Energy before CATS1 - static double c2 = 299.792458*299.792458;// mm/ns - double gamma = 1./sqrt(1-BeamSpeed*BeamSpeed/c2); - BeamEnergy= 11200.962140*(gamma-1); - double BeamAngle= BeamDirection.Angle(TVector3(0,0,1)); - double gammaCav = (BeamEnergy+11200.962140) / 11200.962140 ; - double BeamSpeedCav = sqrt(c2*(1-1/(gammaCav*gammaCav))); -//cout << ModularLeaf->GetCalibratedValue("T_CATS1_CAV") << " " << BeamSpeed << " " << BeamEnergy << " " << BeamEnergy/12. << endl; - if(BeamEnergy>0 && TelescopeNumber<5){ - DetectorNumber = TelescopeNumber ; - - /* // Part 1 : Impact Angle */ - ThetaM2Surface = 0; - ThetaNormalTarget = 0; - if(XTarget>-1000 && YTarget>-1000){ - TVector3 BeamImpact(XTarget,YTarget,0); - TVector3 HitDirection = M2 -> GetPositionOfInteraction(countMust2) - BeamImpact ; - ThetaLab = HitDirection.Angle( BeamDirection ); - - ThetaM2Surface = HitDirection.Angle(- M2 -> GetTelescopeNormal(countMust2) ); - ThetaNormalTarget = HitDirection.Angle( TVector3(0,0,1) ) ; - X_M2 = M2 -> GetPositionOfInteraction(countMust2).X() ; - Y_M2 = M2 -> GetPositionOfInteraction(countMust2).Y() ; - Z_M2 = M2 -> GetPositionOfInteraction(countMust2).Z() ; - - + // MUST2 */ + int X = M2->Si_X[countMust2]; + int Y = M2->Si_Y[countMust2]; + int TelescopeNumber = M2->TelescopeNumber[countMust2]; + Si_X_M2 = X ; + Si_Y_M2 = Y ; + + if(TelescopeNumber<9){ + DetectorNumber = TelescopeNumber ; + + /* // Part 1 : Impact Angle */ + ThetaM2Surface = 0; + ThetaNormalTarget = 0; + if(XTarget>-1000 && YTarget>-1000){ + TVector3 BeamImpact(XTarget,YTarget,0); + TVector3 HitDirection = M2 -> GetPositionOfInteraction(countMust2) - BeamImpact ; + ThetaLab = HitDirection.Angle( BeamDirection ); + + ThetaM2Surface = HitDirection.Angle(- M2 -> GetTelescopeNormal(countMust2) ); + ThetaNormalTarget = HitDirection.Angle( TVector3(0,0,1) ) ; + X_M2 = M2 -> GetPositionOfInteraction(countMust2).X() ; + Y_M2 = M2 -> GetPositionOfInteraction(countMust2).Y() ; + Z_M2 = M2 -> GetPositionOfInteraction(countMust2).Z() ; + + // Beam Energy from Cav Time of Flight // + + // Beam speed from Beam Energy + + // double BeamSpeed = 10.8727 + ModularLeaf->GetCalibratedValue("T_CATS1_CAV")*0.276825; // mm/ns + //double BeamSpeed = 5.17952 + ModularLeaf->GetCalibratedValue("T_CATS1_CAV")*0.305315; // mm/ns + double BeamSpeed = 11.0476 + ModularLeaf->GetCalibratedValue("T_CATS1_CAV")*0.278917; // mm/ns + + // Beam Energy before CATS1 + static double c2 = 299.792458*299.792458;// mm/ns + double gamma = 1./sqrt(1-BeamSpeed*BeamSpeed/c2); + BeamEnergy= 11200.962140*(gamma-1); + double BeamAngle= BeamDirection.Angle(TVector3(0,0,1)); + // Beam Energy and speed after CATS1 - double BeamEnergyC1 = BeamMylar.Slow(BeamEnergy,1.2*micrometer,BeamAngle); - BeamEnergyC1 = BeamIsobutane.Slow(BeamEnergyC1,cm/3.,BeamAngle); - BeamEnergyC1 = BeamMylar.Slow(BeamEnergyC1,0.9*micrometer,BeamAngle); - BeamEnergyC1 = BeamIsobutane.Slow(BeamEnergyC1,cm/3,BeamAngle); - BeamEnergyC1 = BeamMylar.Slow(BeamEnergyC1,0.9*micrometer,BeamAngle); - BeamEnergyC1 = BeamIsobutane.Slow(BeamEnergyC1,cm/3.,BeamAngle); - BeamEnergyC1 = BeamMylar.Slow(BeamEnergyC1,1.2*micrometer,BeamAngle); - double gammaC1 = (BeamEnergyC1+11200.962140) / 11200.962140 ; - double BeamSpeedC1 = sqrt(c2*(1-1/(gammaC1*gammaC1))); - TVector3 C1toC2 = TVector3(CATS->PositionX[1],CATS->PositionY[1],CATS->PositionZ[1]) - - TVector3(CATS->PositionX[0],CATS->PositionY[0],CATS->PositionZ[0]) ; - TimeCorr = C1toC2.Mag()/BeamSpeedC1; - - // Beam Energy and speed after CATS2 - double BeamEnergyC2 = BeamMylar.Slow(BeamEnergyC1,1.2*micrometer,BeamAngle); - BeamEnergyC2 = BeamIsobutane.Slow(BeamEnergyC2,cm/3.,BeamAngle); - BeamEnergyC2 = BeamMylar.Slow(BeamEnergyC2,0.9*micrometer,BeamAngle); - BeamEnergyC2 = BeamIsobutane.Slow(BeamEnergyC2,cm/3,BeamAngle); - BeamEnergyC2 = BeamMylar.Slow(BeamEnergyC2,0.9*micrometer,BeamAngle); - BeamEnergyC2 = BeamIsobutane.Slow(BeamEnergyC2,cm/3.,BeamAngle); - BeamEnergyC2 = BeamMylar.Slow(BeamEnergyC2,1.2*micrometer,BeamAngle); - - double gammaC2 = (BeamEnergyC2+11200.962140) / 11200.962140; - double BeamSpeedC2 = sqrt(c2*(1-1/(gammaC2*gammaC2))); - TVector3 C2toTarget = BeamImpact-TVector3(CATS->PositionX[1],CATS->PositionY[1],CATS->PositionZ[1]); - TimeCorr += C2toTarget.Mag()/BeamSpeedC2; - // slow down beam inside the target - BeamEnergy = BeamTarget.Slow(BeamEnergyC2,TargetThickness*0.5,BeamDirection.Angle(TVector3(0,0,1))); - myReaction->SetBeamEnergy(BeamEnergy); - - - ParticleLength=HitDirection.Mag(); - - } - - - else{ - BeamDirection = TVector3(-1000,-1000,-1000); - ThetaM2Surface = -1000 ; - ThetaNormalTarget = -1000 ; - } - - /* // Part 2 : Impact Energy */ - Energy = ELab = E_M2 = 0; - Si_E_M2 = M2->Si_E[countMust2]; - CsI_E_M2= M2->CsI_E[countMust2]; - - /* // if CsI */ - /* /1* if(CsI_E_M2>0 ){ *1/ */ - /* /1* // The energy in CsI is calculate form dE/dx Table because *1/ */ - /* /1* // 20um resolution is poor *1/ */ - /* /1* Energy = *1/ */ - /* /1* LightSi.EvaluateEnergyFromDeltaE(Si_E_M2,300*micrometer, *1/ */ - /* /1* ThetaM2Surface, 0.01*MeV, *1/ */ - /* /1* 450.*MeV,0.001*MeV ,1000); *1/ */ - /* /1* E_M2=CsI_E_M2; *1/ */ - /* /1* } *1/ */ - - /* /1* else *1/ */ - - - - - Energy = Si_E_M2; - - E_M2 += Si_E_M2; - - /* // Evaluate energy using the thickness */ - ELab = LightAl.EvaluateInitialEnergy( Energy,0.4*micrometer , ThetaM2Surface); - /* // Target Correction */ - ELab = LightTarget.EvaluateInitialEnergy( ELab ,TargetThickness/2., ThetaNormalTarget); - - /* // Part 3 : Excitation Energy Calculation */ - Ex = myReaction -> ReconstructRelativistic( ELab , ThetaLab ); - - - /* // Part 4 : Theta CM Calculation */ - ThetaCM = myReaction -> EnergyLabToThetaCM( ELab , ThetaLab)/deg; - ThetaLab=ThetaLab/deg; - - } + double BeamEnergyC1 = BeamMylar.Slow(BeamEnergy,1.2*micrometer,BeamAngle); + BeamEnergyC1 = BeamIsobutane.Slow(BeamEnergyC1,cm/3.,BeamAngle); + BeamEnergyC1 = BeamMylar.Slow(BeamEnergyC1,0.9*micrometer,BeamAngle); + BeamEnergyC1 = BeamIsobutane.Slow(BeamEnergyC1,cm/3,BeamAngle); + BeamEnergyC1 = BeamMylar.Slow(BeamEnergyC1,0.9*micrometer,BeamAngle); + BeamEnergyC1 = BeamIsobutane.Slow(BeamEnergyC1,cm/3.,BeamAngle); + BeamEnergyC1 = BeamMylar.Slow(BeamEnergyC1,1.2*micrometer,BeamAngle); + + double gammaC1 = (BeamEnergyC1+11200.962140) / 11200.962140 ; + double BeamSpeedC1 = sqrt(c2*(1-1/(gammaC1*gammaC1))); + TVector3 C1toC2 = TVector3(CATS->PositionX[1],CATS->PositionY[1],CATS->PositionZ[1]) + - TVector3(CATS->PositionX[0],CATS->PositionY[0],CATS->PositionZ[0]) ; + TimeCorr = C1toC2.Mag()/BeamSpeedC1; + + // Beam Energy and speed after CATS2 + double BeamEnergyC2 = BeamMylar.Slow(BeamEnergyC1,1.2*micrometer,BeamAngle); + BeamEnergyC2 = BeamIsobutane.Slow(BeamEnergyC2,cm/3.,BeamAngle); + BeamEnergyC2 = BeamMylar.Slow(BeamEnergyC2,0.9*micrometer,BeamAngle); + BeamEnergyC2 = BeamIsobutane.Slow(BeamEnergyC2,cm/3,BeamAngle); + BeamEnergyC2 = BeamMylar.Slow(BeamEnergyC2,0.9*micrometer,BeamAngle); + BeamEnergyC2 = BeamIsobutane.Slow(BeamEnergyC2,cm/3.,BeamAngle); + BeamEnergyC2 = BeamMylar.Slow(BeamEnergyC2,1.2*micrometer,BeamAngle); + + double gammaC2 = (BeamEnergyC2+11200.962140) / 11200.962140; + double BeamSpeedC2 = sqrt(c2*(1-1/(gammaC2*gammaC2))); + TVector3 C2toTarget = BeamImpact-TVector3(CATS->PositionX[1],CATS->PositionY[1],CATS->PositionZ[1]); + TimeCorr += C2toTarget.Mag()/BeamSpeedC2; + + // slow down beam inside the target + BeamEnergy = BeamCD2.Slow(BeamEnergyC2,TargetThickness*0.5,BeamDirection.Angle(TVector3(0,0,1))); + myReaction->SetBeamEnergy(BeamEnergy); + + } + + + else{ + BeamDirection = TVector3(-1000,-1000,-1000); + ThetaM2Surface = -1000 ; + ThetaNormalTarget = -1000 ; + } + +/* // Part 2 : Impact Energy */ + Energy = ELab = E_M2 = 0; + Si_E_M2 = M2->Si_E[countMust2]; + CsI_E_M2= M2->CsI_E[countMust2]; + +/* // if CsI */ +/* /1* if(CsI_E_M2>0 ){ *1/ */ +/* /1* // The energy in CsI is calculate form dE/dx Table because *1/ */ +/* /1* // 20um resolution is poor *1/ */ +/* /1* Energy = *1/ */ +/* /1* He3Si.EvaluateEnergyFromDeltaE(Si_E_M2,300*micrometer, *1/ */ +/* /1* ThetaM2Surface, 0.01*MeV, *1/ */ +/* /1* 450.*MeV,0.001*MeV ,1000); *1/ */ +/* /1* E_M2=CsI_E_M2; *1/ */ +/* /1* } *1/ */ + +/* /1* else *1/ */ + + + + + Energy = Si_E_M2; + + E_M2 += Si_E_M2; + +/* // Evaluate energy using the thickness */ + ELab = He3Al.EvaluateInitialEnergy( Energy,0.4*micrometer , ThetaM2Surface); +/* // Target Correction */ + ELab = He3CD2.EvaluateInitialEnergy( ELab ,TargetThickness/2., ThetaNormalTarget); + +/* // Part 3 : Excitation Energy Calculation */ + Ex = myReaction -> ReconstructRelativistic( ELab , ThetaLab ); + + +/* // Part 4 : Theta CM Calculation */ + ThetaCM = myReaction -> EnergyLabToThetaCM( ELab , ThetaLab)/deg; + ThetaLab=ThetaLab/deg; + + } }//end loop MUST2 } @@ -240,35 +240,35 @@ void Analysis::InitOutputBranch() { RootOutput::getInstance()->GetTree()->Branch("RunMajor",&run_major,"RunMajor/I"); RootOutput::getInstance()->GetTree()->Branch("RunMinor",&run_minor,"RunMinor/I"); - /* RootOutput::getInstance()->GetTree()->Branch("ADC_CHIO_V15",&vADC_CHIO_V15,"ADC_CHIO_V15/s"); - RootOutput::getInstance()->GetTree()->Branch("ADC_VOIE_29",&vADC_VOIE_29,"ADC_VOIE_29/s"); - RootOutput::getInstance()->GetTree()->Branch("CHIO",&vCHIO,"CHIO/s"); - RootOutput::getInstance()->GetTree()->Branch("CONFDEC",&vCONFDEC,"CONFDEC/s"); - RootOutput::getInstance()->GetTree()->Branch("CONFDEC_AGAVA",&vCONFDEC_AGAVA,"CONFDEC_AGAVA/s"); - RootOutput::getInstance()->GetTree()->Branch("DATATRIG",&vDATATRIG,"DATATRIG/s"); - RootOutput::getInstance()->GetTree()->Branch("DATATRIG_CHIO",&vDATATRIG_CHIO,"DATATRIG_CHIO/s"); - RootOutput::getInstance()->GetTree()->Branch("E1D6",&vE1D6,"E1D6/s"); - RootOutput::getInstance()->GetTree()->Branch("E2D6",&vE2D6,"E2D6/s"); - RootOutput::getInstance()->GetTree()->Branch("ED4",&vED4,"ED4/s"); - RootOutput::getInstance()->GetTree()->Branch("EXL_HF",&vEXL_HF,"EXL_HF/s"); - RootOutput::getInstance()->GetTree()->Branch("GALD4X",&vGALD4X,"GALD4X/s"); - RootOutput::getInstance()->GetTree()->Branch("GALD4Y",&vGALD4Y,"GALD4Y/s"); - RootOutput::getInstance()->GetTree()->Branch("QCaviar",&vQCaviar,"QCaviar/s"); - RootOutput::getInstance()->GetTree()->Branch("QPlast",&vQPlast,"QPlast/s"); - RootOutput::getInstance()->GetTree()->Branch("TCAVHF",&vTCAVHF,"TCAVHF/s"); - RootOutput::getInstance()->GetTree()->Branch("TE1D6CAV",&vTE1D6CAV,"TE1D6CAV/s"); - RootOutput::getInstance()->GetTree()->Branch("TE1D6GAL",&vTE1D6GAL,"TE1D6GAL/s"); - RootOutput::getInstance()->GetTree()->Branch("TE1D6HF",&vTE1D6HF,"TE1D6HF/s"); - RootOutput::getInstance()->GetTree()->Branch("TED4HF",&vTED4HF,"TED4HF/s"); - RootOutput::getInstance()->GetTree()->Branch("TGALD4HF",&vTGALD4HF,"TGALD4HF/s"); - RootOutput::getInstance()->GetTree()->Branch("T_CATS1_2",&vT_CATS1_2,"T_CATS1_2/s"); - RootOutput::getInstance()->GetTree()->Branch("T_CATS1_CAV",&vT_CATS1_CAV,"T_CATS1_CAV/s"); - RootOutput::getInstance()->GetTree()->Branch("T_MUVI_CATS1",&vT_MUVI_CATS1,"T_MUVI_CATS1/s"); - RootOutput::getInstance()->GetTree()->Branch("T_PL_CATS1",&vT_PL_CATS1,"T_PL_CATS1/s"); - RootOutput::getInstance()->GetTree()->Branch("T_PL_CATS2",&vT_PL_CATS2,"T_PL_CATS2/s"); - RootOutput::getInstance()->GetTree()->Branch("T_PL_CHIO",&vT_PL_CHIO,"T_PL_CHIO/s"); - RootOutput::getInstance()->GetTree()->Branch("T_PLchCATS1",&vT_PLchCATS1,"T_PLchCATS1/s"); - */ +/* RootOutput::getInstance()->GetTree()->Branch("ADC_CHIO_V15",&vADC_CHIO_V15,"ADC_CHIO_V15/s"); + RootOutput::getInstance()->GetTree()->Branch("ADC_VOIE_29",&vADC_VOIE_29,"ADC_VOIE_29/s"); + RootOutput::getInstance()->GetTree()->Branch("CHIO",&vCHIO,"CHIO/s"); + RootOutput::getInstance()->GetTree()->Branch("CONFDEC",&vCONFDEC,"CONFDEC/s"); + RootOutput::getInstance()->GetTree()->Branch("CONFDEC_AGAVA",&vCONFDEC_AGAVA,"CONFDEC_AGAVA/s"); + RootOutput::getInstance()->GetTree()->Branch("DATATRIG",&vDATATRIG,"DATATRIG/s"); + RootOutput::getInstance()->GetTree()->Branch("DATATRIG_CHIO",&vDATATRIG_CHIO,"DATATRIG_CHIO/s"); + RootOutput::getInstance()->GetTree()->Branch("E1D6",&vE1D6,"E1D6/s"); + RootOutput::getInstance()->GetTree()->Branch("E2D6",&vE2D6,"E2D6/s"); + RootOutput::getInstance()->GetTree()->Branch("ED4",&vED4,"ED4/s"); + RootOutput::getInstance()->GetTree()->Branch("EXL_HF",&vEXL_HF,"EXL_HF/s"); + RootOutput::getInstance()->GetTree()->Branch("GALD4X",&vGALD4X,"GALD4X/s"); + RootOutput::getInstance()->GetTree()->Branch("GALD4Y",&vGALD4Y,"GALD4Y/s"); + RootOutput::getInstance()->GetTree()->Branch("QCaviar",&vQCaviar,"QCaviar/s"); + RootOutput::getInstance()->GetTree()->Branch("QPlast",&vQPlast,"QPlast/s"); + RootOutput::getInstance()->GetTree()->Branch("TCAVHF",&vTCAVHF,"TCAVHF/s"); + RootOutput::getInstance()->GetTree()->Branch("TE1D6CAV",&vTE1D6CAV,"TE1D6CAV/s"); + RootOutput::getInstance()->GetTree()->Branch("TE1D6GAL",&vTE1D6GAL,"TE1D6GAL/s"); + RootOutput::getInstance()->GetTree()->Branch("TE1D6HF",&vTE1D6HF,"TE1D6HF/s"); + RootOutput::getInstance()->GetTree()->Branch("TED4HF",&vTED4HF,"TED4HF/s"); + RootOutput::getInstance()->GetTree()->Branch("TGALD4HF",&vTGALD4HF,"TGALD4HF/s"); + RootOutput::getInstance()->GetTree()->Branch("T_CATS1_2",&vT_CATS1_2,"T_CATS1_2/s"); + RootOutput::getInstance()->GetTree()->Branch("T_CATS1_CAV",&vT_CATS1_CAV,"T_CATS1_CAV/s"); + RootOutput::getInstance()->GetTree()->Branch("T_MUVI_CATS1",&vT_MUVI_CATS1,"T_MUVI_CATS1/s"); + RootOutput::getInstance()->GetTree()->Branch("T_PL_CATS1",&vT_PL_CATS1,"T_PL_CATS1/s"); + RootOutput::getInstance()->GetTree()->Branch("T_PL_CATS2",&vT_PL_CATS2,"T_PL_CATS2/s"); + RootOutput::getInstance()->GetTree()->Branch("T_PL_CHIO",&vT_PL_CHIO,"T_PL_CHIO/s"); + RootOutput::getInstance()->GetTree()->Branch("T_PLchCATS1",&vT_PLchCATS1,"T_PLchCATS1/s"); +*/ } //////////////////////////////////////////////////////////////////////////////// @@ -276,37 +276,37 @@ void Analysis::InitInputBranch(){ /* RootInput:: getInstance()->GetChain()->SetBranchStatus("InitialConditions",true ); */ /* RootInput:: getInstance()->GetChain()->SetBranchStatus("fIC_*",true ); */ /* RootInput:: getInstance()->GetChain()->SetBranchStatus("InitialConditions",true ); */ - + RootInput:: getInstance()->GetChain()->SetBranchAddress("GATCONF",&vGATCONF); - /* RootInput:: getInstance()->GetChain()->SetBranchAddress("ADC_CHIO_V15",&vADC_CHIO_V15); - RootInput:: getInstance()->GetChain()->SetBranchAddress("ADC_VOIE_29",&vADC_VOIE_29); - RootInput:: getInstance()->GetChain()->SetBranchAddress("CHIO",&vCHIO); - RootInput:: getInstance()->GetChain()->SetBranchAddress("CONFDEC",&vCONFDEC); - RootInput:: getInstance()->GetChain()->SetBranchAddress("CONFDEC_AGAVA",&vCONFDEC_AGAVA); - RootInput:: getInstance()->GetChain()->SetBranchAddress("DATATRIG",&vDATATRIG); - RootInput:: getInstance()->GetChain()->SetBranchAddress("DATATRIG_CHIO",&vDATATRIG_CHIO); - RootInput:: getInstance()->GetChain()->SetBranchAddress("E1D6",&vE1D6); - RootInput:: getInstance()->GetChain()->SetBranchAddress("E2D6",&vE2D6); - RootInput:: getInstance()->GetChain()->SetBranchAddress("ED4",&vED4); - RootInput:: getInstance()->GetChain()->SetBranchAddress("EXL_HF",&vEXL_HF); - RootInput:: getInstance()->GetChain()->SetBranchAddress("GALD4X",&vGALD4X); - RootInput:: getInstance()->GetChain()->SetBranchAddress("GALD4Y",&vGALD4Y); - RootInput:: getInstance()->GetChain()->SetBranchAddress("QCaviar",&vQCaviar); - RootInput:: getInstance()->GetChain()->SetBranchAddress("QPlast",&vQPlast); - RootInput:: getInstance()->GetChain()->SetBranchAddress("TCAVHF",&vTCAVHF); - RootInput:: getInstance()->GetChain()->SetBranchAddress("TE1D6CAV",&vTE1D6CAV); - RootInput:: getInstance()->GetChain()->SetBranchAddress("TE1D6GAL",&vTE1D6GAL); - RootInput:: getInstance()->GetChain()->SetBranchAddress("TE1D6HF",&vTE1D6HF); - RootInput:: getInstance()->GetChain()->SetBranchAddress("TED4HF",&vTED4HF); - RootInput:: getInstance()->GetChain()->SetBranchAddress("TGALD4HF",&vTGALD4HF); - RootInput:: getInstance()->GetChain()->SetBranchAddress("T_CATS1_2",&vT_CATS1_2); - RootInput:: getInstance()->GetChain()->SetBranchAddress("T_CATS1_CAV",&vT_CATS1_CAV); - RootInput:: getInstance()->GetChain()->SetBranchAddress("T_MUVI_CATS1",&vT_MUVI_CATS1); - RootInput:: getInstance()->GetChain()->SetBranchAddress("T_PL_CATS1",&vT_PL_CATS1); - RootInput:: getInstance()->GetChain()->SetBranchAddress("T_PL_CATS2",&vT_PL_CATS2); - RootInput:: getInstance()->GetChain()->SetBranchAddress("T_PL_CHIO",&vT_PL_CHIO); - RootInput:: getInstance()->GetChain()->SetBranchAddress("T_PLchCATS1",&vT_PLchCATS1); - */ + /* RootInput:: getInstance()->GetChain()->SetBranchAddress("ADC_CHIO_V15",&vADC_CHIO_V15); + RootInput:: getInstance()->GetChain()->SetBranchAddress("ADC_VOIE_29",&vADC_VOIE_29); + RootInput:: getInstance()->GetChain()->SetBranchAddress("CHIO",&vCHIO); + RootInput:: getInstance()->GetChain()->SetBranchAddress("CONFDEC",&vCONFDEC); + RootInput:: getInstance()->GetChain()->SetBranchAddress("CONFDEC_AGAVA",&vCONFDEC_AGAVA); + RootInput:: getInstance()->GetChain()->SetBranchAddress("DATATRIG",&vDATATRIG); + RootInput:: getInstance()->GetChain()->SetBranchAddress("DATATRIG_CHIO",&vDATATRIG_CHIO); + RootInput:: getInstance()->GetChain()->SetBranchAddress("E1D6",&vE1D6); + RootInput:: getInstance()->GetChain()->SetBranchAddress("E2D6",&vE2D6); + RootInput:: getInstance()->GetChain()->SetBranchAddress("ED4",&vED4); + RootInput:: getInstance()->GetChain()->SetBranchAddress("EXL_HF",&vEXL_HF); + RootInput:: getInstance()->GetChain()->SetBranchAddress("GALD4X",&vGALD4X); + RootInput:: getInstance()->GetChain()->SetBranchAddress("GALD4Y",&vGALD4Y); + RootInput:: getInstance()->GetChain()->SetBranchAddress("QCaviar",&vQCaviar); + RootInput:: getInstance()->GetChain()->SetBranchAddress("QPlast",&vQPlast); + RootInput:: getInstance()->GetChain()->SetBranchAddress("TCAVHF",&vTCAVHF); + RootInput:: getInstance()->GetChain()->SetBranchAddress("TE1D6CAV",&vTE1D6CAV); + RootInput:: getInstance()->GetChain()->SetBranchAddress("TE1D6GAL",&vTE1D6GAL); + RootInput:: getInstance()->GetChain()->SetBranchAddress("TE1D6HF",&vTE1D6HF); + RootInput:: getInstance()->GetChain()->SetBranchAddress("TED4HF",&vTED4HF); + RootInput:: getInstance()->GetChain()->SetBranchAddress("TGALD4HF",&vTGALD4HF); + RootInput:: getInstance()->GetChain()->SetBranchAddress("T_CATS1_2",&vT_CATS1_2); + RootInput:: getInstance()->GetChain()->SetBranchAddress("T_CATS1_CAV",&vT_CATS1_CAV); + RootInput:: getInstance()->GetChain()->SetBranchAddress("T_MUVI_CATS1",&vT_MUVI_CATS1); + RootInput:: getInstance()->GetChain()->SetBranchAddress("T_PL_CATS1",&vT_PL_CATS1); + RootInput:: getInstance()->GetChain()->SetBranchAddress("T_PL_CATS2",&vT_PL_CATS2); + RootInput:: getInstance()->GetChain()->SetBranchAddress("T_PL_CHIO",&vT_PL_CHIO); + RootInput:: getInstance()->GetChain()->SetBranchAddress("T_PLchCATS1",&vT_PLchCATS1); +*/ } //////////////////////////////////////////////////////////////////////////////// @@ -336,13 +336,13 @@ NPL::VAnalysis* Analysis::Construct(){ // Registering the construct method to the factory // //////////////////////////////////////////////////////////////////////////////// extern "C"{ - class proxy{ - public: - proxy(){ - NPL::AnalysisFactory::getInstance()->SetConstructor(Analysis::Construct); - } - }; +class proxy{ + public: + proxy(){ + NPL::AnalysisFactory::getInstance()->SetConstructor(Analysis::Construct); + } +}; - proxy p; +proxy p; } diff --git a/Projects/e748/Analysis.h b/Projects/e748/Analysis.h index 4566a7d1b..6bac47cdc 100644 --- a/Projects/e748/Analysis.h +++ b/Projects/e748/Analysis.h @@ -74,10 +74,10 @@ class Analysis: public NPL::VAnalysis{ double BeamEnergy; int run_major; int run_minor; - NPL::EnergyLoss LightTarget; - NPL::EnergyLoss LightAl ; - NPL::EnergyLoss LightSi ; - NPL::EnergyLoss BeamTarget ; + NPL::EnergyLoss He3CD2 ; + NPL::EnergyLoss He3Al ; + NPL::EnergyLoss He3Si ; + NPL::EnergyLoss BeamCD2 ; NPL::EnergyLoss BeamMylar ; NPL::EnergyLoss BeamIsobutane ; diff --git a/Projects/e748/configs/ConfigMust2.dat b/Projects/e748/configs/ConfigMust2.dat old mode 100644 new mode 100755 diff --git a/Projects/e748/e748.detector b/Projects/e748/e748.detector old mode 100644 new mode 100755 index a1821cf6b..90336a06a --- a/Projects/e748/e748.detector +++ b/Projects/e748/e748.detector @@ -116,7 +116,7 @@ CATSDetector ModularLeaf DefaultValue= -1000 - Leafs= QPlast QCaviar CHIO T_CATS1_CAV T_CATS1_2 T_MUVI_CATS1 T_PL_CATS2 EXL_HF T_PL_CHIO T_PL_CATS E1D6 + Leafs= QPlast QCaviar CHIO T_CATS1_CAV T_CATS1_2 T_MUVI_CATS1 T_PL_CATS2 EXL_HF T_PL_CHIO T_PL_CATS1 Chio_dig Pos= -30. -30. 600. mm -- GitLab