File indexing completed on 2024-04-06 12:30:14
0001 #include "SimG4Core/Application/interface/CMSSimEventManager.h"
0002 #include "SimG4Core/Application/interface/RunAction.h"
0003 #include "SimG4Core/Application/interface/EventAction.h"
0004 #include "SimG4Core/Application/interface/StackingAction.h"
0005 #include "SimG4Core/Application/interface/TrackingAction.h"
0006
0007 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0008 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0009
0010 #include "G4Track.hh"
0011 #include "G4Event.hh"
0012 #include "G4TrajectoryContainer.hh"
0013 #include "G4PrimaryTransformer.hh"
0014 #include "G4TrackingManager.hh"
0015 #include "G4TrackStatus.hh"
0016 #include "G4UserSteppingAction.hh"
0017
0018 #include "G4SDManager.hh"
0019 #include "G4StateManager.hh"
0020 #include "G4ApplicationState.hh"
0021 #include "G4TransportationManager.hh"
0022 #include "G4Navigator.hh"
0023
0024 CMSSimEventManager::CMSSimEventManager(const edm::ParameterSet& iConfig)
0025 : verbose_(iConfig.getParameter<int>("EventVerbose")) {
0026 m_stateManager = G4StateManager::GetStateManager();
0027 m_defTrackManager = new G4TrackingManager();
0028 m_primaryTransformer = new G4PrimaryTransformer();
0029 m_sdManager = G4SDManager::GetSDMpointerIfExist();
0030 m_navigator = G4TransportationManager::GetTransportationManager()->GetNavigatorForTracking();
0031 m_tracks.reserve(1000);
0032 }
0033
0034 CMSSimEventManager::~CMSSimEventManager() {
0035 delete m_primaryTransformer;
0036 delete m_defTrackManager;
0037 delete m_eventAction;
0038 delete m_stackingAction;
0039 }
0040
0041 void CMSSimEventManager::ProcessOneEvent(G4Event* anEvent) {
0042 trackID_ = 0;
0043 m_stateManager->SetNewState(G4State_EventProc);
0044
0045
0046
0047 G4ThreeVector center(0, 0, 0);
0048 m_navigator->LocateGlobalPointAndSetup(center, nullptr, false);
0049
0050 G4Track* track = nullptr;
0051
0052 anEvent->SetHCofThisEvent(m_sdManager->PrepareNewEvent());
0053 m_sdManager->PrepareNewEvent();
0054 m_eventAction->BeginOfEventAction(anEvent);
0055
0056
0057 StackTracks(m_primaryTransformer->GimmePrimaries(anEvent), true);
0058
0059 if (0 < verbose_) {
0060 edm::LogVerbatim("CMSSimEventManager::ProcessOneEvent")
0061 << "### Event #" << anEvent->GetEventID() << " " << trackID_ << " primary tracks";
0062 }
0063
0064
0065 do {
0066 track = m_tracks.back();
0067 m_tracks.pop_back();
0068 m_defTrackManager->ProcessOneTrack(track);
0069 G4TrackVector* secondaries = m_defTrackManager->GimmeSecondaries();
0070 StackTracks(secondaries, false);
0071 delete track;
0072 } while (!m_tracks.empty());
0073
0074 m_sdManager->TerminateCurrentEvent(anEvent->GetHCofThisEvent());
0075 m_eventAction->EndOfEventAction(anEvent);
0076 m_stateManager->SetNewState(G4State_GeomClosed);
0077 }
0078
0079 void CMSSimEventManager::StackTracks(G4TrackVector* trackVector, bool IDisSet) {
0080 if (trackVector == nullptr || trackVector->empty())
0081 return;
0082 for (auto& newTrack : *trackVector) {
0083 ++trackID_;
0084 if (!IDisSet) {
0085 newTrack->SetTrackID(trackID_);
0086 auto pp = newTrack->GetDynamicParticle()->GetPrimaryParticle();
0087 if (pp != nullptr) {
0088 pp->SetTrackID(trackID_);
0089 }
0090 }
0091 if (m_stackingAction->ClassifyNewTrack(newTrack) == fKill) {
0092 delete newTrack;
0093 } else {
0094 newTrack->SetOriginTouchableHandle(newTrack->GetTouchableHandle());
0095 m_tracks.push_back(newTrack);
0096 }
0097 }
0098 trackVector->clear();
0099 }
0100
0101 void CMSSimEventManager::SetUserAction(EventAction* ptr) { m_eventAction = ptr; }
0102
0103 void CMSSimEventManager::SetUserAction(StackingAction* ptr) { m_stackingAction = ptr; }
0104
0105 void CMSSimEventManager::SetUserAction(TrackingAction* ptr) {
0106 m_trackingAction = ptr;
0107 m_defTrackManager->SetUserAction((G4UserTrackingAction*)ptr);
0108 }
0109
0110 void CMSSimEventManager::SetUserAction(G4UserSteppingAction* ptr) { m_defTrackManager->SetUserAction(ptr); }