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

In This Package:

CalibReadoutEventCnv.cc

Go to the documentation of this file.
00001 #include "CalibReadoutEventCnv.h"
00002 #include "PerBaseEvent/HeaderObjectCnv.h"
00003 #include "Conventions/Electronics.h"
00004 #include "Context/TimeStamp.h"
00005 
00006 #include <vector>
00007 
00008 using namespace DayaBay;
00009 using namespace std;
00010 
00011 CalibReadoutHeaderCnv::CalibReadoutHeaderCnv(ISvcLocator* svc)
00012       : RootIOTypedCnv<PerCalibReadoutHeader,CalibReadoutHeader>(
00013                                                        "PerCalibReadoutHeader",
00014                                                        classID(),svc)
00015 {
00016 }
00017 
00018 
00019 CalibReadoutHeaderCnv::~CalibReadoutHeaderCnv()
00020 {
00021 }
00022 
00023 StatusCode CalibReadoutHeaderCnv::PerToTran(const PerCalibReadoutHeader& perobj,
00024                                           DayaBay::CalibReadoutHeader& tranobj)
00025 {
00026   MsgStream log(msgSvc(), "CalibReadoutHeaderCnv::PerToTran");
00027   StatusCode sc = HeaderObjectCnv::toTran(perobj,tranobj);
00028   if (sc.isFailure()) return sc;
00029 
00030   delete tranobj.calibReadout();
00031   if(perobj.site){
00032     CalibReadout* readout = 0;
00033     Detector detector(Site::Site_t(perobj.site),
00034                       DetectorId::DetectorId_t(perobj.detector));
00035     if(detector.isAD() || detector.isWaterShield()){ 
00036       CalibReadoutPmtCrate *out_crate = new CalibReadoutPmtCrate();
00037       readout = out_crate;
00038       out_crate->setDetector(detector);
00039       out_crate->setTriggerType( Trigger::TriggerType_t(perobj.triggerType) );
00040       out_crate->setTriggerNumber( perobj.eventNumber );
00041       timespec value = {perobj.triggerTimeSec,perobj.triggerTimeNanoSec};
00042       TimeStamp tstamp(value);
00043       out_crate->setTriggerTime(tstamp);
00044       
00045       CalibReadoutPmtCrate::PmtChannelReadouts out_channels;
00046       
00047       CalibReadoutPmtChannel* out_channel = 0;
00048       vector<double> timeArr;
00049       vector<double> chargeArr;
00050       if(detector.isAD()){
00051         // Fill AD hits
00052         for(unsigned int hitIdx=0; hitIdx<perobj.nHitsAD; hitIdx++){
00053           AdPmtSensor pmtId(perobj.ring[hitIdx], perobj.column[hitIdx],
00054                             detector.site(),detector.detectorId());
00055           if(!out_channel || (pmtId!=out_channel->pmtSensorId())){
00056             if(out_channel){
00057               out_channel->setTime(timeArr);
00058               out_channel->setCharge(chargeArr);
00059             }
00060             // create channel
00061             timeArr.clear();
00062             chargeArr.clear();
00063             CalibReadoutPmtChannel cur_channel(pmtId,out_crate);
00064             out_channels.push_back(cur_channel);
00065             out_channel=&(out_channels[out_channels.size()-1]);
00066           }
00067           timeArr.push_back(perobj.timeAD[hitIdx]);
00068           chargeArr.push_back(perobj.chargeAD[hitIdx]);
00069         }
00070         // Catch 2-inch calibration PMTs
00071         for(unsigned int hitIdx=0; hitIdx<perobj.nHitsAD_calib; hitIdx++){
00072           AdPmtSensor pmtId(0/*ring==0 for calib PMTs*/, 
00073                             perobj.topOrBottom[hitIdx] 
00074                             + 2*(perobj.acuColumn[hitIdx]-1),
00075                             detector.site(),detector.detectorId());
00076           if(!out_channel || (pmtId!=out_channel->pmtSensorId())){
00077             if(out_channel){
00078               out_channel->setTime(timeArr);
00079               out_channel->setCharge(chargeArr);
00080             }
00081             // create channel
00082             timeArr.clear();
00083             chargeArr.clear();
00084             CalibReadoutPmtChannel cur_channel(pmtId,out_crate);
00085             out_channels.push_back(cur_channel);
00086             out_channel=&(out_channels[out_channels.size()-1]);
00087           }
00088           timeArr.push_back(perobj.timeAD_calib[hitIdx]);
00089           chargeArr.push_back(perobj.chargeAD_calib[hitIdx]);
00090         }
00091         // Catch last channel
00092         if(out_channel){
00093           out_channel->setTime(timeArr);
00094           out_channel->setCharge(chargeArr);
00095         }
00096       }else if(detector.isWaterShield()){
00097         // Fill Water Pool hits
00098         for(unsigned int hitIdx=0; hitIdx<perobj.nHitsPool; hitIdx++){
00099           PoolPmtSensor pmtId(perobj.wallNumber[hitIdx], 
00100                               perobj.wallSpot[hitIdx],
00101                               perobj.inwardFacing[hitIdx],
00102                               detector.site(),detector.detectorId());
00103           if(!out_channel || (pmtId!=out_channel->pmtSensorId())){
00104             if(out_channel){
00105               out_channel->setTime(timeArr);
00106               out_channel->setCharge(chargeArr);
00107             }
00108             // create channel
00109             timeArr.clear();
00110             chargeArr.clear();
00111             CalibReadoutPmtChannel cur_channel(pmtId,out_crate);
00112             out_channels.push_back(cur_channel);
00113             out_channel=&(out_channels[out_channels.size()-1]);
00114           }
00115           timeArr.push_back(perobj.timePool[hitIdx]);
00116           chargeArr.push_back(perobj.chargePool[hitIdx]);
00117         }
00118         // Catch last channel
00119         if(out_channel){
00120           out_channel->setTime(timeArr);
00121           out_channel->setCharge(chargeArr);
00122         }
00123       }
00124       out_crate->setChannelReadout(out_channels);
00125       out_crate->setHeader( &tranobj );
00126     }else if(detector.detectorId() == DetectorId::kRPC){
00127       // FIXME: Add RPC here
00128       readout = 0;
00129     }
00130 
00131     tranobj.setCalibReadout( readout );
00132   }else{
00133     // Header has no readout
00134     tranobj.setCalibReadout(0);
00135   }
00136 
00137   return StatusCode::SUCCESS;
00138 }                                       
00139 
00140 StatusCode CalibReadoutHeaderCnv::TranToPer(
00141                                     const DayaBay::CalibReadoutHeader& tranobj,
00142                                     PerCalibReadoutHeader& perobj)
00143 {
00144   MsgStream log(msgSvc(), "CalibReadoutHeaderCnv::TranToPer");
00145   StatusCode sc = HeaderObjectCnv::toPer(tranobj,perobj);
00146   if (sc.isFailure()) return sc;
00147 
00148   // Clear persistent object
00149   perobj.clear();
00150 
00151   const CalibReadout* readout = tranobj.calibReadout();
00152   if(!readout){
00153     return StatusCode::SUCCESS;
00154   }
00155   
00156   // Convert trigger information
00157   perobj.site = (unsigned int)(readout->detector().site());
00158   perobj.detector = (unsigned int)(readout->detector().detectorId());
00159   perobj.eventNumber = readout->triggerNumber();
00160   perobj.triggerType = readout->triggerType();
00161   perobj.triggerTimeSec =readout->triggerTime().GetSec();
00162   perobj.triggerTimeNanoSec = readout->triggerTime().GetNanoSec();
00163   
00164   // Convert hit information
00165   if(readout->detector().detectorId() == DetectorId::kUnknown){
00166     // Unknown detector, skip
00167     ; 
00168   }else if( readout->detector().isAD() || readout->detector().isWaterShield() ){
00169     // PMT data conversion
00170     const CalibReadoutPmtCrate& pmtCrate = 
00171       dynamic_cast<const CalibReadoutPmtCrate&>(*readout);
00172     const CalibReadoutPmtCrate::PmtChannelReadouts& chReadouts 
00173       = pmtCrate.channelReadout();
00174     CalibReadoutPmtCrate::PmtChannelReadouts::const_iterator channelIter,
00175       channelDone=chReadouts.end();
00176     if(readout->detector().isAD()){
00177       // Loop over AD hits
00178       for(channelIter=chReadouts.begin();channelIter!=channelDone;
00179           ++channelIter){
00180         const CalibReadoutPmtChannel& channel = *channelIter;
00181         AdPmtSensor pmtId(channel.pmtSensorId().fullPackedData());
00182         unsigned int nHits = channel.size();
00183         if(pmtId.ring()==0){
00184           // Catch 2inch calibration PMTs, save separately
00185           for(unsigned int hitIdx=0; hitIdx<nHits; hitIdx++){
00186             perobj.timeAD_calib.push_back( channel.time(hitIdx) );
00187             perobj.chargeAD_calib.push_back( channel.charge(hitIdx) );
00188             perobj.hitCountAD_calib.push_back( hitIdx );
00189             perobj.topOrBottom.push_back( ((pmtId.column()+1)%2) + 1 );
00190             perobj.acuColumn.push_back( (pmtId.column()+1)/2 );
00191             perobj.nHitsAD_calib++;
00192           }
00193         }else{
00194           // 8inch AD PMT
00195           for(unsigned int hitIdx=0; hitIdx<nHits; hitIdx++){
00196             perobj.timeAD.push_back( channel.time(hitIdx) );
00197             perobj.chargeAD.push_back( channel.charge(hitIdx) );
00198             perobj.hitCountAD.push_back( hitIdx );
00199             perobj.ring.push_back( pmtId.ring() );
00200             perobj.column.push_back( pmtId.column() );
00201             perobj.nHitsAD++;
00202           }       
00203         }
00204       }
00205     }else if(readout->detector().isWaterShield()){
00206       // Loop over Water Pool hits
00207       for(channelIter=chReadouts.begin();channelIter!=channelDone;
00208           ++channelIter){
00209         const CalibReadoutPmtChannel& channel = *channelIter;
00210         PoolPmtSensor pmtId(channel.pmtSensorId().fullPackedData());
00211         unsigned int nHits = channel.size();
00212         for(unsigned int hitIdx=0; hitIdx<nHits; hitIdx++){
00213           perobj.timePool.push_back( channel.time(hitIdx) );
00214           perobj.chargePool.push_back( channel.charge(hitIdx) );
00215           perobj.hitCountPool.push_back( hitIdx );
00216           perobj.wallNumber.push_back( pmtId.wallNumber() );
00217           perobj.wallSpot.push_back( pmtId.wallSpot() );
00218           perobj.inwardFacing.push_back( pmtId.inwardFacing() );
00219           perobj.nHitsPool++;
00220         }
00221       }
00222     }
00223   }else{
00224     // RPC data conversion
00225   }
00226 
00227   return StatusCode::SUCCESS;
00228 }
00229 
00230 StatusCode CalibReadoutHeaderCnv::fillRepRefs(IOpaqueAddress*, DataObject* dobj)
00231 {
00232     MsgStream log(msgSvc(), "CalibReadoutHeaderCnv::fillRepRefs");
00233     CalibReadoutHeader* rh = dynamic_cast<CalibReadoutHeader*>(dobj);
00234 
00235     log << MSG::DEBUG
00236         << "Saving links to " << rh->inputHeaders().size() 
00237         << " input headers" << endreq;
00238 
00239     StatusCode sc = HeaderObjectCnv::fillPer(m_rioSvc,*rh,*m_perOutObj);
00240     if (sc.isFailure()) {
00241         log << MSG::ERROR << "Failed to fill HeaderObject part" << endreq;
00242         return sc;
00243     }
00244 
00245     // ... fill CalibReadoutHeader part...
00246     return sc;
00247 }
00248 
00249 StatusCode CalibReadoutHeaderCnv::fillObjRefs(IOpaqueAddress*, DataObject* dobj)
00250 {
00251     MsgStream log(msgSvc(), "CalibReadoutHeaderCnv::fillObjRefs");
00252     HeaderObject* hobj = dynamic_cast<HeaderObject*>(dobj);
00253     StatusCode sc = HeaderObjectCnv::fillTran(m_rioSvc,*m_perInObj,*hobj);
00254     if (sc.isFailure()) {
00255         log << MSG::ERROR << "Failed to fill HeaderObject part" << endreq;
00256         return sc;
00257     }
00258 
00259     log << MSG::DEBUG
00260         << "Restored links to " << hobj->inputHeaders().size() 
00261         << " input headers" << endreq;
00262 
00263     // ... fill CalibReadoutHeader part...
00264     return sc;
00265 }
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 20:23:44 2011 for PerCalibReadoutEvent by doxygen 1.4.7