BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
RecMdcDedxHitCnv.cxx
Go to the documentation of this file.
1#ifndef RecMdcDedxHitCnv_CXX
2#define RecMdcDedxHitCnv_CXX 1
3#include "EventModel/EventModel.h"
4#include "GaudiKernel/DataObject.h"
5#include "GaudiKernel/MsgStream.h"
6#include "GaudiKernel/ObjectVector.h"
7#include "Identifier/Identifier.h"
8#include "MdcRecEvent/RecMdcDedxHit.h"
9#include "ReconEvent/ReconEvent.h"
10#include "TClonesArray.h"
11
12#include "RootEventData/TRecMdcDedxHit.h" // standard root object
13#include "RootEventData/TRecTrackEvent.h"
14
15#include "RootCnvSvc/Rec/RecMdcDedxHitCnv.h"
16#include "RootCnvSvc/Rec/RecTrackCnv.h"
17#include "RootCnvSvc/RootAddress.h"
18
19#include <vector>
20
21using namespace std;
22
23// Instantiation of a static factory class used by clients to create
24// instances of this service
25// static CnvFactory<RecMdcDedxCnv> s_factory;
26// const ICnvFactory& RecMdcDedxCnvFactory = s_factory;
27
29
30 // Here we associate this converter with the /Event path on the TDS.
31 MsgStream log( msgSvc(), "RecMdcDedxHitCnv" );
32 // log << MSG::DEBUG << "Constructor called for " << objType() << endmsg;
33 // m_rootTreename ="Rec";
34 m_rootBranchname = "m_recMdcDedxHitCol";
35 // declareObject(EventModel::Recon::RecMdcDedxCol, objType(), m_rootTreename,
36 // m_rootBranchname);
37 m_adresses.push_back( &m_recMdcDedxHitCol );
38 m_recMdcDedxHitCol = 0;
39}
40
41StatusCode RecMdcDedxHitCnv::TObjectToDataObject( DataObject*& refpObject ) {
42 // creation of TDS object from root object
43 MsgStream log( msgSvc(), "RecMdcDedxHitCnv" );
44 log << MSG::DEBUG << "RecMdcDedxHitCnv::TObjectToDataObject" << endmsg;
45 StatusCode sc = StatusCode::SUCCESS;
46 // create the TDS location for the Dedx Collection
47 RecMdcDedxHitCol* recMdcDedxHitCol = new RecMdcDedxHitCol;
48 refpObject = recMdcDedxHitCol;
49
50 //***************************register rec hit data in TDS****************************
51 IDataProviderSvc* dataSvc = 0;
52 sc = serviceLocator()->getService( "EventDataSvc", IDataProviderSvc::interfaceID(),
53 (IInterface*&)dataSvc );
54 if ( sc.isFailure() )
55 {
56 log << MSG::FATAL << "Could not get EventDataSvc in RecMdcDedxHitCnv" << endmsg;
57 return sc;
58 }
59
60 // Retrieve Mdc Hit
61 SmartDataPtr<RecMdcHitCol> mdcHitCol( dataSvc, EventModel::Recon::RecMdcHitCol );
62 if ( !mdcHitCol ) { log << MSG::INFO << "Could not find RecMdcHitCol" << endmsg; }
63
64 // Retrieve MdcKal Helix Segment
65 SmartDataPtr<RecMdcKalHelixSegCol> mdcKalHelixSegCol(
67 if ( !mdcKalHelixSegCol )
68 { log << MSG::INFO << "Could not find RecMdcKalHelixSegCol" << endmsg; }
69 //**********************************************************************
70
71 // now convert
72 if ( !m_recMdcDedxHitCol ) return sc;
73 TIter dedxIter( m_recMdcDedxHitCol );
74 TRecMdcDedxHit* recMdcDedxHitRoot = 0;
75 while ( ( recMdcDedxHitRoot = (TRecMdcDedxHit*)dedxIter.Next() ) )
76 {
77 int trackId = recMdcDedxHitRoot->trkId();
78 // cout<<"trackId: "<<trackId<<endl;
79 int flagLR = recMdcDedxHitRoot->flagLR();
80 // cout<<"flagLR: "<<flagLR<<endl;
81 long int mdcId( recMdcDedxHitRoot->mdcId() );
82 // cout<<"mdcID: "<<mdcId<<endl;
83 double pathlength = recMdcDedxHitRoot->pathLength();
84 // cout<<"pathlength: " <<pathlength<<endl;
85 double dedx = recMdcDedxHitRoot->getDedx();
86 // cout<<"dedx: "<<dedx<<endl;
87
88 log << MSG::DEBUG << "TObjectToDataObject: check Reconstrunction of dE/dx Hit root::"
89 << " trackId: " << trackId << " flagLR: " << flagLR << " pathlength: " << pathlength
90 << " dedx: " << dedx << endmsg;
91 RecMdcDedxHit* recMdcDedxHit = new RecMdcDedxHit();
92 m_common.m_rootRecMdcDedxHitMap[recMdcDedxHitRoot] = recMdcDedxHit;
93 recMdcDedxHit->setTrkId( trackId );
94 recMdcDedxHit->setFlagLR( flagLR );
95 recMdcDedxHit->setMdcId( Identifier( mdcId ) );
96 recMdcDedxHit->setPathLength( pathlength );
97 recMdcDedxHit->setDedx( dedx );
98 // log << MSG::DEBUG<<"check Reconstrunction of dE/dx Hit root"<<" pathlength 2 is :
99 // "<<(*recdedxhit)->getPathLength()<<endmsg;
100
101 int mdcHitId = recMdcDedxHitRoot->mdcHitId();
102 // std::cout << __FILE__ << __LINE__ << " size: " << mdcHitCol->size() << " id: " <<
103 // mdcHitId << std::endl;
104 if ( mdcHitId >= 0 )
105 {
106 recMdcDedxHit->setMdcHit(
107 dynamic_cast<RecMdcHit*>( mdcHitCol->containedObject( mdcHitId ) ) );
108 }
109 int mdcKalHelixSegId = recMdcDedxHitRoot->mdcKalHelixSegId();
110 // std::cout << __FILE__ << __LINE__ << " size: " << mdcKalHelixSegCol->size() << " id: "
111 // << mdcKalHelixSegId << std::endl;
112 if ( mdcKalHelixSegId >= 0 )
113 {
114 recMdcDedxHit->setMdcKalHelixSeg( dynamic_cast<RecMdcKalHelixSeg*>(
115 mdcKalHelixSegCol->containedObject( mdcKalHelixSegId ) ) );
116 }
117
118 recMdcDedxHitCol->push_back( recMdcDedxHit );
119 // delete dedxTds;
120 // dedxTds = NULL;
121 }
122 // m_dedxCol->Delete();
123 delete m_recMdcDedxHitCol;
124 m_recMdcDedxHitCol = 0;
125
126 return StatusCode::SUCCESS;
127}
128
129StatusCode RecMdcDedxHitCnv::DataObjectToTObject( DataObject* obj, RootAddress* rootaddr ) {
130 MsgStream log( msgSvc(), "RecMdcDedxHitCnv" );
131 log << MSG::DEBUG << "RecMdcDedxHitCnv::DataObjectToTObject" << endmsg;
132 StatusCode sc = StatusCode::SUCCESS;
133
134 RecMdcDedxHitCol* recMdcDedxHitCol = dynamic_cast<RecMdcDedxHitCol*>( obj );
135 if ( !recMdcDedxHitCol )
136 {
137 log << MSG::ERROR << "Could not downcast to RecMdcDedxHitCol" << endmsg;
138 return StatusCode::FAILURE;
139 }
140
141 DataObject* evt;
142 m_eds->findObject( EventModel::Recon::Event, evt );
143 if ( evt == NULL )
144 {
145 log << MSG::ERROR << "Could not get RecEvent in TDS " << endmsg;
146 return StatusCode::FAILURE;
147 }
148 ReconEvent* devtTds = dynamic_cast<ReconEvent*>( evt );
149 if ( !devtTds )
150 { log << MSG::ERROR << "RecMdcDedxHitCnv:Could not downcast to TDS RecEvent" << endmsg; }
151 IOpaqueAddress* addr;
152 m_cnvSvc->getRecTrackCnv()->createRep( evt, addr );
153 TRecTrackEvent* recEvt = m_cnvSvc->getRecTrackCnv()->getWriteObject();
154 const TObjArray* m_recMdcDedxHitCol = recEvt->getRecMdcDedxHitCol();
155 if ( !m_recMdcDedxHitCol ) return sc;
156 recEvt->clearRecMdcDedxHitCol(); // necessary in case there is I/O at the same time since
157 // array is static
158
159 //******************** get according mdcHIt and mdcKalHelixSeg of MdcDedxHit ****************
160
161 RecMdcHitCol::iterator recMdcHitColbegin, recMdcHitColend;
162 RecMdcKalHelixSegCol::iterator recMdcKalHelixSegColbegin, recMdcKalHelixSegColend;
163
164 IDataProviderSvc* dataSvc = 0;
165 sc = serviceLocator()->getService( "EventDataSvc", IDataProviderSvc::interfaceID(),
166 (IInterface*&)dataSvc );
167 if ( sc.isFailure() )
168 {
169 log << MSG::FATAL << "Could not get EventDataSvc in RecMdcDedxHitCnv" << endmsg;
170 return sc;
171 }
172
173 // Retrieve Mdc Hit
174 SmartDataPtr<RecMdcHitCol> recMdcHitCol( dataSvc, EventModel::Recon::RecMdcHitCol );
175 if ( !recMdcHitCol )
176 {
177 log << MSG::ERROR << "Could not downcast to RecMdcHitCol" << endmsg;
178 return StatusCode::FAILURE;
179 }
180 else
181 {
182 recMdcHitColbegin = recMdcHitCol->begin();
183 recMdcHitColend = recMdcHitCol->end();
184 }
185
186 SmartDataPtr<RecMdcKalHelixSegCol> recMdcKalHelixSegCol(
188 if ( !recMdcKalHelixSegCol )
189 {
190 log << MSG::ERROR << "Could not downcast to RecMdcKalHelixSegCol" << endmsg;
191 return StatusCode::FAILURE;
192 }
193 else
194 {
195 recMdcKalHelixSegColbegin = recMdcKalHelixSegCol->begin();
196 recMdcKalHelixSegColend = recMdcKalHelixSegCol->end();
197 }
198 //******************************************************************************
199
200 RecMdcDedxHitCol::const_iterator recMdcDedxHit;
201 for ( recMdcDedxHit = recMdcDedxHitCol->begin(); recMdcDedxHit != recMdcDedxHitCol->end();
202 recMdcDedxHit++ )
203 {
204 int trackId = ( *recMdcDedxHit )->getTrkId();
205 int flagLR = ( *recMdcDedxHit )->getFlagLR();
206 UInt_t mdcId = ( *recMdcDedxHit )->getMdcId().get_value();
207 double pathlength = ( *recMdcDedxHit )->getPathLength();
208 double dedx = ( *recMdcDedxHit )->getDedx();
209
210 log << MSG::DEBUG << "DataObjectToTObject: check Reconstrunction of dE/dx Hit::"
211 << " trackId: " << trackId << " flagLR: " << flagLR << " pathlength: " << pathlength
212 << " dedx: " << dedx << endmsg;
213 TRecMdcDedxHit* recMdcDedxHitRoot = new TRecMdcDedxHit();
214 // m_common.m_recMdcDedxHitMap[(*recMdcDedxHit)] = recMdcDedxHitRoot;
215 recMdcDedxHitRoot->setTrkId( trackId );
216 recMdcDedxHitRoot->setFlagLR( flagLR );
217 recMdcDedxHitRoot->setMdcId( mdcId );
218 recMdcDedxHitRoot->setPathLength( pathlength );
219 recMdcDedxHitRoot->setDedx( dedx );
220
221 // int trackId1 = recMdcDedxHitRoot->trkId();
222 // cout<<"trackId: "<<trackId1<<endl;
223 // int flagLR1 = recMdcDedxHitRoot->flagLR();
224 // cout<<"flagLR: "<<flagLR1<<endl;
225 // long int mdcId1(recMdcDedxHitRoot->mdcId());
226 // cout<<"mdcID: "<<mdcId1<<endl;
227 // double pathlength1 = recMdcDedxHitRoot->pathLength();
228 // cout<<"pathlength: " <<pathlength1<<endl;
229 // double dedx1 = recMdcDedxHitRoot->getDedx();
230 // cout<<"dedx: "<<dedx1<<endl;
231
232 if ( ( *recMdcDedxHit )->isMdcHitValid() )
233 {
234 RecMdcHitCol::iterator it =
235 find( recMdcHitColbegin, recMdcHitColend, ( *recMdcDedxHit )->getMdcHit() );
236 recMdcDedxHitRoot->setMdcHitId( it - recMdcHitColbegin );
237 }
238 else { recMdcDedxHitRoot->setMdcHitId( -1 ); }
239
240 if ( ( *recMdcDedxHit )->isMdcKalHelixSegValid() )
241 {
242 RecMdcKalHelixSegCol::iterator it =
243 find( recMdcKalHelixSegColbegin, recMdcKalHelixSegColend,
244 ( *recMdcDedxHit )->getMdcKalHelixSeg() );
245 recMdcDedxHitRoot->setMdcKalHelixSegId( it - recMdcKalHelixSegColbegin );
246 }
247 else { recMdcDedxHitRoot->setMdcKalHelixSegId( -1 ); }
248
249 // log << MSG::DEBUG<<"check Reconstrunction of dE/dx Hit root"<<" pathlength 2 is :
250 // "<<(*recMdcDedxHit)->getPathLength()<<endmsg;
251 recEvt->addRecMdcDedxHit( recMdcDedxHitRoot );
252 }
253
254 return StatusCode::SUCCESS;
255}
256
257#endif
IMessageSvc * msgSvc()
RecMdcDedxHitCnv(ISvcLocator *svc)
virtual StatusCode TObjectToDataObject(DataObject *&obj)
transformation from root
virtual StatusCode DataObjectToTObject(DataObject *obj, RootAddress *addr)
transformation to root
void setMdcKalHelixSeg(const RecMdcKalHelixSeg *mdcKalHelixSeg)
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)
const TObjArray * getRecMdcDedxHitCol() const
retrieve the whole TObjArray of Dedx Data
void addRecMdcDedxHit(TRecMdcDedxHit *Track)
Add a Dedx into the TOF Data collection.