BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
McParticleCnv.cxx
Go to the documentation of this file.
1#ifndef McParticleCnv_CXX
2#define McParticleCnv_CXX 1
3
4#include "GaudiKernel/DataObject.h"
5#include "GaudiKernel/MsgStream.h"
6#include "GaudiKernel/ObjectVector.h"
7
8#include "TClonesArray.h"
9
10#include "EventModel/EventModel.h"
11#include "McTruth/McEvent.h" //TDS object
12#include "McTruth/McParticle.h" //TDS object
13#include "RootCnvSvc/Mc/McCnv.h"
14#include "RootCnvSvc/Mc/McParticleCnv.h"
15#include "RootCnvSvc/RootAddress.h"
16#include "RootEventData/TMcEvent.h"
17#include "RootEventData/TMcParticle.h" // standard root object
18
19// Instantiation of a static factory class used by clients to create
20// instances of this service
21// static CnvFactory<McParticleCnv> s_factory;
22// const ICnvFactory& McParticleCnvFactory = s_factory;
23
24McParticleCnv::McParticleCnv( ISvcLocator* svc ) : RootEventBaseCnv( classID(), svc ) {
25 // Here we associate this converter with the /Event path on the TDS.
26 MsgStream log( msgSvc(), "McParticleCnv" );
27 // log << MSG::DEBUG << "Constructor called for " << objType() << endmsg;
28 m_rootBranchname = "m_mcParticleCol";
29 // declareObject(EventModel::MC::McParticleCol, objType(), m_rootTreename, m_rootBranchname);
30 m_adresses.push_back( &m_mcParticleCol );
31 m_mcParticleCol = 0;
32}
33
34StatusCode McParticleCnv::TObjectToDataObject( DataObject*& refpObject ) {
35 // creation of TDS object from root object
36
37 MsgStream log( msgSvc(), "McParticleCnv" );
38 log << MSG::DEBUG << "McParticleCnv::TObjectToDataObject" << endmsg;
39 StatusCode sc = StatusCode::SUCCESS;
40
41 // create the TDS location for the MdcMc Collection
42 McParticleCol* mcParticleTdsCol = new McParticleCol;
43 refpObject = mcParticleTdsCol;
44
45 // now convert
46 if ( !m_mcParticleCol ) return sc;
47 TIter mcParticleIter( m_mcParticleCol );
48 TMcParticle* mcParticleRoot = 0;
49
50 vector<int> mothers;
51 // vector<vector<int> > daughtList;
52
53 while ( ( mcParticleRoot = (TMcParticle*)mcParticleIter.Next() ) )
54 {
55 unsigned int particleID = mcParticleRoot->getParticleID();
56 unsigned int trackIndex = mcParticleRoot->getTrackIndex();
57
58 int vertexIndex0 = mcParticleRoot->getVertexIndex0();
59 int vertexIndex1 = mcParticleRoot->getVertexIndex1();
60 unsigned int statusFlags = mcParticleRoot->getStatusFlags();
61
62 double xInitialPosition = mcParticleRoot->getInitialPositionX();
63 double yInitialPosition = mcParticleRoot->getInitialPositionY();
64 double zInitialPosition = mcParticleRoot->getInitialPositionZ();
65 double tInitialPosition = mcParticleRoot->getInitialPositionT();
66
67 double xFinalPosition = mcParticleRoot->getFinalPositionX();
68 double yFinalPosition = mcParticleRoot->getFinalPositionY();
69 double zFinalPosition = mcParticleRoot->getFinalPositionZ();
70 double tFinalPosition = mcParticleRoot->getFinalPositionT();
71
72 double xInitialMomentum = mcParticleRoot->getInitialMomentumX();
73 double yInitialMomentum = mcParticleRoot->getInitialMomentumY();
74 double zInitialMomentum = mcParticleRoot->getInitialMomentumZ();
75 double eInitialMomentum = mcParticleRoot->getInitialMomentumE();
76
77 // double xFinalMomentum = mcParticleRoot->getFinalMomentumX();
78 // double yFinalMomentum = mcParticleRoot->getFinalMomentumY();
79 // double zFinalMomentum = mcParticleRoot->getFinalMomentumZ();
80 // double eFinalMomentum = mcParticleRoot->getFinalMomentumE();
81
82 HepLorentzVector initialMomentum( xInitialMomentum, yInitialMomentum, zInitialMomentum,
83 eInitialMomentum );
84 HepLorentzVector initialPosition( xInitialPosition, yInitialPosition, zInitialPosition,
85 tInitialPosition );
86 // HepLorentzVector finalMomentum(xFinalMomentum, yFinalMomentum, zFinalMomentum,
87 // eFinalMomentum);
88 HepLorentzVector finalPosition( xFinalPosition, yFinalPosition, zFinalPosition,
89 tFinalPosition );
90
91 int mother = mcParticleRoot->getMother();
92 vector<int> daughters = mcParticleRoot->getDaughters();
93
94 mothers.push_back( mother );
95 // daughtList.push_back(daughters);
96
97 McParticle* mcParticleTds = new McParticle;
98 m_common.m_rootMcParticleMap[mcParticleRoot] = mcParticleTds;
99
100 mcParticleTds->initialize( particleID, statusFlags, initialMomentum, initialPosition );
101 mcParticleTds->setTrackIndex( trackIndex );
102 mcParticleTds->addStatusFlag( statusFlags );
103
104 mcParticleTds->setVertexIndex0( vertexIndex0 );
105 mcParticleTds->setVertexIndex1( vertexIndex1 );
106 // mcParticleTds->finalize(finalMomentum, finalPosition);
107 mcParticleTds->finalize( finalPosition );
108
109 mcParticleTdsCol->push_back( mcParticleTds );
110 }
111
112 // Set Mother and DaughterList
113 McParticleCol::iterator iter;
114 int i = 0;
115 for ( iter = mcParticleTdsCol->begin(); iter != mcParticleTdsCol->end(); iter++, i++ )
116 {
117 // cout<<" ***** mothers[ "<<i<<"] = "<<mothers[i]<<endl;
118 if ( mothers[i] != -99 )
119 {
120 McParticleCol::iterator mcParticleTds;
121 for ( mcParticleTds = mcParticleTdsCol->begin();
122 mcParticleTds != mcParticleTdsCol->end(); mcParticleTds++ )
123 {
124 int trackIndex = ( *mcParticleTds )->trackIndex();
125 if ( trackIndex == mothers[i] )
126 {
127 ( *iter )->setMother( *mcParticleTds );
128 ( *mcParticleTds )->addDaughter( *iter );
129 break;
130 }
131 }
132 }
133 else { ( *iter )->setMother( *iter ); }
134 }
135 // m_mcParticleCol->Delete(); // wensp add 2005/12/30
136 delete m_mcParticleCol;
137 m_mcParticleCol = 0;
138 return StatusCode::SUCCESS;
139}
140
141StatusCode McParticleCnv::DataObjectToTObject( DataObject* obj, RootAddress* rootaddr ) {
142
143 MsgStream log( msgSvc(), "McParticleCnv" );
144 log << MSG::DEBUG << "McParticleCnv::DataObjectToTObject" << endmsg;
145 StatusCode sc = StatusCode::SUCCESS;
146
147 McParticleCol* mcParticleCnvTds = dynamic_cast<McParticleCol*>( obj );
148 if ( !mcParticleCnvTds )
149 {
150 log << MSG::ERROR << "Could not downcast to McParticleCol" << endmsg;
151 return StatusCode::FAILURE;
152 }
153
154 DataObject* evt;
155 m_eds->findObject( EventModel::MC::Event, evt );
156 if ( evt == NULL )
157 {
158 log << MSG::ERROR << "Could not get McEvent in TDS " << endmsg;
159 return StatusCode::FAILURE;
160 }
161 McEvent* devtTds = dynamic_cast<McEvent*>( evt );
162 if ( !devtTds )
163 { log << MSG::ERROR << "McParticleCnv:Could not downcast to TDS McEvent" << endmsg; }
164 IOpaqueAddress* addr;
165
166 m_cnvSvc->getMcCnv()->createRep( evt, addr );
167 TMcEvent* McEvt = m_cnvSvc->getMcCnv()->getWriteObject();
168
169 const TObjArray* m_mcParticleCol = McEvt->getMcParticleCol();
170 if ( !m_mcParticleCol ) { return sc; }
171 McEvt->clearMcParticleCol(); // necessary in case there is I/O at the same time since array
172 // is static
173
174 McParticleCol::const_iterator mcParticleTds;
175
176 for ( mcParticleTds = mcParticleCnvTds->begin(); mcParticleTds != mcParticleCnvTds->end();
177 mcParticleTds++ )
178 {
179 Int_t particleID = ( *mcParticleTds )->particleProperty();
180 Int_t trackIndex = ( *mcParticleTds )->trackIndex();
181
182 Int_t vertexIndex0 = ( *mcParticleTds )->vertexIndex0();
183 Int_t vertexIndex1 = ( *mcParticleTds )->vertexIndex1();
184 Int_t statusFlags = ( *mcParticleTds )->statusFlags();
185
186 HepLorentzVector initialPosition = ( *mcParticleTds )->initialPosition();
187 HepLorentzVector finalPosition = ( *mcParticleTds )->finalPosition();
188 HepLorentzVector initialFourMomentum = ( *mcParticleTds )->initialFourMomentum();
189 // HepLorentzVector finalFourMomentum = (*mcParticleTds)->finalFourMomentum();
190
191 // cout << " HepID " << (*mcParticleTds)->particleProperty() << endl;
192 // cout << " init pos " << initialPosition.x() << " " << initialPosition.y() << " " <<
193 // initialPosition.z() << endl;
194 Int_t mother = -99;
195 if ( !( *mcParticleTds )->primaryParticle() )
196 mother = ( ( *mcParticleTds )->mother() ).trackIndex();
197
198 vector<Int_t> daughters;
199 SmartRefVector<McParticle> daughterList = ( *mcParticleTds )->daughterList();
200 // SmartRefVector<McParticle>::iterator iter;
201 for ( int iPar = 0; iPar < daughterList.size(); iPar++ )
202 {
203 // cout <<"daughter Index " <<daughterList[iPar]->getTrackIndex()<<endl;
204 daughters.push_back( daughterList[iPar]->trackIndex() );
205 }
206 /*
207 for (int idau = 0; idau<daughters.size();idau++){
208 cout <<"daughter Index " <<daughters[idau]<<endl;
209 }
210
211 cout<<"###############################"<<endl;
212 */
213 TMcParticle* mcParticleRoot = new TMcParticle();
214 // m_common.m_mcParticleMap[(*mcParticleTds)] = mcParticleRoot;
215
216 mcParticleRoot->setParticleID( particleID );
217 mcParticleRoot->setTrackIndex( trackIndex );
218
219 mcParticleRoot->setVertexIndex0( vertexIndex0 );
220 mcParticleRoot->setVertexIndex1( vertexIndex1 );
221
222 mcParticleRoot->setStatusFlags( statusFlags );
223
224 mcParticleRoot->setInitialPositionX( initialPosition.x() );
225 mcParticleRoot->setInitialPositionY( initialPosition.y() );
226 mcParticleRoot->setInitialPositionZ( initialPosition.z() );
227 mcParticleRoot->setInitialPositionT( initialPosition.t() );
228
229 mcParticleRoot->setFinalPositionX( finalPosition.x() );
230 mcParticleRoot->setFinalPositionY( finalPosition.y() );
231 mcParticleRoot->setFinalPositionZ( finalPosition.z() );
232 mcParticleRoot->setFinalPositionT( finalPosition.t() );
233
234 mcParticleRoot->setInitialMomentumX( initialFourMomentum.x() );
235 mcParticleRoot->setInitialMomentumY( initialFourMomentum.y() );
236 mcParticleRoot->setInitialMomentumZ( initialFourMomentum.z() );
237 mcParticleRoot->setInitialMomentumE( initialFourMomentum.e() );
238
239 // mcParticleRoot->setFinalMomentumX(finalFourMomentum.x());
240 // mcParticleRoot->setFinalMomentumY(finalFourMomentum.y());
241 // mcParticleRoot->setFinalMomentumZ(finalFourMomentum.z());
242 // mcParticleRoot->setFinalMomentumE(finalFourMomentum.e());
243
244 mcParticleRoot->setMother( mother );
245 mcParticleRoot->setDaughters( daughters );
246 /*
247 vector<int> dau = mcParticleRoot->getDaughters();
248
249 for (int idau = 0; idau<daughters.size();idau++){
250 cout <<"daughter Index root " <<dau[idau]<<endl;
251 }
252 */
253
254 McEvt->addMcParticle( mcParticleRoot );
255 }
256 return StatusCode::SUCCESS;
257}
258#endif
ObjectList< McParticle > McParticleCol
EvtStreamInputIterator< typename Generator::result_type > iter(Generator gen, int N=0)
IMessageSvc * msgSvc()
virtual StatusCode DataObjectToTObject(DataObject *obj, RootAddress *addr)
transformation to root
McParticleCnv(ISvcLocator *svc)
virtual StatusCode TObjectToDataObject(DataObject *&obj)
transformation from root
The Monte Carlo particle kinematics information.
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 addMcParticle(TMcParticle *mcHit)
McParticle.
Definition TMcEvent.cxx:115
void setDaughters(vector< Int_t > &daughters)