00001 #ifndef MdcMcHitCnv_CXX 00002 #define MdcMcHitCnv_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 "McTruth/McEvent.h" //TDS object 00012 #include "McTruth/MdcMcHit.h" //TDS object 00013 #include "RootEventData/TMdcMc.h" // standard root object 00014 #include "RootEventData/TMcEvent.h" 00015 #include "RootCnvSvc/Mc/McCnv.h" 00016 #include "RootCnvSvc/Mc/MdcMcHitCnv.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<MdcMcHitCnv> s_factory; 00023 //const ICnvFactory& MdcMcHitCnvFactory = s_factory; 00024 00025 MdcMcHitCnv::MdcMcHitCnv(ISvcLocator* svc) 00026 : RootEventBaseCnv(classID(), svc) 00027 { 00028 // Here we associate this converter with the /Event path on the TDS. 00029 MsgStream log(msgSvc(), "MdcMcHitCnv"); 00030 //log << MSG::DEBUG << "Constructor called for " << objType() << endreq; 00031 m_rootBranchname ="m_mdcMcHitCol"; 00032 //declareObject(EventModel::MC::MdcMcHitCol, objType(), m_rootTreename, m_rootBranchname); 00033 m_adresses.push_back(&m_mdcMcHitCol); 00034 m_mdcMcHitCol=0; 00035 } 00036 00037 StatusCode MdcMcHitCnv::TObjectToDataObject(DataObject*& refpObject) { 00038 // creation of TDS object from root object 00039 00040 MsgStream log(msgSvc(), "MdcMcHitCnv"); 00041 log << MSG::DEBUG << "MdcMcHitCnv::TObjectToDataObject" << endreq; 00042 StatusCode sc=StatusCode::SUCCESS; 00043 00044 // create the TDS location for the MdcMc Collection 00045 MdcMcHitCol* mdcMcTdsCol = new MdcMcHitCol; 00046 refpObject=mdcMcTdsCol; 00047 00048 00049 // now convert 00050 if (!m_mdcMcHitCol) return sc; 00051 TIter mdcMcIter(m_mdcMcHitCol); 00052 TMdcMc *mdcMcRoot = 0; 00053 while ((mdcMcRoot = (TMdcMc*)mdcMcIter.Next())) { 00054 unsigned int id = mdcMcRoot ->getId(); 00055 unsigned int trackIndex = mdcMcRoot ->getTrackIndex(); 00056 double xPosition = mdcMcRoot ->getPositionX() ; 00057 double yPosition = mdcMcRoot ->getPositionY() ; 00058 double zPosition = mdcMcRoot ->getPositionZ() ; 00059 double driftDistance= mdcMcRoot ->getDriftDistance() ; 00060 double depositEnergy = mdcMcRoot ->getDepositEnergy() ; 00061 int positionFlag = mdcMcRoot->getPositionFlag(); 00062 00063 MdcMcHit *mdcMcTds = new MdcMcHit; 00064 m_common.m_rootMdcMcHitMap[mdcMcRoot] = mdcMcTds; 00065 00066 mdcMcTds->setIdentifier(id); 00067 mdcMcTds->setTrackIndex(trackIndex); 00068 mdcMcTds->setPositionX(xPosition); 00069 mdcMcTds->setPositionY(yPosition); 00070 mdcMcTds->setPositionZ(zPosition); 00071 mdcMcTds->setDriftDistance(driftDistance); 00072 mdcMcTds->setDepositEnergy(depositEnergy); 00073 mdcMcTds->setPositionFlag(positionFlag); 00074 00075 mdcMcTdsCol->push_back(mdcMcTds); 00076 } 00077 //m_mdcMcHitCol->Delete(); // wensp add 2005/12/30 00078 delete m_mdcMcHitCol; 00079 m_mdcMcHitCol = 0; 00080 return StatusCode::SUCCESS; 00081 } 00082 00083 StatusCode MdcMcHitCnv::DataObjectToTObject(DataObject* obj,RootAddress* rootaddr) { 00084 00085 MsgStream log(msgSvc(), "MdcMcHitCnv"); 00086 log << MSG::DEBUG << "MdcMcHitCnv::DataObjectToTObject" << endreq; 00087 StatusCode sc=StatusCode::SUCCESS; 00088 00089 MdcMcHitCol * mdcMcHitCnvTds=dynamic_cast<MdcMcHitCol *> (obj); 00090 if (!mdcMcHitCnvTds) { 00091 log << MSG::ERROR << "Could not downcast to MdcMcHitCol" << endreq; 00092 return StatusCode::FAILURE; 00093 } 00094 00095 DataObject *evt; 00096 m_eds->findObject(EventModel::MC::Event,evt); 00097 if (evt==NULL) { 00098 log << MSG::ERROR << "Could not get McEvent in TDS " << endreq; 00099 return StatusCode::FAILURE; 00100 } 00101 McEvent * devtTds=dynamic_cast<McEvent *> (evt); 00102 if (!devtTds) { 00103 log << MSG::ERROR << "MdcMcHitCnv:Could not downcast to TDS McEvent" << endreq; 00104 } 00105 IOpaqueAddress *addr; 00106 00107 m_cnvSvc->getMcCnv()->createRep(evt,addr); 00108 TMcEvent *McEvt=m_cnvSvc->getMcCnv()->getWriteObject(); 00109 00110 const TObjArray *m_mdcMcHitCol = McEvt->getMdcMcHitCol(); 00111 if (!m_mdcMcHitCol) return sc; 00112 McEvt->clearMdcMcHitCol(); //necessary in case there is I/O at the same time since array is static 00113 MdcMcHitCol::const_iterator mdcMcTds; 00114 00115 for (mdcMcTds = mdcMcHitCnvTds->begin(); mdcMcTds != mdcMcHitCnvTds->end(); mdcMcTds++) { 00116 UInt_t id = ((*mdcMcTds)->identify()).get_value() ; 00117 UInt_t trackIndex = (*mdcMcTds) ->getTrackIndex(); 00118 Double_t xPosition = (*mdcMcTds) ->getPositionX() ; 00119 Double_t yPosition = (*mdcMcTds) ->getPositionY() ; 00120 Double_t zPosition = (*mdcMcTds) ->getPositionZ() ; 00121 Double_t driftDistance= (*mdcMcTds) ->getDriftDistance(); 00122 Double_t depositEnergy = (*mdcMcTds) ->getDepositEnergy() ; 00123 Int_t positionFlag = (*mdcMcTds) ->getPositionFlag(); 00124 00125 TMdcMc *mdcMcRoot = new TMdcMc(); 00126 //m_common.m_mdcMcHitMap[(*mdcMcTds)] = mdcMcRoot; 00127 00128 mdcMcRoot->setId(id); 00129 mdcMcRoot->setTrackIndex(trackIndex); 00130 mdcMcRoot->setPositionX(xPosition); 00131 mdcMcRoot->setPositionY(yPosition); 00132 mdcMcRoot->setPositionZ(zPosition); 00133 mdcMcRoot->setDriftDistance(driftDistance); 00134 mdcMcRoot->setDepositEnergy(depositEnergy); 00135 mdcMcRoot->setPositionFlag(positionFlag); 00136 00137 McEvt->addMdcMc(mdcMcRoot); 00138 } 00139 00140 return StatusCode::SUCCESS; 00141 } 00142 #endif 00143 00144 00145 00146 00147 00148 00149 00150 00151 00152