BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
EvtRecDTagCnv.cxx
Go to the documentation of this file.
1#include "GaudiKernel/MsgStream.h"
2#include <algorithm>
3
4#include "EventModel/EventModel.h"
5#include "EvtRecEvent/EvtRecDTag.h"
6#include "EvtRecEvent/EvtRecObject.h"
7
8#include "RootEventData/TEvtRecDTag.h"
9#include "RootEventData/TEvtRecObject.h"
10
11#include "RootCnvSvc/EvtRec/EvtRecCnv.h"
12#include "RootCnvSvc/EvtRec/EvtRecDTagCnv.h"
13#include "RootCnvSvc/RootAddress.h"
14
15#include "CLHEP/Matrix/SymMatrix.h"
16#include "CLHEP/Matrix/Vector.h"
17
18#include <vector>
19
20using CLHEP::HepSymMatrix;
21using CLHEP::HepVector;
22
23EvtRecDTagCnv::EvtRecDTagCnv( ISvcLocator* svc ) : RootEventBaseCnv( classID(), svc ) {
24 m_rootBranchname = "m_evtRecDTagCol";
25 m_adresses.push_back( &m_evtRecDTagCol );
26 m_evtRecDTagCol = 0;
27}
28
29StatusCode EvtRecDTagCnv::TObjectToDataObject( DataObject*& refpObject ) {
30 // creation of TDS object from root object
31 MsgStream log( msgSvc(), "EvtRecDTagCnv" );
32 log << MSG::DEBUG << "EvtRecDTagCnv::TObjectToDataObject" << endmsg;
33
34 // create the TDS location for the EvtRecDTag Collection
35 EvtRecDTagCol* evtRecDTagCol = new EvtRecDTagCol;
36 refpObject = evtRecDTagCol;
37
38 if ( !m_evtRecDTagCol ) return StatusCode::SUCCESS;
39
40 IDataProviderSvc* dataSvc = 0;
41 StatusCode sc = serviceLocator()->getService(
42 "EventDataSvc", IDataProviderSvc::interfaceID(), (IInterface*&)dataSvc );
43 if ( sc.isFailure() )
44 {
45 log << MSG::FATAL << "Could not get EventDataSvc in EvtRecDTagCnv" << endmsg;
46 return sc;
47 }
48
49 SmartDataPtr<EvtRecTrackCol> evtRecTrackCol( dataSvc, EventModel::EvtRec::EvtRecTrackCol );
50 if ( !evtRecTrackCol ) { log << MSG::INFO << "Could not find EvtRecTrackCol" << endmsg; }
51
52 // convert
53 TIter evtRecDTagIter( m_evtRecDTagCol );
54 TEvtRecDTag* evtRecDTagRoot = 0;
55 while ( ( evtRecDTagRoot = (TEvtRecDTag*)evtRecDTagIter.Next() ) )
56 {
57 EvtRecDTag* evtRecDTag = new EvtRecDTag();
58 m_common.m_rootEvtRecDTagMap[evtRecDTagRoot] = evtRecDTag;
59
60 // set ....
61 evtRecDTag->setdecayMode( (EvtRecDTag::DecayMode)evtRecDTagRoot->decayMode() );
62 evtRecDTag->settype( (EvtRecDTag::SelType)evtRecDTagRoot->type() );
63 evtRecDTag->setbeamE( evtRecDTagRoot->beamE() );
64 evtRecDTag->setmass( evtRecDTagRoot->mass() );
65 evtRecDTag->setmBC( evtRecDTagRoot->mBC() );
66 evtRecDTag->setdeltaE( evtRecDTagRoot->deltaE() );
67 evtRecDTag->setcharge( evtRecDTagRoot->charge() );
68 evtRecDTag->setcharm( evtRecDTagRoot->charm() );
69 evtRecDTag->setnumOfChildren( evtRecDTagRoot->numOfChildren() );
70
71 HepLorentzVector p4( evtRecDTagRoot->px(), evtRecDTagRoot->py(), evtRecDTagRoot->pz(),
72 evtRecDTagRoot->pe() );
73 evtRecDTag->setp4( p4 );
74
75 const std::vector<int>& tracks = evtRecDTagRoot->tracks();
76 const std::vector<int>& showers = evtRecDTagRoot->showers();
77 const std::vector<int>& otherTracks = evtRecDTagRoot->otherTracks();
78 const std::vector<int>& otherShowers = evtRecDTagRoot->otherShowers();
79 const std::vector<int>& pionId = evtRecDTagRoot->pionId();
80 const std::vector<int>& kaonId = evtRecDTagRoot->kaonId();
81
82 for ( unsigned int i = 0; i < tracks.size(); i++ )
83 evtRecDTag->addTrack(
84 dynamic_cast<EvtRecTrack*>( evtRecTrackCol->containedObject( tracks[i] ) ) );
85
86 for ( unsigned int i = 0; i < showers.size(); i++ )
87 evtRecDTag->addShower(
88 dynamic_cast<EvtRecTrack*>( evtRecTrackCol->containedObject( showers[i] ) ) );
89
90 for ( unsigned int i = 0; i < otherTracks.size(); i++ )
91 evtRecDTag->addOtherTrack(
92 dynamic_cast<EvtRecTrack*>( evtRecTrackCol->containedObject( otherTracks[i] ) ) );
93
94 for ( unsigned int i = 0; i < otherShowers.size(); i++ )
95 evtRecDTag->addOtherShower(
96 dynamic_cast<EvtRecTrack*>( evtRecTrackCol->containedObject( otherShowers[i] ) ) );
97
98 for ( unsigned int i = 0; i < pionId.size(); i++ )
99 evtRecDTag->addPionId(
100 dynamic_cast<EvtRecTrack*>( evtRecTrackCol->containedObject( pionId[i] ) ) );
101
102 for ( unsigned int i = 0; i < kaonId.size(); i++ )
103 evtRecDTag->addKaonId(
104 dynamic_cast<EvtRecTrack*>( evtRecTrackCol->containedObject( kaonId[i] ) ) );
105
106 evtRecDTagCol->push_back( evtRecDTag );
107 }
108
109 delete m_evtRecDTagCol;
110 m_evtRecDTagCol = 0;
111 return StatusCode::SUCCESS;
112}
113
114StatusCode EvtRecDTagCnv::DataObjectToTObject( DataObject* obj, RootAddress* rootaddr ) {
115 MsgStream log( msgSvc(), "EvtRecDTagCnv" );
116 log << MSG::DEBUG << "EvtRecDTagCnv::DataObjectToTObject" << endmsg;
117
118 EvtRecDTagCol* evtRecDTagCol = dynamic_cast<EvtRecDTagCol*>( obj );
119 if ( !evtRecDTagCol )
120 {
121 log << MSG::ERROR << "Could not downcast to EvtRecDTagCol" << endmsg;
122 return StatusCode::FAILURE;
123 }
124
125 DataObject* evt;
126 m_eds->findObject( EventModel::EvtRec::Event, evt );
127 if ( evt == NULL )
128 {
129 log << MSG::ERROR << "Could not get EvtRecObject in TDS" << endmsg;
130 return StatusCode::FAILURE;
131 }
132 EvtRecObject* devtTds = dynamic_cast<EvtRecObject*>( evt );
133 if ( !devtTds )
134 { log << MSG::ERROR << "EvtRecDTagCnv: Could not downcast to TDS EvtRecObject" << endmsg; }
135
136 IOpaqueAddress* addr;
137 m_cnvSvc->getEvtRecCnv()->createRep( evt, addr );
138 TEvtRecObject* recEvt = m_cnvSvc->getEvtRecCnv()->getWriteObject();
139
140 const TObjArray* m_evtRecDTagCol = recEvt->getEvtRecDTagCol();
141 if ( !m_evtRecDTagCol ) return StatusCode::SUCCESS;
142
143 IDataProviderSvc* dataSvc = 0;
144 StatusCode sc = serviceLocator()->getService(
145 "EventDataSvc", IDataProviderSvc::interfaceID(), (IInterface*&)dataSvc );
146 if ( sc.isFailure() )
147 {
148 log << MSG::FATAL << "Could not get EventDataSvc in EvtRecDTagCnv" << endmsg;
149 return sc;
150 }
151
152 EvtRecTrackCol::iterator evtRecTrackColbegin, evtRecTrackColend;
153
154 SmartDataPtr<EvtRecTrackCol> evtRecTrackCol( dataSvc, EventModel::EvtRec::EvtRecTrackCol );
155 if ( !evtRecTrackCol ) { log << MSG::INFO << "Could not find EvtRecTrackCol" << endmsg; }
156 else
157 {
158 evtRecTrackColbegin = evtRecTrackCol->begin();
159 evtRecTrackColend = evtRecTrackCol->end();
160 }
161
162 // convert
163 recEvt->clearEvtRecDTagCol();
164 EvtRecDTagCol::const_iterator evtRecDTag = evtRecDTagCol->begin();
165
166 for ( ; evtRecDTag != evtRecDTagCol->end(); evtRecDTag++ )
167 {
168 EvtRecDTag* ptr = *evtRecDTag;
169 TEvtRecDTag* evtRecDTagRoot = new TEvtRecDTag();
170
171 // set ...
172 evtRecDTagRoot->setdecayMode( ptr->decayMode() );
173 evtRecDTagRoot->settype( ptr->type() );
174 evtRecDTagRoot->setbeamE( ptr->beamE() );
175 evtRecDTagRoot->setmass( ptr->mass() );
176 evtRecDTagRoot->setmBC( ptr->mBC() );
177 evtRecDTagRoot->setdeltaE( ptr->deltaE() );
178 evtRecDTagRoot->setcharge( ptr->charge() );
179 evtRecDTagRoot->setcharm( ptr->charm() );
180 evtRecDTagRoot->setnumOfChildren( ptr->numOfChildren() );
181
182 HepLorentzVector p4 = ptr->p4();
183 evtRecDTagRoot->setpx( p4.x() );
184 evtRecDTagRoot->setpy( p4.y() );
185 evtRecDTagRoot->setpz( p4.z() );
186 evtRecDTagRoot->setpe( p4.t() );
187
188 SmartRefVector<EvtRecTrack> tracks = ptr->tracks();
189 // assert(evtRecTrackColbegin != evtRecTrackColend);
190 for ( unsigned int i = 0; i < tracks.size(); i++ )
191 {
192 EvtRecTrackCol::iterator it = find( evtRecTrackColbegin, evtRecTrackColend, tracks[i] );
193 // assert(it != evtRecTrackColend);
194 evtRecDTagRoot->addTrack( it - evtRecTrackColbegin );
195 }
196
197 SmartRefVector<EvtRecTrack> showers = ptr->showers();
198 // assert(evtRecTrackColbegin != evtRecTrackColend);
199 for ( unsigned int i = 0; i < showers.size(); i++ )
200 {
201 EvtRecTrackCol::iterator it = find( evtRecTrackColbegin, evtRecTrackColend, showers[i] );
202 // assert(it != evtRecTrackColend);
203 evtRecDTagRoot->addShower( it - evtRecTrackColbegin );
204 }
205
206 SmartRefVector<EvtRecTrack> otherTracks = ptr->otherTracks();
207 // assert(evtRecTrackColbegin != evtRecTrackColend);
208 for ( unsigned int i = 0; i < otherTracks.size(); i++ )
209 {
210 EvtRecTrackCol::iterator it =
211 find( evtRecTrackColbegin, evtRecTrackColend, otherTracks[i] );
212 // assert(it != evtRecTrackColend);
213 evtRecDTagRoot->addOtherTrack( it - evtRecTrackColbegin );
214 }
215
216 SmartRefVector<EvtRecTrack> otherShowers = ptr->otherShowers();
217 // assert(evtRecTrackColbegin != evtRecTrackColend);
218 for ( unsigned int i = 0; i < otherShowers.size(); i++ )
219 {
220 EvtRecTrackCol::iterator it =
221 find( evtRecTrackColbegin, evtRecTrackColend, otherShowers[i] );
222 // assert(it != evtRecTrackColend);
223 evtRecDTagRoot->addOtherShower( it - evtRecTrackColbegin );
224 }
225
226 SmartRefVector<EvtRecTrack> pionId = ptr->pionId();
227 // assert(evtRecTrackColbegin != evtRecTrackColend);
228 for ( unsigned int i = 0; i < pionId.size(); i++ )
229 {
230 EvtRecTrackCol::iterator it = find( evtRecTrackColbegin, evtRecTrackColend, pionId[i] );
231 // assert(it != evtRecTrackColend);
232 evtRecDTagRoot->addPionId( it - evtRecTrackColbegin );
233 }
234
235 SmartRefVector<EvtRecTrack> kaonId = ptr->kaonId();
236 // assert(evtRecTrackColbegin != evtRecTrackColend);
237 for ( unsigned int i = 0; i < kaonId.size(); i++ )
238 {
239 EvtRecTrackCol::iterator it = find( evtRecTrackColbegin, evtRecTrackColend, kaonId[i] );
240 // assert(it != evtRecTrackColend);
241 evtRecDTagRoot->addKaonId( it - evtRecTrackColbegin );
242 }
243
244 recEvt->addEvtRecDTag( evtRecDTagRoot );
245 }
246
247 return StatusCode::SUCCESS;
248}
ObjectVector< EvtRecDTag > EvtRecDTagCol
IMessageSvc * msgSvc()
virtual StatusCode TObjectToDataObject(DataObject *&obj)
transformation from root
EvtRecDTagCnv(ISvcLocator *svc)
virtual StatusCode DataObjectToTObject(DataObject *obj, RootAddress *addr)
transformation to root
SmartRefVector< EvtRecTrack > tracks()
SmartRefVector< EvtRecTrack > showers()
void addOtherTrack(const SmartRef< EvtRecTrack > track)
SmartRefVector< EvtRecTrack > otherShowers()
SmartRefVector< EvtRecTrack > kaonId()
SmartRefVector< EvtRecTrack > otherTracks()
void addOtherShower(const SmartRef< EvtRecTrack > shower)
void addKaonId(const SmartRef< EvtRecTrack > kaonId)
SmartRefVector< EvtRecTrack > pionId()
void addPionId(const SmartRef< EvtRecTrack > pionId)
void addShower(const SmartRef< EvtRecTrack > shower)
void addTrack(const SmartRef< EvtRecTrack > track)
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 std::vector< Int_t > & otherShowers() const
const std::vector< Int_t > & showers() const
const std::vector< Int_t > & otherTracks() const
const std::vector< Int_t > & kaonId() const
const std::vector< Int_t > & tracks() const
const std::vector< Int_t > & pionId() const
void addEvtRecDTag(TEvtRecDTag *dtag)