00001 #ifndef RecEvTimeCnv_CXX 00002 #define RecEvTimeCnv_CXX 1 00003 00004 #include "GaudiKernel/MsgStream.h" 00005 #include "GaudiKernel/DataObject.h" 00006 #include "GaudiKernel/ObjectVector.h" 00007 00008 #include "TClonesArray.h" 00009 00010 #include "EventModel/EventModel.h" 00011 #include "EvTimeEvent/RecEsTime.h" 00012 #include "ReconEvent/ReconEvent.h" 00013 00014 //#include "RootEventData/TMucTrack.h" // standard root object 00015 #include "RootEventData/TRecEvTime.h" // standard root object 00016 //#include "RootEventData/TDstEvent.h" 00017 #include "RootEventData/TRecTrackEvent.h" 00018 00019 #include "RootCnvSvc/Rec/RecTrackCnv.h" 00020 #include "RootCnvSvc/Rec/RecEvTimeCnv.h" 00021 #include "RootCnvSvc/RootAddress.h" 00022 00023 #include <vector> 00024 00025 using namespace std; 00026 00027 // Instantiation of a static factory class used by clients to create 00028 // instances of this service 00029 //static CnvFactory<RecEvTimeCnv> s_factory; 00030 //const ICnvFactory& RecEvTimeCnvFactory = s_factory; 00031 00032 RecEvTimeCnv::RecEvTimeCnv(ISvcLocator* svc) 00033 : RootEventBaseCnv(classID(), svc) 00034 { 00035 00036 // Here we associate this converter with the /Event path on the TDS. 00037 MsgStream log(msgSvc(), "RecEvTimeCnv"); 00038 //log << MSG::DEBUG << "Constructor called for " << objType() << endreq; 00039 //m_rootTreename ="Rec"; 00040 m_rootBranchname ="m_recEvTimeCol"; 00041 // declareObject(EventModel::Recon::EvTimeCol, objType(), m_rootTreename, m_rootBranchname); 00042 m_adresses.push_back(&m_recEvTimeCol); 00043 m_recEvTimeCol=0; 00044 } 00045 00046 StatusCode RecEvTimeCnv::TObjectToDataObject(DataObject*& refpObject) { 00047 // creation of TDS object from root object 00048 MsgStream log(msgSvc(), "RecEvTimeCnv"); 00049 log << MSG::DEBUG << "RecEvTimeCnv::TObjectToDataObject" << endreq; 00050 StatusCode sc=StatusCode::SUCCESS; 00051 00052 // create the TDS location for the MucTrack Collection 00053 RecEsTimeCol* evTimeTdsCol = new RecEsTimeCol; 00054 refpObject=evTimeTdsCol; 00055 // now convert 00056 if (!m_recEvTimeCol) return sc; 00057 TIter evTimeIter(m_recEvTimeCol); 00058 TRecEvTime *evTimeRoot = 0; 00059 while ((evTimeRoot = (TRecEvTime*)evTimeIter.Next())) { 00060 double estime=evTimeRoot->estime(); 00061 int status=evTimeRoot->status(); 00062 double quality=evTimeRoot->quality(); 00063 //double estime=evTimeRoot->getTest(); 00064 //int status=evTimeRoot->getStat(); 00065 00066 RecEsTime *evTimeTds = new RecEsTime(); 00067 m_common.m_rootRecEvTimeMap[evTimeRoot] = evTimeTds; 00068 evTimeTds->setTest( estime ); 00069 evTimeTds->setStat( status ); 00070 evTimeTds->setQuality( quality ); 00071 evTimeTdsCol->push_back(evTimeTds); 00072 } 00073 delete m_recEvTimeCol; 00074 m_recEvTimeCol = 0; 00075 00076 return StatusCode::SUCCESS; 00077 } 00078 00079 StatusCode RecEvTimeCnv::DataObjectToTObject(DataObject* obj,RootAddress* rootaddr) { 00080 MsgStream log(msgSvc(), "RecEvTimeCnv"); 00081 log << MSG::DEBUG << "RecEvTimeCnv::DataObjectToTObject" << endreq; 00082 StatusCode sc=StatusCode::SUCCESS; 00083 00084 RecEsTimeCol * evTimeColTds=dynamic_cast<RecEsTimeCol *> (obj); 00085 if (!evTimeColTds) { 00086 log << MSG::ERROR << "Could not downcast to RecEsTimeCol" << endreq; 00087 return StatusCode::FAILURE; 00088 } 00089 00090 DataObject *evt; 00091 m_eds->findObject(EventModel::Recon::Event,evt); 00092 if (evt==NULL) { 00093 log << MSG::ERROR << "Could not get RecEvent in TDS " << endreq; 00094 return StatusCode::FAILURE; 00095 } 00096 ReconEvent * devtTds=dynamic_cast<ReconEvent *> (evt); 00097 if (!devtTds) { 00098 log << MSG::ERROR << "RecEvTimeCnv:Could not downcast to TDS ReconEvent" << endreq; 00099 } 00100 IOpaqueAddress *addr; 00101 00102 m_cnvSvc->getRecTrackCnv()->createRep(evt,addr); 00103 TRecTrackEvent *recEvt=m_cnvSvc->getRecTrackCnv()->getWriteObject(); 00104 const TObjArray *m_recEvTimeCol = recEvt->getEvTimeCol(); 00105 if (!m_recEvTimeCol) return sc; 00106 recEvt->clearEvTimeCol(); //necessary in case there is I/O at the same time since array is static 00107 RecEsTimeCol::const_iterator evTimeTds; 00108 for (evTimeTds = evTimeColTds->begin(); evTimeTds != evTimeColTds->end(); evTimeTds++) { 00109 //Double_t estime = (*evTimeTds)->estime(); 00110 //Int_t status = (*evTimeTds)->status(); 00111 Double_t estime = (*evTimeTds)->getTest(); 00112 Int_t status = (*evTimeTds)->getStat(); 00113 Double_t quality = (*evTimeTds)->getQuality(); 00114 TRecEvTime *evTimeRoot = new TRecEvTime(); 00115 //m_common.m_RecEvTimeMap[(*evTimeTds)] = evTimeRoot; 00116 00117 evTimeRoot->setTest( estime ); 00118 evTimeRoot->setStats( status ); 00119 evTimeRoot->setQuality( quality ); 00120 00121 recEvt->addEvTime(evTimeRoot); 00122 } 00123 00124 return StatusCode::SUCCESS; 00125 } 00126 #endif