00001 #include "RecEventCnv.h"
00002 #include "PerBaseEvent/HeaderObjectCnv.h"
00003 #include "Conventions/Electronics.h"
00004
00005 using namespace DayaBay;
00006 using namespace std;
00007
00008 RecHeaderCnv::RecHeaderCnv(ISvcLocator* svc)
00009 : RootIOTypedCnv<PerRecHeader,RecHeader>("PerRecHeader",
00010 classID(),svc)
00011 {
00012 }
00013
00014 RecHeaderCnv::~RecHeaderCnv()
00015 {
00016 }
00017
00018
00019 StatusCode RecHeaderCnv::PerToTran(const PerRecHeader& perobj,
00020 DayaBay::RecHeader& tranobj)
00021 {
00022 MsgStream log(msgSvc(), "RecHeaderCnv::PerToTran");
00023 StatusCode sc = HeaderObjectCnv::toTran(perobj, tranobj);
00024 if(sc.isFailure()) return sc;
00025
00026 DayaBay::RecTrigger& recTr = tranobj.recTrigger();
00027 recTr.setHeader(&tranobj);
00028 Detector det((Site::Site_t)perobj.site,
00029 (DetectorId::DetectorId_t)perobj.detector);
00030 recTr.setDetector(det);
00031 recTr.setTriggerType(Trigger::TriggerType_t (perobj.triggerType));
00032 recTr.setTriggerNumber( perobj.triggerNumber );
00033
00034 timespec value = {perobj.triggerTimeSec, perobj.triggerTimeNanoSec};
00035 TimeStamp tstamp(value);
00036 recTr.setTriggerTime(tstamp);
00037
00038 recTr.setEnergy( perobj.energy );
00039 recTr.setPosition( CLHEP::HepLorentzVector(perobj.x, perobj.y,
00040 perobj.z, perobj.t) );
00041 recTr.setPosition( CLHEP::HepLorentzVector(perobj.dx, perobj.dy,
00042 perobj.dz, perobj.dt) );
00043 recTr.setEnergyStatus( perobj.energyStatus );
00044 recTr.setPositionStatus( perobj.positionStatus );
00045 recTr.setDirectionStatus( perobj.directionStatus );
00046 recTr.setEnergyQuality( perobj.energyQuality );
00047 recTr.setPositionQuality( perobj.positionQuality );
00048 recTr.setDirectionQuality( perobj.directionQuality );
00049 if(perobj.errorMatrixDim>0){
00050 CLHEP::HepMatrix errMatrix(perobj.errorMatrixDim,
00051 perobj.errorMatrixDim,
00052 0);
00053 for(int row=1; row<perobj.errorMatrixDim; row++){
00054 for(int col=1; col<perobj.errorMatrixDim; col++){
00055 int rcIndex = (row-1)*perobj.errorMatrixDim + (col-1);
00056 errMatrix(row,col) = perobj.errorMatrix[rcIndex];
00057 }
00058 }
00059 recTr.setErrorMatrix( errMatrix );
00060 }else{
00061 recTr.setErrorMatrix( CLHEP::HepMatrix() );
00062 }
00063 return StatusCode::SUCCESS;
00064 }
00065
00066 StatusCode RecHeaderCnv::TranToPer(const DayaBay::RecHeader& tranobj,
00067 PerRecHeader& perobj)
00068 {
00069 MsgStream log(msgSvc(), "RecHeaderCnv::TranToPer");
00070 StatusCode sc = HeaderObjectCnv::toPer(tranobj,perobj);
00071 if (sc.isFailure()) return sc;
00072 const DayaBay::RecTrigger& recTr = tranobj.recTrigger();
00073
00074 perobj.site = (recTr.detector()).site();
00075 perobj.detector = (recTr.detector()).detectorId();
00076 perobj.triggerType = recTr.triggerType();
00077 perobj.triggerNumber = recTr.triggerNumber();
00078 perobj.triggerTimeSec = recTr.triggerTime().GetSec();
00079 perobj.triggerTimeNanoSec = recTr.triggerTime().GetNanoSec();
00080
00081 perobj.energy = recTr.energy();
00082 perobj.x = recTr.position().x();
00083 perobj.y = recTr.position().y();
00084 perobj.z = recTr.position().z();
00085 perobj.t = recTr.position().t();
00086 perobj.dx = recTr.position().x();
00087 perobj.dy = recTr.position().y();
00088 perobj.dz = recTr.position().z();
00089 perobj.dt = recTr.position().t();
00090 perobj.energyStatus = recTr.energyStatus();
00091 perobj.positionStatus = recTr.positionStatus();
00092 perobj.directionStatus = recTr.directionStatus();
00093 perobj.energyQuality = recTr.energyQuality();
00094 perobj.positionQuality = recTr.positionQuality();
00095 perobj.directionQuality = recTr.directionQuality();
00096 perobj.errorMatrixDim = recTr.errorMatrix().num_row();
00097 perobj.errorMatrix.resize(perobj.errorMatrixDim*perobj.errorMatrixDim);
00098 if(perobj.errorMatrixDim>0){
00099 for(int row=1; row<perobj.errorMatrixDim; row++){
00100 for(int col=1; col<perobj.errorMatrixDim; col++){
00101 int rcIndex = (row-1)*perobj.errorMatrixDim + (col-1);
00102 perobj.errorMatrix[rcIndex] = recTr.errorMatrix()(row,col);
00103 }
00104 }
00105 }
00106
00107 return StatusCode::SUCCESS;
00108 }
00109
00110 StatusCode RecHeaderCnv::fillRepRefs(IOpaqueAddress*, DataObject* dobj) {
00111
00112 MsgStream log(msgSvc(), "RecHeaderCnv::fillRepRefs");
00113
00114 RecHeader* rh = dynamic_cast<RecHeader*>(dobj);
00115
00116 log << MSG::DEBUG
00117 << "Saving links to " << rh->inputHeaders().size()
00118 << " input headers" << endreq;
00119
00120 StatusCode sc = HeaderObjectCnv::fillPer(m_rioSvc,*rh,*m_perOutObj);
00121
00122 if (sc.isFailure()) {
00123 log << MSG::ERROR << "Failed to fill HeaderObject part" << endreq;
00124 return sc;
00125 }
00126
00127
00128 return sc;
00129 }
00130
00131 StatusCode RecHeaderCnv::fillObjRefs(IOpaqueAddress*, DataObject* dobj) {
00132
00133 MsgStream log(msgSvc(), "fillObjRefs");
00134 HeaderObject* hobj = dynamic_cast<HeaderObject*>(dobj);
00135
00136 StatusCode sc = HeaderObjectCnv::fillTran(m_rioSvc,*m_perInObj,*hobj);
00137 if (sc.isFailure()) {
00138 log << MSG::ERROR << "Failed to fill HeaderObject part" << endreq;
00139 return sc;
00140 }
00141
00142 log << MSG::DEBUG
00143 << "Restored links to " << hobj->inputHeaders().size()
00144 << " input headers" << endreq;
00145
00146
00147 return sc;
00148 }
00149