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
00050 m_cableSvc = svc<ICableSvc>(m_cableSvcName, true);
00051
00052
00053 m_pmtGeomSvc = svc<IPmtGeomInfoSvc>(m_pmtGeomSvcName, true);
00054
00055
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
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
00084 info() << "execNumber: " << gh->execNumber() << endreq;
00085
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 }
00129
00130
00131
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 }
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
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 {
00193 error() << "Can not book NTuple:" << long(m_ntuple0) << endreq;
00194 return StatusCode::FAILURE;
00195 }
00196 }
00197 }
00198
00199
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
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 {
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
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
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 <b = pmtCrate->localTriggerBoard();
00330
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
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 }
00424
00425 m_ntuple1->write();
00426 }