00001
00009
00010 #include "BesMdcDigi.hh"
00011 #include "BesTofDigi.hh"
00012 #include "BesEmcDigi.hh"
00013 #include "BesMucDigi.hh"
00014 #include "BesRawDataWriter.hh"
00015 #include "G4DigiManager.hh"
00016 #include "G4Svc/IG4Svc.h"
00017 #include "G4Svc/G4Svc.h"
00018
00019 #include "GaudiKernel/IDataProviderSvc.h"
00020 #include "GaudiKernel/ISvcLocator.h"
00021 #include "GaudiKernel/Bootstrap.h"
00022 #include "GaudiKernel/RegistryEntry.h"
00023 #include "GaudiKernel/MsgStream.h"
00024
00025 #include "MdcRawEvent/MdcDigi.h"
00026 #include "TofRawEvent/TofDigi.h"
00027 #include "EmcRawEvent/EmcDigi.h"
00028 #include "MucRawEvent/MucDigi.h"
00029
00030 #include "Identifier/Identifier.h"
00031 #include "Identifier/MdcID.h"
00032 #include "Identifier/TofID.h"
00033 #include "Identifier/EmcID.h"
00034 #include "Identifier/MucID.h"
00035
00036 #include "RawEvent/RawDataUtil.h"
00037 #include "RawEvent/DigiEvent.h"
00038 #include "GaudiKernel/SmartDataPtr.h"
00039
00040
00041 BesRawDataWriter::BesRawDataWriter()
00042 {
00043 m_DigiMan = G4DigiManager::GetDMpointer();
00044
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 }
00065
00066 BesRawDataWriter::~BesRawDataWriter()
00067 {
00068 }
00069
00070 void BesRawDataWriter::SaveDigits()
00071 {
00072
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 }
00089
00090 void BesRawDataWriter::SaveMdcDigits()
00091 {
00092
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
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
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
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145 }
00146
00147 void BesRawDataWriter::SaveTofDigits() {
00148
00149
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
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
00173 for( int i=0; i<nDigi; i++ ) {
00174 digi = (*tofDC)[i];
00175
00176
00177
00178 G4int scinNum = digi->GetScinNb();
00179
00180
00181 G4int barrel_ec = digi->GetPartId();
00182
00183 if( TofID::is_scin( barrel_ec ) ) {
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
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
00203 charge = digi->GetForwADC();
00204
00205 if( charge>=8192 ) {
00206
00207 charge = (charge | 0x080000);
00208 }
00209 charge = ( (time & 0x07e000) | charge );
00210 }
00211 else {
00212 charge =0;
00213 }
00214
00215 TofDigi* tofDigi = new TofDigi(ident, time, charge);
00216 if( charge & 0x80000 ) {
00217 tofDigi->setOverflow(0x2);
00218 }
00219 tofDigi->setTrackIndex(digi->GetTrackIndex());
00220 aTofDigiCol->push_back(tofDigi);
00221
00222
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
00233 charge = digi->GetBackADC();
00234
00235 if( charge>=8192 ) {
00236
00237 charge = (charge | 0x080000);
00238 }
00239 charge = ( (time & 0x07e000) | charge);
00240 }
00241 else {
00242 charge = 0;
00243 }
00244
00245 tofDigi = new TofDigi(ident, time, charge);
00246 if( charge & 0x80000 ) {
00247 tofDigi->setOverflow(0x2);
00248 }
00249 tofDigi->setTrackIndex(digi->GetTrackIndex());
00250 aTofDigiCol->push_back(tofDigi);
00251 }
00252 else {
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 ) {
00258 endcap = 1;
00259 }
00260
00261
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
00278
00279
00280
00281
00282
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 }
00297
00298 }
00299 }
00300 }
00301
00302
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 }
00309
00310 void BesRawDataWriter::SaveEmcDigits()
00311 {
00312
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
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
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
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
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373 }
00374
00375 void BesRawDataWriter::SaveMucDigits()
00376 {
00377
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
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
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420 }