/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Event/RootCnvSvc/RootCnvSvc-02-01-12/src/Rec/RecMdcDedxCnv.cxx

Go to the documentation of this file.
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" // standard root object
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 // Instantiation of a static factory class used by clients to create
00026 // instances of this service
00027 //static CnvFactory<RecMdcDedxCnv> s_factory;
00028 //const ICnvFactory& RecMdcDedxCnvFactory = s_factory;
00029 
00030 RecMdcDedxCnv::RecMdcDedxCnv(ISvcLocator* svc)
00031 : RootEventBaseCnv(classID(), svc)
00032 {
00033 
00034     // Here we associate this converter with the /Event path on the TDS.
00035     MsgStream log(msgSvc(), "RecMdcDedxCnv");
00036     //log << MSG::DEBUG << "Constructor called for " << objType() << endreq;
00037     //m_rootTreename ="Rec";
00038     m_rootBranchname ="m_recMdcDedxCol";
00039     // declareObject(EventModel::Recon::RecMdcDedxCol, objType(), m_rootTreename, m_rootBranchname);
00040     m_adresses.push_back(&m_recMdcDedxCol);
00041     m_recMdcDedxCol=0;
00042 }
00043 
00044 StatusCode RecMdcDedxCnv::TObjectToDataObject(DataObject*& refpObject) {
00045   // creation of TDS object from root object
00046     MsgStream log(msgSvc(), "RecMdcDedxCnv");
00047     log << MSG::DEBUG << "RecMdcDedxCnv::TObjectToDataObject" << endreq;
00048     StatusCode sc=StatusCode::SUCCESS;
00049 
00050     // create the TDS location for the Dedx Collection
00051     RecMdcDedxCol* recMdcDedxCol = new RecMdcDedxCol;
00052     refpObject=recMdcDedxCol;
00053 
00054     if (!m_recMdcDedxCol) return sc;
00055     
00056     //*******************Dst to Rec convert in case of no Rec data in TDS****************************
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     //----------get hit smartRefVector--------
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     // Retrieve Mdc Track     
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     // Retrieve MdcKal track 
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     // now convert
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         // double pb[5];
00142         // for ( int i = 0; i < 5; i++) 
00143         //      pb[i] = dedxRoot->prob(i);
00144 
00145         // double numSigmaE  = dedxRoot->numSigmaE();   
00146         // double numSigmaMu = dedxRoot->numSigmaMu();  
00147         // double numSigmaPi = dedxRoot->numSigmaPi();  
00148         // double numSigmaK = dedxRoot->numSigmaK();   
00149         // double numSigmaP = dedxRoot->numSigmaP();   
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             // dedxTds->setProb(pb); 
00180             // dedxTds->setNumSigmaE(numSigmaE);       
00181             // dedxTds->setNumSigmaMu(numSigmaMu);     
00182             // dedxTds->setNumSigmaPi(numSigmaPi);     
00183             // dedxTds->setNumSigmaK(numSigmaK);       
00184             // dedxTds->setNumSigmaP(numSigmaP);       
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             //for (int i=0; i<5; i++){
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             //std::cout<<" mdc hits: "<<nhits<< std::endl;
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                 //cout<<"layer: "<<layer<<" wire: "<<wire<<endl;
00220             }
00221 
00222             int mdcTrackId = recMdcDedxRoot->mdcTrackId();
00223             //std::cout << __FILE__ << __LINE__ << " size: " << mdcTrackCol->size() << "  id: " << mdcTrackId << std::endl;
00224             if ( mdcTrackId >= 0 ) { 
00225                 recMdcDedx->setMdcTrack(
00226                             dynamic_cast<RecMdcTrack*>(mdcTrackCol->containedObject(mdcTrackId)));
00227             }
00228             int mdcKalTrackId = recMdcDedxRoot->mdcKalTrackId();
00229             //std::cout << __FILE__ << __LINE__ << " size: " << mdcKalTrackCol->size() << "  id: " << mdcKalTrackId<< std::endl;
00230             if ( mdcKalTrackId >= 0 ) {
00231                 recMdcDedx->setMdcKalTrack(
00232                             dynamic_cast<RecMdcKalTrack*>(mdcKalTrackCol->containedObject(mdcKalTrackId)));
00233             }
00234 
00235             recMdcDedxCol->push_back(recMdcDedx); 
00236             //delete dedxTds;
00237             // dedxTds = NULL;
00238     }
00239     //m_dedxCol->Delete();
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(); //necessary in case there is I/O at the same time since array is static
00276 
00277     //******************** get according mdcTrack and MdcKalmanTrack of MdcDedx  ****************
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         // Double_t pb[5];
00318         // for (Int_t i = 0; i < 5; i++) 
00319         // pb[i] = (*dedxTds)->prob(i);
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         //Double_t fracErrPH = (*dedxTds)-> fracErrPH();  
00340         //Double_t minIronPH = (*dedxTds)->minIronPH();   
00341         //Double_t corrPH = (*dedxTds)->corrPH();      
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         //m_common.m_recMdcDedxMap[(*recMdcDedx)] = recMdcDedxRoot;
00355         //std::cout<<"check write to Reconstrunction root particle Id is "<<dedxRoot->particleId()<<endl; 
00356         recMdcDedxRoot->setTrackId(trackId);
00357         recMdcDedxRoot->setParticleId(particleId);  
00358         recMdcDedxRoot->setStatus (status); 
00359         recMdcDedxRoot->setTruncAlg(truncAlg);
00360         
00361         //dedxRoot->setProb(pb); 
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         //  for (int i=0; i<5; i++){
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         // dedxRoot->setFracErrPH(fracErrPH);       
00408         //dedxRoot->setMinIronPH(minIronPH);       
00409         //dedxRoot->setCorrPH(corrPH);             
00410         recEvt->addRecMdcDedx(recMdcDedxRoot);
00411     }
00412 
00413     return StatusCode::SUCCESS;
00414 }
00415 
00416 #endif

Generated on Tue Nov 29 22:58:52 2016 for BOSS_7.0.2 by  doxygen 1.4.7