00001 #include "ElecHeaderCnv.h"
00002 #include "PerBaseEvent/HeaderObjectCnv.h"
00003
00004 #include "PerElecEvent/PerElecHeader.h"
00005 #include "PerElecEvent/PerElecCrateHeader.h"
00006 #include "PerElecEvent/PerElecFeeCrate.h"
00007 #include "PerElecEvent/PerElecFeeChannel.h"
00008
00009 #include "Event/ElecCrate.h"
00010 #include "Event/ElecFeeChannel.h"
00011 #include "Event/ElecFeeCrate.h"
00012 #include "Event/ElecCrateHeader.h"
00013
00014 #include "Conventions/DetectorId.h"
00015 #include "Conventions/Detectors.h"
00016 #include "Conventions/Electronics.h"
00017
00018 #include <vector>
00019 #include <map>
00020
00021 #include <iostream>
00022
00023 using namespace DayaBay;
00024 using namespace std;
00025
00026 ElecHeaderCnv::ElecHeaderCnv(ISvcLocator* svc)
00027 : RootIOTypedCnv<PerElecHeader,ElecHeader>("PerElecHeader",
00028 classID(),svc)
00029 {
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 m_savePulseData = true;
00040 m_saveChannelData = true;
00041 m_saveBoardData = true;
00042 m_saveEsumData = true;
00043
00044 char* pruneElecSimData = getenv("NUWA_PRUNEELECSIM");
00045 if (pruneElecSimData) {
00046 m_savePulseData = false;
00047 m_saveChannelData = false;
00048 m_saveBoardData = false;
00049 m_saveEsumData = false;
00050 }
00051
00052 }
00053
00054 ElecHeaderCnv::~ElecHeaderCnv()
00055 {
00056 }
00057
00058
00059
00060 StatusCode ElecHeaderCnv::PerToTran(const PerElecHeader& perobj,
00061 ElecHeader& tranobj)
00062 {
00063 StatusCode sc = HeaderObjectCnv::toTran(perobj,tranobj);
00064 if (sc.isFailure()) return sc;
00065
00066 MsgStream log(msgSvc(), "ElecHeaderCnv::PerToTran");
00067
00068 PerElecCrateHeader* perECH = perobj.crateHeader ;
00069 ElecCrateHeader* transECH = 0;
00070 if( perECH!=0 ) {
00071 transECH = convert(*perECH);
00072 transECH->setHeader( &tranobj );
00073 }
00074
00075
00076 PerElecPulseHeader* perEPH = perobj.pulseHeader ;
00077 ElecPulseHeader* transEPH = 0;
00078 if( perEPH!=0 ) {
00079 transEPH = convert(*perEPH);
00080 transEPH->setHeader( &tranobj );
00081 }
00082
00083 tranobj.setCrateHeader(transECH);
00084 tranobj.setPulseHeader(transEPH);
00085
00086 return StatusCode::SUCCESS;
00087 }
00088
00089
00090 StatusCode ElecHeaderCnv::TranToPer(const ElecHeader& tranobj,
00091 PerElecHeader& perobj)
00092 {
00093 MsgStream log(msgSvc(), "ElecHeaderCnv::TranToPer");
00094
00095 StatusCode sc = HeaderObjectCnv::toPer(tranobj,perobj);
00096 if (sc.isFailure()) return sc;
00097
00098
00099 if (perobj.crateHeader != 0 ) {
00100 delete perobj.crateHeader;
00101 }
00102 const ElecCrateHeader* transECH = tranobj.crateHeader() ;
00103 PerElecCrateHeader* perECH = 0;
00104 if (transECH != 0) {
00105 perECH = convert(*transECH);
00106 }
00107 perobj.crateHeader=perECH;
00108
00109
00110 if (perobj.pulseHeader != 0 ) {
00111 delete perobj.pulseHeader;
00112 }
00113 const ElecPulseHeader* transEPH = tranobj.pulseHeader() ;
00114 PerElecPulseHeader* perEPH = 0;
00115 if (transEPH != 0) {
00116 perEPH = convert(*transEPH);
00117 }
00118 perobj.pulseHeader=perEPH;
00119
00120 return StatusCode::SUCCESS;
00121 }
00122
00123 StatusCode ElecHeaderCnv::fillRepRefs(IOpaqueAddress*, DataObject* dobj)
00124 {
00125 MsgStream log(msgSvc(), "ElecHeaderCnv::fillRepRefs");
00126 ElecHeader* eh = dynamic_cast<ElecHeader*>(dobj);
00127
00128 log << MSG::DEBUG
00129 << "Saving links to " << eh->inputHeaders().size()
00130 << " input headers" << endreq;
00131
00132 StatusCode sc = HeaderObjectCnv::fillPer(m_rioSvc,*eh,*m_perOutObj);
00133 if (sc.isFailure()) {
00134 log << MSG::ERROR << "Failed to fill HeaderObject part" << endreq;
00135 return sc;
00136 }
00137
00138
00139 return sc;
00140 }
00141
00142 StatusCode ElecHeaderCnv::fillObjRefs(IOpaqueAddress*, DataObject* dobj)
00143 {
00144 MsgStream log(msgSvc(), "ElecHeaderCnv::fillObjRefs");
00145 HeaderObject* hobj = dynamic_cast<HeaderObject*>(dobj);
00146 StatusCode sc = HeaderObjectCnv::fillTran(m_rioSvc,*m_perInObj,*hobj);
00147 if (sc.isFailure()) {
00148 log << MSG::ERROR << "Failed to fill HeaderObject part" << endreq;
00149 return sc;
00150 }
00151
00152 log << MSG::DEBUG
00153 << "Restored links to " << hobj->inputHeaders().size()
00154 << " input headers" << endreq;
00155
00156
00157 return sc;
00158 }
00159
00160
00161
00162
00163 PerElecCrateHeader* ElecHeaderCnv::convert(const ElecCrateHeader& transCH){
00164 MsgStream log(msgSvc(), "ElecHeaderCnv");
00165
00166 PerElecCrateHeader::detCrateVec cratevec;
00167 const map<Detector,ElecCrate*>& in_cmap = transCH.crates();
00168 map<Detector,ElecCrate*>::const_iterator it, done = in_cmap.end() ;
00169 for (it = in_cmap.begin(); it != done; ++it ){
00170
00171 const ElecCrate* cr = it->second;
00172 PerElecCrate* pcr = convert(*cr);
00173 if(pcr!=0) {
00174 cratevec.push_back( pcr );
00175 } else {
00176 log<<MSG::ERROR<<"You are trying to save a null pointer of ElecCrate to file. Skipped."<<endreq;
00177 continue;
00178 }
00179 }
00180 return new PerElecCrateHeader(cratevec);
00181 }
00182
00183 PerElecCrate* ElecHeaderCnv::convert(const ElecCrate& transCrate){
00184 Detector det = transCrate.detector();
00185
00186 if(det.detectorId() == DetectorId::kUnknown){
00187 return 0;
00188 }else if( det.detectorId() != DetectorId::kRPC ){
00189 return convert( static_cast<const ElecFeeCrate&>(transCrate) );
00190 }else{
00191 return convert( static_cast<const ElecFecCrate&>(transCrate) );
00192 }
00193
00194 }
00195
00196 PerElecFeeCrate* ElecHeaderCnv::convert(const ElecFeeCrate& transFeeCrate){
00197
00198 short int det = (transFeeCrate.detector()).siteDetPackedData();
00199
00200
00201 map<PerElecCrate::ChannelId_type,PerElecFeeChannel*> chan;
00202 if(m_saveChannelData){
00203
00204 const map<FeeChannelId, ElecFeeChannel>& in_channels = transFeeCrate.channelData();
00205 map<FeeChannelId, ElecFeeChannel>::const_iterator it, done=in_channels.end();
00206 for( it = in_channels.begin() ; it != done ; ++it ){
00207 chan[(it->first).fullPackedData()] = convert( it->second ) ;
00208 }
00209 }
00210
00211
00212 std::map<PerElecCrate::BoardId_type,AnalogSignal> BrdEnergy;
00213
00214 std::map<PerElecCrate::BoardId_type,DigitalSignal> BrdnHit;
00215
00216 if(m_saveBoardData){
00217
00218 const map<FeeChannelId,AnalogSignal> in_energy = transFeeCrate.esum();
00219 map<FeeChannelId,AnalogSignal>::const_iterator eIt;
00220 for(eIt = in_energy.begin() ; eIt != in_energy.end() ; ++eIt){
00221 BrdEnergy[(eIt->first).fullPackedData()] = eIt->second;
00222 }
00223
00224 const map<FeeChannelId,DigitalSignal> in_nh = transFeeCrate.nhit();
00225 map<FeeChannelId,DigitalSignal>::const_iterator nIt;
00226 for(nIt = in_nh.begin() ; nIt != in_nh.end() ; ++nIt){
00227 BrdnHit[(nIt->first).fullPackedData()] = nIt->second;
00228 }
00229
00230 }
00231
00232
00233 AnalogSignal ues;
00234 AnalogSignal les;
00235 AnalogSignal tes;
00236 DigitalSignal des;
00237
00238 if(m_saveEsumData){
00239 ues = transFeeCrate.esumUpper();
00240 les = transFeeCrate.esumLower();
00241 tes = transFeeCrate.esumTotal();
00242 des = transFeeCrate.esumADC();
00243 }
00244
00245 return new PerElecFeeCrate(det,chan,BrdEnergy,BrdnHit,ues,les,tes,des);
00246 }
00247
00248 PerElecFecCrate* ElecHeaderCnv::convert(const ElecFecCrate& transFecCrate){
00249 return new PerElecFecCrate();
00250 }
00251
00252 PerElecFeeChannel* ElecHeaderCnv::convert(const ElecFeeChannel& in_ch){
00253 vector<int> hit = in_ch.hit();
00254 vector<int> adcHigh = in_ch.adcHigh();
00255 vector<int> adcLow = in_ch.adcLow();
00256 vector<int> tdc = in_ch.tdc();
00257 vector<double> energy = in_ch.energy();
00258 return new PerElecFeeChannel(hit,adcHigh,adcLow,tdc,energy);
00259 }
00260
00261 PerElecPulseHeader* ElecHeaderCnv::convert(const ElecPulseHeader& transPH){
00262 PerElecPulseHeader::detCollMap pulsemap;
00263 if(m_savePulseData){
00264 const map<Detector,ElecPulseCollection*>& in_pmap = transPH.pulseCollection();
00265 map<Detector,ElecPulseCollection*>::const_iterator it, done = in_pmap.end() ;
00266 for (it = in_pmap.begin(); it != done; ++it ){
00267 short int detId = (it->first).siteDetPackedData();
00268 const ElecPulseCollection* pls = it->second;
00269 pulsemap[detId] = convert(*pls);
00270 }
00271 }
00272 return new PerElecPulseHeader(pulsemap);
00273 }
00274
00275 PerElecPulseCollection* ElecHeaderCnv::convert(const ElecPulseCollection& transPCol){
00276 PerElecPulseCollection::PulseContainer out_pulses;
00277 ElecPulseCollection::PulseContainer in_pulses = transPCol.pulses();
00278 ElecPulseCollection::PulseContainer::iterator it;
00279
00280 for(it = in_pulses.begin(); it != in_pulses.end(); ++it){
00281 out_pulses.push_back( convert(**(it)) );
00282 }
00283
00284 short int det = (transPCol.detector()).siteDetPackedData();
00285 return new PerElecPulseCollection(det,out_pulses);
00286 }
00287
00288 PerElecPulse* ElecHeaderCnv::convert(const ElecPulse& transPulse){
00289 double out_t = transPulse.time();
00290 int out_cid = (transPulse.channelId()).fullPackedData();
00291 float out_amp = transPulse.amplitude();
00292 int out_type = transPulse.type();
00293
00294 return new PerElecPulse( out_t, out_cid, out_amp, out_type);
00295 }
00296
00297
00298
00299 ElecCrateHeader* ElecHeaderCnv::convert(const PerElecCrateHeader& perCH){
00300 MsgStream log(msgSvc(), "ElecHeaderCnv");
00301
00302 ElecCrateHeader *out_header = new ElecCrateHeader();
00303 std::vector<PerElecCrate*> cratevec = perCH.crates;
00304 std::vector<PerElecCrate*>::iterator it;
00305 for(it = cratevec.begin(); it != cratevec.end(); ++it){
00306 PerElecCrate *perCrate = *it;
00307 if(perCrate==0) {
00308 log<<MSG::ERROR<<"What? You got a zero pointer from file?"<<endreq;
00309 continue;
00310 }
00311 ElecCrate *transCrate = convert( *perCrate );
00312
00313 if( transCrate==0 ) {
00314 log<<MSG::ERROR<<"What? A null pointer for a ElecCrate?"<<endreq;
00315 continue;
00316 }
00317
00318 out_header->addCrate(transCrate);
00319 }
00320 return out_header;
00321 }
00322
00323 ElecPulseHeader* ElecHeaderCnv::convert(const PerElecPulseHeader& perPH){
00324 ElecPulseHeader *out_pulseH = new ElecPulseHeader();
00325 PerElecPulseHeader::detCollMap colmap = perPH.pulseCollections;
00326 PerElecPulseHeader::detCollMap::iterator it;
00327 for(it=colmap.begin();it!=colmap.end();++it){
00328 ElecPulseCollection *coll = convert( *(it->second));
00329 coll->setHeader(out_pulseH);
00330 Detector det(it->first);
00331 coll->setDetector(det);
00332 out_pulseH->addPulseCollection(coll);
00333 }
00334 return out_pulseH;
00335 }
00336
00337 ElecCrate* ElecHeaderCnv::convert(const PerElecCrate& perCrate){
00338 Detector det(perCrate.detId);
00339
00340 if(det.detectorId() == DetectorId::kUnknown){
00341 return 0;
00342 }else if( det.detectorId() != DetectorId::kRPC ){
00343 return convert( static_cast<const PerElecFeeCrate&>(perCrate) );
00344 }else{
00345 return convert( static_cast<const PerElecFecCrate&>(perCrate) );
00346 }
00347
00348 return 0;
00349 }
00350
00351 ElecFeeChannel* ElecHeaderCnv::convert(const PerElecFeeChannel& perChannel){
00352 ElecFeeChannel *outCh = new ElecFeeChannel();
00353 outCh->setHit(perChannel.nHit);
00354 outCh->setAdcHigh(perChannel.adcHigh);
00355 outCh->setAdcLow(perChannel.adcLow);
00356 outCh->setEnergy(perChannel.energy);
00357 outCh->setTdc(perChannel.tdc);
00358 return outCh;
00359 }
00360
00361 ElecFecCrate* ElecHeaderCnv::convert(const PerElecFecCrate& perFecCrate){
00362
00363 return 0;
00364 }
00365
00366 ElecFeeCrate* ElecHeaderCnv::convert(const PerElecFeeCrate& perFeeCrate){
00367 ElecFeeCrate *out_crate = new ElecFeeCrate( Detector(perFeeCrate.detId) , 0);
00368
00369
00370 map<PerElecCrate::ChannelId_type,PerElecFeeChannel*> chan = perFeeCrate.channels;
00371 map<PerElecCrate::ChannelId_type,PerElecFeeChannel*>::iterator chIt;
00372 for(chIt=chan.begin();chIt!=chan.end();++chIt){
00373 FeeChannelId feeId(chIt->first);
00374 PerElecFeeChannel* feeCh = chIt->second;
00375 out_crate->channel(feeId) = *convert( *feeCh );
00376 }
00377
00378
00379 std::map<PerElecCrate::BoardId_type,DigitalSignal> BrdnHit = perFeeCrate.boardNHit;
00380 std::map<PerElecCrate::BoardId_type,DigitalSignal>::iterator nhIt;
00381 for(nhIt=BrdnHit.begin();nhIt!=BrdnHit.end();++nhIt){
00382 FeeChannelId feeId(nhIt->first);
00383 out_crate->nhitSignal(feeId) = nhIt->second;
00384 }
00385
00386
00387 std::map<PerElecCrate::BoardId_type,AnalogSignal> BrdeSum = perFeeCrate.boardEnergy;
00388 std::map<PerElecCrate::BoardId_type,AnalogSignal>::iterator esIt;
00389 for(esIt=BrdeSum.begin();esIt!=BrdeSum.end();++esIt){
00390 FeeChannelId feeId(esIt->first);
00391 out_crate->esumSignal(feeId) = esIt->second;
00392 }
00393
00394 out_crate->setEsumTotal(perFeeCrate.totalESum);
00395 out_crate->setEsumUpper(perFeeCrate.upperESum);
00396 out_crate->setEsumLower(perFeeCrate.lowerESum);
00397 out_crate->setEsumADC(perFeeCrate.digitalESum);
00398
00399 return out_crate;
00400 }
00401
00402 ElecPulseCollection* ElecHeaderCnv::convert(const PerElecPulseCollection& perEPC){
00403 ElecPulseCollection* out_pcol = new ElecPulseCollection();
00404 ElecPulseCollection::PulseContainer out_pulseCon;
00405 const std::vector<PerElecPulse*>& in_pulseCon = perEPC.pulses;
00406 std::vector<PerElecPulse*>::const_iterator it;
00407 for(it=in_pulseCon.begin();it!=in_pulseCon.end();++it){
00408 ElecPulse *ep = convert(**it);
00409 ep->setPc(out_pcol);
00410 out_pulseCon.push_back(ep);
00411 }
00412 out_pcol->setPulses(out_pulseCon);
00413 return out_pcol;
00414 }
00415
00416 ElecPulse* ElecHeaderCnv::convert(const PerElecPulse& perEP){
00417 ElecPulse *out_pulse = new ElecPulse();
00418 out_pulse->setTime(perEP.time);
00419 FeeChannelId feeId(perEP.channelId);
00420 out_pulse->setChannelId(feeId);
00421 out_pulse->setAmplitude(perEP.amplitude);
00422 out_pulse->setType(perEP.type);
00423
00424 return out_pulse;
00425 }