BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
EvtRecVeeVertexCnv.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/EvtRecObject.h"
6#include "EvtRecEvent/EvtRecVeeVertex.h"
7
8#include "RootEventData/TEvtRecObject.h"
9#include "RootEventData/TEvtRecVeeVertex.h"
10
11#include "RootCnvSvc/EvtRec/EvtRecCnv.h"
12#include "RootCnvSvc/EvtRec/EvtRecVeeVertexCnv.h"
13#include "RootCnvSvc/RootAddress.h"
14
15#include "CLHEP/Matrix/SymMatrix.h"
16#include "CLHEP/Matrix/Vector.h"
17using CLHEP::HepSymMatrix;
18using CLHEP::HepVector;
19
21 : RootEventBaseCnv( classID(), svc ) {
22 m_rootBranchname = "m_evtRecVeeVertexCol";
23 m_adresses.push_back( &m_evtRecVeeVertexCol );
24 m_evtRecVeeVertexCol = 0;
25}
26
27StatusCode EvtRecVeeVertexCnv::TObjectToDataObject( DataObject*& refpObject ) {
28 // creation of TDS object from root object
29 MsgStream log( msgSvc(), "EvtRecVeeVertexCnv" );
30 log << MSG::DEBUG << "EvtRecVeeVertexCnv::TObjectToDataObject" << endmsg;
31
32 // create the TDS location for the EvtRecVeeVertex Collection
33 EvtRecVeeVertexCol* evtRecVeeVertexCol = new EvtRecVeeVertexCol;
34 refpObject = evtRecVeeVertexCol;
35
36 if ( !m_evtRecVeeVertexCol ) return StatusCode::SUCCESS;
37
38 IDataProviderSvc* dataSvc = 0;
39 StatusCode sc = serviceLocator()->getService(
40 "EventDataSvc", IDataProviderSvc::interfaceID(), (IInterface*&)dataSvc );
41 if ( sc.isFailure() )
42 {
43 log << MSG::FATAL << "Could not get EventDataSvc in EvtRecVeeVertexCnv" << endmsg;
44 return sc;
45 }
46
47 SmartDataPtr<EvtRecTrackCol> evtRecTrackCol( dataSvc, EventModel::EvtRec::EvtRecTrackCol );
48 if ( !evtRecTrackCol ) { log << MSG::INFO << "Could not find EvtRecTrackCol" << endmsg; }
49
50 // convert
51 TIter evtRecVeeVertexIter( m_evtRecVeeVertexCol );
52 TEvtRecVeeVertex* evtRecVeeVertexRoot = 0;
53 while ( ( evtRecVeeVertexRoot = (TEvtRecVeeVertex*)evtRecVeeVertexIter.Next() ) )
54 {
55 EvtRecVeeVertex* evtRecVeeVertex = new EvtRecVeeVertex();
56 m_common.m_rootEvtRecVeeVertexMap[evtRecVeeVertexRoot] = evtRecVeeVertex;
57 // set ....
58 evtRecVeeVertex->setVertexId( evtRecVeeVertexRoot->vertexId() );
59 evtRecVeeVertex->setVertexType( evtRecVeeVertexRoot->vertexType() );
60 evtRecVeeVertex->setChi2( evtRecVeeVertexRoot->chi2() );
61 evtRecVeeVertex->setNdof( evtRecVeeVertexRoot->ndof() );
62 evtRecVeeVertex->setMass( evtRecVeeVertexRoot->mass() );
63
64 HepVector wTrackParameter( 7, 0 );
65 for ( int i = 0; i < 7; i++ ) { wTrackParameter[i] = evtRecVeeVertexRoot->w( i ); }
66 evtRecVeeVertex->setW( wTrackParameter );
67
68 HepSymMatrix EwTrackParameter( 7, 0 );
69 int i = 0;
70 for ( int j = 0; j < 7; j++ )
71 {
72 for ( int k = j; k < 7; k++ )
73 {
74 EwTrackParameter[j][k] = EwTrackParameter[k][j] = evtRecVeeVertexRoot->Ew( i );
75 i++;
76 }
77 }
78 evtRecVeeVertex->setEw( EwTrackParameter );
79
80 std::pair<int, int> pairId;
81 pairId.first = evtRecVeeVertexRoot->pair( 0 );
82 pairId.second = evtRecVeeVertexRoot->pair( 1 );
83 evtRecVeeVertex->setPair( pairId );
84 evtRecVeeVertex->setNCharge( evtRecVeeVertexRoot->nCharge() );
85 evtRecVeeVertex->setNTracks( evtRecVeeVertexRoot->nTracks() );
86 int evtRecTrackId0 = evtRecVeeVertexRoot->daughter( 0 );
87 if ( evtRecTrackId0 >= 0 )
88 {
89 evtRecVeeVertex->addDaughter(
90 dynamic_cast<EvtRecTrack*>( evtRecTrackCol->containedObject( evtRecTrackId0 ) ), 0 );
91 }
92 int evtRecTrackId1 = evtRecVeeVertexRoot->daughter( 1 );
93 if ( evtRecTrackId1 >= 0 )
94 {
95 evtRecVeeVertex->addDaughter(
96 dynamic_cast<EvtRecTrack*>( evtRecTrackCol->containedObject( evtRecTrackId1 ) ), 1 );
97 }
98
99 evtRecVeeVertexCol->push_back( evtRecVeeVertex );
100 }
101
102 delete m_evtRecVeeVertexCol;
103 m_evtRecVeeVertexCol = 0;
104 return StatusCode::SUCCESS;
105}
106
107StatusCode EvtRecVeeVertexCnv::DataObjectToTObject( DataObject* obj, RootAddress* rootaddr ) {
108 MsgStream log( msgSvc(), "EvtRecVeeVertexCnv" );
109 log << MSG::DEBUG << "EvtRecVeeVertexCnv::DataObjectToTObject" << endmsg;
110
111 EvtRecVeeVertexCol* evtRecVeeVertexCol = dynamic_cast<EvtRecVeeVertexCol*>( obj );
112 if ( !evtRecVeeVertexCol )
113 {
114 log << MSG::ERROR << "Could not downcast to EvtRecVeeVertexCol" << endmsg;
115 return StatusCode::FAILURE;
116 }
117
118 DataObject* evt;
119 m_eds->findObject( EventModel::EvtRec::Event, evt );
120 if ( evt == NULL )
121 {
122 log << MSG::ERROR << "Could not get EvtRecObject in TDS" << endmsg;
123 return StatusCode::FAILURE;
124 }
125 EvtRecObject* devtTds = dynamic_cast<EvtRecObject*>( evt );
126 if ( !devtTds )
127 {
128 log << MSG::ERROR << "EvtRecVeeVertexCnv: Could not downcast to TDS EvtRecObject"
129 << endmsg;
130 }
131
132 IOpaqueAddress* addr;
133 m_cnvSvc->getEvtRecCnv()->createRep( evt, addr );
134 TEvtRecObject* recEvt = m_cnvSvc->getEvtRecCnv()->getWriteObject();
135
136 const TObjArray* m_evtRecVeeVertexCol = recEvt->getEvtRecVeeVertexCol();
137 if ( !m_evtRecVeeVertexCol ) return StatusCode::SUCCESS;
138
139 IDataProviderSvc* dataSvc = 0;
140 StatusCode sc = serviceLocator()->getService(
141 "EventDataSvc", IDataProviderSvc::interfaceID(), (IInterface*&)dataSvc );
142 if ( sc.isFailure() )
143 {
144 log << MSG::FATAL << "Could not get EventDataSvc in EvtRecVeeVertexCnv" << endmsg;
145 return sc;
146 }
147
148 EvtRecTrackCol::iterator evtRecTrackColbegin, evtRecTrackColend;
149
150 SmartDataPtr<EvtRecTrackCol> evtRecTrackCol( dataSvc, EventModel::EvtRec::EvtRecTrackCol );
151 if ( !evtRecTrackCol ) { log << MSG::INFO << "Could not find EvtRecTrackCol" << endmsg; }
152 else
153 {
154 evtRecTrackColbegin = evtRecTrackCol->begin();
155 evtRecTrackColend = evtRecTrackCol->end();
156 }
157
158 // convert
159 recEvt->clearEvtRecVeeVertexCol();
160 EvtRecVeeVertexCol::const_iterator evtRecVeeVertex = evtRecVeeVertexCol->begin();
161
162 for ( ; evtRecVeeVertex != evtRecVeeVertexCol->end(); evtRecVeeVertex++ )
163 {
164 EvtRecVeeVertex* ptr = *evtRecVeeVertex;
165 TEvtRecVeeVertex* evtRecVeeVertexRoot = new TEvtRecVeeVertex();
166 // set ...
167 evtRecVeeVertexRoot->setVertexId( ptr->vertexId() );
168 evtRecVeeVertexRoot->setVertexType( ptr->vertexType() );
169 evtRecVeeVertexRoot->setChi2( ptr->chi2() );
170 evtRecVeeVertexRoot->setNdof( ptr->ndof() );
171 evtRecVeeVertexRoot->setMass( ptr->mass() );
172
173 double wTrackParameter[7];
174 for ( int i = 0; i < 7; i++ ) { wTrackParameter[i] = ptr->w()[i]; }
175 evtRecVeeVertexRoot->setW( wTrackParameter );
176 double EwTrackParameter[28];
177 int i = 0;
178 for ( int j = 0; j < 7; j++ )
179 {
180 for ( int k = j; k < 7; k++ )
181 {
182 EwTrackParameter[i] = ptr->Ew()[j][k];
183 i++;
184 }
185 }
186 assert( i == 28 );
187 evtRecVeeVertexRoot->setEw( EwTrackParameter );
188 int pairId[2];
189 pairId[0] = ptr->pair( 0 );
190 pairId[1] = ptr->pair( 1 );
191 evtRecVeeVertexRoot->setPair( pairId );
192 evtRecVeeVertexRoot->setNCharge( ptr->nCharge() );
193 evtRecVeeVertexRoot->setNTracks( ptr->nTracks() );
194
195 int daughterId[2];
196 if ( ptr->daughter( 0 ).target() != NULL && ptr->daughter( 1 ).target() != NULL )
197 {
198 assert( evtRecTrackColbegin != evtRecTrackColend );
199 EvtRecTrackCol::iterator it0 =
200 find( evtRecTrackColbegin, evtRecTrackColend, ptr->daughter( 0 ).target() );
201 EvtRecTrackCol::iterator it1 =
202 find( evtRecTrackColbegin, evtRecTrackColend, ptr->daughter( 1 ).target() );
203 assert( it0 != evtRecTrackColend );
204 assert( it1 != evtRecTrackColend );
205 daughterId[0] = it0 - evtRecTrackColbegin;
206 daughterId[1] = it1 - evtRecTrackColbegin;
207 evtRecVeeVertexRoot->setDaughter( daughterId );
208 }
209 recEvt->addEvtRecVeeVertex( evtRecVeeVertexRoot );
210 }
211
212 return StatusCode::SUCCESS;
213}
ObjectVector< EvtRecVeeVertex > EvtRecVeeVertexCol
IMessageSvc * msgSvc()
EvtRecVeeVertexCnv(ISvcLocator *svc)
virtual StatusCode DataObjectToTObject(DataObject *obj, RootAddress *addr)
transformation to root
virtual StatusCode TObjectToDataObject(DataObject *&obj)
transformation from root
const std::pair< int, int > & pair() const
void addDaughter(const SmartRef< EvtRecTrack > &track, int i)
void setPair(const std::pair< int, int > &pair)
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 addEvtRecVeeVertex(TEvtRecVeeVertex *veeVertex)