#include <BesRawDataWriter.hh>
Public Member Functions | |
BesRawDataWriter () | |
~BesRawDataWriter () | |
void | SaveDigits () |
void | SaveMdcDigits () |
void | SaveTofDigits () |
void | SaveEmcDigits () |
void | SaveMucDigits () |
Private Attributes | |
G4DigiManager * | m_DigiMan |
BesMdcGeoParameter * | mdcGeoPointer |
IDataProviderSvc * | m_evtSvc |
G4Svc * | m_G4Svc |
RealizationSvc * | m_RealizationSvc |
Definition at line 25 of file BesRawDataWriter.hh.
BesRawDataWriter::BesRawDataWriter | ( | ) |
Definition at line 41 of file BesRawDataWriter.cc.
References BesMdcGeoParameter::GetGeo(), m_DigiMan, m_G4Svc, m_RealizationSvc, and mdcGeoPointer.
00042 { 00043 m_DigiMan = G4DigiManager::GetDMpointer(); 00044 //yuany 2005-2-28 00045 mdcGeoPointer=BesMdcGeoParameter::GetGeo(); 00046 00047 IG4Svc* tmpSvc; 00048 StatusCode sc=Gaudi::svcLocator()->service("G4Svc", tmpSvc); 00049 if (!sc.isSuccess()) 00050 G4cout <<" BesRawDataWriter::Error,could not open G4Svc"<<G4endl; 00051 m_G4Svc=dynamic_cast<G4Svc *>(tmpSvc); 00052 00053 IRealizationSvc *tmpReal; 00054 StatusCode scReal = Gaudi::svcLocator()->service("RealizationSvc",tmpReal); 00055 if (!scReal.isSuccess()) 00056 { 00057 std::cout << " Could not initialize Realization Service in BesRawDataWriter" << std::endl; 00058 } 00059 else 00060 { 00061 m_RealizationSvc=dynamic_cast<RealizationSvc*>(tmpReal); 00062 } 00063 00064 }
BesRawDataWriter::~BesRawDataWriter | ( | ) |
void BesRawDataWriter::SaveDigits | ( | ) |
Definition at line 70 of file BesRawDataWriter.cc.
References m_evtSvc, SaveEmcDigits(), SaveMdcDigits(), SaveMucDigits(), and SaveTofDigits().
Referenced by BesTDSWriter::SaveAll().
00071 { 00072 //interface to event data service 00073 ISvcLocator* svcLocator = Gaudi::svcLocator(); 00074 StatusCode sc=svcLocator->service("EventDataSvc", m_evtSvc); 00075 if (sc.isFailure()) 00076 G4cout<<"Could not accesss EventDataSvc!"<<G4endl; 00077 00078 DigiEvent* aDigiEvent = new DigiEvent; 00079 sc = m_evtSvc->registerObject("/Event/Digi",aDigiEvent); 00080 if(sc!=StatusCode::SUCCESS) { 00081 G4cout<< "Could not register DigiEvent" <<G4endl; 00082 } 00083 00084 SaveMdcDigits(); 00085 SaveTofDigits(); 00086 SaveEmcDigits(); 00087 SaveMucDigits(); 00088 }
void BesRawDataWriter::SaveEmcDigits | ( | ) |
Definition at line 310 of file BesRawDataWriter.cc.
References EmcID::crystal_id(), RawDataUtil::EmcChargeChannel(), RawDataUtil::EmcChargeMeasure(), RawDataUtil::EmcTimeChannel(), BesEmcDigi::GetEnergy(), BesEmcDigi::GetPartId(), BesEmcDigi::GetPhiNb(), BesEmcDigi::GetThetaNb(), BesEmcDigi::GetTime(), BesEmcDigi::GetTrackIndex(), genRecEmupikp::i, ganga-rec::j, m_DigiMan, and m_evtSvc.
Referenced by SaveDigits().
00311 { 00312 //Emc digits collection defined in BOSS 00313 EmcDigiCol* aEmcDigiCol = new EmcDigiCol; 00314 00315 G4int emcDigiCollID = -1; 00316 emcDigiCollID = m_DigiMan->GetDigiCollectionID("BesEmcDigitsCollection"); 00317 if(emcDigiCollID>=0) 00318 { 00319 BesEmcDigitsCollection* emcDC = (BesEmcDigitsCollection*)m_DigiMan->GetDigiCollection(emcDigiCollID); 00320 G4int nDigi = emcDC->entries(); 00321 if(nDigi>0) 00322 { 00323 //arrange digis in digitsCollection in order of trackIndex 00324 BesEmcDigi* digi; 00325 vector<BesEmcDigi*>* vecDC = emcDC->GetVector(); 00326 for(int i=0;i<nDigi-1;i++) 00327 for(int j=i+1;j<nDigi;j++) 00328 if((*vecDC)[i]->GetTrackIndex()>(*vecDC)[j]->GetTrackIndex()) 00329 { 00330 digi = (*vecDC)[i]; 00331 (*vecDC)[i] = (*vecDC)[j]; 00332 (*vecDC)[j] = digi; 00333 } 00334 //push back EmcDigi to EmcDigiCol in BOSS 00335 for(int i=0;i<nDigi;i++) 00336 { 00337 digi = (*emcDC)[i]; 00338 00339 int charge = RawDataUtil::EmcChargeChannel(digi->GetEnergy()); 00340 int measure = RawDataUtil::EmcChargeMeasure(digi->GetEnergy()); 00341 int time = RawDataUtil::EmcTimeChannel(digi->GetTime()); 00342 Identifier ident = EmcID::crystal_id (digi->GetPartId(), digi->GetThetaNb(), digi->GetPhiNb()); 00343 EmcDigi* emcDigi = new EmcDigi(ident, time, charge); 00344 emcDigi->setTrackIndex(digi->GetTrackIndex()); 00345 emcDigi->setMeasure(measure); 00346 aEmcDigiCol->push_back(emcDigi); 00347 } 00348 } 00349 } 00350 00351 //register EMC digits collection to TDS 00352 StatusCode scEmc = m_evtSvc->registerObject("/Event/Digi/EmcDigiCol", aEmcDigiCol); 00353 if(scEmc!=StatusCode::SUCCESS) 00354 G4cout<< "Could not register EMC digi collection" <<G4endl; 00355 00356 //retrieve EMC digits from TDS 00357 /*SmartDataPtr<EmcDigiCol> aDigiCol(m_evtSvc,"/Event/Digi/EmcDigiCol"); 00358 if(!aDigiCol) 00359 G4cout<<"Could not retrieve EMC digi collection"<<G4endl; 00360 00361 EmcDigiCol::iterator iDigiCol; 00362 for(iDigiCol=aDigiCol->begin(); iDigiCol!=aDigiCol->end(); iDigiCol++) 00363 { 00364 const Identifier ident = (*iDigiCol)->identify(); 00365 G4cout<<"barrel_ec: "<<EmcID::barrel_ec(ident); 00366 G4cout<<" theta: "<<EmcID::theta_module(ident); 00367 G4cout<<" phi: "<<EmcID::phi_module(ident); 00368 G4cout<<" charge: "<<(*iDigiCol)->getChargeChannel(); 00369 G4cout<<" time: "<<(*iDigiCol)->getTimeChannel()<<G4endl; 00370 } 00371 G4cout<<"end of retrieve EMC digits"<<G4endl; 00372 */ 00373 }
void BesRawDataWriter::SaveMdcDigits | ( | ) |
Definition at line 90 of file BesRawDataWriter.cc.
References BesMdcDigi::GetCellNo(), BesMdcDigi::GetDriftT(), BesMdcDigi::GetEdep(), BesMdcDigi::GetLayerNo(), G4Svc::GetMdcDedxFlag(), BesMdcDigi::GetTrackID(), genRecEmupikp::i, m_DigiMan, m_evtSvc, m_G4Svc, RawDataUtil::MdcChargeChannel(), EventModel::Digi::MdcDigiCol, RawDataUtil::MdcTimeChannel(), and MdcID::wire_id().
Referenced by SaveDigits().
00091 { 00092 //mdc digis collection defined in BOSS 00093 MdcDigiCol* aMdcDigiCol = new MdcDigiCol; 00094 00095 G4int mdcDigiCollID = -1; 00096 mdcDigiCollID = m_DigiMan->GetDigiCollectionID("BesMdcDigisCollection"); 00097 if(mdcDigiCollID>=0) 00098 { 00099 BesMdcDigisCollection* mdcDC = (BesMdcDigisCollection*)m_DigiMan->GetDigiCollection(mdcDigiCollID); 00100 G4int nDigi = mdcDC->entries(); 00101 if(nDigi>0) 00102 { 00103 //push back mdc digits to MdcDigiCol in BOSS 00104 BesMdcDigi* mdcDigi; 00105 for(int i=0;i<nDigi;i++) 00106 { 00107 mdcDigi=(*mdcDC)[i]; 00108 unsigned int charge; 00109 if(m_G4Svc->GetMdcDedxFlag()==1){ 00110 charge = int(mdcDigi->GetEdep()); 00111 }else{ 00112 charge = RawDataUtil::MdcChargeChannel(mdcDigi->GetEdep()); 00113 } 00114 unsigned int time = RawDataUtil::MdcTimeChannel(mdcDigi->GetDriftT()); 00115 const Identifier ident = MdcID::wire_id ( mdcDigi->GetLayerNo(), mdcDigi->GetCellNo() ); 00116 00117 MdcDigi* aMdcDigi = new MdcDigi(ident, time, charge); 00118 aMdcDigi->setTrackIndex(mdcDigi->GetTrackID()); 00119 aMdcDigiCol->push_back(aMdcDigi); 00120 } 00121 } 00122 } 00123 00124 //register MDC digits collection to TDS 00125 StatusCode scMdc = m_evtSvc->registerObject("/Event/Digi/MdcDigiCol", aMdcDigiCol); 00126 if(scMdc!=StatusCode::SUCCESS) 00127 G4cout<< "Could not register MDC digi collection" <<G4endl; 00128 00129 //retrieve MDC digits from TDS 00130 /*SmartDataPtr<MdcDigiCol> aDigiCol(m_evtSvc,"/Event/Digi/MdcDigiCol"); 00131 if(!aDigiCol) 00132 G4cout<<"Could not retrieve MDC digi collection"<<G4endl; 00133 00134 MdcDigiCol::iterator iDigiCol; 00135 for(iDigiCol=aDigiCol->begin(); iDigiCol!=aDigiCol->end(); iDigiCol++) 00136 { 00137 const Identifier ident = (*iDigiCol)->identify(); 00138 G4cout<<"layer: "<<MdcID::layer(ident); 00139 G4cout<<" cell: "<<MdcID::wire(ident); 00140 G4cout<<" charge: "<<(*iDigiCol)->getChargeChannel(); 00141 G4cout<<" time: "<<(*iDigiCol)->getTimeChannel()<<G4endl; 00142 } 00143 G4cout<<"end of retrieve MDC digi collection"<<G4endl; 00144 */ 00145 }
void BesRawDataWriter::SaveMucDigits | ( | ) |
Definition at line 375 of file BesRawDataWriter.cc.
References MucID::channel_id(), BesMucDigi::GetGapId(), BesMucDigi::GetPartId(), BesMucDigi::GetSegId(), BesMucDigi::GetStripId(), BesMucDigi::GetTrackIndex(), genRecEmupikp::i, m_DigiMan, m_evtSvc, and EventModel::Digi::MucDigiCol.
Referenced by SaveDigits().
00376 { 00377 //Muc digits collection defined in BOSS 00378 MucDigiCol* aMucDigiCol = new MucDigiCol; 00379 00380 G4int mucDigiCollID =-1; 00381 mucDigiCollID = m_DigiMan->GetDigiCollectionID("BesMucDigisCollection"); 00382 if(mucDigiCollID>=0) 00383 { 00384 BesMucDigisCollection* mucDC = (BesMucDigisCollection*)m_DigiMan->GetDigiCollection(mucDigiCollID); 00385 G4int nDigi = mucDC->entries(); 00386 00387 if(nDigi > 0) { 00388 BesMucDigi* digi; 00389 for(int i = 0; i < nDigi; i++) { 00390 digi = (*mucDC)[i]; 00391 Identifier ident = MucID::channel_id( digi->GetPartId(), digi->GetSegId(),digi->GetGapId(),digi->GetStripId() ); 00392 MucDigi* mucDigi = new MucDigi(ident); 00393 mucDigi->setTrackIndex(digi->GetTrackIndex()); 00394 aMucDigiCol->push_back(mucDigi); 00395 } 00396 } 00397 } 00398 00399 //register MUC digits collection to TDS 00400 StatusCode scMuc = m_evtSvc->registerObject("/Event/Digi/MucDigiCol", aMucDigiCol); 00401 if(scMuc!=StatusCode::SUCCESS) 00402 G4cout<< "Could not register MUC digi collection" <<G4endl; 00403 00404 //retrieve MUC digits from TDS 00405 /*SmartDataPtr<MucDigiCol> aDigiCol(m_evtSvc,"/Event/Digi/MucDigiCol"); 00406 if(!aDigiCol) 00407 G4cout<<"Could not retrieve MUC digi collection"<<G4endl; 00408 00409 MucDigiCol::iterator iDigiCol; 00410 for(iDigiCol=aDigiCol->begin(); iDigiCol!=aDigiCol->end(); iDigiCol++) 00411 { 00412 const Identifier ident = (*iDigiCol)->identify(); 00413 G4cout<<"Part: "<<MucID::part(ident); 00414 G4cout<<" Seg: "<<MucID::seg(ident); 00415 G4cout<<" Gap: "<<MucID::gap(ident); 00416 G4cout<<" Strip: "<<MucID::strip(ident)<<G4endl; 00417 } 00418 G4cout<<"end of retrieve MUC digits"<<G4endl; 00419 */ 00420 }
void BesRawDataWriter::SaveTofDigits | ( | ) |
Definition at line 147 of file BesRawDataWriter.cc.
References TofID::cell_id(), BesTofDigi::GetBackADC(), BesTofDigi::GetBackT1(), BesTofDigi::GetBackT2(), BesTofDigi::GetBackTDC(), BesTofDigi::GetForwADC(), BesTofDigi::GetForwT1(), BesTofDigi::GetForwT2(), BesTofDigi::GetForwTDC(), BesTofDigi::GetModule(), BesTofDigi::GetPartId(), TofID::getPHI_BARREL_MAX(), BesTofDigi::GetScinNb(), BesTofDigi::GetStrip(), BesTofDigi::GetTrackIndex(), genRecEmupikp::i, TofID::is_barrel(), TofID::is_scin(), ganga-rec::j, m_DigiMan, m_evtSvc, TofDigi::setOverflow(), RawData::setTrackIndex(), EventModel::Digi::TofDigiCol, and RawDataUtil::TofTimeChannel().
Referenced by SaveDigits().
00147 { 00148 00149 //Tof digits collection defined in BOSS 00150 TofDigiCol* aTofDigiCol = new TofDigiCol; 00151 00152 G4int tofDigiCollID = -1; 00153 tofDigiCollID = m_DigiMan->GetDigiCollectionID("BesTofDigitsCollection"); 00154 00155 if( tofDigiCollID>=0 ) { 00156 BesTofDigitsCollection* tofDC = (BesTofDigitsCollection*)m_DigiMan->GetDigiCollection(tofDigiCollID); 00157 G4int nDigi = tofDC->entries(); 00158 if( nDigi>0 ) { 00159 //arrange digis in digitsCollection in order of trackIndex 00160 BesTofDigi* digi; 00161 vector<BesTofDigi*>* vecDC = tofDC->GetVector(); 00162 for( int i=0; i<nDigi-1; i++ ) { 00163 for( int j=i+1; j<nDigi; j++ ) { 00164 if( (*vecDC)[i]->GetTrackIndex()>(*vecDC)[j]->GetTrackIndex() ) { 00165 digi = (*vecDC)[i]; 00166 (*vecDC)[i] = (*vecDC)[j]; 00167 (*vecDC)[j] = digi; 00168 } 00169 } 00170 } 00171 00172 //push back tof digits to TofDigiCol in BOSS 00173 for( int i=0; i<nDigi; i++ ) { 00174 digi = (*tofDC)[i]; 00175 00176 // for Scintillator, scinNum is the number of scintillator 00177 // for MRPC, scinNum is the number of module 00178 G4int scinNum = digi->GetScinNb(); 00179 // for Scintillator, barrel_ec is 0 for east endcap, 1 for barrel, and 2 for west endcap 00180 // for MRPC, barrel_ec is 100 + module number for east, 200 + module number for west 00181 G4int barrel_ec = digi->GetPartId(); 00182 00183 if( TofID::is_scin( barrel_ec ) ) { // for Scintillator 00184 unsigned int layer = 0; 00185 if (TofID::is_barrel(barrel_ec) && scinNum > TofID::getPHI_BARREL_MAX()) { 00186 layer = 1; 00187 scinNum = scinNum - TofID::getPHI_BARREL_MAX() - 1; 00188 } 00189 00190 // Store tofDigi for end==0 00191 Identifier ident = TofID::cell_id ( barrel_ec, layer, scinNum, 0); 00192 unsigned int time; 00193 if( digi->GetForwTDC()>0 ) { 00194 time = RawDataUtil::TofTimeChannel(digi->GetForwTDC()); 00195 } 00196 else { 00197 time = 0; 00198 } 00199 00200 unsigned int charge; 00201 if( digi->GetForwADC()>0 ) { 00202 // ADC linear conversion 00203 charge = digi->GetForwADC(); // convert ADC(pC) of bTof into Q channel in Data 00204 // Treat ADC overflow 00205 if( charge>=8192 ) { 00206 // The overlow flag is the 20th bit of the ADC_channel. 00207 charge = (charge | 0x080000); // if ADC_channel>=8192, set overflow flag = 1. 00208 } 00209 charge = ( (time & 0x07e000) | charge ); // Store tclock into ADC_channel as qclock 00210 } 00211 else { 00212 charge =0; 00213 } 00214 00215 TofDigi* tofDigi = new TofDigi(ident, time, charge); 00216 if( charge & 0x80000 ) {// Treat overflow flag(20th bit) 00217 tofDigi->setOverflow(0x2); 00218 } 00219 tofDigi->setTrackIndex(digi->GetTrackIndex()); 00220 aTofDigiCol->push_back(tofDigi); 00221 00222 // Store tofDigi for end==1 00223 ident = TofID::cell_id ( barrel_ec, layer, scinNum, 1); 00224 if( digi->GetBackTDC()>0 ) { 00225 time = RawDataUtil::TofTimeChannel(digi->GetBackTDC()); 00226 } 00227 else { 00228 time = 0; 00229 } 00230 00231 if( digi->GetBackADC()>0 ) { 00232 // ADC linear conversion 00233 charge = digi->GetBackADC(); 00234 // Treat ADC overflow 00235 if( charge>=8192 ) { 00236 // The overlow flag is the 20th bit of the ADC_channel. 00237 charge = (charge | 0x080000); // if ADC_channel>=8192, set overflow flag = 1. 00238 } 00239 charge = ( (time & 0x07e000) | charge); // Store tclock into ADC_channel as qclock 00240 } 00241 else { 00242 charge = 0; 00243 } 00244 00245 tofDigi = new TofDigi(ident, time, charge); 00246 if( charge & 0x80000 ) { // Treat overflow flag(20th bit) 00247 tofDigi->setOverflow(0x2); 00248 } 00249 tofDigi->setTrackIndex(digi->GetTrackIndex()); 00250 aTofDigiCol->push_back(tofDigi); 00251 } // end if is_scin 00252 else { // for ETF(MRPC) 00253 if( barrel_ec==3 || barrel_ec==4 ) { 00254 unsigned int endcap = 0; 00255 unsigned int module = digi->GetModule(); 00256 unsigned int strip = digi->GetStrip(); 00257 if( barrel_ec==4 ) { // west end cap 00258 endcap = 1; 00259 } 00260 00261 // Store tofDigi for end==0 00262 Identifier ident = TofID::cell_id( 3, endcap, module, strip, 0 ); 00263 unsigned int tleading; 00264 if( digi->GetForwT1() > 0 ) { 00265 tleading = RawDataUtil::TofTimeChannel( digi->GetForwT1() ); 00266 } 00267 else { tleading = 0; } 00268 unsigned int ttrailing; 00269 if( digi->GetForwT2() > 0 ) { 00270 ttrailing = RawDataUtil::TofTimeChannel( digi->GetForwT2() ); 00271 } 00272 else { ttrailing = 0; } 00273 TofDigi* tofDigi = new TofDigi( ident, tleading, ttrailing ); 00274 tofDigi->setTrackIndex( digi->GetTrackIndex() ); 00275 aTofDigiCol->push_back( tofDigi ); 00276 /* 00277 G4cout << " --------- BesRawDataWriter: TOF ------------------ " << G4endl; 00278 G4cout << " endcap=" << endcap << " module=" << module << " strip=" << strip << G4endl; 00279 G4cout << " tleading=" << tleading << " ttrailing=" << ttrailing << G4endl; 00280 G4cout << " --------- BesRawDataWriter: TOF ------------------ " << G4endl; 00281 */ 00282 // Store tofDigi for end==1 00283 ident = TofID::cell_id( 3, endcap, module, strip, 1 ); 00284 if( digi->GetBackT1() > 0 ) { 00285 tleading = RawDataUtil::TofTimeChannel( digi->GetBackT1() ); 00286 } 00287 else { tleading = 0; } 00288 if( digi->GetBackT2() > 0 ) { 00289 ttrailing = RawDataUtil::TofTimeChannel( digi->GetBackT2() ); 00290 } 00291 else { ttrailing = 0; } 00292 tofDigi = new TofDigi( ident, tleading, ttrailing ); 00293 tofDigi->setTrackIndex( digi->GetTrackIndex() ); 00294 aTofDigiCol->push_back( tofDigi ); 00295 } 00296 } // end if is_MRPC 00297 00298 } 00299 } 00300 } 00301 00302 //register TOF digits collection to TDS 00303 StatusCode scTof = m_evtSvc->registerObject("/Event/Digi/TofDigiCol", aTofDigiCol); 00304 if( scTof!=StatusCode::SUCCESS ) { 00305 G4cout<< "Could not register TOF digi collection" <<G4endl; 00306 } 00307 return; 00308 }
G4DigiManager* BesRawDataWriter::m_DigiMan [private] |
Definition at line 41 of file BesRawDataWriter.hh.
Referenced by BesRawDataWriter(), SaveEmcDigits(), SaveMdcDigits(), SaveMucDigits(), and SaveTofDigits().
IDataProviderSvc* BesRawDataWriter::m_evtSvc [private] |
Definition at line 43 of file BesRawDataWriter.hh.
Referenced by SaveDigits(), SaveEmcDigits(), SaveMdcDigits(), SaveMucDigits(), and SaveTofDigits().
G4Svc* BesRawDataWriter::m_G4Svc [private] |
Definition at line 44 of file BesRawDataWriter.hh.
Referenced by BesRawDataWriter(), and SaveMdcDigits().
RealizationSvc* BesRawDataWriter::m_RealizationSvc [private] |