00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "BesMucDigitizer.hh"
00013 #include "BesMucDigit.hh"
00014 #include "BesMucDigi.hh"
00015 #include "BesMucHit.hh"
00016 #include "G4DigiManager.hh"
00017 #include "Randomize.hh"
00018
00019 #include "GaudiKernel/ISvcLocator.h"
00020 #include "GaudiKernel/Bootstrap.h"
00021 #include "GaudiKernel/IDataProviderSvc.h"
00022 #include "G4Svc/IG4Svc.h"
00023 #include "G4Svc/G4Svc.h"
00024
00025
00026 const G4int BesMucDigitizer::m_nPartMax;
00027 const G4int BesMucDigitizer::m_nSegMax;
00028 const G4int BesMucDigitizer::m_nGapMax;
00029 const G4int BesMucDigitizer::m_nStripMax;
00030
00031 BesMucDigitizer::BesMucDigitizer(G4String modName)
00032 :G4VDigitizerModule(modName)
00033 {
00034 collectionName.push_back("BesMucDigisCollection");
00035 m_besMucDigisCollection=0;
00036
00037
00038
00039
00040
00041
00042 ISvcLocator* svcLocator = Gaudi::svcLocator();
00043 IG4Svc* tmpSvc;
00044 StatusCode sc=svcLocator->service("G4Svc", tmpSvc);
00045 m_G4Svc=dynamic_cast<G4Svc *>(tmpSvc);
00046
00047
00048 if(m_G4Svc->MucRootFlag())
00049 {
00050 m_tupleMuc = m_G4Svc->GetTupleMuc();
00051 sc = m_tupleMuc->addItem("part",m_part);
00052 sc = m_tupleMuc->addItem("seg",m_seg);
00053 sc = m_tupleMuc->addItem("gap",m_gap);
00054 sc = m_tupleMuc->addItem("strip",m_strip);
00055
00056 }
00057
00058
00059
00060
00061 Initialize();
00062 }
00063
00064 BesMucDigitizer::~BesMucDigitizer()
00065 {
00066 }
00067
00068 void BesMucDigitizer::Initialize()
00069 {
00070 for(G4int i = 0; i < m_nPartMax; i++) {
00071 for(G4int j = 0; j < m_nSegMax; j++) {
00072 for(G4int k = 0; k < m_nGapMax; k++) {
00073 for(G4int l = 0; l < m_nStripMax; l++) {
00074 m_stripID[i][j][k][l] = 0;
00075 }
00076 }
00077 }
00078 }
00079 }
00080
00081
00082 void BesMucDigitizer::Digitize()
00083 {
00084 Initialize();
00085
00086 m_besMucDigisCollection = new BesMucDigisCollection(moduleName, collectionName[0]);
00087 G4DigiManager* DigiMan = G4DigiManager::GetDMpointer();
00088
00089
00090 G4int THCID;
00091 THCID = DigiMan->GetHitsCollectionID("BesMucHitsCollection");
00092
00093
00094 BesMucHitsCollection* THC = 0;
00095 THC = (BesMucHitsCollection*) (DigiMan->GetHitsCollection(THCID));
00096
00097 if(THC) {
00098 G4int trackIndex, part, seg, gap, strip;
00099 BesMucDigit *aDigit = new BesMucDigit();
00100
00101 G4int n_hit = THC->entries();
00102 for(G4int i = 0; i < n_hit; i++) {
00103 aDigit->SetHit((*THC)[i]);
00104 trackIndex = aDigit->GetTrackIndex();
00105 part = aDigit->GetPart();
00106 seg = aDigit->GetSeg();
00107 gap = aDigit->GetGap();
00108 strip = aDigit->GetNearestStripNo();
00109
00110
00111 if(m_G4Svc->MucRootFlag())
00112 {
00113 m_part = part;
00114 m_seg = seg;
00115 m_gap = gap;
00116 m_strip = strip;
00117
00118 m_tupleMuc->write();
00119 }
00120
00121 (*THC)[i]->SetPart(part);
00122 (*THC)[i]->SetSeg(seg);
00123 (*THC)[i]->SetGap(gap);
00124 (*THC)[i]->SetStrip(strip);
00125 if(m_stripID[part][seg][gap][strip] == 0) {
00126 NewDigi(trackIndex, part, seg, gap, strip);
00127 }
00128 else {
00129 OldDigi();
00130 }
00131 }
00132
00133 StoreDigiCollection(m_besMucDigisCollection);
00134 delete aDigit;
00135 }
00136 }
00137
00138 void BesMucDigitizer::NewDigi(G4int trackIndex, G4int part, G4int seg, G4int gap, G4int strip)
00139 {
00140 BesMucDigi *digi = new BesMucDigi();
00141 digi->SetTrackIndex(trackIndex);
00142 digi->SetPartId(part);
00143 digi->SetSegId(seg);
00144 digi->SetGapId(gap);
00145 digi->SetStripId(strip);
00146 m_besMucDigisCollection->insert(digi);
00147
00148 m_stripID[part][seg][gap][strip] = 1;
00149 }
00150
00151 void BesMucDigitizer::OldDigi()
00152 { }
00153
00154 void BesMucDigitizer::Smear()
00155 { }