00001
00002
00004
00005
00006 #include "GaudiKernel/CnvFactory.h"
00007 #include "GaudiKernel/IDataProviderSvc.h"
00008 #include "GaudiKernel/ObjectVector.h"
00009
00010 #include "McVertexCnv.h"
00011 #include "instrument/MCTruth.h"
00012
00014 static CnvFactory<McVertexCnv> s_factory;
00015 const ICnvFactory& McVertexCnvFactory = s_factory;
00016
00017
00019
00020 StatusCode McVertexCnv::createObj(IOpaqueAddress* pAddress, DataObject*& refpObject)
00021 {
00022
00023 refpObject = m_vlist= new McVertexCol;
00024 DataObject* mcroot;
00025 StatusCode sc;
00026 sc=dataProvider()->findObject("/Event/MC", mcroot);
00027 sc=dataProvider()->registerObject(mcroot, "McParticleCol", m_plist=new McParticleCol);
00028
00029 MCTruth* t = MCTruth::instance();
00030 if( t ) {
00031
00032 FluxGenerator * f = dynamic_cast<FluxGenerator*>(t->particle());
00033 addParticle(0, f->m_particles);
00034 }
00035
00036 return StatusCode::SUCCESS;
00037 }
00038
00040 StatusCode McVertexCnv::updateObj(IOpaqueAddress* pAddress, DataObject* pObject) {
00041 return StatusCode::SUCCESS;
00042
00043 }
00044
00046 const CLID& McVertexCnv::classID() {
00047 return McVertex::classID();
00048 }
00049
00051 McVertexCnv::McVertexCnv(ISvcLocator* svc)
00052 : BaseCnv(classID(), svc)
00053 {
00054
00055 declareObject("/Event/MC/McVertexCol", objType(), "");
00056 }
00057
00059 McVertexCnv::~McVertexCnv(){ }
00060
00061 void McVertexCnv::addParticle(McVertex* mother, FluxGenerator::ParticleData* p)
00062 {
00063
00064 McParticle* p1 = new McParticle;
00065 McVertex* v1 = new McVertex;
00066 m_vlist->add(v1);
00067 m_plist->add(p1);
00068
00069
00070 v1->setInitialPosition(p->m_pos);
00071 if( p->m_kids.size()>0) v1->setFinalPosition(p->m_kids[0]->m_pos);
00072 Hep3Vector momentum=p->m_p;
00073 int id = p->m_idcode;
00074 double mass=0;
00075 switch (abs(id)) {
00076 case 11: mass = 0.000511; break;
00077 case 211: mass = 0.1395675; break;
00078 case 13: mass = 0.105658; break;
00079 case 2212: mass = 0.938272; break;
00080 };
00081 double e2 = mass*mass+momentum.mag2();
00082 v1->setMcParticle(p1);
00083 v1->setInitialFourMomentum( HepLorentzVector(momentum,sqrt(e2)) );
00084 p1->setParticleID(id);
00085 p1->setParticleProperty(id);
00086
00087
00088 v1->setVertexType(McVertex::daughterOrigin);
00089
00090 v1->setMotherMcParticle( mother!=0? mother->mcParticle() : 0);
00091
00092 p1->setPrimaryParticleFlag(mother==0);
00093 p1->setMcVertex(v1);
00094 if( mother !=0) {
00095 mother->addDaughterMcParticle(p1);
00096 } else m_root = v1;
00097
00098 HepLorentzVector final;
00099 for( FluxGenerator::ParticleData::ChildList::iterator it= p->m_kids.begin();
00100 it !=p->m_kids.end(); ++it){
00101 addParticle(v1, *it);
00102
00103 }
00104 v1->setFinalFourMomentum(final);
00105 return;
00106 }