BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
RecMdcDedxCnv.cxx
Go to the documentation of this file.
1#ifndef RecMdcDedxCnv_CXX
2#define RecMdcDedxCnv_CXX 1
3#include "EventModel/EventModel.h"
4#include "GaudiKernel/DataObject.h"
5#include "GaudiKernel/MsgStream.h"
6#include "GaudiKernel/ObjectVector.h"
7#include "MdcRecEvent/RecMdcDedx.h"
8#include "MdcRecEvent/RecMdcDedxHit.h"
9#include "MdcRecEvent/RecMdcKalTrack.h"
10#include "MdcRecEvent/RecMdcTrack.h"
11#include "ReconEvent/ReconEvent.h"
12#include "TClonesArray.h"
13
14#include "RootEventData/TRecMdcDedx.h" // standard root object
15#include "RootEventData/TRecTrackEvent.h"
16
17#include "RootCnvSvc/Rec/RecMdcDedxCnv.h"
18#include "RootCnvSvc/Rec/RecTrackCnv.h"
19#include "RootCnvSvc/RootAddress.h"
20
21#include <vector>
22
23using namespace std;
24
25// Instantiation of a static factory class used by clients to create
26// instances of this service
27// static CnvFactory<RecMdcDedxCnv> s_factory;
28// const ICnvFactory& RecMdcDedxCnvFactory = s_factory;
29
30RecMdcDedxCnv::RecMdcDedxCnv( ISvcLocator* svc ) : RootEventBaseCnv( classID(), svc ) {
31
32 // Here we associate this converter with the /Event path on the TDS.
33 MsgStream log( msgSvc(), "RecMdcDedxCnv" );
34 // log << MSG::DEBUG << "Constructor called for " << objType() << endmsg;
35 // m_rootTreename ="Rec";
36 m_rootBranchname = "m_recMdcDedxCol";
37 // declareObject(EventModel::Recon::RecMdcDedxCol, objType(), m_rootTreename,
38 // m_rootBranchname);
39 m_adresses.push_back( &m_recMdcDedxCol );
40 m_recMdcDedxCol = 0;
41}
42
43StatusCode RecMdcDedxCnv::TObjectToDataObject( DataObject*& refpObject ) {
44 // creation of TDS object from root object
45 MsgStream log( msgSvc(), "RecMdcDedxCnv" );
46 log << MSG::DEBUG << "RecMdcDedxCnv::TObjectToDataObject" << endmsg;
47 StatusCode sc = StatusCode::SUCCESS;
48
49 // create the TDS location for the Dedx Collection
50 RecMdcDedxCol* recMdcDedxCol = new RecMdcDedxCol;
51 refpObject = recMdcDedxCol;
52
53 if ( !m_recMdcDedxCol ) return sc;
54
55 //*******************Dst to Rec convert in case of no Rec data in
56 // TDS****************************
57 IDataProviderSvc* dataSvc = 0;
58 sc = serviceLocator()->getService( "EventDataSvc", IDataProviderSvc::interfaceID(),
59 (IInterface*&)dataSvc );
60 if ( sc.isFailure() )
61 {
62 log << MSG::FATAL << "Could not get EventDataSvc in RecMdcDedxCnv" << endmsg;
63 return sc;
64 }
65
66 //----------get hit smartRefVector--------
67 SmartDataPtr<RecMdcDedxHitCol> recMdcDedxHitCol( dataSvc, "/Event/Recon/RecMdcDedxHitCol" );
68 if ( !recMdcDedxHitCol )
69 {
70 log << MSG::FATAL << "Could not find RecMdcDedxHitCol" << endmsg;
71 return ( StatusCode::FAILURE );
72 }
73
74 int trackID;
75 // Retrieve Mdc Track
76 SmartDataPtr<RecMdcTrackCol> mdcTrackCol( dataSvc, EventModel::Recon::RecMdcTrackCol );
77 if ( !mdcTrackCol )
78 {
79 log << MSG::INFO << "Could not find RecMdcTrackCol" << endmsg;
80 SmartDataPtr<DstMdcTrackCol> dstMdcTrackCol( dataSvc, "/Event/Dst/DstMdcTrackCol" );
81 if ( !dstMdcTrackCol ) { log << MSG::INFO << "Could not find DstMdcTrackCol" << endmsg; }
82 else
83 {
84 RecMdcTrackCol* mdcTrackCol = new RecMdcTrackCol();
85 DstMdcTrackCol::iterator iter_mdc = dstMdcTrackCol->begin();
86 trackID = 0;
87 for ( ; iter_mdc != dstMdcTrackCol->end(); iter_mdc++, trackID++ )
88 {
89 RecMdcTrack* recMdcTrack = new RecMdcTrack();
90 *recMdcTrack = **iter_mdc;
91 ( *mdcTrackCol ).push_back( recMdcTrack );
92 log << MSG::INFO << " Mdc Track ID = " << trackID
93 << " Mdc Track Nster = " << ( *iter_mdc )->nster() << endmsg;
94 }
95 sc = dataSvc->registerObject( EventModel::Recon::RecMdcTrackCol, mdcTrackCol );
96 }
97 }
98
99 // Retrieve MdcKal track
100 SmartDataPtr<RecMdcKalTrackCol> mdcKalTrackCol( dataSvc,
102 if ( !mdcKalTrackCol )
103 {
104 log << MSG::INFO << "Could not find RecMdcKalTrackCol" << endmsg;
105 SmartDataPtr<DstMdcKalTrackCol> dstMdcKalTrackCol( dataSvc,
106 "/Event/Dst/DstMdcKalTrackCol" );
107 if ( !dstMdcKalTrackCol )
108 { log << MSG::INFO << "Could not find DstMdcKalTrackCol" << endmsg; }
109 else
110 {
111 RecMdcKalTrackCol* mdcKalTrackCol = new RecMdcKalTrackCol();
112 DstMdcKalTrackCol::iterator iter_mdc = dstMdcKalTrackCol->begin();
113 trackID = 0;
114 for ( ; iter_mdc != dstMdcKalTrackCol->end(); iter_mdc++, trackID++ )
115 {
116 RecMdcKalTrack* recMdcKalTrack = new RecMdcKalTrack();
117 *recMdcKalTrack = **iter_mdc;
118 ( *mdcKalTrackCol ).push_back( recMdcKalTrack );
119 log << MSG::INFO << " MdcKalTrack ID = " << trackID
120 << " MdcKalTrack Nster = " << ( *iter_mdc )->nster()
121 << " MdcKalTrack poca = " << ( *iter_mdc )->poca() << endmsg;
122 }
123 sc = dataSvc->registerObject( EventModel::Recon::RecMdcKalTrackCol, mdcKalTrackCol );
124 }
125 }
126
127 //**********************************************************************
128 // now convert
129 TIter dedxIter( m_recMdcDedxCol );
130 TRecMdcDedx* recMdcDedxRoot = 0;
131 while ( ( recMdcDedxRoot = (TRecMdcDedx*)dedxIter.Next() ) )
132 {
133 double dedxHit = recMdcDedxRoot->dedxHit();
134 double dedxEsat = recMdcDedxRoot->dedxEsat();
135 double dedxNoRun = recMdcDedxRoot->dedxNoRun();
136 double dedxMoment = recMdcDedxRoot->dedxMoment();
137
138 int trackId = recMdcDedxRoot->trackId();
139 int particleId = recMdcDedxRoot->particleId();
140 int status = recMdcDedxRoot->status();
141 int truncAlg = recMdcDedxRoot->truncAlg();
142 // double pb[5];
143 // for ( int i = 0; i < 5; i++)
144 // pb[i] = dedxRoot->prob(i);
145
146 // double numSigmaE = dedxRoot->numSigmaE();
147 // double numSigmaMu = dedxRoot->numSigmaMu();
148 // double numSigmaPi = dedxRoot->numSigmaPi();
149 // double numSigmaK = dedxRoot->numSigmaK();
150 // double numSigmaP = dedxRoot->numSigmaP();
151 double chi[5];
152 chi[0] = recMdcDedxRoot->chiE();
153 chi[1] = recMdcDedxRoot->chiMu();
154 chi[2] = recMdcDedxRoot->chiPi();
155 chi[3] = recMdcDedxRoot->chiK();
156 chi[4] = recMdcDedxRoot->chiP();
157 int numGoodHits = recMdcDedxRoot->numGoodHits();
158 int numTotalHits = recMdcDedxRoot->numTotalHits();
159
160 double probPH = recMdcDedxRoot->probPH();
161 double normPH = recMdcDedxRoot->normPH();
162 double errorPH = recMdcDedxRoot->errorPH();
163 double twentyPH = recMdcDedxRoot->twentyPH();
164 double dedxExpect[5], sigmaDedx[5], pidProb[5];
165
166 for ( int i = 0; i < 5; i++ )
167 {
168 dedxExpect[i] = recMdcDedxRoot->dedxExpect( i );
169 sigmaDedx[i] = recMdcDedxRoot->sigmaDedx( i );
170 pidProb[i] = recMdcDedxRoot->pidProb( i );
171 }
172
173 log << MSG::DEBUG << "TObjectToDataObject: check Reconstrunction of dE/dx root::"
174 << " trackId: " << trackId << " particleId: " << particleId << " status: " << status
175 << " truncAlg: " << truncAlg << " chi[2]: " << chi[2]
176 << " numTotalHits: " << numTotalHits << " probPH: " << probPH
177 << " errorPH: " << errorPH << " dedxExpect[2]: " << dedxExpect[2] << endmsg;
178
179 RecMdcDedx* recMdcDedx = new RecMdcDedx();
180 m_common.m_rootRecMdcDedxMap[recMdcDedxRoot] = recMdcDedx;
181
182 recMdcDedx->setTrackId( trackId );
183 recMdcDedx->setParticleId( particleId );
184 recMdcDedx->setStatus( status );
185 recMdcDedx->setTruncAlg( truncAlg );
186 // dedxTds->setProb(pb);
187 // dedxTds->setNumSigmaE(numSigmaE);
188 // dedxTds->setNumSigmaMu(numSigmaMu);
189 // dedxTds->setNumSigmaPi(numSigmaPi);
190 // dedxTds->setNumSigmaK(numSigmaK);
191 // dedxTds->setNumSigmaP(numSigmaP);
192 recMdcDedx->setChi( chi );
193 recMdcDedx->setNumGoodHits( numGoodHits );
194 recMdcDedx->setNumTotalHits( numTotalHits );
195
196 recMdcDedx->setProbPH( probPH );
197 recMdcDedx->setNormPH( normPH );
198 recMdcDedx->setErrorPH( errorPH );
199 recMdcDedx->setTwentyPH( twentyPH );
200 // for (int i=0; i<5; i++){
201 recMdcDedx->setDedxExpect( dedxExpect );
202 recMdcDedx->setSigmaDedx( sigmaDedx );
203 recMdcDedx->setPidProb( pidProb );
204
205 recMdcDedx->setDedxHit( dedxHit );
206 recMdcDedx->setDedxEsat( dedxEsat );
207 recMdcDedx->setDedxNoRun( dedxNoRun );
208 recMdcDedx->setDedxMoment( dedxMoment );
209 //}
210
211 DedxHitRefVec theDedxHitRefVec;
212 RecMdcDedxHitCol::iterator iter = recMdcDedxHitCol->begin();
213 for ( ; iter != recMdcDedxHitCol->end(); iter++ )
214 {
215 if ( ( *iter )->getTrkId() == trackId )
216 {
217 SmartRef<RecMdcDedxHit> refDedxHit( *iter );
218 theDedxHitRefVec.push_back( refDedxHit );
219 }
220 }
221 recMdcDedx->setVecDedxHits( theDedxHitRefVec );
222 int nhits = recMdcDedx->getVecDedxHits().size();
223 // std::cout<<" mdc hits: "<<nhits<< std::endl;
224 for ( int ii = 0; ii < nhits; ii++ )
225 {
226 Identifier id( recMdcDedx->getVecDedxHits()[ii]->getMdcId() );
227 int layer = MdcID::layer( id );
228 int wire = MdcID::wire( id );
229 // cout<<"layer: "<<layer<<" wire: "<<wire<<endl;
230 }
231
232 int mdcTrackId = recMdcDedxRoot->mdcTrackId();
233 // std::cout << __FILE__ << __LINE__ << " size: " << mdcTrackCol->size() << " id: " <<
234 // mdcTrackId << std::endl;
235 if ( mdcTrackId >= 0 )
236 {
237 recMdcDedx->setMdcTrack(
238 dynamic_cast<RecMdcTrack*>( mdcTrackCol->containedObject( mdcTrackId ) ) );
239 }
240 int mdcKalTrackId = recMdcDedxRoot->mdcKalTrackId();
241 // std::cout << __FILE__ << __LINE__ << " size: " << mdcKalTrackCol->size() << " id: " <<
242 // mdcKalTrackId<< std::endl;
243 if ( mdcKalTrackId >= 0 )
244 {
245 recMdcDedx->setMdcKalTrack(
246 dynamic_cast<RecMdcKalTrack*>( mdcKalTrackCol->containedObject( mdcKalTrackId ) ) );
247 }
248
249 recMdcDedxCol->push_back( recMdcDedx );
250 // delete dedxTds;
251 // dedxTds = NULL;
252 }
253 // m_dedxCol->Delete();
254 delete m_recMdcDedxCol;
255 m_recMdcDedxCol = 0;
256
257 return StatusCode::SUCCESS;
258}
259
260StatusCode RecMdcDedxCnv::DataObjectToTObject( DataObject* obj, RootAddress* rootaddr ) {
261 MsgStream log( msgSvc(), "RecMdcDedxCnv" );
262 log << MSG::DEBUG << "RecMdcDedxCnv::DataObjectToTObject" << endmsg;
263 StatusCode sc = StatusCode::SUCCESS;
264
265 RecMdcDedxCol* recMdcDedxCol = dynamic_cast<RecMdcDedxCol*>( obj );
266 if ( !recMdcDedxCol )
267 {
268 log << MSG::ERROR << "Could not downcast to RecMdcDedxCol" << endmsg;
269 return StatusCode::FAILURE;
270 }
271
272 DataObject* evt;
273 m_eds->findObject( EventModel::Recon::Event, evt );
274 if ( evt == NULL )
275 {
276 log << MSG::ERROR << "Could not get RecEvent in TDS " << endmsg;
277 return StatusCode::FAILURE;
278 }
279 ReconEvent* devtTds = dynamic_cast<ReconEvent*>( evt );
280 if ( !devtTds )
281 { log << MSG::ERROR << "RecMdcDedxCnv:Could not downcast to TDS RecEvent" << endmsg; }
282
283 IOpaqueAddress* addr;
284 m_cnvSvc->getRecTrackCnv()->createRep( evt, addr );
285 TRecTrackEvent* recEvt = m_cnvSvc->getRecTrackCnv()->getWriteObject();
286
287 const TObjArray* m_recMdcDedxCol = recEvt->getRecMdcDedxCol();
288 if ( !m_recMdcDedxCol ) return sc;
289 recEvt->clearRecMdcDedxCol(); // necessary in case there is I/O at the same time since array
290 // is static
291
292 //******************** get according mdcTrack and MdcKalmanTrack of MdcDedx ****************
293
294 RecMdcTrackCol::iterator recMdcTrackColbegin, recMdcTrackColend;
295 RecMdcKalTrackCol::iterator recMdcKalTrackColbegin, recMdcKalTrackColend;
296
297 IDataProviderSvc* dataSvc = 0;
298 sc = serviceLocator()->getService( "EventDataSvc", IDataProviderSvc::interfaceID(),
299 (IInterface*&)dataSvc );
300 if ( sc.isFailure() )
301 {
302 log << MSG::FATAL << "Could not get EventDataSvc in RecMdcDedxCnv" << endmsg;
303 return sc;
304 }
305 SmartDataPtr<RecMdcTrackCol> recMdcTrackCol( dataSvc, EventModel::Recon::RecMdcTrackCol );
306 if ( !recMdcTrackCol )
307 {
308 log << MSG::ERROR << "Could not downcast to RecMdcTrackCol" << endmsg;
309 return StatusCode::FAILURE;
310 }
311 else
312 {
313 recMdcTrackColbegin = recMdcTrackCol->begin();
314 recMdcTrackColend = recMdcTrackCol->end();
315 }
316
317 SmartDataPtr<RecMdcKalTrackCol> recMdcKalTrackCol( dataSvc,
319 if ( !recMdcKalTrackCol )
320 {
321 log << MSG::ERROR << "Could not downcast to RecMdcKalTrackCol" << endmsg;
322 return StatusCode::FAILURE;
323 }
324 else
325 {
326 recMdcKalTrackColbegin = recMdcKalTrackCol->begin();
327 recMdcKalTrackColend = recMdcKalTrackCol->end();
328 }
329 //******************************************************************************
330
331 RecMdcDedxCol::const_iterator recMdcDedx;
332
333 for ( recMdcDedx = recMdcDedxCol->begin(); recMdcDedx != recMdcDedxCol->end(); recMdcDedx++ )
334 {
335 Int_t trackId = ( *recMdcDedx )->trackId();
336 Int_t particleId = ( *recMdcDedx )->particleId();
337 Int_t status = ( *recMdcDedx )->status();
338 Int_t truncAlg = ( *recMdcDedx )->truncAlg();
339 // Double_t pb[5];
340 // for (Int_t i = 0; i < 5; i++)
341 // pb[i] = (*dedxTds)->prob(i);
342 Double_t dedxHit = ( *recMdcDedx )->getDedxHit();
343 Double_t dedxEsat = ( *recMdcDedx )->getDedxEsat();
344 Double_t dedxNoRun = ( *recMdcDedx )->getDedxNoRun();
345 Double_t dedxMoment = ( *recMdcDedx )->getDedxMoment();
346
347 Double_t chiE = ( *recMdcDedx )->chi( 0 );
348 Double_t chiMu = ( *recMdcDedx )->chi( 1 );
349 Double_t chiPi = ( *recMdcDedx )->chi( 2 );
350 Double_t chiK = ( *recMdcDedx )->chi( 3 );
351 Double_t chiP = ( *recMdcDedx )->chi( 4 );
352
353 Int_t numGoodHits = ( *recMdcDedx )->numGoodHits();
354 Int_t numTotalHits = ( *recMdcDedx )->numTotalHits();
355
356 Double_t probPH = ( *recMdcDedx )->probPH();
357 Double_t normPH = ( *recMdcDedx )->normPH();
358 Double_t errorPH = ( *recMdcDedx )->errorPH();
359 Double_t twentyPH = ( *recMdcDedx )->twentyPH();
360 // Double_t fracErrPH = (*dedxTds)-> fracErrPH();
361 // Double_t minIronPH = (*dedxTds)->minIronPH();
362 // Double_t corrPH = (*dedxTds)->corrPH();
363 double dedxExpect[5], sigmaDedx[5], pidProb[5], chi[5];
364 for ( int i = 0; i < 5; i++ )
365 {
366 chi[i] = ( *recMdcDedx )->chi( i );
367 dedxExpect[i] = ( *recMdcDedx )->getDedxExpect( i );
368 sigmaDedx[i] = ( *recMdcDedx )->getSigmaDedx( i );
369 pidProb[i] = ( *recMdcDedx )->getPidProb( i );
370 }
371
372 log << MSG::DEBUG << "DataObjectToTObject: check Reconstrunction of dE/dx::"
373 << " trackId: " << trackId << " particleId: " << particleId << " status: " << status
374 << " truncAlg: " << truncAlg << " chiPi: " << chiPi
375 << " numTotalHits: " << numTotalHits << " probPH: " << probPH
376 << " errorPH: " << errorPH << " dedxExpect[2]: " << dedxExpect[2] << endmsg;
377
378 TRecMdcDedx* recMdcDedxRoot = new TRecMdcDedx();
379 // m_common.m_recMdcDedxMap[(*recMdcDedx)] = recMdcDedxRoot;
380 // std::cout<<"check write to Reconstrunction root particle Id is
381 // "<<dedxRoot->particleId()<<endl;
382 recMdcDedxRoot->setTrackId( trackId );
383 recMdcDedxRoot->setParticleId( particleId );
384 recMdcDedxRoot->setStatus( status );
385 recMdcDedxRoot->setTruncAlg( truncAlg );
386
387 // dedxRoot->setProb(pb);
388 recMdcDedxRoot->setChiE( chiE );
389 recMdcDedxRoot->setChiMu( chiMu );
390 recMdcDedxRoot->setChiPi( chiPi );
391 recMdcDedxRoot->setChiK( chiK );
392 recMdcDedxRoot->setChiP( chiP );
393
394 recMdcDedxRoot->setNumGoodHits( numGoodHits );
395 recMdcDedxRoot->setNumTotalHits( numTotalHits );
396
397 recMdcDedxRoot->setProbPH( probPH );
398 recMdcDedxRoot->setNormPH( normPH );
399 recMdcDedxRoot->setErrorPH( errorPH );
400 recMdcDedxRoot->setTwentyPH( twentyPH );
401 // for (int i=0; i<5; i++){
402 recMdcDedxRoot->setChi( chi );
403 recMdcDedxRoot->setDedxExpect( dedxExpect );
404 recMdcDedxRoot->setSigmaDedx( sigmaDedx );
405 recMdcDedxRoot->setPidProb( pidProb );
406
407 recMdcDedxRoot->setDedxHit( dedxHit );
408 recMdcDedxRoot->setDedxEsat( dedxEsat );
409 recMdcDedxRoot->setDedxNoRun( dedxNoRun );
410 recMdcDedxRoot->setDedxMoment( dedxMoment );
411 //}
412
413 if ( ( *recMdcDedx )->isMdcTrackValid() )
414 {
415 RecMdcTrackCol::iterator it =
416 find( recMdcTrackColbegin, recMdcTrackColend, ( *recMdcDedx )->getMdcTrack() );
417 recMdcDedxRoot->setMdcTrackId( it - recMdcTrackColbegin );
418 }
419 else { recMdcDedxRoot->setMdcTrackId( -1 ); }
420
421 if ( ( *recMdcDedx )->isMdcKalTrackValid() )
422 {
423 RecMdcKalTrackCol::iterator it = find( recMdcKalTrackColbegin, recMdcKalTrackColend,
424 ( *recMdcDedx )->getMdcKalTrack() );
425 recMdcDedxRoot->setMdcKalTrackId( it - recMdcKalTrackColbegin );
426 }
427 else { recMdcDedxRoot->setMdcKalTrackId( -1 ); }
428
429 log << MSG::INFO << "check Reconstrunction root"
430 << " particle Id is : " << particleId << "track id is : " << trackId
431 << " and status is : " << status << endmsg;
432
433 // dedxRoot->setFracErrPH(fracErrPH);
434 // dedxRoot->setMinIronPH(minIronPH);
435 // dedxRoot->setCorrPH(corrPH);
436 recEvt->addRecMdcDedx( recMdcDedxRoot );
437 }
438
439 return StatusCode::SUCCESS;
440}
441
442#endif
EvtStreamInputIterator< typename Generator::result_type > iter(Generator gen, int N=0)
SmartRefVector< RecMdcDedxHit > DedxHitRefVec
IMessageSvc * msgSvc()
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
virtual StatusCode DataObjectToTObject(DataObject *obj, RootAddress *addr)
transformation to root
RecMdcDedxCnv(ISvcLocator *svc)
virtual StatusCode TObjectToDataObject(DataObject *&obj)
transformation from root
void setVecDedxHits(const DedxHitRefVec &vecdedxhit)
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)
void setDedxMoment(const Double_t dedx_momentum)
void addRecMdcDedx(TRecMdcDedx *Track)
Add a Dedx into the TOF Data collection.
const TObjArray * getRecMdcDedxCol() const
retrieve the whole TObjArray of Dedx Data