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

Go to the documentation of this file.
00001 #ifndef RecMdcTrackCnv_CXX
00002 #define RecMdcTrackCnv_CXX  1
00003 
00004 #include "GaudiKernel/MsgStream.h"
00005 #include "GaudiKernel/DataObject.h"
00006 #include "GaudiKernel/ObjectVector.h"
00007 
00008 #include "TClonesArray.h"
00009 #include "Identifier/MdcID.h"
00010 #include "Identifier/Identifier.h"
00011 
00012 #include "EventModel/EventModel.h"
00013 
00014 #include "ReconEvent/ReconEvent.h"  
00015 #include "MdcRecEvent/RecMdcTrack.h"
00016 #include "MdcRecEvent/RecMdcHit.h"
00017 #include "RootEventData/TRecMdcTrack.h"
00018 #include "RootEventData/TRecTrackEvent.h"
00019 
00020 #include "RootCnvSvc/Rec/RecTrackCnv.h"
00021 #include "RootCnvSvc/Rec/RecMdcTrackCnv.h"
00022 #include "RootCnvSvc/RootAddress.h"
00023 
00024 #include <vector>
00025 
00026 using namespace std;
00027 
00028 // Instantiation of a static factory class used by clients to create
00029 // instances of this service
00030 //static CnvFactory<RecMdcTrackCnv> s_factory;
00031 //const ICnvFactory& RecMdcTrackCnvFactory = s_factory;
00032 
00033 RecMdcTrackCnv::RecMdcTrackCnv(ISvcLocator* svc)
00034 : RootEventBaseCnv(classID(), svc)
00035 {
00036     // Here we associate this converter with the /Event path on the TDS.
00037     MsgStream log(msgSvc(), "RecMdcTrackCnv");
00038     //m_rootTreename ="Rec";
00039     m_rootBranchname ="m_recMdcTrackCol";
00040     //declareObject(EventModel::Recon::RecMdcTrackCol, objType(), m_rootTreename, m_rootBranchname);
00041     m_adresses.push_back(&m_recMdcTrackCol);
00042     m_recMdcTrackCol=0;
00043 }
00044 
00045 StatusCode RecMdcTrackCnv::TObjectToDataObject(DataObject*& refpObject) {
00046   // creation of TDS object from root object
00047   MsgStream log(msgSvc(), "RecMdcTrackCnv");
00048   log << MSG::DEBUG << "RecMdcTrackCnv::TObjectToDataObject" << endreq;
00049 
00050   // create the TDS location for the RecMdcTrack Collection
00051   RecMdcTrackCol* recMdcTrackCol = new RecMdcTrackCol;
00052   refpObject = recMdcTrackCol;
00053   // now convert
00054   if (!m_recMdcTrackCol) return StatusCode::SUCCESS;
00055   TIter mdcTrackIter(m_recMdcTrackCol);
00056 
00057   //----------get hit smartRefVector--------
00058   //HitRefVec *hitRefVec;
00059   //int nTk=0;
00060   //while (mdcTrackIter.Next()){ nTk++; }
00061   //hitRefVec = new HitRefVec[nTk];
00062 
00063   IDataProviderSvc* dataSvc = 0;
00064   StatusCode sc = serviceLocator()->getService ("EventDataSvc",  
00065                     IDataProviderSvc::interfaceID(), (IInterface*&)dataSvc);
00066   if (!sc.isSuccess()) {
00067     log << MSG::FATAL << "Could not get EventDataSvc in RecMdcTrackCnv" << endreq;
00068     return( StatusCode::FAILURE);
00069   }
00070   SmartDataPtr<RecMdcHitCol> recMdcHitCol(dataSvc,"/Event/Recon/RecMdcHitCol");
00071   if (!recMdcHitCol) {
00072     log << MSG::FATAL << "Could not find RecMdcHitCol" << endreq;
00073     return( StatusCode::FAILURE);
00074   }
00075   //RecMdcHitCol::iterator iter = recMdcHitCol->begin();
00076   //for (;iter != recMdcHitCol->end(); iter++ ) {
00077   //  int tkId = (*iter)->getTrkId(); 
00078   //  hitRefVec[tkId].push_back(*iter);
00079   //}
00080 
00081   //---------------------------------------
00082   mdcTrackIter = m_recMdcTrackCol;
00083   TRecMdcTrack *recMdcTrackRoot = 0;
00084   while ((recMdcTrackRoot = (TRecMdcTrack*)mdcTrackIter.Next())) {
00085     int      trackId =  recMdcTrackRoot->trackId();
00086     int      charge =   recMdcTrackRoot->charge();     
00087     double   helix[5];
00088     for(int i=0;i<5; i++){
00089       helix[i] = recMdcTrackRoot->helix(i);
00090     }
00091     double   pxy   = recMdcTrackRoot->pxy();
00092     double   px    = recMdcTrackRoot->px();
00093     double   py    = recMdcTrackRoot->py();
00094     double   pz    = recMdcTrackRoot->pz();
00095     double   p     = recMdcTrackRoot->p();
00096     double   theta = recMdcTrackRoot->theta();
00097     double   phi   = recMdcTrackRoot->phi();
00098     double   x     = recMdcTrackRoot->x();
00099     double   y     = recMdcTrackRoot->y();
00100     double   z     = recMdcTrackRoot->z();
00101     double   r     = recMdcTrackRoot->r();
00102     int      stat  = recMdcTrackRoot->stat();      
00103     double   chi   = recMdcTrackRoot->chi2();      
00104     int      ndof  = recMdcTrackRoot->ndof();       
00105     int      nlayer= recMdcTrackRoot->nlayer();       
00106     double err[15];
00107     for (int i=0; i<15; i++){
00108       err[i] = recMdcTrackRoot->err(i);
00109     }
00110     int      nh     = recMdcTrackRoot->nhits();     
00111     int      ns     = recMdcTrackRoot->nster();    
00112     // vector<int> vecHits = recMdcTrackRoot->vecHits();
00113     double   vx0    = recMdcTrackRoot->vx0();
00114     double   vy0    = recMdcTrackRoot->vy0();
00115     double   vz0    = recMdcTrackRoot->vz0();
00116     double   fiterm = recMdcTrackRoot->fiTerm();
00117     RecMdcTrack *recMdcTrack = new RecMdcTrack();
00118     m_common.m_rootRecMdcTrackMap[recMdcTrackRoot] = recMdcTrack;
00119 
00120     recMdcTrack->setTrackId( trackId );
00121     recMdcTrack->setCharge( charge );
00122     recMdcTrack->setHelix( helix );
00123     recMdcTrack->setPxy( pxy );   
00124     recMdcTrack->setPx( px );   
00125     recMdcTrack->setPy( py );   
00126     recMdcTrack->setPz( pz );   
00127     recMdcTrack->setP( p );   
00128     recMdcTrack->setTheta( theta );   
00129     recMdcTrack->setPhi( phi );   
00130     recMdcTrack->setX( x );   
00131     recMdcTrack->setY( y );    
00132     recMdcTrack->setZ( z );   
00133     recMdcTrack->setR( r );   
00134     recMdcTrack->setStat( stat );  
00135     recMdcTrack->setChi2( chi );  
00136     recMdcTrack->setNdof( ndof );  
00137     recMdcTrack->setError( err );   
00138     recMdcTrack->setNhits( nh );  
00139     recMdcTrack->setNster( ns ); 
00140     recMdcTrack->setNlayer( nlayer ); 
00141     // recMdcTrack->setVecHits( vecHits );
00142     //rec
00143     recMdcTrack->setVX0( vx0 );   
00144     recMdcTrack->setVY0( vy0 );    
00145     recMdcTrack->setVZ0( vz0 );   
00146     recMdcTrack->setFiTerm( fiterm );  
00147 
00148     HitRefVec theHitRefVec;
00149 
00150     RecMdcHitCol::iterator iter = recMdcHitCol->begin();
00151     for (;iter != recMdcHitCol->end(); iter++){
00152   
00153       //cout<<" (*iter)->getTrkId(): "<<(*iter)->getTrkId()<<endl;
00154       if((*iter)->getTrkId() == trackId){
00155         SmartRef<RecMdcHit> refhit(*iter);
00156         theHitRefVec.push_back(refhit);
00157       }
00158     }
00159 
00160     recMdcTrack->setVecHits(theHitRefVec);
00161     
00162     int nhits = recMdcTrack->getVecHits().size();
00163           
00164     //std::cout<<" mdc hits: "<<nhits<< std::endl;
00165         
00166     for(int ii=0; ii <nhits ; ii++){
00167 
00168       //cout<<"ddl: "<<(recMdcTrack->getVecHits()[ii])->getDriftDistLeft()<<endl;
00169       //cout<<"erddl: "<<(recMdcTrack->getVecHits()[ii])->getErrDriftDistLeft()<<endl;
00170       Identifier id(recMdcTrack->getVecHits()[ii]->getMdcId());
00171       int layer = MdcID::layer(id);
00172       int wire = MdcID::wire(id);
00173       //cout<<"layer: "<<layer<<" wire: "<<wire<<endl;
00174     } 
00175       recMdcTrackCol->push_back(recMdcTrack);
00176   }
00177 
00178   delete m_recMdcTrackCol;
00179   m_recMdcTrackCol = 0;  
00180   return StatusCode::SUCCESS;
00181 }
00182 
00183 
00184 
00185 
00186 StatusCode RecMdcTrackCnv::DataObjectToTObject(DataObject* obj,RootAddress* rootaddr) {
00187 
00188   MsgStream log(msgSvc(), "RecMdcTrackCnv");
00189   log << MSG::DEBUG << "RecMdcTrackCnv::DataObjectToTObject" << endreq;
00190  
00191   RecMdcTrackCol * mdcTrackColTds=dynamic_cast<RecMdcTrackCol *> (obj);
00192   if (!mdcTrackColTds) {
00193     log << MSG::ERROR << "Could not downcast to MdcTrackCol" << endreq;
00194     return StatusCode::FAILURE;
00195   }
00196   DataObject *evt;
00197   StatusCode sc = m_eds->findObject(EventModel::Recon::Event,evt);
00198   if (!sc.isSuccess()) {
00199     log << MSG::ERROR << "Could not get ReconEvent in TDS "  << endreq;
00200     return StatusCode::FAILURE;
00201   }
00202   ReconEvent * devtTds=dynamic_cast<ReconEvent *> (evt);
00203   if (!devtTds) {
00204     log << MSG::ERROR << "RecMdcTrackCnv:Could not downcast to TDS ReconEvent" << endreq;
00205   }
00206 
00207   IOpaqueAddress *addr;
00208 
00209   m_cnvSvc->getRecTrackCnv()->createRep(evt,addr);
00210   TRecTrackEvent *recEvt=m_cnvSvc->getRecTrackCnv()->getWriteObject();
00211 
00212   const TObjArray *m_recMdcTrackCol = recEvt->getRecMdcTrackCol();
00213   if (!m_recMdcTrackCol) return StatusCode::SUCCESS;
00214   //necessary in case there is I/O at the same time since array is static
00215   recEvt->clearRecMdcTrackCol();
00216 
00217   RecMdcTrackCol::const_iterator recMdcTrack;
00218   for (recMdcTrack = mdcTrackColTds->begin(); recMdcTrack != mdcTrackColTds->end(); recMdcTrack++) {
00219      Int_t      trackId =(*recMdcTrack)->trackId();
00220      Double_t   helix[5];
00221      for(int i=0;i<5;i++){
00222        log<<MSG::INFO<<" recMdcTrack.helix("<<i<<"): "<<(*recMdcTrack)->helix(i)<<endreq;
00223        helix[i] = (*recMdcTrack)->helix(i);     
00224      }
00225 
00226      Int_t      stat =  (*recMdcTrack)->stat();      
00227      Double_t   chi =   (*recMdcTrack)->chi2();      
00228      Int_t      ndof =  (*recMdcTrack)->ndof();       
00229      Int_t      ns =    (*recMdcTrack)->nster();
00230      Int_t      nlayer =(*recMdcTrack)->nlayer();       
00231 
00232      Double_t er[15];
00233      for (Int_t i=0; i<15; i++){
00234        er[i] = (*recMdcTrack)->err(i);
00235      }
00236      Int_t      nh =    (*recMdcTrack)->getNhits();     
00237      // vector<Int_t> vecHits = (*recMdcTrack)->vecHits();
00238      Double_t   vx0 =   (*recMdcTrack)->getVX0();         
00239      Double_t   vy0 =   (*recMdcTrack)->getVY0();         
00240      Double_t   vz0 =   (*recMdcTrack)->getVZ0();
00241      Double_t   fiterm =(*recMdcTrack)->getFiTerm();
00242 
00243      TRecMdcTrack *recMdcTrackRoot = new TRecMdcTrack();
00244      //m_common.m_recMdcTrackMap[(*recMdcTrack)] = recMdcTrackRoot;
00245 
00246      recMdcTrackRoot->setTrackId( trackId );
00247      recMdcTrackRoot->setHelix(helix);
00248      log<<MSG::INFO<<" test,recMdcTrackRoot.px: "<<recMdcTrackRoot->px()
00249                    <<" recMdcTrackRoot.py: "<<recMdcTrackRoot->py()
00250                    <<" recMdcTrackRoot.pz: "<<recMdcTrackRoot->pz()
00251                    <<endreq;
00252        
00253      recMdcTrackRoot->setStat( stat );  
00254      recMdcTrackRoot->setChi2( chi );  
00255      recMdcTrackRoot->setNdof( ndof );
00256      recMdcTrackRoot->setNlayer( nlayer );  
00257      recMdcTrackRoot->setErr( er );   
00258      recMdcTrackRoot->setNhits( nh );  
00259      recMdcTrackRoot->setNster( ns  );  
00260      // recMdcTrackRoot->setVecHits(vecHits);
00261      recMdcTrackRoot->setVX0( vx0 );
00262      recMdcTrackRoot->setVY0( vy0 );
00263      recMdcTrackRoot->setVZ0( vz0 );
00264      recMdcTrackRoot->setFiTerm( fiterm );
00265 
00266      recEvt->addRecMdcTrack(recMdcTrackRoot);
00267   }
00268 
00269 
00270   return StatusCode::SUCCESS;
00271 }
00272 #endif

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