| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

In This Package:

RawData2Tree.cc

Go to the documentation of this file.
00001 #include "RawData2Tree.h"
00002 #include "Event/CalibReadoutHeader.h"
00003 #include "Event/CalibReadoutPmtCrate.h"
00004 #include "Event/ReadoutHeader.h"
00005 #include "Event/ReadoutPmtCrate.h"
00006 #include "Event/RawEventHeader.h"
00007 #include "Event/RawRom.h"
00008 #include "Event/RawRomLtb.h"
00009 #include "Event/RawPmtChannel.h"
00010 #include "Event/GenHeader.h"
00011 #include "HepMC/GenEvent.h"
00012 #include "HepMC/GenVertex.h"
00013 #include "Event/RecHeader.h"
00014 #include "DetHelpers/IPmtGeomInfoSvc.h"
00015 #include "DataSvc/ICableSvc.h"
00016 #include "DatabaseInterface/DbiResultPtr.h"
00017 #include "Event/DaqLtb.h"
00018 #include "Event/DaqLtbFrame.h"
00019 #include <map>
00020 
00021 using namespace std;
00022 using namespace DayaBay;
00023 
00024 RawData2Tree::RawData2Tree(const string& name, ISvcLocator* svcloc)
00025 : GaudiAlgorithm(name, svcloc)
00026 , m_cableSvc(0)
00027 , m_pmtGeomSvc(0)
00028 {
00029   declareProperty("PrintFreq", m_printFreq = -1, "print frequency for event information");
00030   declareProperty("CheckGen", m_checkGen = false, "check GenEvent");
00031   declareProperty("CheckReadout", m_checkReadout = false, "check ReadoutEvent");
00032   declareProperty("CableSvcName", m_cableSvcName = "StaticCableSvc",
00033     "Name of service to map between detector, hardware, and electronic IDs");
00034   declareProperty("PmtGeomSvcName", m_pmtGeomSvcName = "PmtGeomInfoSvc",
00035     "Name of Pmt Geometry Information Service");
00036   m_execNum = 0;
00037   m_ntuple0 = 0;
00038   m_ntuple1 = 0;
00039 }
00040 
00041 RawData2Tree::~RawData2Tree()
00042 {
00043 }
00044 
00045 StatusCode RawData2Tree::initialize()
00046 {
00047   debug() << "initialize()" << endreq;
00048 
00049   // Get Cable Service
00050   m_cableSvc = svc<ICableSvc>(m_cableSvcName, true);
00051 
00052   // Get PmtGeomInfo Service
00053   m_pmtGeomSvc = svc<IPmtGeomInfoSvc>(m_pmtGeomSvcName, true);
00054 
00055   // Book Ntuple
00056   StatusCode sc = bookNtuple();
00057   if(sc!=StatusCode::SUCCESS) {
00058     error() << "Can't book ntuple!" << endreq;
00059   }
00060 
00061   return sc;
00062 }
00063 
00064 StatusCode RawData2Tree::execute()
00065 {
00066   debug() << "execute() ______________________________ start" << endreq;
00067 
00068   if(m_printFreq>0 && m_execNum%m_printFreq==0) cout << "---------- " << m_execNum << endl;
00069 
00070   //----------------------------------------------------------------------------------------
00071   //GenHeader
00072 
00073   if(m_checkGen) {
00074 
00075     GenHeader* gh = get<GenHeader>("/Event/Gen/GenHeader");
00076 
00077     if (gh == 0) {
00078       error() << " =======> Requested Object can not be accessable." << endreq;
00079       return StatusCode::FAILURE;
00080     }
00081 
00082     if (m_printFreq > 0 && m_execNum % m_printFreq == 0) {
00083       //m_log << MSG::INFO << "Gen Header: " << *gh << endreq;
00084       info() << "execNumber: " << gh->execNumber() << endreq;
00085       //gh->event()->print();
00086       info() << "signal_process_id= " << gh->event()->signal_process_id() << endreq;
00087       info() << "vertices_size= " << gh->event()->vertices_size() << endreq;
00088     }
00089 
00090     m_eventType = gh->event()->signal_process_id();
00091     m_nVertex = gh->event()->vertices_size();
00092     m_nParticle = gh->event()->particles_size();
00093 
00094     unsigned int iVertex = 0;
00095     for(HepMC::GenEvent::vertex_const_iterator it = gh->event()->vertices_begin();
00096         it != gh->event()->vertices_end();
00097         it++ ) {
00098       if(m_printFreq > 0 && m_execNum % m_printFreq == 0) {
00099         info() << "vertex= " << (*it)->position().x() 
00100               <<","<< (*it)->position().y()<<","<<(*it)->position().z()
00101               << endreq;
00102       }
00103       m_verX0[iVertex] = (*it)->position().x();
00104       m_verY0[iVertex] = (*it)->position().y();
00105       m_verZ0[iVertex] = (*it)->position().z();
00106       iVertex++;
00107     }
00108 
00109     unsigned int iParticle = 0;
00110     for(HepMC::GenEvent::particle_const_iterator it = gh->event()->particles_begin();
00111         it != gh->event()->particles_end();
00112         it++ ) {
00113       if(m_printFreq > 0 && m_execNum % m_printFreq == 0) {
00114         info() << "particle momentum= " 
00115               << (*it)->momentum().x() <<","
00116               << (*it)->momentum().y() <<","
00117               << (*it)->momentum().z() 
00118               << endreq;
00119       }
00120       m_verPx[iParticle] = (*it)->momentum().x();
00121       m_verPy[iParticle] = (*it)->momentum().y();
00122       m_verPz[iParticle] = (*it)->momentum().z();
00123       iParticle++;
00124     }
00125 
00126     m_ntuple0->write();
00127 
00128   }//GenHeader
00129 
00130   //----------------------------------------------------------------------------------------
00131   //ReadoutHeader
00132 
00133   if(m_checkReadout) {
00134 
00135     ReadoutHeader* roh = get<ReadoutHeader>("/Event/Readout/ReadoutHeader");
00136     if (roh == 0) {
00137       error() << " =======> Requested Object can not be accessable." << endreq;
00138       return StatusCode::FAILURE;
00139     }
00140 
00141     const DaqCrate* daqCrate = roh->daqCrate();
00142     if(!daqCrate){
00143       error() << "Failed to get DAQ crate from header" << endreq;
00144       return StatusCode::FAILURE;
00145     } 
00146 
00147     if(daqCrate) {
00148       const Detector& detector = daqCrate->detector();
00149       info() << "Detector = " << detector << endreq;
00150 
00151       if(detector.isAD() || detector.isWaterShield()) {
00152         processPmtCrate(roh,daqCrate);
00153       }
00154     } else if(roh->readout()) {
00155       processReadout(roh);
00156     } else {
00157       error() << "Failed to get DAQ crate or Readout from header" << endreq;
00158       return StatusCode::FAILURE;
00159     }
00160 
00161   }//ReadoutHeader
00162 
00163   m_execNum++;
00164   debug() << "execute() ______________________________ end" << endreq;
00165   return StatusCode::SUCCESS;
00166 }
00167 
00168 StatusCode RawData2Tree::finalize()
00169 {
00170   debug() << "finalize()" << endreq;
00171   return StatusCode::SUCCESS;
00172 }
00173 StatusCode RawData2Tree::bookNtuple()
00174 {
00175   //  Book NTuple 0
00176   if(m_checkGen) {
00177     NTuplePtr nt0(ntupleSvc(), "FILE1/Gen");
00178     if ( nt0 ) m_ntuple0 = nt0;
00179     else {
00180       m_ntuple0 = ntupleSvc()->book("FILE1/Gen", CLID_ColumnWiseTuple, "Gen");
00181       if ( m_ntuple0 )    {
00182         m_ntuple0->addItem ("EventType",      m_eventType);
00183         m_ntuple0->addItem ("VertexSize",     m_nVertex, 0, 30);
00184         m_ntuple0->addItem ("ver_x0",  m_nVertex, m_verX0);
00185         m_ntuple0->addItem ("ver_y0",  m_nVertex, m_verY0);
00186         m_ntuple0->addItem ("ver_z0",  m_nVertex, m_verZ0);
00187         m_ntuple0->addItem ("ParticleSize",   m_nParticle, 0, 30);
00188         m_ntuple0->addItem ("ver_px",  m_nParticle, m_verPx);
00189         m_ntuple0->addItem ("ver_py",  m_nParticle, m_verPy);
00190         m_ntuple0->addItem ("ver_pz",  m_nParticle, m_verPz);
00191       }
00192       else { // Did not manage to book the NTuple....
00193         error() << "Can not book NTuple:" << long(m_ntuple0) << endreq;
00194         return StatusCode::FAILURE;
00195       }
00196     }
00197   }
00198 
00199   //  Book NTuple 1
00200   if(m_checkReadout) {
00201     NTuplePtr nt1(ntupleSvc(), "FILE1/Readout");
00202     if ( nt1 ) m_ntuple1 = nt1;
00203     else {
00204       m_ntuple1 = ntupleSvc()->book("FILE1/Readout", CLID_ColumnWiseTuple, "Readout");
00205       if ( m_ntuple1 )    {
00206         info() << "Start m_ntuple1 addItem successful!" << endreq;
00207         // Trigger number serial
00208         m_ntuple1->addItem("Run",m_run);
00209         m_ntuple1->addItem("Event",m_event);
00210         m_ntuple1->addItem("Det",m_det);
00211         m_ntuple1->addItem("TrigNum",m_trigNum);
00212         m_ntuple1->addItem("TrigSeconde",m_trigSecond);
00213         m_ntuple1->addItem("TrigNanoSec",m_trigNanoSec);
00214         m_ntuple1->addItem("TrigType",  m_trigType);
00215         m_ntuple1->addItem("NChannel",m_nChannel);
00216         m_ntuple1->addItem("NHit",m_nHit,0,1000);
00217         m_ntuple1->addItem("Board",m_nHit,m_board);
00218         m_ntuple1->addItem("Channel",m_nHit,m_channel);
00219         m_ntuple1->addItem("Ring",m_nHit,m_ring);
00220         m_ntuple1->addItem("Column",m_nHit,m_column);
00221         m_ntuple1->addItem("Wall",m_nHit,m_wall);
00222         m_ntuple1->addItem("Spot",m_nHit,m_spot);
00223         m_ntuple1->addItem("Inout",m_nHit,m_inout);
00224         m_ntuple1->addItem("Adc",m_nHit,m_adc);
00225         m_ntuple1->addItem("Tdc",m_nHit,m_tdc);
00226         m_ntuple1->addItem("Cycle",m_nHit,m_cycle);
00227         m_ntuple1->addItem("PreAdc",m_nHit,m_preAdc);
00228         m_ntuple1->addItem("Range",m_nHit,m_range);
00229         m_ntuple1->addItem("HitCount",m_nHit,m_hitCount);
00230         m_ntuple1->addItem("MultiTdc",m_nHit,m_multiTdc);
00231         m_ntuple1->addItem("NTrigger",m_nTrigger,0,20);
00232         m_ntuple1->addItem("TriggerSec",m_nTrigger,m_triggerSec);
00233         m_ntuple1->addItem("TriggerNano",m_nTrigger,m_triggerNano);
00234         m_ntuple1->addItem("TriggerHSum",m_nTrigger,m_triggerHSum);
00235         m_ntuple1->addItem("TriggerESumComp",m_nTrigger,m_triggerESumComp);
00236         m_ntuple1->addItem("TriggerESumADC",m_nTrigger,m_triggerESumAdc);
00237       }
00238       else { // Did not manage to book the NTuple....
00239         error() << "Can not book NTuple:" << long(m_ntuple1) << endmsg;
00240         return StatusCode::FAILURE;
00241       }
00242     }
00243   }
00244 
00245   return StatusCode::SUCCESS;
00246 }
00247 
00248 void RawData2Tree::processPmtCrate(const ReadoutHeader *roh, const DaqCrate *daqCrate)
00249 {
00250   info() << "processPmtCrate"  << endl;
00251   ServiceMode svcMode( roh->context(),0 );
00252 
00253   // Convert to PMT crate readout
00254   const DaqPmtCrate* pmtCrate = daqCrate->asPmtCrate();
00255   if(!pmtCrate){
00256     error() << "Can't find pmt crate for AD or Water Shield" << endreq;
00257   } 
00258 
00259   m_run = pmtCrate->runNumber();
00260   m_event = pmtCrate->eventNumber();
00261   m_det = pmtCrate->detector().fullPackedData();
00262   m_trigNum = pmtCrate->localTriggerNumber();
00263   m_trigSecond = pmtCrate->triggerTime().GetSec();
00264   m_trigNanoSec = pmtCrate->triggerTime().GetNanoSec();
00265   m_trigType = pmtCrate->triggerType();
00266 
00267   const DaqPmtCrate::PmtChannelPtrList& channels
00268     = pmtCrate->channelReadouts();
00269 
00270   m_nChannel= channels.size();
00271   DaqPmtCrate::PmtChannelPtrList::const_iterator channelIter,
00272     channelEnd = channels.end();
00273 
00274   // Calculate number of hits in this readout
00275   int nHit = 0;
00276   for(channelIter = channels.begin(); channelIter!=channelEnd; channelIter++) {
00277     const DaqPmtChannel& channel = *(*channelIter);
00278     nHit += channel.hitCount();
00279   }
00280   m_nHit = nHit;
00281   info() << "Number of channel: " << channels.size() 
00282     << ", Number of hit: " << nHit << endreq;
00283 
00284   int index = -1;
00285   for(channelIter = channels.begin(); channelIter!=channelEnd; channelIter++) {
00286     const DaqPmtChannel& channel = *(*channelIter);
00287 
00288     int board = channel.channelId().board(); 
00289     int connector = channel.channelId().connector();
00290     int ring = -1;
00291     int clmn = -1;
00292     int wall = -1;
00293     int spot = -1;
00294     bool inout = false;
00295     if( pmtCrate->detector().isAD() ) {
00296       AdPmtSensor pmtId = m_cableSvc->adPmtSensor( channel.channelId(), svcMode );
00297       ring = pmtId.ring();
00298       clmn = pmtId.column();
00299     } else if( pmtCrate->detector().isWaterShield() ) {
00300       PoolPmtSensor pmtId = m_cableSvc->poolPmtSensor( channel.channelId(), svcMode );
00301       wall = pmtId.wallNumber();
00302       spot = pmtId.wallSpot();
00303       inout = pmtId.inwardFacing();
00304     }
00305     debug() << "(board,connector) = (" << board << "," << connector << "), " 
00306       << "(ring,column) = (" << ring << "," << clmn << ")" << endreq;
00307 
00308     unsigned int hitSize = channel.hitCount();
00309     for(unsigned int i=0; i<hitSize; i++) {
00310       index++;
00311       m_board[index] = board;
00312       m_channel[index] = connector;
00313       m_ring[index] = ring;
00314       m_column[index] = clmn;
00315       m_wall[index] = wall;
00316       m_spot[index] = spot;
00317       m_inout[index] = inout ? 1 : 0;
00318       m_adc[index] = channel.adc(i);
00319       m_tdc[index] = channel.tdc(i);
00320       m_cycle[index] = channel.peakCycle(i);
00321       m_preAdc[index] = channel.preAdcRaw(i);
00322       m_range[index] = channel.isHighGainAdc(i) ? 1 : 2;
00323       m_hitCount[index] = i;
00324       m_multiTdc[index] = hitSize;
00325       debug() << "tdc=" << m_tdc[index] << ", adc=" << m_adc[index] << endreq;
00326     }
00327   }
00328 
00329   const DaqLtb &ltb = pmtCrate->localTriggerBoard();
00330   //const LtbFramePtrList frames = ltb.frames();
00331   const vector<DayaBay::DaqLtbFrame*> &frames = ltb.frames();
00332   if(frames.size()>20) {
00333     warning() << "Two many trigger frames: " << frames.size() << endreq;
00334   }
00335 
00336   for(unsigned int i=0; i<frames.size(); i++) {
00337     m_triggerSec[i] = frames[i]->triggerTime().GetSec();
00338     m_triggerNano[i] = frames[i]->triggerTime().GetNanoSec();
00339     m_triggerHSum[i] = frames[i]->hitSum();
00340     m_triggerESumComp[i] = frames[i]->energySum();
00341     m_triggerESumAdc[i] = frames[i]->energySum();
00342   }
00343 
00344   m_ntuple1->write();
00345 }
00346 
00347 void RawData2Tree::processReadout(const ReadoutHeader *roh)
00348 {
00349   info() << "processReadout"  << endl;
00350   ServiceMode svcMode( roh->context(),0 );
00351 
00352   Readout* readout = const_cast<Readout*>(roh->readout());
00353 
00354   ReadoutPmtCrate* pmtCrate = dynamic_cast<DayaBay::ReadoutPmtCrate* > ( readout );
00355 
00357   Detector det = pmtCrate->detector();
00358 
00359   m_det = det.fullPackedData();
00360   m_trigNum = readout->triggerNumber();
00361   m_trigSecond = readout->triggerTime().GetSec();
00362   m_trigNanoSec= readout->triggerTime().GetNanoSec();
00363   m_trigType = readout->triggerType();
00364 
00366   const ReadoutPmtCrate::PmtChannelReadouts &channels = pmtCrate->channelReadout();
00367   m_nChannel = channels.size();
00368   ReadoutPmtCrate::PmtChannelReadouts::const_iterator ci, ci_end = channels.end();
00369   
00370   // Calculate number of hits in this readout
00371   int nHit = 0;
00372   for(ci = channels.begin(); ci!=ci_end; ci++) {
00373     nHit += ci->second.size();
00374   }
00375   m_nHit = nHit;
00376   info() << "Number of channel: " << channels.size() 
00377     << ", Number of hit: " << m_nHit << endreq;
00378 
00379   int index = -1;
00380   for(ci = channels.begin(); ci!=ci_end; ci++) {
00381 
00382     const ReadoutPmtChannel &channel = ci->second;
00383 
00384     int board = channel.channelId().board(); 
00385     int connector = channel.channelId().connector();
00386     int ring = -1;
00387     int clmn = -1;
00388     int wall = -1;
00389     int spot = -1;
00390     bool inout = false;
00391     if( readout->detector().isAD() ) {
00392       AdPmtSensor pmtId = m_cableSvc->adPmtSensor( channel.channelId(), svcMode );
00393       ring = pmtId.ring();
00394       clmn = pmtId.column();
00395     } else if( readout->detector().isWaterShield() ) {
00396       PoolPmtSensor pmtId = m_cableSvc->poolPmtSensor( channel.channelId(), svcMode );
00397       wall = pmtId.wallNumber();
00398       spot = pmtId.wallSpot();
00399       inout = pmtId.inwardFacing();
00400     }
00401     debug() << "(board,connector) = (" << board << "," << connector << "), " 
00402       << "(ring,column) = (" << ring << "," << clmn << ")" << endreq;
00403 
00404     unsigned int hitSize = channel.size();
00405     for(unsigned int i = 0; i<hitSize; i++) {
00406       index++;
00407       m_board[index] = board;
00408       m_channel[index] = connector;
00409       m_ring[index] = ring;
00410       m_column[index] = clmn;
00411       m_wall[index] = wall;
00412       m_spot[index] = spot;
00413       m_inout[index] = inout ? 1 : 0;
00414       m_adc[index] = channel.adc(i);
00415       m_tdc[index] = channel.tdc(i);
00416       m_cycle[index] = channel.adcCycle(i);
00417       m_preAdc[index] = channel.pedestal(i);
00418       m_range[index] = channel.adcRange(i);
00419       m_hitCount[index] = channel.tdcHitCount(i);
00420       m_multiTdc[index] = hitSize;
00421       debug() << "index=" << index << ", tdc=" << m_tdc[index] << ", adc=" << m_adc[index] << endreq;
00422     }
00423   } // end of channels
00424 
00425   m_ntuple1->write();
00426 }
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 20:34:06 2011 for AnalysesEx by doxygen 1.4.7