00001 #ifndef MdcDigiCnv_CXX 00002 #define MdcDigiCnv_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 "RawEvent/DigiEvent.h" //TDS object 00012 #include "MdcRawEvent/MdcDigi.h" //TDS object 00013 #include "RootEventData/TMdcDigi.h" // standard root object 00014 #include "RootEventData/TDigiEvent.h" 00015 #include "RootCnvSvc/Digi/DigiCnv.h" 00016 #include "RootCnvSvc/Digi/MdcDigiCnv.h" 00017 #include "RootCnvSvc/RootAddress.h" 00018 00019 00020 // Instantiation of a static factory class used by clients to create 00021 // instances of this service 00022 //static CnvFactory<MdcDigiCnv> s_factory; 00023 //const ICnvFactory& MdcDigiCnvFactory = s_factory; 00024 00025 MdcDigiCnv::MdcDigiCnv(ISvcLocator* svc) 00026 : RootEventBaseCnv(classID(), svc) 00027 { 00028 // Here we associate this converter with the /Event path on the TDS. 00029 MsgStream log(msgSvc(), "MdcDigiCnv"); 00030 //log << MSG::DEBUG << "Constructor called for " << objType() << endreq; 00031 m_rootBranchname ="m_mdcDigiCol"; 00032 //declareObject(EventModel::Digi::MdcDigiCol, objType(), m_rootTreename, m_rootBranchname); 00033 m_adresses.push_back(&m_mdcDigiCol); 00034 m_mdcDigiCol=0; 00035 00036 } 00037 00038 StatusCode MdcDigiCnv::TObjectToDataObject(DataObject*& refpObject) { 00039 // creation of TDS object from root object 00040 00041 MsgStream log(msgSvc(), "MdcDigiCnv"); 00042 log << MSG::DEBUG << "MdcDigiCnv::TObjectToDataObject" << endreq; 00043 StatusCode sc=StatusCode::SUCCESS; 00044 00045 // create the TDS location for the MdcDigi Collection 00046 MdcDigiCol* mdcDigiTdsCol = new MdcDigiCol; 00047 refpObject=mdcDigiTdsCol; 00048 // sc = m_eds->registerObject(EventModel::Digi::MdcDigiCol, mdcDigiTdsCol); 00049 // if (sc.isFailure()) { 00050 // log << "Failed to register MdcDigi Collection" << endreq; 00051 // return StatusCode::FAILURE; 00052 // } 00053 00054 00055 // now convert 00056 if (!m_mdcDigiCol) return sc; 00057 TIter mdcDigiIter(m_mdcDigiCol); 00058 TMdcDigi *mdcDigiRoot = 0; 00059 while ((mdcDigiRoot = (TMdcDigi*)mdcDigiIter.Next())) { 00060 unsigned int id = mdcDigiRoot->getIntId(); 00061 unsigned int time = mdcDigiRoot->getTimeChannel(); 00062 unsigned int charge = mdcDigiRoot->getChargeChannel(); 00063 unsigned int overflow = mdcDigiRoot->getOverflow(); 00064 int trackIndex = mdcDigiRoot->getTrackIndex(); 00065 00066 MdcDigi *mdcDigiTds = new MdcDigi(id); 00067 m_common.m_rootMdcDigiMap[mdcDigiRoot] = mdcDigiTds; 00068 00069 mdcDigiTds->setTimeChannel(time); 00070 mdcDigiTds->setChargeChannel(charge); 00071 mdcDigiTds->setOverflow(overflow); 00072 mdcDigiTds->setTrackIndex(trackIndex); 00073 00074 mdcDigiTdsCol->push_back(mdcDigiTds); 00075 } 00076 //m_mdcDigiCol->Delete(); // wensp add 2005/12/30 00077 delete m_mdcDigiCol; 00078 m_mdcDigiCol = 0; 00079 return StatusCode::SUCCESS; 00080 } 00081 00082 StatusCode MdcDigiCnv::DataObjectToTObject(DataObject* obj,RootAddress* rootaddr) { 00083 00084 MsgStream log(msgSvc(), "MdcDigiCnv"); 00085 log << MSG::DEBUG << "MdcDigiCnv::DataObjectToTObject" << endreq; 00086 StatusCode sc=StatusCode::SUCCESS; 00087 00088 MdcDigiCol * mdcDigiColTds=dynamic_cast<MdcDigiCol *> (obj); 00089 if (!mdcDigiColTds) { 00090 log << MSG::ERROR << "Could not downcast to MdcDigiCol" << endreq; 00091 return StatusCode::FAILURE; 00092 } 00093 00094 DataObject *evt; 00095 m_eds->findObject(EventModel::Digi::Event,evt); 00096 if (evt==NULL) { 00097 log << MSG::ERROR << "Could not get DigiEvent in TDS " << endreq; 00098 return StatusCode::FAILURE; 00099 } 00100 DigiEvent * devtTds=dynamic_cast<DigiEvent *> (evt); 00101 if (!devtTds) { 00102 log << MSG::ERROR << "MdcDigiCnv:Could not downcast to TDS DigiEvent" << endreq; 00103 } 00104 00105 IOpaqueAddress *addr; 00106 00107 00108 m_cnvSvc->getDigiCnv()->createRep(evt,addr); 00109 00110 //createRep(evt,addr); 00111 00112 TDigiEvent *recEvt=m_cnvSvc->getDigiCnv()->getWriteObject(); 00113 00114 const TObjArray *m_mdcDigiCol = recEvt->getMdcDigiCol(); 00115 if (!m_mdcDigiCol) return sc; 00116 recEvt->clearMdcDigiCol(); //necessary in case there is I/O at the same time since array is static 00117 MdcDigiCol::const_iterator mdcDigiTds; 00118 00119 for (mdcDigiTds = mdcDigiColTds->begin(); mdcDigiTds != mdcDigiColTds->end(); mdcDigiTds++) { 00120 UInt_t overflow = (*mdcDigiTds)->getOverflow(); 00121 UInt_t time = (*mdcDigiTds)->getTimeChannel(); 00122 UInt_t charge = (*mdcDigiTds)->getChargeChannel(); 00123 UInt_t id = (*mdcDigiTds)->getIntId(); 00124 Int_t trackIndex = (*mdcDigiTds)->getTrackIndex(); 00125 00126 TMdcDigi *mdcDigiRoot = new TMdcDigi(); 00127 //m_common.m_mdcDigiMap[(*mdcDigiTds)] = mdcDigiRoot; 00128 00129 mdcDigiRoot->initialize(id, time ,charge); 00130 mdcDigiRoot->setOverflow(overflow); 00131 mdcDigiRoot->setTrackIndex(trackIndex); 00132 recEvt->addMdcDigi(mdcDigiRoot); 00133 } 00134 00135 return StatusCode::SUCCESS; 00136 } 00137 00138 #endif 00139 00140 00141 00142 00143 00144 00145 00146 00147 00148