00001 #include "BesEventAction.hh" 00002 #include "G4Event.hh" 00003 #include "G4TrajectoryContainer.hh" 00004 #include "G4Trajectory.hh" 00005 #include "G4VVisManager.hh" 00006 00007 #include "G4DigiManager.hh" 00008 #include "BesMdcDigitizer.hh" 00009 #include "BesTofDigitizer.hh" 00010 #include "BesMucDigitizer.hh" 00011 #include "BesEmcDigitizer.hh" 00012 00013 #include "BesRunAction.hh" 00014 #include "G4RunManager.hh" 00015 #include "BesAsciiIO.hh" 00016 #include "BesMdcHit.hh" 00017 #include "BesRootIO.hh" 00018 #include "BesTDSWriter.hh" 00019 #include "BesTuningIO.hh" 00020 00021 #include "BesSensitiveManager.hh" 00022 #include "BesTruthTrack.hh" 00023 #include "BesTruthVertex.hh" 00024 #include <fstream> 00025 00026 #include "GaudiKernel/SvcFactory.h" 00027 #include "GaudiKernel/ISvcLocator.h" 00028 #include "GaudiKernel/SmartDataPtr.h" 00029 #include "GaudiKernel/Bootstrap.h" 00030 00031 using namespace std; 00032 00033 #include "ReadBoostRoot.hh" 00034 #include "G4UImanager.hh" 00035 00036 BesEventAction::BesEventAction(BesRunAction* runAction) 00037 :m_runAction(runAction) 00038 { 00039 ISvcLocator* svcLocator = Gaudi::svcLocator(); 00040 IRealizationSvc *tmpReal; 00041 StatusCode sc = svcLocator->service("RealizationSvc",tmpReal); 00042 if (!sc.isSuccess()) 00043 { 00044 std::cout << " Could not initialize Realization Service in BesEventAction" << std::endl; 00045 } else { 00046 m_RealizationSvc=dynamic_cast<RealizationSvc*>(tmpReal); 00047 } 00048 00049 m_DM = G4DigiManager::GetDMpointer(); 00050 00051 if (ReadBoostRoot::GetMdc()) 00052 { 00053 BesMdcDigitizer* mdcDM = new BesMdcDigitizer("BesMdcDigitizer"); 00054 m_DM->AddNewModule(mdcDM); 00055 } 00056 if (ReadBoostRoot::GetTof()) 00057 { 00058 BesTofDigitizer* tofDM = new BesTofDigitizer("BesTofDigitizer"); 00059 m_DM->AddNewModule(tofDM); 00060 } 00061 if (ReadBoostRoot::GetEmc()) 00062 { 00063 BesEmcDigitizer* emcDM = new BesEmcDigitizer("BesEmcDigitizer"); 00064 m_DM->AddNewModule(emcDM); 00065 } 00066 if (ReadBoostRoot::GetMuc()) 00067 { 00068 BesMucDigitizer* mucDM = new BesMucDigitizer("BesMucDigitizer"); 00069 m_DM->AddNewModule(mucDM); 00070 } 00071 00072 } 00073 00074 BesEventAction::~BesEventAction() 00075 { 00076 delete m_DM; 00077 } 00078 00079 void BesEventAction::BeginOfEventAction(const G4Event* evt) 00080 { 00081 00082 G4int eventId = evt->GetEventID(); 00083 //if (eventId%5000==0) 00084 // G4cout<<"---> Begin of event: "<<eventId<<G4endl; 00085 00086 G4UImanager* uiMgr = G4UImanager::GetUIpointer(); 00087 //if(eventId == 46 || eventId == 75) 00088 // uiMgr->ApplyCommand("/tracking/verbose 1"); 00089 //else 00090 // uiMgr->ApplyCommand("/tracking/verbose 0"); 00091 00092 //mc truth 00093 if (m_runAction) 00094 if (m_runAction->GetMCTruthFlag()!=0) 00095 { 00096 BesSensitiveManager* sensitiveManager = BesSensitiveManager::GetSensitiveManager(); 00097 sensitiveManager->BeginOfTruthEvent(evt); 00098 } 00099 } 00100 00101 void BesEventAction::EndOfEventAction(const G4Event* evt) 00102 { 00103 if (G4VVisManager::GetConcreteInstance()) 00104 { 00105 G4TrajectoryContainer* trajectoryContainer = evt->GetTrajectoryContainer(); 00106 G4int n_trajectories = 0; 00107 if (trajectoryContainer) n_trajectories = trajectoryContainer->entries(); 00108 00109 for (G4int i=0; i<n_trajectories; i++) 00110 { 00111 G4Trajectory* trj = (G4Trajectory*) 00112 ((*(evt->GetTrajectoryContainer()))[i]); 00113 00114 trj->DrawTrajectory(50); 00115 00116 } 00117 } 00118 00119 //mc truth 00120 BesSensitiveManager* sensitiveManager = BesSensitiveManager::GetSensitiveManager(); 00121 if (m_runAction) 00122 if (m_runAction->GetMCTruthFlag()!=0) 00123 { 00124 sensitiveManager->EndOfTruthEvent(evt); 00125 } 00126 00127 if (ReadBoostRoot::GetHitOut()){ 00128 if (m_runAction) 00129 { 00130 //Ascii I/O, output hit collections 00131 BesAsciiIO* asciiIO = m_runAction->GetAsciiIO(); 00132 if (asciiIO) { 00133 if (m_RealizationSvc->UseDBFlag() == true) asciiIO->SaveHitAsciiEvents(m_RealizationSvc->getRunId(), evt); 00134 else asciiIO->SaveHitAsciiEvents(m_runAction->GetRunId(), evt); 00135 } 00136 00137 //Root I/O, output MdcHit collections 00138 BesRootIO* rootIO = m_runAction->GetRootIO(); 00139 if (rootIO){ 00140 //emc digitization 00141 if (ReadBoostRoot::GetEmc()) m_DM->Digitize("BesEmcDigitizer"); 00142 00143 if (m_RealizationSvc->UseDBFlag() == true) rootIO->SaveHitRootEvent(m_RealizationSvc->getRunId(), evt); 00144 else rootIO->SaveHitRootEvent(m_runAction->GetRunId(), evt); 00145 } 00146 } 00147 }else{ 00148 //Tuning I/O 00149 if (ReadBoostRoot::GetTuning()){ 00150 if (m_runAction) 00151 { 00152 BesTuningIO* tuningIO = m_runAction->GetTuningIO(); 00153 if (tuningIO){ 00154 if (ReadBoostRoot::GetFormatAR()) 00155 { 00156 tuningIO->GetRootEvent(evt->GetEventID()); 00157 } 00158 else{ 00159 tuningIO->GetNextEvents(); 00160 } 00161 } 00162 00163 } 00164 } 00165 //mdc digitization 00166 00167 if (ReadBoostRoot::GetMdc()) 00168 m_DM->Digitize("BesMdcDigitizer"); 00169 00170 //tof digitization 00171 if (ReadBoostRoot::GetTof()) 00172 m_DM->Digitize("BesTofDigitizer"); 00173 00174 //emc digitization 00175 if ((!ReadBoostRoot::GetTuning())&&ReadBoostRoot::GetEmc()) 00176 m_DM->Digitize("BesEmcDigitizer"); 00177 00178 //muc digitization 00179 if (ReadBoostRoot::GetMuc()) 00180 m_DM->Digitize("BesMucDigitizer"); 00181 00182 00183 if (m_runAction) 00184 { 00185 //Ascii I/O, output digi collections 00186 BesAsciiIO* asciiIO = m_runAction->GetAsciiIO(); 00187 if (asciiIO) 00188 { 00189 if (m_RealizationSvc->UseDBFlag() == true) asciiIO->SaveAsciiEvents(m_RealizationSvc->getRunId(), evt); 00190 else asciiIO->SaveAsciiEvents(m_runAction->GetRunId(), evt); 00191 } 00192 00193 // Root I/O,output digi collections 00194 BesTDSWriter* tdsWriter = m_runAction->GetTDSWriter(); 00195 if (tdsWriter) 00196 { 00197 if (m_RealizationSvc->UseDBFlag() == true) tdsWriter->SaveAll(evt, m_RealizationSvc->getRunId() ); 00198 else tdsWriter->SaveAll(evt, m_runAction->GetRunId() ); 00199 } 00200 } 00201 } 00202 00203 sensitiveManager->ClearEvent(); 00204 //HepRandom::saveEngineStatus("EndSimCurrEvt.rndm"); 00205 } 00206 00207 00208 00209 00210 00211 00212 00213 00214 00215 00216 00217 00218