00001 #ifndef RecMdcDedxCnv_CXX
00002 #define RecMdcDedxCnv_CXX 1
00003 #include "GaudiKernel/MsgStream.h"
00004 #include "GaudiKernel/DataObject.h"
00005 #include "GaudiKernel/ObjectVector.h"
00006 #include "TClonesArray.h"
00007 #include "EventModel/EventModel.h"
00008 #include "ReconEvent/ReconEvent.h"
00009 #include "MdcRecEvent/RecMdcTrack.h"
00010 #include "MdcRecEvent/RecMdcDedxHit.h"
00011 #include "MdcRecEvent/RecMdcKalTrack.h"
00012 #include "MdcRecEvent/RecMdcDedx.h"
00013
00014 #include "RootEventData/TRecMdcDedx.h"
00015 #include "RootEventData/TRecTrackEvent.h"
00016
00017 #include "RootCnvSvc/Rec/RecTrackCnv.h"
00018 #include "RootCnvSvc/Rec/RecMdcDedxCnv.h"
00019 #include "RootCnvSvc/RootAddress.h"
00020
00021 #include <vector>
00022
00023 using namespace std;
00024
00025
00026
00027
00028
00029
00030 RecMdcDedxCnv::RecMdcDedxCnv(ISvcLocator* svc)
00031 : RootEventBaseCnv(classID(), svc)
00032 {
00033
00034
00035 MsgStream log(msgSvc(), "RecMdcDedxCnv");
00036
00037
00038 m_rootBranchname ="m_recMdcDedxCol";
00039
00040 m_adresses.push_back(&m_recMdcDedxCol);
00041 m_recMdcDedxCol=0;
00042 }
00043
00044 StatusCode RecMdcDedxCnv::TObjectToDataObject(DataObject*& refpObject) {
00045
00046 MsgStream log(msgSvc(), "RecMdcDedxCnv");
00047 log << MSG::DEBUG << "RecMdcDedxCnv::TObjectToDataObject" << endreq;
00048 StatusCode sc=StatusCode::SUCCESS;
00049
00050
00051 RecMdcDedxCol* recMdcDedxCol = new RecMdcDedxCol;
00052 refpObject=recMdcDedxCol;
00053
00054 if (!m_recMdcDedxCol) return sc;
00055
00056
00057 IDataProviderSvc* dataSvc = 0;
00058 sc = serviceLocator()->getService("EventDataSvc",
00059 IDataProviderSvc::interfaceID(), (IInterface*&)dataSvc);
00060 if ( sc.isFailure() ) {
00061 log << MSG::FATAL << "Could not get EventDataSvc in RecMdcDedxCnv" << endreq;
00062 return sc;
00063 }
00064
00065
00066 SmartDataPtr<RecMdcDedxHitCol> recMdcDedxHitCol(dataSvc,"/Event/Recon/RecMdcDedxHitCol");
00067 if (!recMdcDedxHitCol) {
00068 log << MSG::FATAL << "Could not find RecMdcDedxHitCol" << endreq;
00069 return( StatusCode::FAILURE);
00070 }
00071
00072
00073 int trackID;
00074
00075 SmartDataPtr<RecMdcTrackCol> mdcTrackCol(dataSvc, EventModel::Recon::RecMdcTrackCol);
00076 if(!mdcTrackCol)
00077 {
00078 log << MSG::INFO << "Could not find RecMdcTrackCol" << endreq;
00079 SmartDataPtr<DstMdcTrackCol> dstMdcTrackCol(dataSvc,"/Event/Dst/DstMdcTrackCol");
00080 if (!dstMdcTrackCol) {
00081 log << MSG::INFO << "Could not find DstMdcTrackCol" << endreq;
00082 }
00083 else {
00084 RecMdcTrackCol* mdcTrackCol = new RecMdcTrackCol();
00085 DstMdcTrackCol::iterator iter_mdc = dstMdcTrackCol->begin();
00086 trackID = 0;
00087 for (;iter_mdc != dstMdcTrackCol->end(); iter_mdc++, trackID++) {
00088 RecMdcTrack* recMdcTrack = new RecMdcTrack();
00089 *recMdcTrack = **iter_mdc;
00090 (*mdcTrackCol).push_back(recMdcTrack);
00091 log << MSG::INFO
00092 << " Mdc Track ID = " << trackID
00093 << " Mdc Track Nster = " << (*iter_mdc)->nster()
00094 << endreq;
00095 }
00096 sc = dataSvc->registerObject(EventModel::Recon::RecMdcTrackCol,mdcTrackCol);
00097 }
00098 }
00099
00100
00101 SmartDataPtr<RecMdcKalTrackCol> mdcKalTrackCol(dataSvc, EventModel::Recon::RecMdcKalTrackCol);
00102 if (!mdcKalTrackCol) {
00103 log << MSG::INFO << "Could not find RecMdcKalTrackCol" << endreq;
00104 SmartDataPtr<DstMdcKalTrackCol> dstMdcKalTrackCol(dataSvc,"/Event/Dst/DstMdcKalTrackCol");
00105 if(!dstMdcKalTrackCol) {
00106 log << MSG::INFO << "Could not find DstMdcKalTrackCol" << endreq;
00107 }
00108 else {
00109 RecMdcKalTrackCol* mdcKalTrackCol = new RecMdcKalTrackCol();
00110 DstMdcKalTrackCol::iterator iter_mdc = dstMdcKalTrackCol->begin();
00111 trackID = 0;
00112 for (;iter_mdc != dstMdcKalTrackCol->end(); iter_mdc++, trackID++) {
00113 RecMdcKalTrack* recMdcKalTrack = new RecMdcKalTrack();
00114 *recMdcKalTrack = **iter_mdc;
00115 (*mdcKalTrackCol).push_back(recMdcKalTrack);
00116 log << MSG::INFO
00117 << " MdcKalTrack ID = " << trackID
00118 << " MdcKalTrack Nster = " << (*iter_mdc)->nster()
00119 << " MdcKalTrack poca = " << (*iter_mdc)->poca()
00120 << endreq;
00121 }
00122 sc = dataSvc->registerObject(EventModel::Recon::RecMdcKalTrackCol, mdcKalTrackCol);
00123 }
00124 }
00125
00126
00127
00128
00129 TIter dedxIter(m_recMdcDedxCol);
00130 TRecMdcDedx *recMdcDedxRoot = 0;
00131 while ((recMdcDedxRoot = (TRecMdcDedx*)dedxIter.Next())) {
00132 double dedxHit = recMdcDedxRoot->dedxHit();
00133 double dedxEsat = recMdcDedxRoot->dedxEsat();
00134 double dedxNoRun = recMdcDedxRoot->dedxNoRun();
00135 double dedxMoment = recMdcDedxRoot->dedxMoment();
00136
00137 int trackId = recMdcDedxRoot->trackId();
00138 int particleId = recMdcDedxRoot->particleId();
00139 int status = recMdcDedxRoot->status();
00140 int truncAlg = recMdcDedxRoot->truncAlg();
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150 double chi[5];
00151 chi[0] = recMdcDedxRoot->chiE();
00152 chi[1] = recMdcDedxRoot->chiMu();
00153 chi[2] = recMdcDedxRoot->chiPi();
00154 chi[3] = recMdcDedxRoot->chiK();
00155 chi[4] = recMdcDedxRoot->chiP();
00156 int numGoodHits = recMdcDedxRoot->numGoodHits();
00157 int numTotalHits = recMdcDedxRoot->numTotalHits();
00158
00159 double probPH = recMdcDedxRoot->probPH();
00160 double normPH = recMdcDedxRoot->normPH();
00161 double errorPH = recMdcDedxRoot->errorPH();
00162 double twentyPH = recMdcDedxRoot->twentyPH();
00163 double dedxExpect[5],sigmaDedx[5],pidProb[5];
00164
00165 for (int i=0; i<5; i++){
00166 dedxExpect[i] = recMdcDedxRoot->dedxExpect(i);
00167 sigmaDedx[i] = recMdcDedxRoot->sigmaDedx(i);
00168 pidProb[i] = recMdcDedxRoot->pidProb(i);}
00169
00170 log << MSG::DEBUG<<"TObjectToDataObject: check Reconstrunction of dE/dx root::"<<" trackId: "<<trackId<<" particleId: "<<particleId<<" status: "<<status<<" truncAlg: "<<truncAlg<<" chi[2]: "<<chi[2]<<" numTotalHits: "<<numTotalHits<<" probPH: "<<probPH<<" errorPH: "<<errorPH<<" dedxExpect[2]: "<<dedxExpect[2]<<endreq;
00171
00172 RecMdcDedx *recMdcDedx = new RecMdcDedx();
00173 m_common.m_rootRecMdcDedxMap[recMdcDedxRoot] = recMdcDedx;
00174
00175 recMdcDedx->setTrackId(trackId);
00176 recMdcDedx->setParticleId(particleId);
00177 recMdcDedx->setStatus (status);
00178 recMdcDedx->setTruncAlg(truncAlg);
00179
00180
00181
00182
00183
00184
00185 recMdcDedx->setChi(chi);
00186 recMdcDedx->setNumGoodHits( numGoodHits);
00187 recMdcDedx->setNumTotalHits( numTotalHits);
00188
00189 recMdcDedx->setProbPH(probPH);
00190 recMdcDedx->setNormPH(normPH);
00191 recMdcDedx->setErrorPH(errorPH);
00192 recMdcDedx->setTwentyPH(twentyPH);
00193
00194 recMdcDedx->setDedxExpect(dedxExpect);
00195 recMdcDedx->setSigmaDedx(sigmaDedx);
00196 recMdcDedx->setPidProb(pidProb);
00197
00198 recMdcDedx->setDedxHit(dedxHit);
00199 recMdcDedx->setDedxEsat(dedxEsat);
00200 recMdcDedx->setDedxNoRun(dedxNoRun);
00201 recMdcDedx->setDedxMoment(dedxMoment);
00202
00203
00204 DedxHitRefVec theDedxHitRefVec;
00205 RecMdcDedxHitCol::iterator iter = recMdcDedxHitCol->begin();
00206 for (;iter != recMdcDedxHitCol->end(); iter++){
00207 if((*iter)->getTrkId() == trackId){
00208 SmartRef<RecMdcDedxHit> refDedxHit(*iter);
00209 theDedxHitRefVec.push_back(refDedxHit);
00210 }
00211 }
00212 recMdcDedx->setVecDedxHits(theDedxHitRefVec);
00213 int nhits = recMdcDedx->getVecDedxHits().size();
00214
00215 for(int ii=0; ii <nhits ; ii++){
00216 Identifier id(recMdcDedx->getVecDedxHits()[ii]->getMdcId());
00217 int layer = MdcID::layer(id);
00218 int wire = MdcID::wire(id);
00219
00220 }
00221
00222 int mdcTrackId = recMdcDedxRoot->mdcTrackId();
00223
00224 if ( mdcTrackId >= 0 ) {
00225 recMdcDedx->setMdcTrack(
00226 dynamic_cast<RecMdcTrack*>(mdcTrackCol->containedObject(mdcTrackId)));
00227 }
00228 int mdcKalTrackId = recMdcDedxRoot->mdcKalTrackId();
00229
00230 if ( mdcKalTrackId >= 0 ) {
00231 recMdcDedx->setMdcKalTrack(
00232 dynamic_cast<RecMdcKalTrack*>(mdcKalTrackCol->containedObject(mdcKalTrackId)));
00233 }
00234
00235 recMdcDedxCol->push_back(recMdcDedx);
00236
00237
00238 }
00239
00240 delete m_recMdcDedxCol;
00241 m_recMdcDedxCol = 0;
00242
00243 return StatusCode::SUCCESS;
00244 }
00245
00246
00247 StatusCode RecMdcDedxCnv::DataObjectToTObject(DataObject* obj,RootAddress* rootaddr) {
00248 MsgStream log(msgSvc(), "RecMdcDedxCnv");
00249 log << MSG::DEBUG << "RecMdcDedxCnv::DataObjectToTObject" << endreq;
00250 StatusCode sc=StatusCode::SUCCESS;
00251
00252 RecMdcDedxCol * recMdcDedxCol=dynamic_cast<RecMdcDedxCol *> (obj);
00253 if (!recMdcDedxCol) {
00254 log << MSG::ERROR << "Could not downcast to RecMdcDedxCol" << endreq;
00255 return StatusCode::FAILURE;
00256 }
00257
00258 DataObject *evt;
00259 m_eds->findObject(EventModel::Recon::Event,evt);
00260 if (evt==NULL) {
00261 log << MSG::ERROR << "Could not get RecEvent in TDS " << endreq;
00262 return StatusCode::FAILURE;
00263 }
00264 ReconEvent * devtTds=dynamic_cast<ReconEvent *> (evt);
00265 if (!devtTds) {
00266 log << MSG::ERROR << "RecMdcDedxCnv:Could not downcast to TDS RecEvent" << endreq;
00267 }
00268
00269 IOpaqueAddress *addr;
00270 m_cnvSvc->getRecTrackCnv()->createRep(evt,addr);
00271 TRecTrackEvent *recEvt=m_cnvSvc->getRecTrackCnv()->getWriteObject();
00272
00273 const TObjArray *m_recMdcDedxCol = recEvt->getRecMdcDedxCol();
00274 if (!m_recMdcDedxCol) return sc;
00275 recEvt->clearRecMdcDedxCol();
00276
00277
00278
00279 RecMdcTrackCol::iterator recMdcTrackColbegin, recMdcTrackColend;
00280 RecMdcKalTrackCol::iterator recMdcKalTrackColbegin, recMdcKalTrackColend;
00281
00282 IDataProviderSvc* dataSvc = 0;
00283 sc = serviceLocator()->getService("EventDataSvc",
00284 IDataProviderSvc::interfaceID(), (IInterface*&)dataSvc);
00285 if ( sc.isFailure() ) {
00286 log << MSG::FATAL << "Could not get EventDataSvc in RecMdcDedxCnv" << endreq;
00287 return sc;
00288 }
00289 SmartDataPtr<RecMdcTrackCol> recMdcTrackCol(dataSvc, EventModel::Recon::RecMdcTrackCol);
00290 if (!recMdcTrackCol) {
00291 log << MSG::ERROR << "Could not downcast to RecMdcTrackCol" << endreq;
00292 return StatusCode::FAILURE;
00293 }
00294 else {
00295 recMdcTrackColbegin = recMdcTrackCol->begin();
00296 recMdcTrackColend = recMdcTrackCol->end();
00297 }
00298
00299 SmartDataPtr<RecMdcKalTrackCol> recMdcKalTrackCol(dataSvc, EventModel::Recon::RecMdcKalTrackCol);
00300 if (!recMdcKalTrackCol) {
00301 log << MSG::ERROR << "Could not downcast to RecMdcKalTrackCol" << endreq;
00302 return StatusCode::FAILURE;
00303 }
00304 else {
00305 recMdcKalTrackColbegin = recMdcKalTrackCol->begin();
00306 recMdcKalTrackColend = recMdcKalTrackCol->end();
00307 }
00308
00309
00310 RecMdcDedxCol::const_iterator recMdcDedx;
00311
00312 for (recMdcDedx = recMdcDedxCol->begin(); recMdcDedx != recMdcDedxCol->end(); recMdcDedx++) {
00313 Int_t trackId = (*recMdcDedx)->trackId();
00314 Int_t particleId = (*recMdcDedx)->particleId();
00315 Int_t status = (*recMdcDedx)->status();
00316 Int_t truncAlg = (*recMdcDedx)->truncAlg();
00317
00318
00319
00320 Double_t dedxHit = (*recMdcDedx)->getDedxHit();
00321 Double_t dedxEsat = (*recMdcDedx)->getDedxEsat();
00322 Double_t dedxNoRun = (*recMdcDedx)->getDedxNoRun();
00323 Double_t dedxMoment = (*recMdcDedx)->getDedxMoment();
00324
00325
00326 Double_t chiE = (*recMdcDedx)->chi(0);
00327 Double_t chiMu = (*recMdcDedx)->chi(1);
00328 Double_t chiPi = (*recMdcDedx)->chi(2);
00329 Double_t chiK = (*recMdcDedx)->chi(3);
00330 Double_t chiP = (*recMdcDedx)->chi(4);
00331
00332 Int_t numGoodHits = (*recMdcDedx)->numGoodHits();
00333 Int_t numTotalHits = (*recMdcDedx)->numTotalHits();
00334
00335 Double_t probPH = (*recMdcDedx)->probPH();
00336 Double_t normPH = (*recMdcDedx)->normPH();
00337 Double_t errorPH = (*recMdcDedx)->errorPH();
00338 Double_t twentyPH = (*recMdcDedx)->twentyPH();
00339
00340
00341
00342 double dedxExpect[5],sigmaDedx[5],pidProb[5],chi[5];
00343 for (int i=0; i<5; i++){
00344 chi[i] = (*recMdcDedx)->chi(i);
00345 dedxExpect[i] = (*recMdcDedx)->getDedxExpect(i);
00346 sigmaDedx[i] = (*recMdcDedx)->getSigmaDedx(i);
00347 pidProb[i] = (*recMdcDedx)->getPidProb(i);
00348 }
00349
00350 log << MSG::DEBUG<<"DataObjectToTObject: check Reconstrunction of dE/dx::"<<" trackId: "<<trackId<<" particleId: "<<particleId<<" status: "<<status<<" truncAlg: "<<truncAlg<<" chiPi: "<<chiPi<<" numTotalHits: "<<numTotalHits<<" probPH: "<<probPH<<" errorPH: "<<errorPH<<" dedxExpect[2]: "<<dedxExpect[2]<<endreq;
00351
00352
00353 TRecMdcDedx *recMdcDedxRoot = new TRecMdcDedx();
00354
00355
00356 recMdcDedxRoot->setTrackId(trackId);
00357 recMdcDedxRoot->setParticleId(particleId);
00358 recMdcDedxRoot->setStatus (status);
00359 recMdcDedxRoot->setTruncAlg(truncAlg);
00360
00361
00362 recMdcDedxRoot->setChiE(chiE);
00363 recMdcDedxRoot->setChiMu(chiMu);
00364 recMdcDedxRoot->setChiPi(chiPi);
00365 recMdcDedxRoot->setChiK(chiK);
00366 recMdcDedxRoot->setChiP(chiP);
00367
00368 recMdcDedxRoot->setNumGoodHits( numGoodHits);
00369 recMdcDedxRoot->setNumTotalHits( numTotalHits);
00370
00371 recMdcDedxRoot->setProbPH(probPH);
00372 recMdcDedxRoot->setNormPH(normPH);
00373 recMdcDedxRoot->setErrorPH(errorPH);
00374 recMdcDedxRoot->setTwentyPH(twentyPH);
00375
00376 recMdcDedxRoot->setChi(chi);
00377 recMdcDedxRoot->setDedxExpect(dedxExpect);
00378 recMdcDedxRoot->setSigmaDedx(sigmaDedx);
00379 recMdcDedxRoot->setPidProb(pidProb);
00380
00381 recMdcDedxRoot->setDedxHit(dedxHit);
00382 recMdcDedxRoot->setDedxEsat(dedxEsat);
00383 recMdcDedxRoot->setDedxNoRun(dedxNoRun);
00384 recMdcDedxRoot->setDedxMoment(dedxMoment);
00385
00386
00387 if ( (*recMdcDedx)->isMdcTrackValid() ) {
00388 RecMdcTrackCol::iterator it = find(recMdcTrackColbegin, recMdcTrackColend, (*recMdcDedx)->getMdcTrack());
00389 recMdcDedxRoot->setMdcTrackId( it - recMdcTrackColbegin );
00390 }
00391 else {
00392 recMdcDedxRoot->setMdcTrackId( -1 );
00393 }
00394
00395 if ( (*recMdcDedx)->isMdcKalTrackValid() ) {
00396 RecMdcKalTrackCol::iterator it = find(recMdcKalTrackColbegin, recMdcKalTrackColend, (*recMdcDedx)->getMdcKalTrack());
00397 recMdcDedxRoot->setMdcKalTrackId( it - recMdcKalTrackColbegin );
00398 }
00399 else {
00400 recMdcDedxRoot->setMdcKalTrackId( -1 );
00401 }
00402
00403 log << MSG::INFO<<"check Reconstrunction root"<<" particle Id is : "<<particleId
00404 <<"track id is : "<<trackId
00405 <<" and status is : "<<status<<endreq;
00406
00407
00408
00409
00410 recEvt->addRecMdcDedx(recMdcDedxRoot);
00411 }
00412
00413 return StatusCode::SUCCESS;
00414 }
00415
00416 #endif