BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
RecMdcTrackCnv.cxx
Go to the documentation of this file.
1#ifndef RecMdcTrackCnv_CXX
2#define RecMdcTrackCnv_CXX 1
3
4#include "GaudiKernel/DataObject.h"
5#include "GaudiKernel/MsgStream.h"
6#include "GaudiKernel/ObjectVector.h"
7
8#include "Identifier/Identifier.h"
9#include "Identifier/MdcID.h"
10#include "TClonesArray.h"
11
12#include "EventModel/EventModel.h"
13
14#include "MdcRecEvent/RecMdcHit.h"
15#include "MdcRecEvent/RecMdcTrack.h"
16#include "ReconEvent/ReconEvent.h"
17#include "RootEventData/TRecMdcTrack.h"
18#include "RootEventData/TRecTrackEvent.h"
19
20#include "RootCnvSvc/Rec/RecMdcTrackCnv.h"
21#include "RootCnvSvc/Rec/RecTrackCnv.h"
22#include "RootCnvSvc/RootAddress.h"
23
24#include <vector>
25
26using namespace std;
27
28// Instantiation of a static factory class used by clients to create
29// instances of this service
30// static CnvFactory<RecMdcTrackCnv> s_factory;
31// const ICnvFactory& RecMdcTrackCnvFactory = s_factory;
32
34 // Here we associate this converter with the /Event path on the TDS.
35 MsgStream log( msgSvc(), "RecMdcTrackCnv" );
36 // m_rootTreename ="Rec";
37 m_rootBranchname = "m_recMdcTrackCol";
38 // declareObject(EventModel::Recon::RecMdcTrackCol, objType(), m_rootTreename,
39 // m_rootBranchname);
40 m_adresses.push_back( &m_recMdcTrackCol );
41 m_recMdcTrackCol = 0;
42}
43
44StatusCode RecMdcTrackCnv::TObjectToDataObject( DataObject*& refpObject ) {
45 // creation of TDS object from root object
46 MsgStream log( msgSvc(), "RecMdcTrackCnv" );
47 log << MSG::DEBUG << "RecMdcTrackCnv::TObjectToDataObject" << endmsg;
48
49 // create the TDS location for the RecMdcTrack Collection
50 RecMdcTrackCol* recMdcTrackCol = new RecMdcTrackCol;
51 refpObject = recMdcTrackCol;
52 // now convert
53 if ( !m_recMdcTrackCol ) return StatusCode::SUCCESS;
54 TIter mdcTrackIter( m_recMdcTrackCol );
55
56 //----------get hit smartRefVector--------
57 // HitRefVec *hitRefVec;
58 // int nTk=0;
59 // while (mdcTrackIter.Next()){ nTk++; }
60 // hitRefVec = new HitRefVec[nTk];
61
62 IDataProviderSvc* dataSvc = 0;
63 StatusCode sc = serviceLocator()->getService(
64 "EventDataSvc", IDataProviderSvc::interfaceID(), (IInterface*&)dataSvc );
65 if ( !sc.isSuccess() )
66 {
67 log << MSG::FATAL << "Could not get EventDataSvc in RecMdcTrackCnv" << endmsg;
68 return ( StatusCode::FAILURE );
69 }
70 SmartDataPtr<RecMdcHitCol> recMdcHitCol( dataSvc, "/Event/Recon/RecMdcHitCol" );
71 if ( !recMdcHitCol )
72 {
73 log << MSG::FATAL << "Could not find RecMdcHitCol" << endmsg;
74 return ( StatusCode::FAILURE );
75 }
76 // RecMdcHitCol::iterator iter = recMdcHitCol->begin();
77 // for (;iter != recMdcHitCol->end(); iter++ ) {
78 // int tkId = (*iter)->getTrkId();
79 // hitRefVec[tkId].push_back(*iter);
80 // }
81
82 //---------------------------------------
83 mdcTrackIter = m_recMdcTrackCol;
84 TRecMdcTrack* recMdcTrackRoot = 0;
85 while ( ( recMdcTrackRoot = (TRecMdcTrack*)mdcTrackIter.Next() ) )
86 {
87 int trackId = recMdcTrackRoot->trackId();
88 int charge = recMdcTrackRoot->charge();
89 double helix[5];
90 for ( int i = 0; i < 5; i++ ) { helix[i] = recMdcTrackRoot->helix( i ); }
91 double pxy = recMdcTrackRoot->pxy();
92 double px = recMdcTrackRoot->px();
93 double py = recMdcTrackRoot->py();
94 double pz = recMdcTrackRoot->pz();
95 double p = recMdcTrackRoot->p();
96 double theta = recMdcTrackRoot->theta();
97 double phi = recMdcTrackRoot->phi();
98 double x = recMdcTrackRoot->x();
99 double y = recMdcTrackRoot->y();
100 double z = recMdcTrackRoot->z();
101 double r = recMdcTrackRoot->r();
102 int stat = recMdcTrackRoot->stat();
103 double chi = recMdcTrackRoot->chi2();
104 int ndof = recMdcTrackRoot->ndof();
105 int nlayer = recMdcTrackRoot->nlayer();
106 double err[15];
107 for ( int i = 0; i < 15; i++ ) { err[i] = recMdcTrackRoot->err( i ); }
108 int nh = recMdcTrackRoot->nhits();
109 int ns = recMdcTrackRoot->nster();
110 // vector<int> vecHits = recMdcTrackRoot->vecHits();
111 double vx0 = recMdcTrackRoot->vx0();
112 double vy0 = recMdcTrackRoot->vy0();
113 double vz0 = recMdcTrackRoot->vz0();
114 double fiterm = recMdcTrackRoot->fiTerm();
115 RecMdcTrack* recMdcTrack = new RecMdcTrack();
116 m_common.m_rootRecMdcTrackMap[recMdcTrackRoot] = recMdcTrack;
117
118 recMdcTrack->setTrackId( trackId );
119 recMdcTrack->setCharge( charge );
120 recMdcTrack->setHelix( helix );
121 recMdcTrack->setPxy( pxy );
122 recMdcTrack->setPx( px );
123 recMdcTrack->setPy( py );
124 recMdcTrack->setPz( pz );
125 recMdcTrack->setP( p );
126 recMdcTrack->setTheta( theta );
127 recMdcTrack->setPhi( phi );
128 recMdcTrack->setX( x );
129 recMdcTrack->setY( y );
130 recMdcTrack->setZ( z );
131 recMdcTrack->setR( r );
132 recMdcTrack->setStat( stat );
133 recMdcTrack->setChi2( chi );
134 recMdcTrack->setNdof( ndof );
135 recMdcTrack->setError( err );
136 recMdcTrack->setNhits( nh );
137 recMdcTrack->setNster( ns );
138 recMdcTrack->setNlayer( nlayer );
139 // recMdcTrack->setVecHits( vecHits );
140 // rec
141 recMdcTrack->setVX0( vx0 );
142 recMdcTrack->setVY0( vy0 );
143 recMdcTrack->setVZ0( vz0 );
144 recMdcTrack->setFiTerm( fiterm );
145
146 HitRefVec theHitRefVec;
147
148 RecMdcHitCol::iterator iter = recMdcHitCol->begin();
149 for ( ; iter != recMdcHitCol->end(); iter++ )
150 {
151
152 // cout<<" (*iter)->getTrkId(): "<<(*iter)->getTrkId()<<endl;
153 if ( ( *iter )->getTrkId() == trackId )
154 {
155 SmartRef<RecMdcHit> refhit( *iter );
156 theHitRefVec.push_back( refhit );
157 }
158 }
159
160 recMdcTrack->setVecHits( theHitRefVec );
161
162 int nhits = recMdcTrack->getVecHits().size();
163
164 // std::cout<<" mdc hits: "<<nhits<< std::endl;
165
166 for ( int ii = 0; ii < nhits; ii++ )
167 {
168
169 // cout<<"ddl: "<<(recMdcTrack->getVecHits()[ii])->getDriftDistLeft()<<endl;
170 // cout<<"erddl: "<<(recMdcTrack->getVecHits()[ii])->getErrDriftDistLeft()<<endl;
171 Identifier id( recMdcTrack->getVecHits()[ii]->getMdcId() );
172 int layer = MdcID::layer( id );
173 int wire = MdcID::wire( id );
174 // cout<<"layer: "<<layer<<" wire: "<<wire<<endl;
175 }
176 recMdcTrackCol->push_back( recMdcTrack );
177 }
178
179 delete m_recMdcTrackCol;
180 m_recMdcTrackCol = 0;
181 return StatusCode::SUCCESS;
182}
183
184StatusCode RecMdcTrackCnv::DataObjectToTObject( DataObject* obj, RootAddress* rootaddr ) {
185
186 MsgStream log( msgSvc(), "RecMdcTrackCnv" );
187 log << MSG::DEBUG << "RecMdcTrackCnv::DataObjectToTObject" << endmsg;
188
189 RecMdcTrackCol* mdcTrackColTds = dynamic_cast<RecMdcTrackCol*>( obj );
190 if ( !mdcTrackColTds )
191 {
192 log << MSG::ERROR << "Could not downcast to MdcTrackCol" << endmsg;
193 return StatusCode::FAILURE;
194 }
195 DataObject* evt;
196 StatusCode sc = m_eds->findObject( EventModel::Recon::Event, evt );
197 if ( !sc.isSuccess() )
198 {
199 log << MSG::ERROR << "Could not get ReconEvent in TDS " << endmsg;
200 return StatusCode::FAILURE;
201 }
202 ReconEvent* devtTds = dynamic_cast<ReconEvent*>( evt );
203 if ( !devtTds )
204 { log << MSG::ERROR << "RecMdcTrackCnv:Could not downcast to TDS ReconEvent" << endmsg; }
205
206 IOpaqueAddress* addr;
207
208 m_cnvSvc->getRecTrackCnv()->createRep( evt, addr );
209 TRecTrackEvent* recEvt = m_cnvSvc->getRecTrackCnv()->getWriteObject();
210
211 const TObjArray* m_recMdcTrackCol = recEvt->getRecMdcTrackCol();
212 if ( !m_recMdcTrackCol ) return StatusCode::SUCCESS;
213 // necessary in case there is I/O at the same time since array is static
214 recEvt->clearRecMdcTrackCol();
215
216 RecMdcTrackCol::const_iterator recMdcTrack;
217 for ( recMdcTrack = mdcTrackColTds->begin(); recMdcTrack != mdcTrackColTds->end();
218 recMdcTrack++ )
219 {
220 Int_t trackId = ( *recMdcTrack )->trackId();
221 Double_t helix[5];
222 for ( int i = 0; i < 5; i++ )
223 {
224 log << MSG::INFO << " recMdcTrack.helix(" << i << "): " << ( *recMdcTrack )->helix( i )
225 << endmsg;
226 helix[i] = ( *recMdcTrack )->helix( i );
227 }
228
229 Int_t stat = ( *recMdcTrack )->stat();
230 Double_t chi = ( *recMdcTrack )->chi2();
231 Int_t ndof = ( *recMdcTrack )->ndof();
232 Int_t ns = ( *recMdcTrack )->nster();
233 Int_t nlayer = ( *recMdcTrack )->nlayer();
234
235 Double_t er[15];
236 for ( Int_t i = 0; i < 15; i++ ) { er[i] = ( *recMdcTrack )->err( i ); }
237 Int_t nh = ( *recMdcTrack )->getNhits();
238 // vector<Int_t> vecHits = (*recMdcTrack)->vecHits();
239 Double_t vx0 = ( *recMdcTrack )->getVX0();
240 Double_t vy0 = ( *recMdcTrack )->getVY0();
241 Double_t vz0 = ( *recMdcTrack )->getVZ0();
242 Double_t fiterm = ( *recMdcTrack )->getFiTerm();
243
244 TRecMdcTrack* recMdcTrackRoot = new TRecMdcTrack();
245 // m_common.m_recMdcTrackMap[(*recMdcTrack)] = recMdcTrackRoot;
246
247 recMdcTrackRoot->setTrackId( trackId );
248 recMdcTrackRoot->setHelix( helix );
249 log << MSG::INFO << " test,recMdcTrackRoot.px: " << recMdcTrackRoot->px()
250 << " recMdcTrackRoot.py: " << recMdcTrackRoot->py()
251 << " recMdcTrackRoot.pz: " << recMdcTrackRoot->pz() << endmsg;
252
253 recMdcTrackRoot->setStat( stat );
254 recMdcTrackRoot->setChi2( chi );
255 recMdcTrackRoot->setNdof( ndof );
256 recMdcTrackRoot->setNlayer( nlayer );
257 recMdcTrackRoot->setErr( er );
258 recMdcTrackRoot->setNhits( nh );
259 recMdcTrackRoot->setNster( ns );
260 // recMdcTrackRoot->setVecHits(vecHits);
261 recMdcTrackRoot->setVX0( vx0 );
262 recMdcTrackRoot->setVY0( vy0 );
263 recMdcTrackRoot->setVZ0( vz0 );
264 recMdcTrackRoot->setFiTerm( fiterm );
265
266 recEvt->addRecMdcTrack( recMdcTrackRoot );
267 }
268
269 return StatusCode::SUCCESS;
270}
271#endif
EvtStreamInputIterator< typename Generator::result_type > iter(Generator gen, int N=0)
IMessageSvc * msgSvc()
void setError(double err[15])
void setHelix(double helix[5])
static int layer(const Identifier &id)
Values of different levels (failure returns 0).
Definition MdcID.cxx:47
static int wire(const Identifier &id)
Definition MdcID.cxx:52
RecMdcTrackCnv(ISvcLocator *svc)
virtual StatusCode TObjectToDataObject(DataObject *&obj)
transformation from root
virtual StatusCode DataObjectToTObject(DataObject *obj, RootAddress *addr)
transformation to root
Definition of a Root address, derived from IOpaqueAddress.
IDataProviderSvc * m_eds
pointer to eventdataservice
std::vector< void * > m_adresses
each converter knows the corresponding adresses
std::string m_rootBranchname
root branchname (may be concatenated of severals)
RootEventBaseCnv(const CLID &clid, ISvcLocator *svc)
Double_t y() const
Double_t theta() const
Double_t p() const
Double_t px() const
Double_t x() const
Double_t py() const
Double_t z() const
Double_t pz() const
Double_t pxy() const
Double_t phi() const
Double_t r() const
Int_t charge() const
void addRecMdcTrack(TRecMdcTrack *Track)
Add a TkrTrack into the Mdc data collection.
void clearRecMdcTrackCol()
clear the whole array (necessary because of the consts-s)
const TObjArray * getRecMdcTrackCol() const
retrieve the whole TObjArray of RecMdcTrack Data
#define ns(x)
Definition xmltok.c:1355