Back to home page

Project CMSSW displayed by LXR

 
 

    


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   // Resetting Navigator has been moved to CMSSimEventManager,
0046   // so that resetting is now done for every event.
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   // Fill primary tracks
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   // Loop over main stack of tracks
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); }