00001 #ifndef MucMcHitCnv_CXX 00002 #define MucMcHitCnv_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/MucMcHit.h" //TDS object 00013 #include "RootEventData/TMucMc.h" // standard root object 00014 #include "RootEventData/TMcEvent.h" 00015 #include "RootCnvSvc/Mc/McCnv.h" 00016 #include "RootCnvSvc/Mc/MucMcHitCnv.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<MucMcHitCnv> s_factory; 00023 //const ICnvFactory& MucMcHitCnvFactory = s_factory; 00024 00025 MucMcHitCnv::MucMcHitCnv(ISvcLocator* svc) 00026 : RootEventBaseCnv(classID(), svc) 00027 { 00028 // Here we associate this converter with the /Event path on the TDS. 00029 MsgStream log(msgSvc(), "MucMcHitCnv"); 00030 //log << MSG::DEBUG << "Constructor called for " << objType() << endreq; 00031 m_rootBranchname ="m_mucMcHitCol"; 00032 //declareObject(EventModel::MC::MucMcHitCol, objType(), m_rootTreename, m_rootBranchname); 00033 m_adresses.push_back(&m_mucMcHitCol); 00034 m_mucMcHitCol=0; 00035 } 00036 00037 StatusCode MucMcHitCnv::TObjectToDataObject(DataObject*& refpObject) { 00038 // creation of TDS object from root object 00039 00040 MsgStream log(msgSvc(), "MucMcHitCnv"); 00041 log << MSG::DEBUG << "MucMcHitCnv::TObjectToDataObject" << endreq; 00042 StatusCode sc=StatusCode::SUCCESS; 00043 00044 // create the TDS location for the MdcMc Collection 00045 MucMcHitCol* mucMcTdsCol = new MucMcHitCol; 00046 refpObject=mucMcTdsCol; 00047 00048 00049 // now convert 00050 if (!m_mucMcHitCol) return sc; 00051 TIter mucMcIter(m_mucMcHitCol); 00052 TMucMc *mucMcRoot = 0; 00053 while ((mucMcRoot = (TMucMc*)mucMcIter.Next())) { 00054 unsigned int id = mucMcRoot ->getId(); 00055 unsigned int trackIndex = mucMcRoot ->getTrackIndex(); 00056 double xPosition = mucMcRoot ->getPositionX() ; 00057 double yPosition = mucMcRoot ->getPositionY() ; 00058 double zPosition = mucMcRoot ->getPositionZ() ; 00059 double px= mucMcRoot ->getPx() ; 00060 double py = mucMcRoot ->getPy() ; 00061 double pz = mucMcRoot ->getPz() ; 00062 00063 MucMcHit *mucMcTds = new MucMcHit; 00064 m_common.m_rootMucMcHitMap[mucMcRoot] = mucMcTds; 00065 00066 mucMcTds->setIdentifier(id); 00067 mucMcTds->setTrackIndex(trackIndex); 00068 mucMcTds->setPositionX(xPosition); 00069 mucMcTds->setPositionY(yPosition); 00070 mucMcTds->setPositionZ(zPosition); 00071 mucMcTds->setPx(px); 00072 mucMcTds->setPy(py); 00073 mucMcTds->setPz(pz); 00074 00075 mucMcTdsCol->push_back(mucMcTds); 00076 } 00077 //m_mucMcHitCol->Delete(); // wensp add 2005/12/30 00078 delete m_mucMcHitCol; 00079 m_mucMcHitCol = 0; 00080 return StatusCode::SUCCESS; 00081 } 00082 00083 StatusCode MucMcHitCnv::DataObjectToTObject(DataObject* obj,RootAddress* rootaddr) { 00084 00085 MsgStream log(msgSvc(), "MucMcHitCnv"); 00086 log << MSG::DEBUG << "MucMcHitCnv::DataObjectToTObject" << endreq; 00087 StatusCode sc=StatusCode::SUCCESS; 00088 00089 MucMcHitCol * mucMcHitCnvTds=dynamic_cast<MucMcHitCol *> (obj); 00090 if (!mucMcHitCnvTds) { 00091 log << MSG::ERROR << "Could not downcast to MucMcHitCol" << 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 << "MucMcHitCnv: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_mucMcHitCol = McEvt->getMucMcHitCol(); 00111 if (!m_mucMcHitCol) return sc; 00112 McEvt->clearMucMcHitCol(); //necessary in case there is I/O at the same time since array is static 00113 MucMcHitCol::const_iterator mucMcTds; 00114 00115 for (mucMcTds = mucMcHitCnvTds->begin(); mucMcTds != mucMcHitCnvTds->end(); mucMcTds++) { 00116 UInt_t id = ((*mucMcTds)->identify()).get_value() ; 00117 UInt_t trackIndex = (*mucMcTds) ->getTrackIndex(); 00118 Double_t xPosition = (*mucMcTds) ->getPositionX() ; 00119 Double_t yPosition = (*mucMcTds) ->getPositionY() ; 00120 Double_t zPosition = (*mucMcTds) ->getPositionZ() ; 00121 Double_t px= (*mucMcTds) ->getPx() ; 00122 Double_t py = (*mucMcTds) ->getPy() ; 00123 Double_t pz = (*mucMcTds) ->getPz() ; 00124 00125 TMucMc *mucMcRoot = new TMucMc(); 00126 //m_common.m_mucMcHitMap[(*mucMcTds)] = mucMcRoot; 00127 00128 mucMcRoot->setId(id); 00129 mucMcRoot->setTrackIndex(trackIndex); 00130 mucMcRoot->setPositionX(xPosition); 00131 mucMcRoot->setPositionY(yPosition); 00132 mucMcRoot->setPositionZ(zPosition); 00133 mucMcRoot->setPx(px); 00134 mucMcRoot->setPy(py); 00135 mucMcRoot->setPz(pz); 00136 00137 McEvt->addMucMc(mucMcRoot); 00138 } 00139 00140 return StatusCode::SUCCESS; 00141 } 00142 #endif 00143 00144 00145 00146 00147 00148 00149 00150 00151 00152