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

In This Package:

ReadoutEventCnv.cc

Go to the documentation of this file.
00001 #include "ReadoutEventCnv.h"
00002 #include "PerBaseEvent/HeaderObjectCnv.h"
00003 #include "Conventions/Electronics.h"
00004 #include "Context/TimeStamp.h"
00005 
00006 //#include "Event/ReadoutHeader.h"
00007 //#include "PerReadoutEvent/PerReadout.h"
00008 
00009 #include "Event/DaqPmtCrate.h"
00010 
00011 #include "DaqReadoutFormat/ByteBuffer.h"
00012 
00013 using namespace DayaBay;
00014 using namespace std;
00015 
00016 using DybDaq::ByteBuffer;
00017 using DybDaq::DaqBuffer;
00018 using DybDaq::EventReadout;
00019 
00020 ReadoutHeaderCnv::ReadoutHeaderCnv(ISvcLocator* svc)
00021       : RootIOTypedCnv<PerReadoutHeader,ReadoutHeader>("PerReadoutHeader",
00022                                                        classID(),svc),
00023             m_buffers(new DaqBuffer::OutputBufferList())
00024 {
00025     m_writefadc = true;
00026 }
00027 
00028 
00029 ReadoutHeaderCnv::~ReadoutHeaderCnv()
00030 {
00031   delete m_buffers;
00032 }
00033 
00034 StatusCode ReadoutHeaderCnv::PerToTran(const PerReadoutHeader& perobj,
00035                                        DayaBay::ReadoutHeader& tranobj)
00036 {
00037   MsgStream log(msgSvc(), "ReadoutHeaderCnv::PerToTran");
00038   StatusCode sc = HeaderObjectCnv::toTran(perobj,tranobj);
00039   if (sc.isFailure()) return sc;
00040 
00041   delete tranobj.readout();
00042   if(perobj.readout){
00043     DayaBay::Readout* readout = convert( *(perobj.readout) );
00044     if (0 != readout) {
00045       readout->setHeader( &tranobj );
00046       tranobj.setReadout( readout );
00047     }
00048     if (!((perobj.readout)->rawEvent).empty()) {
00049       tranobj.setDaqCrate(new DaqPmtCrate(perobj.daqPmtCrate(true)));
00050     }
00051   }else{
00052     // Header has no readout
00053     tranobj.setReadout(0);
00054   }
00055 
00056   return StatusCode::SUCCESS;
00057 }                                       
00058 
00059 StatusCode ReadoutHeaderCnv::TranToPer(const DayaBay::ReadoutHeader& tranobj,
00060                                        PerReadoutHeader& perobj)
00061 {
00062   MsgStream log(msgSvc(), "ReadoutHeaderCnv::TranToPer");
00063   StatusCode sc = HeaderObjectCnv::toPer(tranobj,perobj);
00064   if (sc.isFailure()) return sc;
00065 
00066   delete perobj.readout;
00067   const Readout* readout = tranobj.readout();
00068   const DayaBay::DaqCrate* daqCrate = tranobj.daqCrate();
00069   if(0 != readout && m_rioSvc->isReadoutForced()) {
00070     perobj.readout = convert( *(readout ) );
00071     if ((0 == readout->rawEvent()) && (0 != daqCrate)) {
00072       return TranToPer(*daqCrate,
00073                        perobj);
00074     }
00075   }else{
00076     if (0 == daqCrate) {
00077       perobj.readout = 0;
00078     } else {
00079       perobj.readout = new PerReadout();
00080       return TranToPer(*daqCrate,
00081                        perobj);
00082     }
00083   }
00084   
00085   return StatusCode::SUCCESS;
00086 }
00087 
00088 StatusCode ReadoutHeaderCnv::TranToPer(const DayaBay::DaqCrate& tranobj,
00089                                        PerReadoutHeader& perobj) {
00090   const DybDaq::EventReadout& eventReadout = tranobj.eventReadout();
00091   std::vector<unsigned int>& daqBytes = perobj.readout->rawEvent;
00092   daqBytes.resize(eventReadout.bufferSize() * ByteBuffer::BYTES_IN_INT);
00093   unsigned int index = 0;
00094   eventReadout.gather(*m_buffers);
00095   DaqBuffer::OutputBufferList::const_iterator buffer;
00096   for (buffer = m_buffers->begin();
00097        buffer != m_buffers->end();
00098        ++buffer) {
00099     unsigned int capacity = (*buffer).second;
00100     memcpy(&(daqBytes[index]),
00101            (*buffer).first,
00102            capacity);
00103     index += (capacity / ByteBuffer::BYTES_IN_INT);
00104   }
00105   m_buffers->clear();
00106   return StatusCode::SUCCESS;
00107 }
00108 
00109 StatusCode ReadoutHeaderCnv::fillRepRefs(IOpaqueAddress*, DataObject* dobj)
00110 {
00111     MsgStream log(msgSvc(), "ReadoutHeaderCnv::fillRepRefs");
00112     ReadoutHeader* rh = dynamic_cast<ReadoutHeader*>(dobj);
00113 
00114     log << MSG::DEBUG
00115         << "Saving links to " << rh->inputHeaders().size() 
00116         << " input headers" << endreq;
00117 
00118     StatusCode sc = HeaderObjectCnv::fillPer(m_rioSvc,*rh,*m_perOutObj);
00119     if (sc.isFailure()) {
00120         log << MSG::ERROR << "Failed to fill HeaderObject part" << endreq;
00121         return sc;
00122     }
00123 
00124     // ... fill ReadoutHeader part...
00125     return sc;
00126 }
00127 
00128 StatusCode ReadoutHeaderCnv::fillObjRefs(IOpaqueAddress*, DataObject* dobj)
00129 {
00130     MsgStream log(msgSvc(), "ReadoutHeaderCnv::fillObjRefs");
00131     HeaderObject* hobj = dynamic_cast<HeaderObject*>(dobj);
00132     StatusCode sc = HeaderObjectCnv::fillTran(m_rioSvc,*m_perInObj,*hobj);
00133     if (sc.isFailure()) {
00134         log << MSG::ERROR << "Failed to fill HeaderObject part" << endreq;
00135         return sc;
00136     }
00137 
00138     log << MSG::DEBUG
00139         << "Restored links to " << hobj->inputHeaders().size() 
00140         << " input headers" << endreq;
00141 
00142     // ... fill ReadoutHeader part...
00143     return sc;
00144 }
00145 
00146 PerReadout* ReadoutHeaderCnv::convert(const DayaBay::Readout& roRo)
00147 {
00148   Detector det(roRo.detector());
00149   if(det.detectorId() == DetectorId::kUnknown){
00150       return 0; 
00151   }else if( det.detectorId() != DetectorId::kRPC ){
00152       return convert( static_cast<const ReadoutPmtCrate&>(roRo) );
00153   }else{
00154       //return convert( static_cast<const ReadoutRpcCrate&>(roRo) ); 
00155     return 0; // do RPC later
00156   }
00157   return 0;
00158 }
00159 
00160 PerReadoutPmtCrate* ReadoutHeaderCnv::convert(const DayaBay::ReadoutPmtCrate& roPmtCrate)
00161 {
00162   MsgStream log(msgSvc(), "ReadoutHeaderCnv::convert(ReadoutPmtCrate&)");
00163   PerReadoutPmtCrate *perRoPcr = new PerReadoutPmtCrate();
00164   perRoPcr->detector = (roPmtCrate.detector()).siteDetPackedData();
00165   perRoPcr->triggerType = roPmtCrate.triggerType();
00166   perRoPcr->triggerNumber = roPmtCrate.triggerNumber();
00167   
00168   perRoPcr->triggerTimeSec = roPmtCrate.triggerTime().GetSec(); /* FIXME */
00169   perRoPcr->triggerTimeNanoSec = roPmtCrate.triggerTime().GetNanoSec();
00170   const DayaBay::RawEvent* rawEvent = roPmtCrate.rawEvent();
00171   if( rawEvent && rawEvent->isValid() ){
00172     perRoPcr->rawEvent.resize( roPmtCrate.rawEvent()->size() );
00173     memcpy(&(perRoPcr->rawEvent[0]), roPmtCrate.rawEvent()->buffer(),
00174            roPmtCrate.rawEvent()->size()*sizeof(unsigned int) );
00175   }
00176   ReadoutPmtCrate::PmtChannelReadouts chReadouts = roPmtCrate.channelReadout();
00177   ReadoutPmtCrate::PmtChannelReadouts::iterator it;
00178   
00179   std::vector<PerReadoutPmtChannel*> out_vec;
00180   
00181   for(it=chReadouts.begin();it!=chReadouts.end();++it)
00182   {
00183     PerReadoutPmtChannel* perRoPch = convert( it->second );
00184     perRoPch->channelId = (it->first).fullPackedData();
00185     out_vec.push_back(perRoPch);
00186   }
00187   perRoPcr->perChannelReadouts = out_vec;
00188   if(roPmtCrate.triggerDataPkg()){
00189       perRoPcr->perTriggerDataPkg = convert (*(roPmtCrate.triggerDataPkg()));
00190   }else{
00191       log << MSG::WARNING << "TriggerDataPackage Not Found" << endreq;
00192   }
00193   
00194   // now do fadc data
00195   if(m_writefadc)
00196   {
00197       const map<FadcChannelId, DigitalSignal>& in_fadcReadouts = roPmtCrate.fadcReadout();
00198       map<FadcChannelId, DigitalSignal>::const_iterator fadc_it, done=in_fadcReadouts.end();
00199       for( fadc_it = in_fadcReadouts.begin() ; fadc_it != done ; ++fadc_it ){
00200         (perRoPcr->perFadcReadouts)[(fadc_it->first).fullPackedData()] = fadc_it->second ;
00201       }   
00202   }
00203   
00204   //perRoPcr->fadcReadouts = chan;
00205   
00206   return perRoPcr;
00207 }
00208 
00209 PerReadoutPmtChannel* ReadoutHeaderCnv::convert(const DayaBay::ReadoutPmtChannel& roPmtChannel)
00210 {
00211   PerReadoutPmtChannel* perRoPch = new PerReadoutPmtChannel();
00212   
00213   perRoPch->mode = roPmtChannel.mode();
00214   perRoPch->adc   = roPmtChannel.adc();
00215   perRoPch->adcRange= roPmtChannel.adcRange();
00216   perRoPch->adcCycle= roPmtChannel.adcCycle();
00217   perRoPch->pedestal= roPmtChannel.pedestal();
00218   perRoPch->tdc   = roPmtChannel.tdc();
00219   perRoPch->tdcHitCount = roPmtChannel.tdcHitCount();
00220   perRoPch->waveAdcCycle= roPmtChannel.waveAdcCycle();
00221   perRoPch->waveAdcHigh = roPmtChannel.waveAdcHigh();
00222   perRoPch->waveAdcLow = roPmtChannel.waveAdcLow();
00223   return perRoPch;
00224 }
00225 
00226 PerReadoutTriggerDataPkg* ReadoutHeaderCnv::convert(const DayaBay::ReadoutTriggerDataPkg& roPmtTDP)
00227 {
00228     PerReadoutTriggerDataPkg* perRoTDP= new PerReadoutTriggerDataPkg((roPmtTDP.detector()).siteDetPackedData(),
00229                                                                       roPmtTDP.trigNumber(),    
00230                                                                       roPmtTDP.numSubTriggers(),
00231                                                                       roPmtTDP.boardStatus(),   
00232                                                                       roPmtTDP.localSN());
00233     
00234     //PerReadoutTriggerDataPkg* perRoTDP= new PerReadoutTriggerDataPkg();
00235     //perRoTDP->detector=(roPmtTDP.detector()).siteDetPackedData();
00236     //perRoTDP->trigNumber=roPmtTDP.trigNumber();
00237     //perRoTDP->numSubTriggers=roPmtTDP.numSubTriggers();
00238     //perRoTDP->boardStatus=roPmtTDP.boardStatus();
00239     //perRoTDP->localSN=roPmtTDP.localSN();
00240     
00241     std::vector<DayaBay::ReadoutTriggerDataFrame*>::const_iterator it;
00242     for(it=roPmtTDP.frames().begin();it!=roPmtTDP.frames().end();++it){
00243         (perRoTDP->frames).push_back(convert(**it));
00244     }
00245     return perRoTDP;
00246 }
00247 
00248 
00249 PerReadoutTriggerDataFrame* ReadoutHeaderCnv::convert(const DayaBay::ReadoutTriggerDataFrame& roPmtTDF)
00250 {
00251     PerReadoutTriggerDataFrame *perRoTDF = new PerReadoutTriggerDataFrame(roPmtTDF.seqNumber(), 
00252                                                                           roPmtTDF.readoutType(),
00253                                                                           roPmtTDF.triggerType(),
00254                                                                           roPmtTDF.triggerTime(),
00255                                                                           roPmtTDF.cycle(),
00256                                                                           roPmtTDF.nhit(),
00257                                                                           roPmtTDF.esumAdc(),
00258                                                                           roPmtTDF.esumComp(),  
00259                                                                           roPmtTDF.crossSource());
00260 
00261     return perRoTDF;
00262 
00263 }
00264 
00265 Readout*  ReadoutHeaderCnv::convert(const PerReadout& perRo)
00266 {
00267   Detector det(perRo.detector);
00268   if(det.detectorId() == DetectorId::kUnknown){
00269       return 0; 
00270   }else if( det.detectorId() != DetectorId::kRPC ){
00271       return convert( static_cast<const PerReadoutPmtCrate&>(perRo) );
00272   }else{
00273       //return convert( static_cast<const ReadoutRpcCrate&>(roRo) ); 
00274     return 0; // do RPC later
00275   }
00276   return 0;
00277 }
00278 
00279 ReadoutPmtCrate* ReadoutHeaderCnv::convert(const PerReadoutPmtCrate& perRoPcr)
00280 {
00281   ReadoutPmtCrate *out_crate = new ReadoutPmtCrate();
00282   Detector det(perRoPcr.detector);
00283   out_crate->setDetector(det);
00284   out_crate->setTriggerType( Trigger::TriggerType_t(perRoPcr.triggerType) );
00285   out_crate->setTriggerNumber( perRoPcr.triggerNumber );
00286   
00287   timespec value = {perRoPcr.triggerTimeSec,perRoPcr.triggerTimeNanoSec};
00288   TimeStamp tstamp(value);
00289   out_crate->setTriggerTime(tstamp); 
00290   if(perRoPcr.rawEvent.size() > 0){
00291     unsigned int* buffer = const_cast<unsigned int*>(&(perRoPcr.rawEvent[0]));
00292     out_crate->setRawEvent( RawEvent( buffer ).clone() );
00293   }
00294   
00295   ReadoutPmtCrate::PmtChannelReadouts out_channels;
00296   
00297   PerReadoutPmtCrate::PerPmtChannelReadouts in_channels = perRoPcr.perChannelReadouts;
00298   PerReadoutPmtCrate::PerPmtChannelReadouts::const_iterator it;
00299   
00300   for(it=in_channels.begin(); it!=in_channels.end(); ++it){
00301     ReadoutPmtChannel out_channel = convert(**it);
00302     out_channel.setReadout(out_crate);
00303     out_channels[out_channel.channelId()]=out_channel;
00304   }
00305   
00306   out_crate->setChannelReadout(out_channels);
00307   //Add protection so old version data without TriggerDataPkg can also be read
00308   if(perRoPcr.perTriggerDataPkg) {
00309     ReadoutTriggerDataPkg* rotdf = convert( *(perRoPcr.perTriggerDataPkg) );
00310     rotdf->setReadout(out_crate);
00311     out_crate->setTriggerDataPkg(rotdf);
00312   }
00313   
00314   ReadoutPmtCrate::FadcReadouts& out_fadcReadouts = out_crate->fadcReadout();
00315   
00316   PerReadoutPmtCrate::PerFadcReadouts in_fadcReadouts;
00317   PerReadoutPmtCrate::PerFadcReadouts::const_iterator fadc_it;
00318   
00319   //if(perRoPcr.perFadcReadouts.size()>0){
00320   //ReadoutPmtCrate::FadcReadouts::iterator fadc_it;
00321   for(fadc_it=in_fadcReadouts.begin();fadc_it!=in_fadcReadouts.end();++fadc_it){
00322       out_fadcReadouts[DayaBay::FadcChannelId(fadc_it->first)]=fadc_it->second;
00323   }
00324   //}
00325     
00326   return out_crate;
00327 }
00328 
00329 ReadoutPmtChannel ReadoutHeaderCnv::convert(const PerReadoutPmtChannel& perRoPch)
00330 {
00331   ReadoutPmtChannel out_ch;
00332   FeeChannelId id(perRoPch.channelId);
00333   out_ch.setChannelId(id);
00334   out_ch.setMode(perRoPch.mode);
00335   out_ch.setAdc(perRoPch.adc);
00336   out_ch.setAdcRange(perRoPch.adcRange);
00337   out_ch.setAdcCycle(perRoPch.adcCycle);
00338   out_ch.setPedestal(perRoPch.pedestal);
00339   out_ch.setTdc(perRoPch.tdc);
00340   out_ch.setTdcHitCount(perRoPch.tdcHitCount);
00341   out_ch.setWaveAdcCycle(perRoPch.waveAdcCycle);
00342   out_ch.setWaveAdcHigh(perRoPch.waveAdcHigh);
00343   out_ch.setWaveAdcLow(perRoPch.waveAdcLow);
00344   return out_ch;
00345 }
00346 
00347 ReadoutTriggerDataPkg* ReadoutHeaderCnv::convert(const PerReadoutTriggerDataPkg& perRoPmtTDP)
00348 {
00349   ReadoutTriggerDataPkg* roTDP = new ReadoutTriggerDataPkg();
00350   Detector det(perRoPmtTDP.detector);
00351   roTDP->setDetector(det);
00352   roTDP->setTrigNumber(perRoPmtTDP.trigNumber);
00353   roTDP->setBoardStatus(perRoPmtTDP.boardStatus);
00354   roTDP->setLocalSN(perRoPmtTDP.localSN);
00355   std::vector<PerReadoutTriggerDataFrame*>::const_iterator it;
00356   for(it=perRoPmtTDP.frames.begin();it!=perRoPmtTDP.frames.end();++it)
00357   {
00358     ReadoutTriggerDataFrame* rotdf=convert(**it);
00359     rotdf->setPackage(roTDP);
00360     roTDP->addFrame(rotdf);
00361   }
00362   return roTDP;
00363 }
00364 
00365 ReadoutTriggerDataFrame* ReadoutHeaderCnv::convert(const PerReadoutTriggerDataFrame& perToPmtTDF)
00366 {
00367   ReadoutTriggerDataFrame *rotdf = new ReadoutTriggerDataFrame();
00368   rotdf->setSeqNumber(perToPmtTDF.seqNumber);
00369   rotdf->setReadoutType(perToPmtTDF.readoutType);
00370   rotdf->setTriggerType(Trigger::TriggerType_t(perToPmtTDF.triggerType));
00371   rotdf->setTriggerTime(perToPmtTDF.triggerTime);
00372   rotdf->setCycle(perToPmtTDF.cycle);
00373   rotdf->setNhit(perToPmtTDF.nhit);
00374   rotdf->setEsumAdc(perToPmtTDF.esumAdc);
00375   rotdf->setEsumComp(perToPmtTDF.esumComp);
00376   rotdf->setCrossSource(perToPmtTDF.crossSource);
00377   return rotdf;
00378 }
00379 
00380 
00381 // Local Variables:
00382 // c-basic-offset: 2
00383 // End:
00384 
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 20:30:32 2011 for PerReadoutEvent by doxygen 1.4.7