/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Event/RootCnvSvc/RootCnvSvc-02-01-12/src/Mc/McParticleCnv.cxx

Go to the documentation of this file.
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"   //TDS object
00012 #include "McTruth/McParticle.h"   //TDS object
00013 #include "RootEventData/TMcParticle.h" // standard root object
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 // Instantiation of a static factory class used by clients to create
00021 // instances of this service
00022 //static CnvFactory<McParticleCnv> s_factory;
00023 //const ICnvFactory& McParticleCnvFactory = s_factory;
00024 
00025 McParticleCnv::McParticleCnv(ISvcLocator* svc)
00026 : RootEventBaseCnv(classID(), svc)
00027 {
00028     // Here we associate this converter with the /Event path on the TDS.
00029     MsgStream log(msgSvc(), "McParticleCnv");
00030     //log << MSG::DEBUG << "Constructor called for " << objType() << endreq;
00031     m_rootBranchname ="m_mcParticleCol";
00032     //declareObject(EventModel::MC::McParticleCol, objType(), m_rootTreename, m_rootBranchname);
00033     m_adresses.push_back(&m_mcParticleCol);
00034     m_mcParticleCol=0;
00035 }
00036 
00037 StatusCode McParticleCnv::TObjectToDataObject(DataObject*& refpObject) {
00038   // creation of TDS object from root object
00039 
00040     MsgStream log(msgSvc(), "McParticleCnv");
00041     log << MSG::DEBUG << "McParticleCnv::TObjectToDataObject" << endreq;
00042     StatusCode sc=StatusCode::SUCCESS;
00043 
00044     // create the TDS location for the MdcMc Collection
00045     McParticleCol* mcParticleTdsCol = new McParticleCol;
00046     refpObject=mcParticleTdsCol;
00047 
00048 
00049     // now convert
00050     if (!m_mcParticleCol) return sc;
00051     TIter mcParticleIter(m_mcParticleCol);
00052     TMcParticle *mcParticleRoot = 0;
00053     
00054     vector<int> mothers;
00055     // vector<vector<int> > daughtList;
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         //double xFinalMomentum =   mcParticleRoot->getFinalMomentumX();
00081         //double yFinalMomentum =   mcParticleRoot->getFinalMomentumY();
00082         //double zFinalMomentum =   mcParticleRoot->getFinalMomentumZ();
00083         //double eFinalMomentum =   mcParticleRoot->getFinalMomentumE();
00084 
00085         HepLorentzVector initialMomentum(xInitialMomentum, yInitialMomentum, zInitialMomentum, eInitialMomentum);
00086         HepLorentzVector initialPosition(xInitialPosition, yInitialPosition, zInitialPosition, tInitialPosition);
00087         //HepLorentzVector finalMomentum(xFinalMomentum, yFinalMomentum, zFinalMomentum, eFinalMomentum);
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         //daughtList.push_back(daughters);
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         //mcParticleTds->finalize(finalMomentum, finalPosition);
00108   mcParticleTds->finalize(finalPosition);
00109 
00110         mcParticleTdsCol->push_back(mcParticleTds);
00111      }
00112         
00113     //Set Mother and DaughterList 
00114     McParticleCol::iterator iter;
00115     int i =0;
00116     for (iter = mcParticleTdsCol->begin(); iter != mcParticleTdsCol->end(); iter++,i++){
00117       //cout<<"    *****   mothers[ "<<i<<"] = "<<mothers[i]<<endl;
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     //m_mcParticleCol->Delete();  // wensp add 2005/12/30
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(); //necessary in case there is I/O at the same time since array is static
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     //HepLorentzVector finalFourMomentum   = (*mcParticleTds)->finalFourMomentum();
00184 
00185     //cout << " HepID " << (*mcParticleTds)->particleProperty() << endl;
00186     //cout << " init pos " << initialPosition.x() << "  " << initialPosition.y() << "  " << initialPosition.z() << endl;
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     //SmartRefVector<McParticle>::iterator iter; 
00193     for (int iPar = 0; iPar < daughterList.size(); iPar++) {
00194       //cout <<"daughter Index   " <<daughterList[iPar]->getTrackIndex()<<endl; 
00195       daughters.push_back(daughterList[iPar]->trackIndex());
00196     }
00197     /*    
00198     for (int idau = 0; idau<daughters.size();idau++){
00199       cout <<"daughter Index      " <<daughters[idau]<<endl;
00200     }
00201     
00202     cout<<"###############################"<<endl;
00203     */
00204     TMcParticle *mcParticleRoot = new TMcParticle();
00205     //m_common.m_mcParticleMap[(*mcParticleTds)] = mcParticleRoot;
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     //mcParticleRoot->setFinalMomentumX(finalFourMomentum.x());
00231     //mcParticleRoot->setFinalMomentumY(finalFourMomentum.y());
00232     //mcParticleRoot->setFinalMomentumZ(finalFourMomentum.z());
00233     //mcParticleRoot->setFinalMomentumE(finalFourMomentum.e());
00234 
00235     mcParticleRoot->setMother(mother);
00236     mcParticleRoot->setDaughters(daughters);
00237     /*
00238     vector<int> dau = mcParticleRoot->getDaughters();       
00239 
00240     for (int idau = 0; idau<daughters.size();idau++){
00241       cout <<"daughter Index root      " <<dau[idau]<<endl;
00242     } 
00243     */
00244     
00245     McEvt->addMcParticle(mcParticleRoot);
00246   }
00247   return StatusCode::SUCCESS;
00248 }
00249 #endif
00250 

Generated on Tue Nov 29 22:58:47 2016 for BOSS_7.0.2 by  doxygen 1.4.7