00001 #include <algorithm>
00002 #include "GaudiKernel/MsgStream.h"
00003
00004 #include "EventModel/EventModel.h"
00005 #include "EvtRecEvent/EvtRecObject.h"
00006 #include "EvtRecEvent/EvtRecDTag.h"
00007
00008 #include "RootEventData/TEvtRecObject.h"
00009 #include "RootEventData/TEvtRecDTag.h"
00010
00011 #include "RootCnvSvc/RootAddress.h"
00012 #include "RootCnvSvc/EvtRec/EvtRecCnv.h"
00013 #include "RootCnvSvc/EvtRec/EvtRecDTagCnv.h"
00014
00015 #include "CLHEP/Matrix/Vector.h"
00016 #include "CLHEP/Matrix/SymMatrix.h"
00017
00018 #include <vector>
00019
00020
00021 using CLHEP::HepVector;
00022 using CLHEP::HepSymMatrix;
00023
00024 EvtRecDTagCnv::EvtRecDTagCnv(ISvcLocator* svc)
00025 : RootEventBaseCnv(classID(), svc)
00026 {
00027 m_rootBranchname = "m_evtRecDTagCol";
00028 m_adresses.push_back(&m_evtRecDTagCol);
00029 m_evtRecDTagCol = 0;
00030 }
00031
00032 StatusCode EvtRecDTagCnv::TObjectToDataObject(DataObject*& refpObject) {
00033
00034 MsgStream log(msgSvc(), "EvtRecDTagCnv");
00035 log << MSG::DEBUG << "EvtRecDTagCnv::TObjectToDataObject" << endreq;
00036
00037
00038 EvtRecDTagCol* evtRecDTagCol = new EvtRecDTagCol;
00039 refpObject = evtRecDTagCol;
00040
00041 if ( ! m_evtRecDTagCol ) return StatusCode::SUCCESS;
00042
00043 IDataProviderSvc* dataSvc = 0;
00044 StatusCode sc = serviceLocator()->getService("EventDataSvc",
00045 IDataProviderSvc::interfaceID(), (IInterface*&)dataSvc);
00046 if ( sc.isFailure() ) {
00047 log << MSG::FATAL << "Could not get EventDataSvc in EvtRecDTagCnv" << endreq;
00048 return sc;
00049 }
00050
00051 SmartDataPtr<EvtRecTrackCol> evtRecTrackCol(dataSvc, EventModel::EvtRec::EvtRecTrackCol);
00052 if ( ! evtRecTrackCol) {
00053 log << MSG::INFO << "Could not find EvtRecTrackCol" << endreq;
00054 }
00055
00056
00057 TIter evtRecDTagIter(m_evtRecDTagCol);
00058 TEvtRecDTag* evtRecDTagRoot = 0;
00059 while ( (evtRecDTagRoot = (TEvtRecDTag*)evtRecDTagIter.Next() ) ) {
00060 EvtRecDTag* evtRecDTag = new EvtRecDTag();
00061 m_common.m_rootEvtRecDTagMap[evtRecDTagRoot] = evtRecDTag;
00062
00063
00064 evtRecDTag->setdecayMode( (EvtRecDTag::DecayMode)evtRecDTagRoot->decayMode() );
00065 evtRecDTag->settype( (EvtRecDTag::SelType)evtRecDTagRoot->type() );
00066 evtRecDTag->setbeamE( evtRecDTagRoot->beamE() );
00067 evtRecDTag->setmass( evtRecDTagRoot->mass() );
00068 evtRecDTag->setmBC( evtRecDTagRoot->mBC() );
00069 evtRecDTag->setdeltaE( evtRecDTagRoot->deltaE() );
00070 evtRecDTag->setcharge( evtRecDTagRoot->charge() );
00071 evtRecDTag->setcharm( evtRecDTagRoot->charm() );
00072 evtRecDTag->setnumOfChildren( evtRecDTagRoot->numOfChildren() );
00073
00074 HepLorentzVector p4(evtRecDTagRoot->px(),evtRecDTagRoot->py(),evtRecDTagRoot->pz(),evtRecDTagRoot->pe());
00075 evtRecDTag->setp4(p4);
00076
00077
00078 const std::vector<int>& tracks=evtRecDTagRoot->tracks();
00079 const std::vector<int>& showers=evtRecDTagRoot->showers();
00080 const std::vector<int>& otherTracks=evtRecDTagRoot->otherTracks();
00081 const std::vector<int>& otherShowers=evtRecDTagRoot->otherShowers();
00082 const std::vector<int>& pionId=evtRecDTagRoot->pionId();
00083 const std::vector<int>& kaonId=evtRecDTagRoot->kaonId();
00084
00085 for(unsigned int i=0; i<tracks.size();i++)
00086 evtRecDTag->addTrack(
00087 dynamic_cast<EvtRecTrack*>(evtRecTrackCol->containedObject(tracks[i]))
00088 );
00089
00090 for(unsigned int i=0; i<showers.size();i++)
00091 evtRecDTag->addShower(
00092 dynamic_cast<EvtRecTrack*>(evtRecTrackCol->containedObject(showers[i]))
00093 );
00094
00095
00096 for(unsigned int i=0; i<otherTracks.size();i++)
00097 evtRecDTag->addOtherTrack(
00098 dynamic_cast<EvtRecTrack*>(evtRecTrackCol->containedObject(otherTracks[i]))
00099 );
00100
00101
00102 for(unsigned int i=0; i<otherShowers.size();i++)
00103 evtRecDTag->addOtherShower(
00104 dynamic_cast<EvtRecTrack*>(evtRecTrackCol->containedObject(otherShowers[i]))
00105 );
00106
00107 for(unsigned int i=0; i<pionId.size();i++)
00108 evtRecDTag->addPionId(
00109 dynamic_cast<EvtRecTrack*>(evtRecTrackCol->containedObject(pionId[i]))
00110 );
00111
00112 for(unsigned int i=0; i<kaonId.size();i++)
00113 evtRecDTag->addKaonId(
00114 dynamic_cast<EvtRecTrack*>(evtRecTrackCol->containedObject(kaonId[i]))
00115 );
00116
00117
00118
00119 evtRecDTagCol->push_back(evtRecDTag);
00120 }
00121
00122 delete m_evtRecDTagCol;
00123 m_evtRecDTagCol = 0;
00124 return StatusCode::SUCCESS;
00125 }
00126
00127 StatusCode EvtRecDTagCnv::DataObjectToTObject(DataObject* obj, RootAddress* rootaddr) {
00128 MsgStream log(msgSvc(), "EvtRecDTagCnv");
00129 log << MSG::DEBUG << "EvtRecDTagCnv::DataObjectToTObject" << endreq;
00130
00131 EvtRecDTagCol* evtRecDTagCol = dynamic_cast<EvtRecDTagCol*> (obj);
00132 if ( ! evtRecDTagCol ) {
00133 log << MSG::ERROR << "Could not downcast to EvtRecDTagCol" << endreq;
00134 return StatusCode::FAILURE;
00135 }
00136
00137 DataObject* evt;
00138 m_eds->findObject(EventModel::EvtRec::Event, evt);
00139 if ( evt == NULL ) {
00140 log << MSG::ERROR << "Could not get EvtRecObject in TDS" << endreq;
00141 return StatusCode::FAILURE;
00142 }
00143 EvtRecObject* devtTds = dynamic_cast<EvtRecObject*> (evt);
00144 if ( ! devtTds ) {
00145 log << MSG::ERROR << "EvtRecDTagCnv: Could not downcast to TDS EvtRecObject" << endreq;
00146 }
00147
00148 IOpaqueAddress *addr;
00149 m_cnvSvc->getEvtRecCnv()->createRep(evt, addr);
00150 TEvtRecObject* recEvt = m_cnvSvc->getEvtRecCnv()->getWriteObject();
00151
00152 const TObjArray* m_evtRecDTagCol = recEvt->getEvtRecDTagCol();
00153 if ( ! m_evtRecDTagCol ) return StatusCode::SUCCESS;
00154
00155 IDataProviderSvc* dataSvc = 0;
00156 StatusCode sc = serviceLocator()->getService("EventDataSvc",
00157 IDataProviderSvc::interfaceID(), (IInterface*&)dataSvc);
00158 if ( sc.isFailure() ) {
00159 log << MSG::FATAL << "Could not get EventDataSvc in EvtRecDTagCnv" << endreq;
00160 return sc;
00161 }
00162
00163 EvtRecTrackCol::iterator evtRecTrackColbegin, evtRecTrackColend;
00164
00165 SmartDataPtr<EvtRecTrackCol> evtRecTrackCol(dataSvc, EventModel::EvtRec::EvtRecTrackCol);
00166 if ( ! evtRecTrackCol) {
00167 log << MSG::INFO << "Could not find EvtRecTrackCol" << endreq;
00168 }
00169 else {
00170 evtRecTrackColbegin = evtRecTrackCol->begin();
00171 evtRecTrackColend = evtRecTrackCol->end();
00172 }
00173
00174
00175 recEvt->clearEvtRecDTagCol();
00176 EvtRecDTagCol::const_iterator evtRecDTag = evtRecDTagCol->begin();
00177
00178 for ( ; evtRecDTag != evtRecDTagCol->end(); evtRecDTag++) {
00179 EvtRecDTag* ptr = *evtRecDTag;
00180 TEvtRecDTag* evtRecDTagRoot = new TEvtRecDTag();
00181
00182
00183 evtRecDTagRoot->setdecayMode( ptr->decayMode() );
00184 evtRecDTagRoot->settype( ptr->type() );
00185 evtRecDTagRoot->setbeamE( ptr->beamE() );
00186 evtRecDTagRoot->setmass( ptr->mass() );
00187 evtRecDTagRoot->setmBC( ptr->mBC() );
00188 evtRecDTagRoot->setdeltaE( ptr->deltaE() );
00189 evtRecDTagRoot->setcharge( ptr->charge() );
00190 evtRecDTagRoot->setcharm( ptr->charm() );
00191 evtRecDTagRoot->setnumOfChildren( ptr->numOfChildren() );
00192
00193 HepLorentzVector p4=ptr->p4();
00194 evtRecDTagRoot->setpx(p4.x());
00195 evtRecDTagRoot->setpy(p4.y());
00196 evtRecDTagRoot->setpz(p4.z());
00197 evtRecDTagRoot->setpe(p4.t());
00198
00199
00200
00201 SmartRefVector<EvtRecTrack> tracks=ptr->tracks();
00202
00203 for(unsigned int i=0; i<tracks.size();i++){
00204 EvtRecTrackCol::iterator it = find(evtRecTrackColbegin,
00205 evtRecTrackColend, tracks[i]);
00206
00207 evtRecDTagRoot->addTrack(it - evtRecTrackColbegin );
00208 }
00209
00210
00211 SmartRefVector<EvtRecTrack> showers=ptr->showers();
00212
00213 for(unsigned int i=0; i<showers.size();i++){
00214 EvtRecTrackCol::iterator it = find(evtRecTrackColbegin,
00215 evtRecTrackColend, showers[i]);
00216
00217 evtRecDTagRoot->addShower(it - evtRecTrackColbegin );
00218 }
00219
00220
00221 SmartRefVector<EvtRecTrack> otherTracks=ptr->otherTracks();
00222
00223 for(unsigned int i=0; i<otherTracks.size();i++){
00224 EvtRecTrackCol::iterator it = find(evtRecTrackColbegin,
00225 evtRecTrackColend, otherTracks[i]);
00226
00227 evtRecDTagRoot->addOtherTrack(it - evtRecTrackColbegin );
00228 }
00229
00230 SmartRefVector<EvtRecTrack> otherShowers=ptr->otherShowers();
00231
00232 for(unsigned int i=0; i<otherShowers.size();i++){
00233 EvtRecTrackCol::iterator it = find(evtRecTrackColbegin,
00234 evtRecTrackColend, otherShowers[i]);
00235
00236 evtRecDTagRoot->addOtherShower(it - evtRecTrackColbegin );
00237 }
00238
00239 SmartRefVector<EvtRecTrack> pionId=ptr->pionId();
00240
00241 for(unsigned int i=0; i<pionId.size();i++){
00242 EvtRecTrackCol::iterator it = find(evtRecTrackColbegin,
00243 evtRecTrackColend, pionId[i]);
00244
00245 evtRecDTagRoot->addPionId(it - evtRecTrackColbegin );
00246 }
00247
00248 SmartRefVector<EvtRecTrack> kaonId=ptr->kaonId();
00249
00250 for(unsigned int i=0; i<kaonId.size();i++){
00251 EvtRecTrackCol::iterator it = find(evtRecTrackColbegin,
00252 evtRecTrackColend, kaonId[i]);
00253
00254 evtRecDTagRoot->addKaonId(it - evtRecTrackColbegin );
00255 }
00256
00257
00258 recEvt->addEvtRecDTag(evtRecDTagRoot);
00259 }
00260
00261 return StatusCode::SUCCESS;
00262 }