00001 #include "ReadoutEventCnv.h"
00002 #include "PerBaseEvent/HeaderObjectCnv.h"
00003 #include "Conventions/Electronics.h"
00004 #include "Context/TimeStamp.h"
00005
00006
00007
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
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
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
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
00155 return 0;
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();
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
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
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
00235
00236
00237
00238
00239
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
00274 return 0;
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
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
00320
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
00382
00383
00384