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

In This Package:

ElecHeaderCnv.cc

Go to the documentation of this file.
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   // FIXME: Converters do not have properties
00031   //declareProperty("SaveChannelData",m_saveChannelData=true,
00032   //                "Save channel-level simulation data in output");
00033   //declareProperty("SaveBoardData",m_saveBoardData=true,
00034   //                "Save board-level simulation data in output");
00035 
00036   // Helper variables to allow control of writing electronics
00037   // simulation data
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 // From Persistent to Transient
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     // convert ElecPulseHeader to PerElecPulseHeader
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 // From Transient to Persistent
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     // convert PerElecCrateHeader to PerElecCrateHeader;
00099     if (perobj.crateHeader != 0 ) {
00100       delete perobj.crateHeader;   // delete the old one
00101     }
00102     const ElecCrateHeader* transECH = tranobj.crateHeader() ;
00103     PerElecCrateHeader* perECH = 0;
00104     if (transECH != 0) {
00105       perECH = convert(*transECH); // create a new one
00106     }
00107     perobj.crateHeader=perECH;
00108     
00109     // convert ElecPulseHeader to PerElecPulseHeader
00110     if (perobj.pulseHeader != 0 ) {
00111       delete perobj.pulseHeader;   // delete the old one
00112     }
00113     const ElecPulseHeader* transEPH = tranobj.pulseHeader() ;
00114     PerElecPulseHeader* perEPH = 0;
00115     if (transEPH != 0) {
00116       perEPH = convert(*transEPH); // create a new one
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     // ... fill ElecHeader part...
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     // ... fill ElecHeader part...
00157     return sc;
00158 }
00159 
00160 
00161 // Convert Transient to Persistant
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     //short int detId = (it->first).siteDetPackedData();
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   // get detector Id
00198   short int det = (transFeeCrate.detector()).siteDetPackedData();
00199   
00200   // make channel map
00201   map<PerElecCrate::ChannelId_type,PerElecFeeChannel*> chan;
00202   if(m_saveChannelData){
00203     // Save channel data if requested
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   // make board energy map
00212   std::map<PerElecCrate::BoardId_type,AnalogSignal> BrdEnergy;
00213   // make board nHit map
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   // make the esum vectors
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   // PerSimHit* simhit = ...
00294   return new PerElecPulse( out_t, out_cid, out_amp, out_type);
00295 }
00296 
00297 // Convert Persistant to Transient
00298 
00299 ElecCrateHeader* ElecHeaderCnv::convert(const PerElecCrateHeader& perCH){
00300   MsgStream log(msgSvc(), "ElecHeaderCnv");
00301 
00302   ElecCrateHeader *out_header = new ElecCrateHeader(); // make header to return;
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;  // drop this turn
00310     }
00311     ElecCrate *transCrate = convert( *perCrate );
00312     // wangzhe
00313     if( transCrate==0 ) {
00314       log<<MSG::ERROR<<"What? A null pointer for a ElecCrate?"<<endreq;
00315       continue;  // drop this turn
00316     }
00317     // wz
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   // get rid of unused variable warning
00363   return 0;
00364 }
00365 
00366 ElecFeeCrate* ElecHeaderCnv::convert(const PerElecFeeCrate& perFeeCrate){
00367   ElecFeeCrate *out_crate = new  ElecFeeCrate( Detector(perFeeCrate.detId) , 0);
00368   
00369   // convert channels
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   // convert NHit
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   // convert ESum
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   //out_pulse->setAncestor()
00424   return out_pulse;
00425 }
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 20:32:53 2011 for PerElecEvent by doxygen 1.4.7