BesRawDataWriter Class Reference

#include <BesRawDataWriter.hh>

List of all members.

Public Member Functions

 BesRawDataWriter ()
 ~BesRawDataWriter ()
void SaveDigits ()
void SaveMdcDigits ()
void SaveTofDigits ()
void SaveEmcDigits ()
void SaveMucDigits ()

Private Attributes

G4DigiManager * m_DigiMan
BesMdcGeoParametermdcGeoPointer
IDataProviderSvc * m_evtSvc
G4Svcm_G4Svc
RealizationSvcm_RealizationSvc


Detailed Description

Definition at line 25 of file BesRawDataWriter.hh.


Constructor & Destructor Documentation

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 (  ) 

Definition at line 66 of file BesRawDataWriter.cc.

00067 {
00068 }


Member Function Documentation

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 }  


Member Data Documentation

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]

Definition at line 45 of file BesRawDataWriter.hh.

Referenced by BesRawDataWriter().

BesMdcGeoParameter* BesRawDataWriter::mdcGeoPointer [private]

Definition at line 42 of file BesRawDataWriter.hh.

Referenced by BesRawDataWriter().


Generated on Tue Nov 29 23:17:34 2016 for BOSS_7.0.2 by  doxygen 1.4.7