Go to the documentation of this file.00001
00002
00003
00004
00005
00007
00008 #include "SimG4Core/TrackingVerbose/interface/TrackingVerboseAction.h"
00009
00010 #include "SimG4Core/Notification/interface/BeginOfRun.h"
00011 #include "SimG4Core/Notification/interface/BeginOfEvent.h"
00012 #include "SimG4Core/Notification/interface/BeginOfTrack.h"
00013 #include "SimG4Core/Notification/interface/EndOfTrack.h"
00014 #include "SimG4Core/Notification/interface/TrackInformation.h"
00015 #include "SimG4Core/Application/interface/TrackingAction.h"
00016
00017 #include "G4Track.hh"
00018 #include "G4Event.hh"
00019 #include "G4ios.hh"
00020 #include "G4TrackingManager.hh"
00021 #include "G4EventManager.hh"
00022 #include "G4VSteppingVerbose.hh"
00023 #include "G4UnitsTable.hh"
00024
00025 #include<algorithm>
00026
00027 TrackingVerboseAction::TrackingVerboseAction(edm::ParameterSet const & p) :
00028 theTrackingManager(0), fVerbose(0) {
00029
00030 fLarge = int(1E10);
00031 fDEBUG = p.getUntrackedParameter<bool>("DEBUG",false);
00032 fHighEtPhotons = p.getUntrackedParameter<bool>("CheckForHighEtPhotons",false);
00033 fG4Verbose = p.getUntrackedParameter<bool>("G4Verbose",false);
00034
00035
00036 fTVEventMin = p.getUntrackedParameter<int>("EventMin",0);
00037 fTVEventMax = p.getUntrackedParameter<int>("EventMax",fLarge);
00038 fTVEventStep = p.getUntrackedParameter<int>("EventStep",1);
00039
00040
00041 fTVTrackMin = p.getUntrackedParameter<int>("TrackMin",0);
00042 fTVTrackMax = p.getUntrackedParameter<int>("TrackMax",fLarge);
00043 fTVTrackStep = p.getUntrackedParameter<int>("TrackStep",1);
00044
00045
00046 fVerboseLevel = p.getUntrackedParameter<int>("VerboseLevel",1);
00047 fPdgIds = p.getUntrackedParameter<std::vector<int> >("PDGids");
00048 if (fDEBUG) {
00049 G4cout << "TV: fTVTrackMin " << fTVTrackMin
00050 << " fTVTrackMax " << fTVTrackMax
00051 << " fTVTrackStep " << fTVTrackStep
00052 << " fTVEventMin " << fTVEventMin
00053 << " fTVEventMax " << fTVEventMax
00054 << " fTVEventStep " << fTVEventStep
00055 << " fVerboseLevel " << fVerboseLevel
00056 << " fG4Verbose " << fG4Verbose
00057 << " PDGIds " << fPdgIds.size() << G4endl;
00058 for (unsigned int ii=0; ii<fPdgIds.size(); ++ii)
00059 G4cout << "TV: PDGId[" << ii << "] = " << fPdgIds[ii] << G4endl;
00060 }
00061
00062
00063 fTrackingVerboseON = false;
00064 fTkVerbThisEventON = false;
00065
00066 G4cout << " TrackingVerbose constructed " << G4endl;
00067 }
00068
00069 TrackingVerboseAction::~TrackingVerboseAction() {}
00070
00071 void TrackingVerboseAction::update(const BeginOfRun * run) {
00072 TrackingAction * ta =
00073 dynamic_cast<TrackingAction*>(G4EventManager::GetEventManager()->GetUserTrackingAction());
00074 theTrackingManager = ta->getTrackManager();
00075 fVerbose = G4VSteppingVerbose::GetInstance();
00076 if (fDEBUG)
00077 G4cout << " TV: Get the Tracking Manager: " << theTrackingManager
00078 << " and the SteppingVerbose: " << fVerbose << G4endl;
00079 }
00080
00081 void TrackingVerboseAction::update(const BeginOfEvent * evt) {
00082 if (evt==0) return;
00083 const G4Event * anEvent = (*evt)();
00084 if (anEvent==0) return;
00085
00086
00087 int eventNo = anEvent->GetEventID();
00088 if (fDEBUG) G4cout << "TV: trackID: NEW EVENT " << eventNo << G4endl;
00089
00090 fTkVerbThisEventON = false;
00091
00092 if (eventNo >= fTVEventMin && eventNo <= fTVEventMax) {
00093 if ((eventNo-fTVEventMin) % fTVEventStep == 0) fTkVerbThisEventON = true;
00094 }
00095
00096 if (fDEBUG)
00097 G4cout << " TV: fTkVerbThisEventON " << fTkVerbThisEventON
00098 << " fTrackingVerboseON " << fTrackingVerboseON
00099 << " fTVEventMin " << fTVEventMin << " fTVEventMax " << fTVEventMax << G4endl;
00100
00101 if ((fTkVerbThisEventON) && (!fTrackingVerboseON)) {
00102 if (fTVTrackMin == 0 && fTVTrackMax == fLarge && fTVTrackStep != 1) {
00103 setTrackingVerbose(fVerboseLevel);
00104 fTrackingVerboseON = true;
00105 if (fDEBUG) G4cout << "TV: VERBOSEet1 " << eventNo << G4endl;
00106 }
00107 } else if ((!fTkVerbThisEventON) && (fTrackingVerboseON) ) {
00108 setTrackingVerbose(0);
00109 fTrackingVerboseON = false;
00110 if (fDEBUG) G4cout << "TV: VERBOSEet0 " << eventNo << G4endl;
00111 }
00112
00113 }
00114
00115 void TrackingVerboseAction::update(const BeginOfTrack * trk) {
00116 const G4Track * aTrack = (*trk)();
00117
00118
00119
00120
00121 double tkP = aTrack->GetMomentum().mag();
00122 double tkPx = aTrack->GetMomentum().x();
00123 double tkPy = aTrack->GetMomentum().y();
00124 double tkPz = aTrack->GetMomentum().z();
00125
00126 double tvtx = aTrack->GetVertexPosition().x();
00127 double tvty = aTrack->GetVertexPosition().y();
00128 double tvtz = aTrack->GetVertexPosition().z();
00129
00130 double g4t_phi=atan2(tkPy,tkPx);
00131
00132 double drpart=sqrt(tkPx*tkPx + tkPy*tkPy);
00133
00134 double mythetapart=acos(tkPz/sqrt(drpart*drpart+tkPz*tkPz));
00135
00136 double g4t_eta=-log(tan(mythetapart/2.));
00137 G4int MytrackNo = aTrack->GetTrackID();
00138
00139 if (fHighEtPhotons) {
00140 if (aTrack->GetDefinition()->GetParticleName() == "gamma" && aTrack->GetParentID() !=0) {
00141 if((tkPx*tkPx + tkPy*tkPy + tkPz*tkPz)>1000.0*1000.0 &&
00142 aTrack->GetCreatorProcess()->GetProcessName() == "LCapture") {
00143 G4cout << "MY NEW GAMMA " << G4endl;
00144 G4cout << "**********************************************************************" << G4endl;
00145 G4cout << "MY NEW TRACK ID = " << MytrackNo << "("
00146 << aTrack->GetDefinition()->GetParticleName()
00147 <<")"<< " PARENT ="<< aTrack->GetParentID() << G4endl;
00148 G4cout << "Primary particle: "
00149 << aTrack->GetDynamicParticle()->GetPrimaryParticle() << G4endl;
00150 G4cout << "Process type: " << aTrack->GetCreatorProcess()->GetProcessType()
00151 << " Process name: "
00152 << aTrack->GetCreatorProcess()->GetProcessName() << G4endl;
00153 G4cout << "ToT E = " << aTrack->GetTotalEnergy()
00154 << " KineE = " << aTrack->GetKineticEnergy()
00155 << " Tot P = " << tkP << " Pt = " << sqrt(tkPx*tkPx + tkPy*tkPy)
00156 << " VTX=(" << tvtx << "," << tvty << "," << tvtz << ")" << G4endl;
00157 if (aTrack->GetKineticEnergy() > 1.*GeV
00158 && aTrack->GetCreatorProcess()->GetProcessName() != "LCapture")
00159 G4cout << " KineE > 1 GeV !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << G4endl;
00160 const G4VTouchable* touchable=aTrack->GetTouchable();
00161 if (touchable!=0 && touchable->GetVolume()!=0 &&
00162 touchable->GetVolume()->GetLogicalVolume()!=0) {
00163 G4Material* material=touchable->GetVolume()->GetLogicalVolume()->GetMaterial();
00164 G4cout << "G4LCapture Gamma E(GeV) "
00165 << aTrack->GetTotalEnergy()/GeV << " "
00166 << material->GetName()<< " "
00167 << touchable->GetVolume()->GetName() << G4endl;
00168 G4cout << "G4LCapture Gamma position(m): "
00169 << aTrack->GetPosition()/m << G4endl;
00170 G4cout << "G4LCapture created Gamma direction "
00171 << aTrack->GetMomentumDirection() << G4endl;
00172 G4cout << "G4LCapture gamma (eta,phi) = "
00173 << "(" << g4t_eta << "," << g4t_phi << ")" << G4endl;
00174 }
00175 aTrack->GetUserInformation()->Print();
00176 G4cout << "**********************************************************************" << G4endl;
00177 }
00178 }
00179
00180 if (aTrack->GetDefinition()->GetParticleName() == "gamma") {
00181 const G4VProcess * proc = aTrack->GetCreatorProcess();
00182 double Tgamma = aTrack->GetKineticEnergy();
00183 std::string ProcName;
00184 const std::string nullstr ("Null_prc");
00185 if (proc) ProcName = proc->GetProcessName();
00186 else ProcName = nullstr;
00187 if (Tgamma > 2.5*GeV ) {
00188 std::string volumeName("_Unknown_Vol_");
00189 std::string materialName("_Unknown_Mat_");
00190 G4Material * material = 0;
00191 G4VPhysicalVolume * pvolume = 0;
00192 G4LogicalVolume * lvolume = 0;
00193 const G4VTouchable * touchable = aTrack->GetTouchable();
00194 if (touchable) pvolume = touchable->GetVolume();
00195 if (pvolume) {
00196 volumeName = pvolume->GetName();
00197 lvolume = pvolume->GetLogicalVolume();
00198 }
00199 if (lvolume) material = lvolume->GetMaterial();
00200 if (material) materialName = material->GetName();
00201 G4cout << "**** ALL photons > 2.5 GeV ****" << G4endl;
00202 G4cout << ProcName << "**** ALL photons: gamma E(GeV) "
00203 << aTrack->GetTotalEnergy()/GeV << " "
00204 << materialName << " " << volumeName << G4endl;
00205 G4cout << ProcName << "**** ALL photons: gamma position(m): "
00206 << aTrack->GetPosition()/m << G4endl;
00207 G4cout << ProcName << "**** ALL photons: gamma direction "
00208 << aTrack->GetMomentumDirection() << G4endl;
00209 G4cout << "**********************************************************************" << G4endl;
00210 }
00211 }
00212 }
00213
00214
00215
00216 if (fTkVerbThisEventON) {
00217 bool trackingVerboseThisTrack = checkTrackingVerbose(aTrack);
00218
00219
00220 if ((trackingVerboseThisTrack) && (!fTrackingVerboseON) ) {
00221 setTrackingVerbose(fVerboseLevel);
00222 fTrackingVerboseON = true;
00223 if (fDEBUG) G4cout << "TV: VERBOSEtt1 " << aTrack->GetTrackID()
00224 << G4endl;
00225 printTrackInfo(aTrack);
00226 } else if ((!trackingVerboseThisTrack) && ( fTrackingVerboseON )) {
00227 setTrackingVerbose(0);
00228 fTrackingVerboseON = false;
00229 if (fDEBUG) G4cout << "TV: VERBOSEtt0 " << aTrack->GetTrackID()
00230 << G4endl;
00231 }
00232 }
00233 }
00234
00235 void TrackingVerboseAction::update(const EndOfTrack * trk) {
00236 const G4Track * aTrack = (*trk)();
00237 if (fTkVerbThisEventON) {
00238 bool trackingVerboseThisTrack = checkTrackingVerbose(aTrack);
00239 if ((trackingVerboseThisTrack) && (fTrackingVerboseON ) &&
00240 (fTVTrackMax < fLarge || fTVTrackStep != 1)) {
00241 setTrackingVerbose(0);
00242 fTrackingVerboseON = false;
00243 if (fDEBUG) G4cout << "TV: VERBOSEtt0 " << aTrack->GetTrackID()
00244 << G4endl;
00245 }
00246 }
00247 }
00248
00249 void TrackingVerboseAction::update(const G4Step* fStep) {
00250
00251 if ((fG4Verbose) && (fTrackingVerboseON)) {
00252 G4Track* fTrack = fStep->GetTrack();
00253 G4cout << std::setw( 5) << fTrack->GetCurrentStepNumber() << " "
00254 << std::setw( 8) << G4BestUnit(fTrack->GetPosition().x() , "Length") << " "
00255 << std::setw( 8) << G4BestUnit(fTrack->GetPosition().y() , "Length") << " "
00256 << std::setw( 8) << G4BestUnit(fTrack->GetPosition().z() , "Length") << " "
00257 << std::setw( 9) << G4BestUnit(fTrack->GetKineticEnergy() , "Energy") << " "
00258 << std::setw( 8) << G4BestUnit(fStep->GetTotalEnergyDeposit(), "Energy") << " "
00259 << std::setw( 8) << G4BestUnit(fStep->GetStepLength() , "Length") << " "
00260 << std::setw( 9) << G4BestUnit(fTrack->GetTrackLength() , "Length") << " "
00261 << std::setw( 9) << G4BestUnit(fTrack->GetGlobalTime(), "Time") << " ";
00262
00263
00264 if( fTrack->GetNextVolume() != 0 ) {
00265 G4cout << std::setw(11) << fTrack->GetNextVolume()->GetName() << " ";
00266 } else {
00267 G4cout << std::setw(11) << "OutOfWorld" << " ";
00268 }
00269 if(fStep->GetPostStepPoint()->GetProcessDefinedStep() != NULL){
00270 G4cout << fStep->GetPostStepPoint()->GetProcessDefinedStep()->GetProcessName();
00271 } else {
00272 G4cout << "User Limit";
00273 }
00274 G4cout << G4endl;
00275 }
00276 }
00277
00278 void TrackingVerboseAction::setTrackingVerbose(int verblev) {
00279 if (fDEBUG) G4cout << " setting verbose level " << verblev << G4endl;
00280 if (theTrackingManager!=0) theTrackingManager->SetVerboseLevel(verblev);
00281 }
00282
00283 bool TrackingVerboseAction::checkTrackingVerbose(const G4Track* aTrack) {
00284 int trackNo = aTrack->GetTrackID();
00285 bool trackingVerboseThisTrack = false;
00286
00287 if (trackNo >= fTVTrackMin && trackNo <= fTVTrackMax) {
00288 if ((trackNo-fTVTrackMin) % fTVTrackStep == 0) trackingVerboseThisTrack = true;
00289 }
00290 if (trackingVerboseThisTrack && (fPdgIds.size()>0)) {
00291 int pdgId = aTrack->GetDefinition()->GetPDGEncoding();
00292 if (std::count(fPdgIds.begin(),fPdgIds.end(),pdgId) == 0) trackingVerboseThisTrack = false;
00293 }
00294 return trackingVerboseThisTrack;
00295 }
00296
00297 void TrackingVerboseAction::printTrackInfo(const G4Track* aTrack) {
00298 G4cout << G4endl
00299 << "*******************************************************"
00300 << "**************************************************" << G4endl
00301 << "* G4Track Information: "
00302 << " Particle = " << aTrack->GetDefinition()->GetParticleName()
00303 << ","
00304 << " Track ID = " << aTrack->GetTrackID()
00305 << ","
00306 << " Parent ID = " << aTrack->GetParentID() << G4endl
00307 << "*******************************************************"
00308 << "**************************************************"
00309 << G4endl << G4endl;
00310 if (fVerbose) fVerbose->TrackingStarted();
00311 }