00001 #include "RootEventData/TMcHitTof.h"
00002 #include "RootEventData/TMcHitEvent.h"
00003 #include "RootEventData/TMcDigiEmc.h"
00004 #include "BesMdcHit.hh"
00005 #include "BesTofHit.hh"
00006 #include "BesEmcDigi.hh"
00007 #include "BesEventAction.hh"
00008 #include "G4RunManager.hh"
00009 #include "BesTruthTrack.hh"
00010 #include "BesTruthVertex.hh"
00011 #include "BesSensitiveManager.hh"
00012 #include "G4HCofThisEvent.hh"
00013 #include "G4SDManager.hh"
00014 #include "G4PrimaryVertex.hh"
00015 #include "G4PrimaryParticle.hh"
00016
00017 #include "TFile.h"
00018 #include "TTree.h"
00019 #include "BesRootIO.hh"
00020
00021 #include "G4ThreeVector.hh"
00022
00023 #include "AsciiDmp/AsciiData.hh"
00024 #include "G4DigiManager.hh"
00025 #include <iostream>
00026
00027 using namespace std;
00028
00029
00030 #include "GaudiKernel/IDataProviderSvc.h"
00031 #include "GaudiKernel/ISvcLocator.h"
00032 #include "GaudiKernel/Bootstrap.h"
00033 #include "GaudiKernel/RegistryEntry.h"
00034 #include "GaudiKernel/MsgStream.h"
00035 #include "GaudiKernel/SmartDataPtr.h"
00036
00037 #include "G4Svc/IG4Svc.h"
00038 #include "G4Svc/G4Svc.h"
00039
00040 BesRootIO::BesRootIO(
00041 G4int mdcTruFlag,G4int mdcDigiFlag,
00042 G4int tofTruFlag, G4int tofDigiFlag,
00043 G4int emcTruFlag, G4int emcDigiFlag,
00044 G4int mucTruFlag, G4int mucDigiFlag,G4String name)
00045 :m_mdcTruFlag(mdcTruFlag),m_mdcDigiFlag(mdcDigiFlag),
00046 m_tofTruFlag(tofTruFlag),m_tofDigiFlag(tofDigiFlag),
00047 m_emcTruFlag(emcTruFlag),m_emcDigiFlag(emcDigiFlag),
00048 m_mucTruFlag(mucTruFlag),m_mucDigiFlag(mucDigiFlag),m_rootFile(name)
00049 {
00050 m_DigiMan = G4DigiManager::GetDMpointer();
00051
00052 f = new TFile(m_rootFile,"RECREATE");
00053
00054 m_TMcHitEvent = new TMcHitEvent();
00055 HitTree = new TTree("HitTree","staff data from HitCollection");
00056
00057 HitTree->Branch("TMcHitEvent", "TMcHitEvent", &m_TMcHitEvent, 32000, 99);
00058 }
00059
00060 BesRootIO::~BesRootIO()
00061 {
00062 f->Write();
00063 }
00064
00065 void BesRootIO::SaveHitRootEvent(G4int runId, const G4Event* evt)
00066 {
00067
00068 if (m_mdcDigiFlag)
00069 {
00070 SaveMdcHitRoot();
00071 }
00072 if (m_tofDigiFlag)
00073 {
00074 SaveTofHitRoot();
00075 }
00076 if (m_emcDigiFlag){
00077 SaveEmcDigiRootEvent();
00078 }
00079
00080 HitTree->Fill();
00081
00082 m_TMcHitEvent->Clear();
00083 }
00084
00085 void BesRootIO::SaveEmcDigiRootEvent(){
00086
00087 G4int emcDigiCollID = -1;
00088 emcDigiCollID = m_DigiMan->GetDigiCollectionID("BesEmcDigitsCollection");
00089 if(emcDigiCollID>=0)
00090 {
00091 BesEmcDigitsCollection* emcDC = (BesEmcDigitsCollection*)m_DigiMan->GetDigiCollection(emcDigiCollID);
00092 G4int nHits = emcDC->entries();
00093
00094
00095 if(nHits>0){
00096 BesEmcDigi* emcDigi;
00097 for (int i = 0; i < nHits; i++) {
00098 emcDigi=(*emcDC)[i];
00099 TMcDigiEmc* tEmcDigi = new TMcDigiEmc();
00100
00101 tEmcDigi->SetPartId(emcDigi->GetPartId());
00102 tEmcDigi->SetThetaNb(emcDigi->GetThetaNb());
00103 tEmcDigi->SetPhiNb(emcDigi->GetPhiNb());
00104 tEmcDigi->SetEnergy(emcDigi->GetEnergy());
00105 tEmcDigi->SetTime(emcDigi->GetTime());
00106 tEmcDigi->SetTrackIndex(emcDigi->GetTrackIndex());
00107
00108
00109
00110 m_TMcHitEvent->addMcDigiEmc(tEmcDigi);
00111
00112 }
00113 }
00114 }
00115 }
00116
00117 void BesRootIO::SaveMdcHitRoot()
00118 {
00119
00120 G4int THCID = -1;
00121 THCID = m_DigiMan->GetHitsCollectionID("BesMdcHitsCollection");
00122 if (THCID>=0)
00123 {
00124 BesMdcHitsCollection* mdcDC = (BesMdcHitsCollection*) (m_DigiMan->GetHitsCollection(THCID));
00125 G4int nHits = mdcDC->entries();
00126
00127 if (nHits>0)
00128 {
00129 BesMdcHit* mdcHit;
00130 for (int i=0;i<nHits;i++)
00131 {
00132 mdcHit=(*mdcDC)[i];
00133 TMcHitMdc* tMdcHit = new TMcHitMdc();
00134 tMdcHit->SetTrackID(mdcHit->GetTrackID());
00135 tMdcHit->SetLayerNo(mdcHit->GetLayerNo());
00136 tMdcHit->SetCellNo(mdcHit->GetCellNo());
00137 tMdcHit->SetEdep(mdcHit->GetEdep());
00138 tMdcHit->SetDriftD(mdcHit->GetDriftD());
00139 tMdcHit->SetDriftT(mdcHit->GetDriftT());
00140 tMdcHit->SetGlobalT(mdcHit->GetGlobalT());
00141 tMdcHit->SetTheta(mdcHit->GetTheta());
00142 tMdcHit->SetEnterAngle(mdcHit->GetEnterAngle());
00143 tMdcHit->SetPosFlag(mdcHit->GetPosFlag());
00144
00145 G4ThreeVector gTemp = mdcHit->GetPos();
00146 TVector3 tTemp = TVector3(gTemp.x(), gTemp.y(), gTemp.z());
00147 tMdcHit->SetPos(tTemp);
00148
00149
00150 m_TMcHitEvent->addMcHitMdc(tMdcHit);
00151 }
00152 }
00153 }
00154
00155
00156 }
00157
00158 void BesRootIO::SaveTofHitRoot()
00159 {
00160
00161 ISvcLocator* svcLocator = Gaudi::svcLocator();
00162 IG4Svc* tmpSvc;
00163 StatusCode sc = svcLocator->service("G4Svc", tmpSvc);
00164 G4Svc* m_G4Svc = dynamic_cast<G4Svc *>(tmpSvc);
00165 double m_beamTime = m_G4Svc->GetBeamTime() * ns;
00166 m_TMcHitEvent->setBeamTime(m_beamTime);
00167
00168
00169 G4int THCID = -1;
00170 THCID = m_DigiMan->GetHitsCollectionID("BesTofHitsCollection");
00171 if (THCID>=0)
00172 {
00173 BesTofHitsCollection* tofDC = (BesTofHitsCollection*) (m_DigiMan->GetHitsCollection(THCID));
00174 G4int nHits = tofDC->entries();
00175
00176 if (nHits>0)
00177 {
00178 BesTofHit* tofHit;
00179 for (int i=0;i<nHits;i++)
00180 {
00181 tofHit=(*tofDC)[i];
00182 TMcHitTof* tTofHit = new TMcHitTof();
00183 tTofHit->SetTrackIndex(tofHit->GetTrackIndex());
00184 tTofHit->SetG4Index(tofHit->GetG4Index());
00185 tTofHit->SetPartId(tofHit->GetPartId());
00186 tTofHit->SetScinNb(tofHit->GetScinNb());
00187 tTofHit->SetEdep(tofHit->GetEdep());
00188 tTofHit->SetStepL(tofHit->GetStepL());
00189 tTofHit->SetTrackL(tofHit->GetTrackL());
00190 tTofHit->SetTime(tofHit->GetTime());
00191 tTofHit->SetDeltaT(tofHit->GetDeltaT());
00192 tTofHit->SetCharge(tofHit->GetCharge());
00193
00194 G4ThreeVector gTemp = tofHit->GetPos();
00195 TVector3 tTemp(gTemp.x(), gTemp.y(), gTemp.z());
00196 tTofHit->SetPos(tTemp);
00197
00198 gTemp = tofHit->GetPDirection();
00199 tTemp = TVector3(gTemp.x(), gTemp.y(), gTemp.z());
00200 tTofHit->SetPDirection(tTemp);
00201
00202 gTemp = tofHit->GetMomentum();
00203 tTemp = TVector3(gTemp.x(), gTemp.y(), gTemp.z());
00204 tTofHit->SetMomentum(tTemp);
00205
00206
00207 m_TMcHitEvent->addMcHitTof(tTofHit);
00208 }
00209 }
00210 }
00211
00212 }