Main Page   Namespace List   Class Hierarchy   Compound List   File List   Compound Members   File Members  

McVertexCnv.cpp

Go to the documentation of this file.
00001 // McVertexCnv.cpp: implementation of the McVertexCnv class.
00002 //
00004 // $Header: /nfs/slac/g/glast/ground/cvs/GlastSvc/src/MonteCarlo/McVertexCnv.cpp,v 1.2 2001/08/27 04:18:57 burnett Exp $
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         // do this if MCTruth exists. Otherwise assume MCTree will take care of it
00032        FluxGenerator * f = dynamic_cast<FluxGenerator*>(t->particle()); // first 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     // create a new node in the tree
00064     McParticle* p1 = new McParticle;
00065     McVertex*   v1 = new McVertex;
00066     m_vlist->add(v1);
00067     m_plist->add(p1);
00068 
00069     // a McVertex is really a track segment
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)) { //TODO: use the particle propery database
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); // associated particle will be set up below
00083     v1->setInitialFourMomentum( HepLorentzVector(momentum,sqrt(e2)) );
00084     p1->setParticleID(id); 
00085     p1->setParticleProperty(id);
00086     
00087     //TODO: choose among primaryOrigin, daughterOrigin, decayProduct, showerContents, showerBacksplash
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;  // make root available for display, etc.
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 //        final +=  (*it)->m_p; 
00103     }
00104     v1->setFinalFourMomentum(final);
00105     return;
00106 }

Generated at Wed Nov 21 12:21:13 2001 by doxygen1.2.3 written by Dimitri van Heesch, © 1997-2000