00001 #ifndef McParticleCnv_CXX
00002 #define McParticleCnv_CXX 1
00003
00004 #include "GaudiKernel/MsgStream.h"
00005 #include "GaudiKernel/DataObject.h"
00006 #include "GaudiKernel/ObjectVector.h"
00007
00008 #include "TClonesArray.h"
00009
00010 #include "EventModel/EventModel.h"
00011 #include "McTruth/McEvent.h"
00012 #include "McTruth/McParticle.h"
00013 #include "RootEventData/TMcParticle.h"
00014 #include "RootEventData/TMcEvent.h"
00015 #include "RootCnvSvc/Mc/McCnv.h"
00016 #include "RootCnvSvc/Mc/McParticleCnv.h"
00017 #include "RootCnvSvc/RootAddress.h"
00018
00019
00020
00021
00022
00023
00024
00025 McParticleCnv::McParticleCnv(ISvcLocator* svc)
00026 : RootEventBaseCnv(classID(), svc)
00027 {
00028
00029 MsgStream log(msgSvc(), "McParticleCnv");
00030
00031 m_rootBranchname ="m_mcParticleCol";
00032
00033 m_adresses.push_back(&m_mcParticleCol);
00034 m_mcParticleCol=0;
00035 }
00036
00037 StatusCode McParticleCnv::TObjectToDataObject(DataObject*& refpObject) {
00038
00039
00040 MsgStream log(msgSvc(), "McParticleCnv");
00041 log << MSG::DEBUG << "McParticleCnv::TObjectToDataObject" << endreq;
00042 StatusCode sc=StatusCode::SUCCESS;
00043
00044
00045 McParticleCol* mcParticleTdsCol = new McParticleCol;
00046 refpObject=mcParticleTdsCol;
00047
00048
00049
00050 if (!m_mcParticleCol) return sc;
00051 TIter mcParticleIter(m_mcParticleCol);
00052 TMcParticle *mcParticleRoot = 0;
00053
00054 vector<int> mothers;
00055
00056
00057 while ((mcParticleRoot = (TMcParticle*)mcParticleIter.Next())) {
00058 unsigned int particleID = mcParticleRoot ->getParticleID();
00059 unsigned int trackIndex = mcParticleRoot ->getTrackIndex();
00060
00061 int vertexIndex0 = mcParticleRoot ->getVertexIndex0();
00062 int vertexIndex1 = mcParticleRoot ->getVertexIndex1();
00063 unsigned int statusFlags = mcParticleRoot ->getStatusFlags();
00064
00065 double xInitialPosition = mcParticleRoot->getInitialPositionX();
00066 double yInitialPosition = mcParticleRoot->getInitialPositionY();
00067 double zInitialPosition = mcParticleRoot->getInitialPositionZ();
00068 double tInitialPosition = mcParticleRoot->getInitialPositionT();
00069
00070 double xFinalPosition = mcParticleRoot->getFinalPositionX();
00071 double yFinalPosition = mcParticleRoot->getFinalPositionY();
00072 double zFinalPosition = mcParticleRoot->getFinalPositionZ();
00073 double tFinalPosition = mcParticleRoot->getFinalPositionT();
00074
00075 double xInitialMomentum = mcParticleRoot->getInitialMomentumX();
00076 double yInitialMomentum = mcParticleRoot->getInitialMomentumY();
00077 double zInitialMomentum = mcParticleRoot->getInitialMomentumZ();
00078 double eInitialMomentum = mcParticleRoot->getInitialMomentumE();
00079
00080
00081
00082
00083
00084
00085 HepLorentzVector initialMomentum(xInitialMomentum, yInitialMomentum, zInitialMomentum, eInitialMomentum);
00086 HepLorentzVector initialPosition(xInitialPosition, yInitialPosition, zInitialPosition, tInitialPosition);
00087
00088 HepLorentzVector finalPosition(xFinalPosition, yFinalPosition, zFinalPosition, tFinalPosition);
00089
00090
00091 int mother = mcParticleRoot->getMother();
00092 vector<int> daughters = mcParticleRoot->getDaughters();
00093
00094 mothers.push_back(mother);
00095
00096
00097 McParticle *mcParticleTds = new McParticle;
00098 m_common.m_rootMcParticleMap[mcParticleRoot] = mcParticleTds;
00099
00100
00101 mcParticleTds->initialize(particleID, statusFlags, initialMomentum, initialPosition);
00102 mcParticleTds->setTrackIndex(trackIndex);
00103 mcParticleTds->addStatusFlag(statusFlags);
00104
00105 mcParticleTds->setVertexIndex0(vertexIndex0);
00106 mcParticleTds->setVertexIndex1(vertexIndex1);
00107
00108 mcParticleTds->finalize(finalPosition);
00109
00110 mcParticleTdsCol->push_back(mcParticleTds);
00111 }
00112
00113
00114 McParticleCol::iterator iter;
00115 int i =0;
00116 for (iter = mcParticleTdsCol->begin(); iter != mcParticleTdsCol->end(); iter++,i++){
00117
00118 if(mothers[i] != -99 ){
00119 McParticleCol::iterator mcParticleTds;
00120 for (mcParticleTds = mcParticleTdsCol->begin(); mcParticleTds != mcParticleTdsCol->end(); mcParticleTds++) {
00121 int trackIndex = (*mcParticleTds)->trackIndex();
00122 if( trackIndex == mothers[i] ){
00123 (*iter)->setMother(*mcParticleTds);
00124 (*mcParticleTds)->addDaughter(*iter);
00125 break;
00126 }
00127 }
00128 }
00129 else{
00130 (*iter)->setMother(*iter);
00131 }
00132 }
00133
00134 delete m_mcParticleCol;
00135 m_mcParticleCol = 0;
00136 return StatusCode::SUCCESS;
00137 }
00138
00139 StatusCode McParticleCnv::DataObjectToTObject(DataObject* obj,RootAddress* rootaddr) {
00140
00141 MsgStream log(msgSvc(), "McParticleCnv");
00142 log << MSG::DEBUG << "McParticleCnv::DataObjectToTObject" << endreq;
00143 StatusCode sc=StatusCode::SUCCESS;
00144
00145 McParticleCol *mcParticleCnvTds=dynamic_cast<McParticleCol *> (obj);
00146 if (!mcParticleCnvTds) {
00147 log << MSG::ERROR << "Could not downcast to McParticleCol" << endreq;
00148 return StatusCode::FAILURE;
00149 }
00150
00151 DataObject *evt;
00152 m_eds->findObject(EventModel::MC::Event,evt);
00153 if (evt==NULL) {
00154 log << MSG::ERROR << "Could not get McEvent in TDS " << endreq;
00155 return StatusCode::FAILURE;
00156 }
00157 McEvent * devtTds=dynamic_cast<McEvent *> (evt);
00158 if (!devtTds) {
00159 log << MSG::ERROR << "McParticleCnv:Could not downcast to TDS McEvent" << endreq;
00160 }
00161 IOpaqueAddress *addr;
00162
00163 m_cnvSvc->getMcCnv()->createRep(evt,addr);
00164 TMcEvent *McEvt=m_cnvSvc->getMcCnv()->getWriteObject();
00165
00166 const TObjArray *m_mcParticleCol = McEvt->getMcParticleCol();
00167 if (!m_mcParticleCol) { return sc; }
00168 McEvt->clearMcParticleCol();
00169
00170 McParticleCol::const_iterator mcParticleTds;
00171
00172 for (mcParticleTds = mcParticleCnvTds->begin(); mcParticleTds != mcParticleCnvTds->end(); mcParticleTds++) {
00173 Int_t particleID = (*mcParticleTds)->particleProperty();
00174 Int_t trackIndex = (*mcParticleTds)->trackIndex();
00175
00176 Int_t vertexIndex0 = (*mcParticleTds)->vertexIndex0();
00177 Int_t vertexIndex1 = (*mcParticleTds)->vertexIndex1();
00178 Int_t statusFlags = (*mcParticleTds)->statusFlags();
00179
00180 HepLorentzVector initialPosition = (*mcParticleTds)->initialPosition();
00181 HepLorentzVector finalPosition = (*mcParticleTds)->finalPosition();
00182 HepLorentzVector initialFourMomentum = (*mcParticleTds)->initialFourMomentum();
00183
00184
00185
00186
00187 Int_t mother = -99;
00188 if(!(*mcParticleTds)->primaryParticle()) mother = ((*mcParticleTds)->mother()).trackIndex();
00189
00190 vector<Int_t> daughters;
00191 SmartRefVector<McParticle> daughterList = (*mcParticleTds)->daughterList();
00192
00193 for (int iPar = 0; iPar < daughterList.size(); iPar++) {
00194
00195 daughters.push_back(daughterList[iPar]->trackIndex());
00196 }
00197
00198
00199
00200
00201
00202
00203
00204 TMcParticle *mcParticleRoot = new TMcParticle();
00205
00206
00207 mcParticleRoot->setParticleID(particleID);
00208 mcParticleRoot->setTrackIndex(trackIndex);
00209
00210 mcParticleRoot->setVertexIndex0(vertexIndex0);
00211 mcParticleRoot->setVertexIndex1(vertexIndex1);
00212
00213 mcParticleRoot->setStatusFlags(statusFlags);
00214
00215 mcParticleRoot->setInitialPositionX(initialPosition.x());
00216 mcParticleRoot->setInitialPositionY(initialPosition.y());
00217 mcParticleRoot->setInitialPositionZ(initialPosition.z());
00218 mcParticleRoot->setInitialPositionT(initialPosition.t());
00219
00220 mcParticleRoot->setFinalPositionX(finalPosition.x());
00221 mcParticleRoot->setFinalPositionY(finalPosition.y());
00222 mcParticleRoot->setFinalPositionZ(finalPosition.z());
00223 mcParticleRoot->setFinalPositionT(finalPosition.t());
00224
00225 mcParticleRoot->setInitialMomentumX(initialFourMomentum.x());
00226 mcParticleRoot->setInitialMomentumY(initialFourMomentum.y());
00227 mcParticleRoot->setInitialMomentumZ(initialFourMomentum.z());
00228 mcParticleRoot->setInitialMomentumE(initialFourMomentum.e());
00229
00230
00231
00232
00233
00234
00235 mcParticleRoot->setMother(mother);
00236 mcParticleRoot->setDaughters(daughters);
00237
00238
00239
00240
00241
00242
00243
00244
00245 McEvt->addMcParticle(mcParticleRoot);
00246 }
00247 return StatusCode::SUCCESS;
00248 }
00249 #endif
00250