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
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
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
00071 for(unsigned int hitIdx=0; hitIdx<perobj.nHitsAD_calib; hitIdx++){
00072 AdPmtSensor pmtId(0,
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
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
00092 if(out_channel){
00093 out_channel->setTime(timeArr);
00094 out_channel->setCharge(chargeArr);
00095 }
00096 }else if(detector.isWaterShield()){
00097
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
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
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
00128 readout = 0;
00129 }
00130
00131 tranobj.setCalibReadout( readout );
00132 }else{
00133
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
00149 perobj.clear();
00150
00151 const CalibReadout* readout = tranobj.calibReadout();
00152 if(!readout){
00153 return StatusCode::SUCCESS;
00154 }
00155
00156
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
00165 if(readout->detector().detectorId() == DetectorId::kUnknown){
00166
00167 ;
00168 }else if( readout->detector().isAD() || readout->detector().isWaterShield() ){
00169
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
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
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
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
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
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
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
00264 return sc;
00265 }