Go to the documentation of this file.00001
00002 #include "Validation/Geometry/interface/MaterialBudgetAction.h"
00003 #include "Validation/Geometry/interface/MaterialBudgetData.h"
00004
00005 #include "FWCore/Framework/interface/Event.h"
00006 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00007
00008 #include "SimG4Core/Notification/interface/BeginOfRun.h"
00009 #include "SimG4Core/Notification/interface/BeginOfTrack.h"
00010 #include "SimG4Core/Notification/interface/EndOfTrack.h"
00011 #include "SimG4Core/Notification/interface/EndOfEvent.h"
00012
00013 #include "G4Step.hh"
00014 #include "G4Track.hh"
00015 #include "G4UImanager.hh"
00016 #include "G4UIterminal.hh"
00017 #include "G4UItcsh.hh"
00018 #include "G4LogicalVolumeStore.hh"
00019 #include "G4TouchableHistory.hh"
00020 #include "G4VPhysicalVolume.hh"
00021 #include "G4VProcess.hh"
00022 #include "G4ParticleTable.hh"
00023 #include "G4ParticleDefinition.hh"
00024 #include "G4ProcessManager.hh"
00025 #include "G4TransportationManager.hh"
00026
00027 #include <iostream>
00028
00029
00030
00031 MaterialBudgetAction::MaterialBudgetAction(const edm::ParameterSet& iPSet) :
00032 theHistoMgr(0)
00033 {
00034 theData = new MaterialBudgetData;
00035
00036 edm::ParameterSet m_Anal = iPSet.getParameter<edm::ParameterSet>("MaterialBudgetAction");
00037
00038
00039 std::string theHistoList = m_Anal.getParameter<std::string>("HistogramList");
00040 std::vector<std::string> volList = m_Anal.getParameter< std::vector<std::string> >("SelectedVolumes");
00041 std::vector<std::string>::const_iterator ite;
00042 std::cout << "TestGeometry: List of the selected volumes: " << std::endl;
00043 for( ite = volList.begin(); ite != volList.end(); ite++ ){
00044 if( (*ite) != "None" ) {
00045 theVolumeList.push_back( *ite );
00046 std::cout << (*ite) << std::endl;
00047 }
00048 }
00049
00050 if(theHistoList == "Tracker" ) {
00051 std::cout << "TestGeometry: MaterialBudgetAction running in Tracker Mode" << std::endl;
00052 }
00053 else if(theHistoList == "ECAL" ) {
00054 std::cout << "TestGeometry: MaterialBudgetAction running in Ecal Mode" << std::endl;
00055 }
00056 else {
00057 std::cout << "TestGeometry: MaterialBudgetAction running in General Mode" << std::endl;
00058 }
00059
00060
00061
00062 theProcessToStop = m_Anal.getParameter<std::string>("StopAfterProcess");
00063 std::cout << "TestGeometry: stop at process " << theProcessToStop << std::endl;
00064
00065
00066 std::string saveToHistosFile = m_Anal.getParameter<std::string>("HistosFile");
00067 if( saveToHistosFile != "None" ) {
00068 saveToHistos = true;
00069 std::cout << "TestGeometry: saving histograms to " << saveToHistosFile << std::endl;
00070 theHistoMgr = new TestHistoMgr();
00071
00072
00073 if(theHistoList == "Tracker" ) {
00074 theHistos = new MaterialBudgetTrackerHistos( theData, theHistoMgr, saveToHistosFile );
00075 }
00076 else if (theHistoList == "ECAL") {
00077 theHistos = new MaterialBudgetEcalHistos( theData, theHistoMgr, saveToHistosFile );
00078 }
00079 else {
00080 theHistos = new MaterialBudgetHistos( theData, theHistoMgr, saveToHistosFile );
00081 }
00082
00083 } else {
00084 saveToHistos = false;
00085 }
00086
00087
00088 std::string saveToTxtFile = m_Anal.getParameter<std::string>("TextFile");
00089 if( saveToTxtFile != "None" ) {
00090 saveToTxt = true;
00091 std::cout << "TestGeometry: saving text info to " << saveToTxtFile << std::endl;
00092 theTxt = new MaterialBudgetTxt( theData, saveToTxtFile );
00093 } else {
00094 saveToTxt = false;
00095 }
00096
00097
00098 bool allSteps = m_Anal.getParameter<bool>("AllStepsToTree");
00099 std::cout << "TestGeometry: all steps are computed " << allSteps << std::endl;
00100 if( allSteps ) theData->SetAllStepsToTree();
00101
00102
00103 std::string saveToTreeFile = m_Anal.getParameter<std::string>("TreeFile");
00104
00105 if( saveToTreeFile != "None" ) {
00106 saveToTree = true;
00107 theTree = new MaterialBudgetTree( theData, saveToTreeFile );
00108 } else {
00109 saveToTree = false;
00110 }
00111 std::cout << "TestGeometry: saving ROOT TREE to " << saveToTreeFile << std::endl;
00112
00113
00114
00115 storeDecay = m_Anal.getUntrackedParameter<bool>("storeDecay",false);
00116 Ekin = m_Anal.getUntrackedParameter<double>("EminDecayProd",1000.0);
00117 std::cout << "TestGeometry: decay products steps are stored " << storeDecay;
00118 if(storeDecay) std::cout << " if their kinetic energy is greater than " << Ekin << " MeV";
00119 std::cout << std::endl;
00120 firstParticle = false;
00121 }
00122
00123
00124
00125 MaterialBudgetAction::~MaterialBudgetAction()
00126 {
00127 if (saveToTxt) delete theTxt;
00128 if (saveToTree) delete theTree;
00129 if (saveToHistos) delete theHistos;
00130 if (theHistoMgr) delete theHistoMgr;
00131 delete theData;
00132 }
00133
00134
00135
00136 void MaterialBudgetAction::produce(edm::Event& e, const edm::EventSetup&)
00137 {
00138 }
00139
00140
00141
00142 void MaterialBudgetAction::update(const BeginOfRun* trk)
00143 {
00144
00145 const G4LogicalVolumeStore* lvs = G4LogicalVolumeStore::GetInstance();
00146 std::vector<G4LogicalVolume*>::const_iterator lvcite;
00147 std::vector<G4String>::const_iterator volcite;
00148
00149 for( volcite = theVolumeList.begin(); volcite != theVolumeList.end(); volcite++ ){
00150
00151 bool volFound = false;
00152 for( lvcite = lvs->begin(); lvcite != lvs->end(); lvcite++ ) {
00153 if( (*lvcite)->GetName() == *volcite ) {
00154 volFound = true;
00155 break;
00156 }
00157 }
00158 if( !volFound ) {
00159 std::cerr << " @@@@@@@ WARNING at MaterialBudgetAction: selected volume not found in geometry " << *volcite << std::endl;
00160 }
00161 }
00162
00163
00164
00165 bool procFound = false;
00166 if( theProcessToStop == "None" ) {
00167 procFound = true;
00168 } else {
00169 G4ParticleTable * partTable = G4ParticleTable::GetParticleTable();
00170 int siz = partTable->size();
00171 for (int ii= 0; ii < siz; ii++) {
00172 G4ParticleDefinition * particle = partTable->GetParticle(ii);
00173 std::string particleName = particle->GetParticleName();
00174
00175
00176 G4ProcessManager * pmanager = particle->GetProcessManager();
00177 G4ProcessVector * pvect = pmanager->GetProcessList();
00178 int sizproc = pvect->size();
00179 for (int jj = 0; jj < sizproc; jj++) {
00180 if( (*pvect)[jj]->GetProcessName() == theProcessToStop ) {
00181 procFound = true;
00182 break;
00183 }
00184 }
00185 }
00186 }
00187
00188 if( !procFound ) {
00189 std::cerr << " @@@@@@@ WARNING at MaterialBudgetAction: selected process to stop tracking not found " << theProcessToStop << std::endl;
00190 }
00191
00192 }
00193
00194
00195
00196 void MaterialBudgetAction::update(const BeginOfTrack* trk)
00197 {
00198 const G4Track * aTrack = (*trk)();
00199
00200
00201
00202
00203 std::cout << "Track ID " << aTrack->GetTrackID() << " Track parent ID " << aTrack->GetParentID()
00204 << " PDG Id. = " << aTrack->GetDefinition()->GetPDGEncoding()
00205 << " Ekin = " << aTrack->GetKineticEnergy() << " MeV" << std::endl;
00206 if( aTrack->GetCreatorProcess() ) std::cout << " produced through " << aTrack->GetCreatorProcess()->GetProcessType() << std::endl;
00207
00208 if(aTrack->GetTrackID() == 1) {
00209 firstParticle = true;
00210 } else {
00211 firstParticle = false;
00212 }
00213
00214 if( storeDecay ) {
00215 if( aTrack->GetCreatorProcess() ) {
00216 if (
00217 aTrack->GetParentID() == 1
00218 &&
00219
00220
00221 aTrack->GetKineticEnergy() > Ekin
00222 ) {
00223
00224 } else {
00225 G4Track * aTracknc = const_cast<G4Track*>(aTrack);
00226 aTracknc->SetTrackStatus(fStopAndKill);
00227 return;
00228 }
00229 }
00230 } else {
00231 if( aTrack->GetParentID() != 0) {
00232 G4Track * aTracknc = const_cast<G4Track*>(aTrack);
00233 aTracknc->SetTrackStatus(fStopAndKill);
00234 return;
00235 }
00236 }
00237
00238
00239 if(firstParticle) {
00240
00241
00242 theData->dataStartTrack( aTrack );
00243 if (saveToTree) theTree->fillStartTrack();
00244 if (saveToHistos) theHistos->fillStartTrack();
00245 if (saveToTxt) theTxt->fillStartTrack();
00246 }
00247 }
00248
00249
00250
00251 void MaterialBudgetAction::update(const G4Step* aStep)
00252 {
00253
00254
00255 if( theVolumeList.size() != 0 ) {
00256 if( !CheckTouchableInSelectedVolumes( aStep->GetTrack()->GetTouchable() ) ) return;
00257 }
00258
00259
00260 theData->dataPerStep( aStep );
00261
00262 if (saveToTree) theTree->fillPerStep();
00263 if (saveToHistos) theHistos->fillPerStep();
00264 if (saveToTxt) theTxt->fillPerStep();
00265
00266
00267
00268 if( StopAfterProcess( aStep ) ) {
00269 G4Track* track = aStep->GetTrack();
00270 track->SetTrackStatus( fStopAndKill );
00271 }
00272
00273 return;
00274
00275 }
00276
00277
00278
00279 std::string MaterialBudgetAction::getSubDetectorName( G4StepPoint* aStepPoint )
00280 {
00281 G4TouchableHistory* theTouchable
00282 = (G4TouchableHistory*)(aStepPoint->GetTouchable());
00283 G4int num_levels = theTouchable->GetHistoryDepth();
00284
00285 if( theTouchable->GetVolume() ) {
00286 return theTouchable->GetVolume(num_levels-1)->GetName();
00287 } else {
00288 return "OutOfWorld";
00289 }
00290 }
00291
00292
00293
00294 std::string MaterialBudgetAction::getPartName( G4StepPoint* aStepPoint )
00295 {
00296 G4TouchableHistory* theTouchable
00297 = (G4TouchableHistory*)(aStepPoint->GetTouchable());
00298 G4int num_levels = theTouchable->GetHistoryDepth();
00299
00300
00301 if( theTouchable->GetVolume() ) {
00302 return theTouchable->GetVolume(num_levels-3)->GetName();
00303 } else {
00304 return "OutOfWorld";
00305 }
00306 }
00307
00308
00309
00310
00311 void MaterialBudgetAction::update(const EndOfTrack* trk)
00312 {
00313
00314 const G4Track * aTrack = (*trk)();
00315
00316
00317
00318
00319 theData->dataEndTrack( aTrack );
00320 }
00321
00322 void MaterialBudgetAction::update(const EndOfEvent* evt)
00323 {
00324
00325 if (saveToTree) theTree->fillEndTrack();
00326 if (saveToHistos) theHistos->fillEndTrack();
00327 if (saveToTxt) theTxt->fillEndTrack();
00328 }
00329
00330
00331 void MaterialBudgetAction::endRun()
00332 {
00333 }
00334
00335
00336
00337 bool MaterialBudgetAction::CheckTouchableInSelectedVolumes( const G4VTouchable* touch )
00338 {
00339 std::vector<G4String>::const_iterator ite;
00340 size_t volh = touch->GetHistoryDepth();
00341 for( ite = theVolumeList.begin(); ite != theVolumeList.end(); ite++ ){
00342
00343 for( int ii = volh; ii >= 0; ii-- ){
00344
00345 if( touch->GetVolume(ii)->GetName() == *ite ) return true;
00346 }
00347 }
00348
00349 return false;
00350
00351 }
00352
00353
00354
00355 bool MaterialBudgetAction::StopAfterProcess( const G4Step* aStep )
00356 {
00357 if( theProcessToStop == "" ) return false;
00358
00359 if(aStep->GetPostStepPoint()->GetProcessDefinedStep() == NULL) return false;
00360 if( aStep->GetPostStepPoint()->GetProcessDefinedStep()->GetProcessName() == theProcessToStop ) {
00361 std::cout << " MaterialBudgetAction::StopAfterProcess " << aStep->GetPostStepPoint()->GetProcessDefinedStep()->GetProcessName() << std::endl;
00362 return true;
00363 } else {
00364 return false;
00365 }
00366 }