/search.css" rel="stylesheet" type="text/css"/> /search.js">
00001 #include "RecRpcEventCnv.h" 00002 #include "PerBaseEvent/HeaderObjectCnv.h" 00003 #include "Conventions/Detectors.h" 00004 #include <algorithm> 00005 00006 using namespace DayaBay; 00007 00008 RecRpcEventCnv::RecRpcEventCnv(ISvcLocator* svc) 00009 : RootIOTypedCnv<PerRecRpcHeader,RecRpcHeader>("PerRecRpcHeader", 00010 classID(),svc) 00011 { 00012 } 00013 00014 RecRpcEventCnv::~RecRpcEventCnv() 00015 { 00016 } 00017 00018 00019 StatusCode RecRpcEventCnv::PerToTran(const PerRecRpcHeader& perobj, 00020 RecRpcHeader& tranobj) 00021 { 00022 MsgStream log(msgSvc(), "RecRpcEventCnv::PerToTran"); 00023 StatusCode sc = HeaderObjectCnv::toTran(perobj, tranobj); 00024 if(sc.isFailure()) return sc; 00025 00026 RecRpcTrigger& 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.setTriggerNumber( perobj.triggerNumber ); 00032 recTr.setTriggerType(Trigger::TriggerType_t (perobj.triggerType)); 00033 00034 timespec value = {perobj.triggerTimeSec, perobj.triggerTimeNanoSec}; 00035 TimeStamp tstamp(value); 00036 recTr.setTriggerTime(tstamp); 00037 00038 recTr.setEventType(perobj.eventType); 00039 00040 for ( int i = 0; i < perobj.nClusters; ++i ) { 00041 const PerRecRpcHeader::RpcCluster& per = perobj.clusters.at(i); 00042 RecRpcCluster* tran = new RecRpcCluster( 00043 CLHEP::HepLorentzVector(per.x, per.y, per.z, per.t), 00044 ReconStatus::ReconStatus_t(per.status), 00045 per.quality, 00046 RecRpcCluster::ClusterType(per.type)); 00047 tran->setMaxHitsInLayer(per.maxHitsInLayer); 00048 tran->setIs4of4(per.is4of4); 00049 recTr.addCluster(tran); 00050 } 00051 00052 const std::vector<const RecRpcCluster*>& clusters = recTr.clusters(); 00053 for ( int i = 0; i < perobj.nTracks; ++i ) { 00054 const PerRecRpcHeader::RpcTrack& per = perobj.tracks.at(i); 00055 recTr.addTrack(RecRpcTrack(clusters[per.start], clusters[per.end])); 00056 } 00057 00058 return StatusCode::SUCCESS; 00059 } 00060 00061 StatusCode RecRpcEventCnv::TranToPer(const RecRpcHeader& tranobj, 00062 PerRecRpcHeader& perobj) 00063 { 00064 MsgStream log(msgSvc(), "RecRpcEventCnv::TranToPer"); 00065 StatusCode sc = HeaderObjectCnv::toPer(tranobj,perobj); 00066 if (sc.isFailure()) return sc; 00067 const RecRpcTrigger& recTr = tranobj.recTrigger(); 00068 00069 perobj.site = recTr.detector().site(); 00070 perobj.detector = recTr.detector().detectorId(); 00071 perobj.triggerNumber = recTr.triggerNumber(); 00072 perobj.triggerType = recTr.triggerType(); 00073 perobj.triggerTimeSec = recTr.triggerTime().GetSec(); 00074 perobj.triggerTimeNanoSec = recTr.triggerTime().GetNanoSec(); 00075 00076 perobj.combinationType = recTr.combinationType(); 00077 perobj.eventType = recTr.eventType(); 00078 00079 perobj.reset(recTr.numCluster(), recTr.numTrack()); 00080 00081 const std::vector<const RecRpcCluster*>& clusters = recTr.clusters(); 00082 for ( int i = 0; i < perobj.nClusters; ++i ) { 00083 const RecRpcCluster* iCluster = clusters.at(i); 00084 perobj.clusters[i].status = iCluster->status(); 00085 perobj.clusters[i].type = iCluster->type(); 00086 perobj.clusters[i].maxHitsInLayer = iCluster->maxHitsInLayer(); 00087 perobj.clusters[i].is4of4 = iCluster->is4of4(); 00088 perobj.clusters[i].x = iCluster->position().x(); 00089 perobj.clusters[i].y = iCluster->position().y(); 00090 perobj.clusters[i].z = iCluster->position().z(); 00091 perobj.clusters[i].t = iCluster->position().t(); 00092 perobj.clusters[i].quality = iCluster->quality(); 00093 } 00094 00095 std::vector<const RecRpcCluster*>::const_iterator begin = clusters.begin(); 00096 std::vector<const RecRpcCluster*>::const_iterator end = clusters.end(); 00097 const std::vector<RecRpcTrack>& tracks = recTr.tracks(); 00098 for ( int i = 0; i < perobj.nTracks; ++i ) { 00099 perobj.tracks[i].start = std::find(begin, end, tracks[i].start()) - begin; 00100 perobj.tracks[i].end = std::find(begin, end, tracks[i].end()) - begin; 00101 } 00102 00103 return StatusCode::SUCCESS; 00104 } 00105 00106 StatusCode RecRpcEventCnv::fillRepRefs(IOpaqueAddress*, DataObject* tobj) { 00107 00108 MsgStream log(msgSvc(), "RecRpcEventCnv::fillRepRefs"); 00109 RecRpcHeader* rh = dynamic_cast<RecRpcHeader*>(tobj); 00110 00111 log << MSG::DEBUG 00112 << "Saving links to " << rh->inputHeaders().size() 00113 << " input headers" << endreq; 00114 00115 StatusCode sc = HeaderObjectCnv::fillPer(m_rioSvc,*rh,*m_perOutObj); 00116 00117 if (sc.isFailure()) { 00118 log << MSG::ERROR << "Failed to fill HeaderObject part" << endreq; 00119 return sc; 00120 } 00121 00122 // ... fill RecRpcHeader part... 00123 return sc; 00124 } 00125 00126 StatusCode RecRpcEventCnv::fillObjRefs(IOpaqueAddress*, DataObject* tobj) { 00127 //MsgStream log(msgSvc(), "RecRpcEventCnv::fillObjRefs"); 00128 MsgStream log(msgSvc(), "fillObjRefs"); 00129 HeaderObject* hobj = dynamic_cast<HeaderObject*>(tobj); 00130 00131 StatusCode sc = HeaderObjectCnv::fillTran(m_rioSvc,*m_perInObj,*hobj); 00132 if (sc.isFailure()) { 00133 log << MSG::ERROR << "Failed to fill HeaderObject part" << endreq; 00134 return sc; 00135 } 00136 00137 log << MSG::DEBUG 00138 << "Restored links to " << hobj->inputHeaders().size() 00139 << " input headers" << endreq; 00140 00141 // ... fill RecRpcHeader part... 00142 return sc; 00143 } 00144