#include <MaterialBudgetAction.h>
Public Member Functions | |
MaterialBudgetAction (const edm::ParameterSet &) | |
void | produce (edm::Event &, const edm::EventSetup &) |
virtual | ~MaterialBudgetAction () |
Private Member Functions | |
bool | CheckTouchableInSelectedVolumes (const G4VTouchable *touch) |
void | endRun () |
std::string | getPartName (G4StepPoint *aStepPoint) |
std::string | getSubDetectorName (G4StepPoint *aStepPoint) |
void | initRun () |
MaterialBudgetAction (const MaterialBudgetAction &) | |
const MaterialBudgetAction & | operator= (const MaterialBudgetAction &) |
void | processEvent (unsigned int nEv) |
void | save (const G4Step *aStep) |
bool | StopAfterProcess (const G4Step *aStep) |
void | update (const BeginOfRun *) |
This routine will be called when the appropriate signal arrives. | |
void | update (const EndOfTrack *) |
This routine will be called when the appropriate signal arrives. | |
void | update (const G4Step *) |
This routine will be called when the appropriate signal arrives. | |
void | update (const EndOfEvent *) |
This routine will be called when the appropriate signal arrives. | |
void | update (const BeginOfTrack *) |
This routine will be called when the appropriate signal arrives. | |
Private Attributes | |
double | Ekin |
bool | firstParticle |
bool | saveToHistos |
bool | saveToTree |
bool | saveToTxt |
bool | storeDecay |
MaterialBudgetData * | theData |
std::string | theHistoList |
TestHistoMgr * | theHistoMgr |
MaterialBudgetFormat * | theHistos |
G4String | theProcessToStop |
MaterialBudgetTree * | theTree |
MaterialBudgetTxt * | theTxt |
std::vector< G4String > | theVolumeList |
Definition at line 29 of file MaterialBudgetAction.h.
MaterialBudgetAction::MaterialBudgetAction | ( | const edm::ParameterSet & | iPSet | ) |
Definition at line 31 of file MaterialBudgetAction.cc.
References gather_cfg::cout, Ekin, firstParticle, edm::ParameterSet::getParameter(), edm::ParameterSet::getUntrackedParameter(), saveToHistos, saveToTree, saveToTxt, MaterialBudgetData::SetAllStepsToTree(), storeDecay, theData, theHistoList, theHistoMgr, theHistos, theProcessToStop, theTree, theTxt, and theVolumeList.
: theHistoMgr(0) { theData = new MaterialBudgetData; edm::ParameterSet m_Anal = iPSet.getParameter<edm::ParameterSet>("MaterialBudgetAction"); //---- Accumulate material budget only inside selected volumes std::string theHistoList = m_Anal.getParameter<std::string>("HistogramList"); std::vector<std::string> volList = m_Anal.getParameter< std::vector<std::string> >("SelectedVolumes"); std::vector<std::string>::const_iterator ite; std::cout << "TestGeometry: List of the selected volumes: " << std::endl; for( ite = volList.begin(); ite != volList.end(); ite++ ){ if( (*ite) != "None" ) { theVolumeList.push_back( *ite ); std::cout << (*ite) << std::endl; } } // log if(theHistoList == "Tracker" ) { std::cout << "TestGeometry: MaterialBudgetAction running in Tracker Mode" << std::endl; } else if(theHistoList == "ECAL" ) { std::cout << "TestGeometry: MaterialBudgetAction running in Ecal Mode" << std::endl; } else { std::cout << "TestGeometry: MaterialBudgetAction running in General Mode" << std::endl; } // //---- Stop track when a process occurs theProcessToStop = m_Anal.getParameter<std::string>("StopAfterProcess"); std::cout << "TestGeometry: stop at process " << theProcessToStop << std::endl; //---- Save histos to ROOT file std::string saveToHistosFile = m_Anal.getParameter<std::string>("HistosFile"); if( saveToHistosFile != "None" ) { saveToHistos = true; std::cout << "TestGeometry: saving histograms to " << saveToHistosFile << std::endl; theHistoMgr = new TestHistoMgr(); // rr if(theHistoList == "Tracker" ) { theHistos = new MaterialBudgetTrackerHistos( theData, theHistoMgr, saveToHistosFile ); } else if (theHistoList == "ECAL") { theHistos = new MaterialBudgetEcalHistos( theData, theHistoMgr, saveToHistosFile ); } else { theHistos = new MaterialBudgetHistos( theData, theHistoMgr, saveToHistosFile ); } // rr } else { saveToHistos = false; } //---- Save material budget info to TEXT file std::string saveToTxtFile = m_Anal.getParameter<std::string>("TextFile"); if( saveToTxtFile != "None" ) { saveToTxt = true; std::cout << "TestGeometry: saving text info to " << saveToTxtFile << std::endl; theTxt = new MaterialBudgetTxt( theData, saveToTxtFile ); } else { saveToTxt = false; } //---- Compute all the steps even if not stored on file bool allSteps = m_Anal.getParameter<bool>("AllStepsToTree"); std::cout << "TestGeometry: all steps are computed " << allSteps << std::endl; if( allSteps ) theData->SetAllStepsToTree(); //---- Save tree to ROOT file std::string saveToTreeFile = m_Anal.getParameter<std::string>("TreeFile"); // std::string saveToTreeFile = ""; if( saveToTreeFile != "None" ) { saveToTree = true; theTree = new MaterialBudgetTree( theData, saveToTreeFile ); } else { saveToTree = false; } std::cout << "TestGeometry: saving ROOT TREE to " << saveToTreeFile << std::endl; //---- Track the first decay products of the main particle // if their kinetic energy is greater than Ekin storeDecay = m_Anal.getUntrackedParameter<bool>("storeDecay",false); Ekin = m_Anal.getUntrackedParameter<double>("EminDecayProd",1000.0); // MeV std::cout << "TestGeometry: decay products steps are stored " << storeDecay; if(storeDecay) std::cout << " if their kinetic energy is greater than " << Ekin << " MeV"; std::cout << std::endl; firstParticle = false; }
MaterialBudgetAction::~MaterialBudgetAction | ( | ) | [virtual] |
Definition at line 125 of file MaterialBudgetAction.cc.
References saveToHistos, saveToTree, saveToTxt, theData, theHistoMgr, theHistos, theTree, and theTxt.
{ if (saveToTxt) delete theTxt; if (saveToTree) delete theTree; if (saveToHistos) delete theHistos; if (theHistoMgr) delete theHistoMgr; delete theData; }
MaterialBudgetAction::MaterialBudgetAction | ( | const MaterialBudgetAction & | ) | [private] |
bool MaterialBudgetAction::CheckTouchableInSelectedVolumes | ( | const G4VTouchable * | touch | ) | [private] |
Definition at line 337 of file MaterialBudgetAction.cc.
References theVolumeList.
Referenced by update().
{ std::vector<G4String>::const_iterator ite; size_t volh = touch->GetHistoryDepth(); for( ite = theVolumeList.begin(); ite != theVolumeList.end(); ite++ ){ //- std::cout << " CheckTouchableInSelectedVolumes vol " << *ite << std::endl; for( int ii = volh; ii >= 0; ii-- ){ //- std::cout << ii << " CheckTouchableInSelectedVolumes parent " << touch->GetVolume(ii)->GetName() << std::endl; if( touch->GetVolume(ii)->GetName() == *ite ) return true; } } return false; }
void MaterialBudgetAction::endRun | ( | void | ) | [private] |
Definition at line 331 of file MaterialBudgetAction.cc.
{ }
std::string MaterialBudgetAction::getPartName | ( | G4StepPoint * | aStepPoint | ) | [private] |
Definition at line 294 of file MaterialBudgetAction.cc.
{ G4TouchableHistory* theTouchable = (G4TouchableHistory*)(aStepPoint->GetTouchable()); G4int num_levels = theTouchable->GetHistoryDepth(); // theTouchable->MoveUpHistory(num_levels-3); if( theTouchable->GetVolume() ) { return theTouchable->GetVolume(num_levels-3)->GetName(); } else { return "OutOfWorld"; } }
std::string MaterialBudgetAction::getSubDetectorName | ( | G4StepPoint * | aStepPoint | ) | [private] |
Definition at line 279 of file MaterialBudgetAction.cc.
{ G4TouchableHistory* theTouchable = (G4TouchableHistory*)(aStepPoint->GetTouchable()); G4int num_levels = theTouchable->GetHistoryDepth(); if( theTouchable->GetVolume() ) { return theTouchable->GetVolume(num_levels-1)->GetName(); } else { return "OutOfWorld"; } }
void MaterialBudgetAction::initRun | ( | ) | [private] |
const MaterialBudgetAction& MaterialBudgetAction::operator= | ( | const MaterialBudgetAction & | ) | [private] |
void MaterialBudgetAction::processEvent | ( | unsigned int | nEv | ) | [private] |
void MaterialBudgetAction::produce | ( | edm::Event & | e, |
const edm::EventSetup & | |||
) | [virtual] |
void MaterialBudgetAction::save | ( | const G4Step * | aStep | ) | [private] |
bool MaterialBudgetAction::StopAfterProcess | ( | const G4Step * | aStep | ) | [private] |
Definition at line 355 of file MaterialBudgetAction.cc.
References gather_cfg::cout, NULL, and theProcessToStop.
Referenced by update().
{ if( theProcessToStop == "" ) return false; if(aStep->GetPostStepPoint()->GetProcessDefinedStep() == NULL) return false; if( aStep->GetPostStepPoint()->GetProcessDefinedStep()->GetProcessName() == theProcessToStop ) { std::cout << " MaterialBudgetAction::StopAfterProcess " << aStep->GetPostStepPoint()->GetProcessDefinedStep()->GetProcessName() << std::endl; return true; } else { return false; } }
void MaterialBudgetAction::update | ( | const BeginOfRun * | ) | [private, virtual] |
This routine will be called when the appropriate signal arrives.
Implements Observer< const BeginOfRun * >.
Definition at line 142 of file MaterialBudgetAction.cc.
References benchmark_cfg::cerr, theProcessToStop, and theVolumeList.
{ //----- Check that selected volumes are indeed part of the geometry const G4LogicalVolumeStore* lvs = G4LogicalVolumeStore::GetInstance(); std::vector<G4LogicalVolume*>::const_iterator lvcite; std::vector<G4String>::const_iterator volcite; for( volcite = theVolumeList.begin(); volcite != theVolumeList.end(); volcite++ ){ //- std::cout << " MaterialBudgetAction checking volume " << *volcite << std::endl; bool volFound = false; for( lvcite = lvs->begin(); lvcite != lvs->end(); lvcite++ ) { if( (*lvcite)->GetName() == *volcite ) { volFound = true; break; } } if( !volFound ) { std::cerr << " @@@@@@@ WARNING at MaterialBudgetAction: selected volume not found in geometry " << *volcite << std::endl; } } //----- Check process selected is one of the available ones bool procFound = false; if( theProcessToStop == "None" ) { procFound = true; } else { G4ParticleTable * partTable = G4ParticleTable::GetParticleTable(); int siz = partTable->size(); for (int ii= 0; ii < siz; ii++) { G4ParticleDefinition * particle = partTable->GetParticle(ii); std::string particleName = particle->GetParticleName(); //--- All processes of this particle G4ProcessManager * pmanager = particle->GetProcessManager(); G4ProcessVector * pvect = pmanager->GetProcessList(); int sizproc = pvect->size(); for (int jj = 0; jj < sizproc; jj++) { if( (*pvect)[jj]->GetProcessName() == theProcessToStop ) { procFound = true; break; } } } } if( !procFound ) { std::cerr << " @@@@@@@ WARNING at MaterialBudgetAction: selected process to stop tracking not found " << theProcessToStop << std::endl; } }
void MaterialBudgetAction::update | ( | const EndOfTrack * | ) | [private, virtual] |
This routine will be called when the appropriate signal arrives.
Implements Observer< const EndOfTrack * >.
Definition at line 311 of file MaterialBudgetAction.cc.
References MaterialBudgetData::dataEndTrack(), and theData.
{ // std::cout << " EndOfTrack " << saveToHistos << std::endl; const G4Track * aTrack = (*trk)(); // recover G4 pointer if wanted // if( aTrack->GetParentID() != 0 ) return; //---------- end of track (OutOfWorld) //- std::cout << " Data End Track " << std::endl; theData->dataEndTrack( aTrack ); }
void MaterialBudgetAction::update | ( | const G4Step * | ) | [private, virtual] |
This routine will be called when the appropriate signal arrives.
Implements Observer< const G4Step * >.
Definition at line 251 of file MaterialBudgetAction.cc.
References CheckTouchableInSelectedVolumes(), MaterialBudgetData::dataPerStep(), MaterialBudgetFormat::fillPerStep(), MaterialBudgetTxt::fillPerStep(), MaterialBudgetTree::fillPerStep(), saveToHistos, saveToTree, saveToTxt, StopAfterProcess(), theData, theHistos, theTree, theTxt, and theVolumeList.
{ //----- Check it is inside one of the volumes selected if( theVolumeList.size() != 0 ) { if( !CheckTouchableInSelectedVolumes( aStep->GetTrack()->GetTouchable() ) ) return; } //---------- each step theData->dataPerStep( aStep ); //- std::cout << " aStep->GetPostStepPoint()->GetTouchable() " << aStep->GetPostStepPoint()->GetTouchable()->GetVolume() << " " << aStep->GetPreStepPoint()->GetTouchable()->GetVolume() << std::endl; if (saveToTree) theTree->fillPerStep(); if (saveToHistos) theHistos->fillPerStep(); if (saveToTxt) theTxt->fillPerStep(); //----- Stop tracking after selected process if( StopAfterProcess( aStep ) ) { G4Track* track = aStep->GetTrack(); track->SetTrackStatus( fStopAndKill ); } return; }
void MaterialBudgetAction::update | ( | const EndOfEvent * | ) | [private, virtual] |
This routine will be called when the appropriate signal arrives.
Implements Observer< const EndOfEvent * >.
Definition at line 322 of file MaterialBudgetAction.cc.
References MaterialBudgetTxt::fillEndTrack(), MaterialBudgetTree::fillEndTrack(), MaterialBudgetFormat::fillEndTrack(), saveToHistos, saveToTree, saveToTxt, theHistos, theTree, and theTxt.
{ //- std::cout << " Data End Event " << std::endl; if (saveToTree) theTree->fillEndTrack(); if (saveToHistos) theHistos->fillEndTrack(); if (saveToTxt) theTxt->fillEndTrack(); }
void MaterialBudgetAction::update | ( | const BeginOfTrack * | ) | [private, virtual] |
This routine will be called when the appropriate signal arrives.
Implements Observer< const BeginOfTrack * >.
Definition at line 196 of file MaterialBudgetAction.cc.
References gather_cfg::cout, MaterialBudgetData::dataStartTrack(), Ekin, MaterialBudgetFormat::fillStartTrack(), MaterialBudgetTxt::fillStartTrack(), MaterialBudgetTree::fillStartTrack(), firstParticle, saveToHistos, saveToTree, saveToTxt, storeDecay, theData, theHistos, theTree, and theTxt.
{ const G4Track * aTrack = (*trk)(); // recover G4 pointer if wanted // that was a temporary action while we're sorting out // about # of secondaries (produced if CutsPerRegion=true) // std::cout << "Track ID " << aTrack->GetTrackID() << " Track parent ID " << aTrack->GetParentID() << " PDG Id. = " << aTrack->GetDefinition()->GetPDGEncoding() << " Ekin = " << aTrack->GetKineticEnergy() << " MeV" << std::endl; if( aTrack->GetCreatorProcess() ) std::cout << " produced through " << aTrack->GetCreatorProcess()->GetProcessType() << std::endl; if(aTrack->GetTrackID() == 1) { firstParticle = true; } else { firstParticle = false; } if( storeDecay ) { // if record of the decay is requested if( aTrack->GetCreatorProcess() ) { if ( aTrack->GetParentID() == 1 && // aTrack->GetCreatorProcess()->GetProcessType() == 6 // && aTrack->GetKineticEnergy() > Ekin ) { // continue } else { G4Track * aTracknc = const_cast<G4Track*>(aTrack); aTracknc->SetTrackStatus(fStopAndKill); return; } } // particles produced from a decay (type=6) of the main particle (ID=1) with Kinetic Energy [MeV] > Ekin } else { // kill all the other particles (take only the main one until it disappears) if decay not stored if( aTrack->GetParentID() != 0) { G4Track * aTracknc = const_cast<G4Track*>(aTrack); aTracknc->SetTrackStatus(fStopAndKill); return; } } if(firstParticle) { //--------- start of track //- std::cout << " Data Start Track " << std::endl; theData->dataStartTrack( aTrack ); if (saveToTree) theTree->fillStartTrack(); if (saveToHistos) theHistos->fillStartTrack(); if (saveToTxt) theTxt->fillStartTrack(); } }
double MaterialBudgetAction::Ekin [private] |
Definition at line 72 of file MaterialBudgetAction.h.
Referenced by MaterialBudgetAction(), and update().
bool MaterialBudgetAction::firstParticle [private] |
Definition at line 73 of file MaterialBudgetAction.h.
Referenced by MaterialBudgetAction(), and update().
bool MaterialBudgetAction::saveToHistos [private] |
Definition at line 70 of file MaterialBudgetAction.h.
Referenced by MaterialBudgetAction(), update(), and ~MaterialBudgetAction().
bool MaterialBudgetAction::saveToTree [private] |
Definition at line 70 of file MaterialBudgetAction.h.
Referenced by MaterialBudgetAction(), update(), and ~MaterialBudgetAction().
bool MaterialBudgetAction::saveToTxt [private] |
Definition at line 70 of file MaterialBudgetAction.h.
Referenced by MaterialBudgetAction(), update(), and ~MaterialBudgetAction().
bool MaterialBudgetAction::storeDecay [private] |
Definition at line 71 of file MaterialBudgetAction.h.
Referenced by MaterialBudgetAction(), and update().
MaterialBudgetData* MaterialBudgetAction::theData [private] |
Definition at line 65 of file MaterialBudgetAction.h.
Referenced by MaterialBudgetAction(), update(), and ~MaterialBudgetAction().
std::string MaterialBudgetAction::theHistoList [private] |
Definition at line 77 of file MaterialBudgetAction.h.
Referenced by MaterialBudgetAction().
TestHistoMgr* MaterialBudgetAction::theHistoMgr [private] |
Definition at line 69 of file MaterialBudgetAction.h.
Referenced by MaterialBudgetAction(), and ~MaterialBudgetAction().
Definition at line 67 of file MaterialBudgetAction.h.
Referenced by MaterialBudgetAction(), update(), and ~MaterialBudgetAction().
G4String MaterialBudgetAction::theProcessToStop [private] |
Definition at line 76 of file MaterialBudgetAction.h.
Referenced by MaterialBudgetAction(), StopAfterProcess(), and update().
MaterialBudgetTree* MaterialBudgetAction::theTree [private] |
Definition at line 66 of file MaterialBudgetAction.h.
Referenced by MaterialBudgetAction(), update(), and ~MaterialBudgetAction().
MaterialBudgetTxt* MaterialBudgetAction::theTxt [private] |
Definition at line 68 of file MaterialBudgetAction.h.
Referenced by MaterialBudgetAction(), update(), and ~MaterialBudgetAction().
std::vector<G4String> MaterialBudgetAction::theVolumeList [private] |
Definition at line 75 of file MaterialBudgetAction.h.
Referenced by CheckTouchableInSelectedVolumes(), MaterialBudgetAction(), and update().