00001 #include <algorithm>
00002 #include "GaudiKernel/MsgStream.h"
00003
00004 #include "EventModel/EventModel.h"
00005 #include "EvtRecEvent/EvtRecObject.h"
00006 #include "EvtRecEvent/EvtRecTrack.h"
00007
00008 #include "RootEventData/TEvtRecObject.h"
00009 #include "RootEventData/TEvtRecTrack.h"
00010
00011 #include "RootCnvSvc/RootAddress.h"
00012 #include "RootCnvSvc/EvtRec/EvtRecCnv.h"
00013 #include "RootCnvSvc/EvtRec/EvtRecTrackCnv.h"
00014
00015 EvtRecTrackCnv::EvtRecTrackCnv(ISvcLocator* svc)
00016 : RootEventBaseCnv(classID(), svc)
00017 {
00018 m_rootBranchname = "m_evtRecTrackCol";
00019 m_adresses.push_back(&m_evtRecTrackCol);
00020 m_evtRecTrackCol = 0;
00021 }
00022
00023 StatusCode EvtRecTrackCnv::TObjectToDataObject(DataObject*& refpObject) {
00024
00025 MsgStream log(msgSvc(), "EvtRecTrackCnv");
00026 log << MSG::DEBUG << "EvtRecTrackCnv::TObjectToDataObject" << endreq;
00027
00028
00029 EvtRecTrackCol* evtRecTrackCol = new EvtRecTrackCol;
00030 refpObject = evtRecTrackCol;
00031
00032 if ( ! m_evtRecTrackCol ) return StatusCode::SUCCESS;
00033
00034 IDataProviderSvc* dataSvc = 0;
00035 StatusCode sc = serviceLocator()->getService("EventDataSvc",
00036 IDataProviderSvc::interfaceID(), (IInterface*&)dataSvc);
00037 if ( sc.isFailure() ) {
00038 log << MSG::FATAL << "Could not get EventDataSvc in EvtRecTrackCnv" << endreq;
00039 return sc;
00040 }
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078 int trackID;
00079
00080
00081 SmartDataPtr<RecMdcTrackCol> mdcTrackCol(dataSvc, EventModel::Recon::RecMdcTrackCol);
00082 if(!mdcTrackCol)
00083 {
00084 log << MSG::INFO << "Could not find RecMdcTrackCol" << endreq;
00085 SmartDataPtr<DstMdcTrackCol> dstMdcTrackCol(dataSvc,"/Event/Dst/DstMdcTrackCol");
00086 if (!dstMdcTrackCol) {
00087 log << MSG::INFO << "Could not find DstMdcTrackCol" << endreq;
00088 }
00089 else {
00090 RecMdcTrackCol* mdcTrackCol = new RecMdcTrackCol();
00091 DstMdcTrackCol::iterator iter_mdc = dstMdcTrackCol->begin();
00092 trackID = 0;
00093 for (;iter_mdc != dstMdcTrackCol->end(); iter_mdc++, trackID++) {
00094 RecMdcTrack* recMdcTrack = new RecMdcTrack();
00095 *recMdcTrack = **iter_mdc;
00096 (*mdcTrackCol).push_back(recMdcTrack);
00097 log << MSG::INFO
00098 << " Mdc Track ID = " << trackID
00099 << " Mdc Track Nster = " << (*iter_mdc)->nster()
00100 << endreq;
00101 }
00102 sc = dataSvc->registerObject(EventModel::Recon::RecMdcTrackCol,mdcTrackCol);
00103 }
00104 }
00105
00106
00107 SmartDataPtr<RecMdcKalTrackCol> mdcKalTrackCol(dataSvc, EventModel::Recon::RecMdcKalTrackCol);
00108 if (!mdcKalTrackCol) {
00109 log << MSG::INFO << "Could not find RecMdcKalTrackCol" << endreq;
00110 SmartDataPtr<DstMdcKalTrackCol> dstMdcKalTrackCol(dataSvc,"/Event/Dst/DstMdcKalTrackCol");
00111 if(!dstMdcKalTrackCol) {
00112 log << MSG::INFO << "Could not find DstMdcKalTrackCol" << endreq;
00113 }
00114 else {
00115 RecMdcKalTrackCol* mdcKalTrackCol = new RecMdcKalTrackCol();
00116 DstMdcKalTrackCol::iterator iter_mdc = dstMdcKalTrackCol->begin();
00117 trackID = 0;
00118 for (;iter_mdc != dstMdcKalTrackCol->end(); iter_mdc++, trackID++) {
00119 RecMdcKalTrack* recMdcKalTrack = new RecMdcKalTrack();
00120 *recMdcKalTrack = **iter_mdc;
00121 (*mdcKalTrackCol).push_back(recMdcKalTrack);
00122 log << MSG::INFO
00123 << " MdcKalTrack ID = " << trackID
00124 << " MdcKalTrack Nster = " << (*iter_mdc)->nster()
00125 << " MdcKalTrack poca = " << (*iter_mdc)->poca()
00126 << endreq;
00127 }
00128 sc = dataSvc->registerObject(EventModel::Recon::RecMdcKalTrackCol, mdcKalTrackCol);
00129 }
00130 }
00131
00132
00133 SmartDataPtr<RecMdcDedxCol> mdcDedxCol(dataSvc, EventModel::Recon::RecMdcDedxCol);
00134 if (!mdcDedxCol) {
00135 log <<MSG::INFO << "Could not find RecMdcDedxCol" << endreq;
00136 SmartDataPtr<DstMdcDedxCol> dstMdcDedxCol(dataSvc,"/Event/Dst/DstMdcDedxCol");
00137 if(!dstMdcDedxCol) {
00138 log <<MSG::INFO << "Could not find DstMdcDedxCol" << endreq;
00139 }
00140 else {
00141 RecMdcDedxCol* mdcDedxCol = new RecMdcDedxCol();
00142 DstMdcDedxCol::iterator iter_mdc = dstMdcDedxCol->begin();
00143 trackID=0;
00144 for (;iter_mdc != dstMdcDedxCol->end(); iter_mdc++, trackID++) {
00145 RecMdcDedx* recMdcDedx = new RecMdcDedx();
00146 *recMdcDedx= **iter_mdc;
00147 (*mdcDedxCol).push_back(recMdcDedx);
00148 log << MSG::INFO
00149 << " MdcDedx ID = " << trackID
00150 << " MdcDedx "
00151 << endreq;
00152 }
00153 sc = dataSvc->registerObject(EventModel::Recon::RecMdcDedxCol, mdcDedxCol);
00154 }
00155 }
00156
00157
00158 SmartDataPtr<RecExtTrackCol> extTrackCol(dataSvc, EventModel::Recon::RecExtTrackCol);
00159 if (!extTrackCol) {
00160 log <<MSG::INFO << "Could not find RecExtTrackCol" << endreq;
00161 SmartDataPtr<DstExtTrackCol> dstExtTrackCol(dataSvc,"/Event/Dst/DstExtTrackCol");
00162 if(!dstExtTrackCol) {
00163 log <<MSG::INFO << "Could not find DstExtTrackCol" << endreq;
00164 }
00165 else {
00166 RecExtTrackCol* extTrackCol = new RecExtTrackCol();
00167 DstExtTrackCol::iterator iter_ext = dstExtTrackCol->begin();
00168 trackID=0;
00169 for (;iter_ext != dstExtTrackCol->end(); iter_ext++, trackID++) {
00170 RecExtTrack* recExtTrack = new RecExtTrack();
00171 *recExtTrack = **iter_ext;
00172 (*extTrackCol).push_back(recExtTrack);
00173 log << MSG::INFO
00174 << " ExtTrack ID = " << trackID
00175 << endreq;
00176 }
00177 sc = dataSvc->registerObject(EventModel::Recon::RecExtTrackCol, extTrackCol);
00178 }
00179 }
00180
00181
00182 SmartDataPtr<RecTofTrackCol> tofTrackCol(dataSvc, EventModel::Recon::RecTofTrackCol);
00183 if ( !tofTrackCol ) {
00184 log << MSG::INFO << "Could not find TofTrackCol" << endreq;
00185 SmartDataPtr<DstTofTrackCol> dstTofTrackCol(dataSvc,"/Event/Dst/DstTofTrackCol");
00186 if(!dstTofTrackCol) {
00187 log << MSG::INFO << "Could not find DstTofTrackCol" << endreq;
00188 }
00189 else {
00190 RecTofTrackCol* tofTrackCol = new RecTofTrackCol();
00191 DstTofTrackCol::iterator iter_tof = dstTofTrackCol->begin();
00192 for (;iter_tof != dstTofTrackCol->end(); iter_tof++) {
00193 RecTofTrack* recTofTrack = new RecTofTrack();
00194 *recTofTrack = **iter_tof;
00195 (*tofTrackCol).push_back(recTofTrack);
00196 log << MSG::INFO
00197 << "Tof Track ID = " << (*iter_tof)->tofTrackID()
00198 << " Track ID = " << (*iter_tof)->trackID()
00199 << " Tof Counter ID = "<<(*iter_tof)->tofID()
00200 << " Quality = "<< (*iter_tof)->quality()
00201 << endreq;
00202 }
00203 sc = dataSvc->registerObject(EventModel::Recon::RecTofTrackCol, tofTrackCol);
00204 }
00205 }
00206
00207
00208
00209 SmartDataPtr<RecEmcShowerCol> emcShowerCol(dataSvc, EventModel::Recon::RecEmcShowerCol);
00210 if (!emcShowerCol) {
00211 log << MSG::INFO << "Could not find RecEmcShowerCol" << endreq;
00212 SmartDataPtr<DstEmcShowerCol> dstEmcShowerCol(dataSvc,"/Event/Dst/DstEmcShowerCol");
00213 if(!dstEmcShowerCol) {
00214 log << MSG::INFO << "Could not find DstEmcShowerCol" << endreq;
00215 }
00216 else {
00217 RecEmcShowerCol* emcShowerCol = new RecEmcShowerCol();
00218 DstEmcShowerCol::iterator iter_emc = dstEmcShowerCol->begin();
00219 trackID=0;
00220 for (;iter_emc != dstEmcShowerCol->end(); iter_emc++, trackID++) {
00221 RecEmcShower* recEmcShower = new RecEmcShower();
00222 *recEmcShower = **iter_emc;
00223 (*emcShowerCol).push_back(recEmcShower);
00224 log << MSG::INFO
00225 << " EmcShower ID = " << trackID
00226 << " EmcShower energy = " << (*iter_emc)->energy()
00227 << endreq;
00228 }
00229 sc = dataSvc->registerObject(EventModel::Recon::RecEmcShowerCol, emcShowerCol);
00230 }
00231 }
00232
00233
00234 SmartDataPtr<RecMucTrackCol> mucTrackCol(dataSvc, EventModel::Recon::RecMucTrackCol);
00235 if (!mucTrackCol) {
00236 log <<MSG::INFO << "Could not find RecMucTrackCol" << endreq;
00237 SmartDataPtr<DstMucTrackCol> dstMucTrackCol(dataSvc,"/Event/Dst/DstMucTrackCol");
00238 if(!dstMucTrackCol) {
00239 log <<MSG::INFO << "Could not find DstMucTrackCol" << endreq;
00240 }
00241 else {
00242 RecMucTrackCol* mucTrackCol = new RecMucTrackCol();
00243 DstMucTrackCol::iterator iter_muc = dstMucTrackCol->begin();
00244 trackID=0;
00245 for (;iter_muc != dstMucTrackCol->end(); iter_muc++, trackID++) {
00246 RecMucTrack* recMucTrack = new RecMucTrack();
00247 *recMucTrack = **iter_muc;
00248 (*mucTrackCol).push_back(recMucTrack);
00249 log << MSG::INFO
00250 << " MucTrack ID = "<< trackID
00251 <<endreq;
00252 }
00253 sc = dataSvc->registerObject(EventModel::Recon::RecMucTrackCol, mucTrackCol);
00254 }
00255 }
00256
00257
00258 TIter evtRecTrackIter(m_evtRecTrackCol);
00259 TEvtRecTrack* evtRecTrackRoot = 0;
00260 while ( (evtRecTrackRoot = (TEvtRecTrack*)evtRecTrackIter.Next() ) ) {
00261 EvtRecTrack* evtRecTrack = new EvtRecTrack();
00262 m_common.m_rootEvtRecTrackMap[evtRecTrackRoot] = evtRecTrack;
00263
00264 evtRecTrack->setTrackId( evtRecTrackRoot->trackId() );
00265 evtRecTrack->setPartId( evtRecTrackRoot->partId() );
00266 evtRecTrack->setQuality( evtRecTrackRoot->quality() );
00267
00268 int mdcTrackId = evtRecTrackRoot->mdcTrackId();
00269 if ( mdcTrackId >= 0 ) {
00270 evtRecTrack->setMdcTrack(
00271 dynamic_cast<RecMdcTrack*>(mdcTrackCol->containedObject(mdcTrackId))
00272 );
00273 }
00274
00275 int mdcKalTrackId = evtRecTrackRoot->mdcKalTrackId();
00276 if ( mdcKalTrackId >= 0 ) {
00277 evtRecTrack->setMdcKalTrack(
00278 dynamic_cast<RecMdcKalTrack*>(mdcKalTrackCol->containedObject(mdcKalTrackId))
00279 );
00280 }
00281
00282 int mdcDedxId = evtRecTrackRoot->mdcDedxId();
00283 if ( mdcDedxId >= 0 ) {
00284 evtRecTrack->setMdcDedx(
00285 dynamic_cast<RecMdcDedx*>(mdcDedxCol->containedObject(mdcDedxId))
00286 );
00287 }
00288
00289 int extTrackId = evtRecTrackRoot->extTrackId();
00290 if ( extTrackId >= 0 ) {
00291 evtRecTrack->setExtTrack(
00292 dynamic_cast<RecExtTrack*>(extTrackCol->containedObject(extTrackId))
00293 );
00294 }
00295
00296 const std::vector<int>& tofTrackIds = evtRecTrackRoot->tofTrackIds();
00297 for ( unsigned int i = 0; i < tofTrackIds.size(); i++) {
00298 RecTofTrack* tofTrack = dynamic_cast<RecTofTrack*>(tofTrackCol->containedObject(tofTrackIds[i]));
00299 evtRecTrack->addTofTrack(tofTrack);
00300 }
00301
00302 int emcShowerId = evtRecTrackRoot->emcShowerId();
00303 if ( emcShowerId >= 0 ) {
00304 evtRecTrack->setEmcShower(
00305 dynamic_cast<RecEmcShower*>(emcShowerCol->containedObject(emcShowerId))
00306 );
00307 }
00308
00309 int mucTrackId = evtRecTrackRoot->mucTrackId();
00310 if ( mucTrackId >= 0 ) {
00311 evtRecTrack->setMucTrack(
00312 dynamic_cast<RecMucTrack*>(mucTrackCol->containedObject(mucTrackId))
00313 );
00314 }
00315
00316 evtRecTrackCol->push_back(evtRecTrack);
00317 }
00318
00319 delete m_evtRecTrackCol;
00320 m_evtRecTrackCol = 0;
00321 return StatusCode::SUCCESS;
00322 }
00323
00324 StatusCode EvtRecTrackCnv::DataObjectToTObject(DataObject* obj, RootAddress* rootaddr) {
00325 MsgStream log(msgSvc(), "EvtRecTrackCnv");
00326 log << MSG::DEBUG << "EvtRecTrackCnv::DataObjectToTObject" << endreq;
00327
00328 EvtRecTrackCol* evtRecTrackCol = dynamic_cast<EvtRecTrackCol*> (obj);
00329 if ( ! evtRecTrackCol ) {
00330 log << MSG::ERROR << "Could not downcast to EvtRecTrackCol" << endreq;
00331 return StatusCode::FAILURE;
00332 }
00333
00334 DataObject* evt = NULL;
00335 StatusCode sc = m_eds->findObject(EventModel::EvtRec::Event, evt);
00336 if ( sc.isFailure() ) {
00337 log << MSG::ERROR << "Could not get EvtRecObject in TDS" << endreq;
00338 return StatusCode::FAILURE;
00339 }
00340 EvtRecObject* devtTds = dynamic_cast<EvtRecObject*> (evt);
00341 if ( ! devtTds ) {
00342 log << MSG::ERROR << "EvtRecTrackCnv: Could not downcast to TDS EvtRecObject" << endreq;
00343 }
00344
00345 IOpaqueAddress *addr;
00346 m_cnvSvc->getEvtRecCnv()->createRep(evt, addr);
00347 TEvtRecObject* recEvt = m_cnvSvc->getEvtRecCnv()->getWriteObject();
00348
00349 const TObjArray* m_evtRecTrackCol = recEvt->getEvtRecTrackCol();
00350 if ( ! m_evtRecTrackCol ) return StatusCode::SUCCESS;
00351
00352 IDataProviderSvc* dataSvc = 0;
00353 sc = serviceLocator()->getService("EventDataSvc",
00354 IDataProviderSvc::interfaceID(), (IInterface*&)dataSvc);
00355 if ( sc.isFailure() ) {
00356 log << MSG::FATAL << "Could not get EventDataSvc in EvtRecTrackCnv" << endreq;
00357 return sc;
00358 }
00359
00360 RecMdcTrackCol::iterator mdcTrackColbegin, mdcTrackColend;
00361 RecMdcKalTrackCol::iterator mdcKalTrackColbegin, mdcKalTrackColend;
00362 RecMdcDedxCol::iterator mdcDedxColbegin, mdcDedxColend;
00363 RecExtTrackCol::iterator extTrackColbegin, extTrackColend;
00364 RecTofTrackCol::iterator tofTrackColbegin, tofTrackColend;
00365 RecEmcShowerCol::iterator emcShowerColbegin, emcShowerColend;
00366 RecMucTrackCol::iterator mucTrackColbegin, mucTrackColend;
00367
00368 SmartDataPtr<RecMdcTrackCol> mdcTrackCol(dataSvc, EventModel::Recon::RecMdcTrackCol);
00369 if ( ! mdcTrackCol ) {
00370 log << MSG::INFO << "Could not find RecMdcTrackCol" << endreq;
00371 }
00372 else {
00373 mdcTrackColbegin = mdcTrackCol->begin();
00374 mdcTrackColend = mdcTrackCol->end();
00375 }
00376
00377 SmartDataPtr<RecMdcKalTrackCol> mdcKalTrackCol(dataSvc, EventModel::Recon::RecMdcKalTrackCol);
00378 if ( ! mdcKalTrackCol ) {
00379 log << MSG::INFO << "Could not find RecMdcKalTrackCol" << endreq;
00380 }
00381 else {
00382 mdcKalTrackColbegin = mdcKalTrackCol->begin();
00383 mdcKalTrackColend = mdcKalTrackCol->end();
00384 }
00385
00386 SmartDataPtr<RecMdcDedxCol> mdcDedxCol(dataSvc, EventModel::Recon::RecMdcDedxCol);
00387 if ( ! mdcDedxCol ) {
00388 log << MSG::INFO << "Could not find RecMdcDedxCol" << endreq;
00389 }
00390 else {
00391 mdcDedxColbegin = mdcDedxCol->begin();
00392 mdcDedxColend = mdcDedxCol->end();
00393 }
00394
00395 SmartDataPtr<RecExtTrackCol> extTrackCol(dataSvc, EventModel::Recon::RecExtTrackCol);
00396 if ( ! extTrackCol ) {
00397 log << MSG::INFO << "Could not find RecExtTrackCol" << endreq;
00398 }
00399 else {
00400 extTrackColbegin = extTrackCol->begin();
00401 extTrackColend = extTrackCol->end();
00402 }
00403
00404 SmartDataPtr<RecTofTrackCol> tofTrackCol(dataSvc, EventModel::Recon::RecTofTrackCol);
00405 if ( ! tofTrackCol ) {
00406 log << MSG::INFO << "Could not find RecTofTrackCol" << endreq;
00407 }
00408 else {
00409 tofTrackColbegin = tofTrackCol->begin();
00410 tofTrackColend = tofTrackCol->end();
00411 }
00412
00413 SmartDataPtr<RecEmcShowerCol> emcShowerCol(dataSvc, EventModel::Recon::RecEmcShowerCol);
00414 if ( ! emcShowerCol ) {
00415 log << MSG::INFO << "Could not find RecEmcShowerCol" << endreq;
00416 }
00417 else {
00418 emcShowerColbegin = emcShowerCol->begin();
00419 emcShowerColend = emcShowerCol->end();
00420 }
00421
00422 SmartDataPtr<RecMucTrackCol> mucTrackCol(dataSvc, EventModel::Recon::RecMucTrackCol);
00423 if ( ! mucTrackCol ) {
00424 log << MSG::INFO << "Could not find RecMucTrackCol" << endreq;
00425 }
00426 else {
00427 mucTrackColbegin = mucTrackCol->begin();
00428 mucTrackColend = mucTrackCol->end();
00429 }
00430
00431
00432 recEvt->clearEvtRecTrackCol();
00433 EvtRecTrackCol::const_iterator evtRecTrack = evtRecTrackCol->begin();
00434
00435 for ( ; evtRecTrack != evtRecTrackCol->end(); evtRecTrack++) {
00436 EvtRecTrack* ptr = *evtRecTrack;
00437 TEvtRecTrack* evtRecTrackRoot = new TEvtRecTrack();
00438
00439 evtRecTrackRoot->setTrackId( ptr->trackId() );
00440 evtRecTrackRoot->setPartId( ptr->partId() );
00441 evtRecTrackRoot->setQuality( ptr->quality() );
00442
00443 if ( ptr->isMdcTrackValid() ) {
00444 RecMdcTrackCol::iterator it = find(mdcTrackColbegin, mdcTrackColend, ptr->mdcTrack());
00445 evtRecTrackRoot->setMdcTrackId( it - mdcTrackColbegin );
00446 }
00447 if ( ptr->isMdcKalTrackValid() ) {
00448 RecMdcKalTrackCol::iterator it = find(mdcKalTrackColbegin, mdcKalTrackColend, ptr->mdcKalTrack());
00449 evtRecTrackRoot->setMdcKalTrackId( it - mdcKalTrackColbegin );
00450 }
00451 if ( ptr->isMdcDedxValid() ) {
00452 RecMdcDedxCol::iterator it = find(mdcDedxColbegin, mdcDedxColend, ptr->mdcDedx());
00453 evtRecTrackRoot->setMdcDedxId( it - mdcDedxColbegin );
00454 }
00455 if ( ptr->isExtTrackValid() ) {
00456 RecExtTrackCol::iterator it = find(extTrackColbegin, extTrackColend, ptr->extTrack());
00457 evtRecTrackRoot->setExtTrackId( it - extTrackColbegin );
00458 }
00459 if ( ptr->isTofTrackValid() ) {
00460 SmartRefVector<RecTofTrack> tofTrackVec = ptr->tofTrack();
00461 for ( unsigned int i = 0; i < tofTrackVec.size(); i++ ) {
00462 RecTofTrackCol::iterator it = find(tofTrackColbegin, tofTrackColend, tofTrackVec[i]);
00463 evtRecTrackRoot->addTofTrackId( it - tofTrackColbegin );
00464 }
00465 }
00466 if ( ptr->isEmcShowerValid() ) {
00467 RecEmcShowerCol::iterator it = find(emcShowerColbegin, emcShowerColend, ptr->emcShower());
00468 evtRecTrackRoot->setEmcShowerId( it - emcShowerColbegin );
00469 }
00470 if ( ptr->isMucTrackValid() ) {
00471 RecMucTrackCol::iterator it = find(mucTrackColbegin, mucTrackColend, ptr->mucTrack());
00472 evtRecTrackRoot->setMucTrackId( it - mucTrackColbegin );
00473 }
00474
00475 recEvt->addEvtRecTrack(evtRecTrackRoot);
00476 }
00477
00478 return StatusCode::SUCCESS;
00479 }