Main Page | Compound List | File List | Compound Members | File Members | Related Pages

McParticle.cxx

Go to the documentation of this file.
00001 //                                                                       
00002 // The McParticle class provides an interface to a particle for use in
00003 // GLAST Monte Carlo applications
00004 //
00005 // $Header: /nfs/slac/g/glast/ground/cvs/mcRootData/src/McParticle.cxx,v 1.12 2007/02/15 19:25:24 usher Exp $
00006 
00007 #include "mcRootData/McParticle.h"
00008 #include <commonRootData/RootDataUtil.h>
00009 #include "Riostream.h"
00010 
00011 #include "McObjectManager.h"
00012 
00013 ClassImp(McParticle)
00014 
00015 McParticle::McParticle() : 
00016 m_particleId(0), m_statusFlags(0)
00017 {
00018     Clear();
00019 }
00020 
00021 McParticle::McParticle(const McParticle &p)
00022  : TObject(p) {
00023     // Purpose and Method:  The copy constructor.  This will make it easier to
00024     //    read in the McParticles within the simulation.
00025 
00026     m_particleId = p.m_particleId;
00027     m_statusFlags = p.m_statusFlags;
00028     m_initialPosition = p.m_initialPosition;
00029     m_finalPosition = p.m_finalPosition;
00030     m_initialFourMomentum = p.m_initialFourMomentum;
00031     m_finalFourMomentum = p.m_finalFourMomentum;
00032     m_mother = p.m_mother;
00033     m_process = p.m_process;
00034     // TRefArrayIter::Next does not seem to be implemented in Root 3.02.03
00035     // or ROOT 3.03.04 - just iterating over the entries for now.
00036     //TRefArrayIter daughterIter(&p.m_daughters);
00037     McParticle *curRef;
00038     Int_t iPart;
00039     for (iPart = 0; iPart < p.m_daughters.GetEntries(); iPart++) {
00040     //while ( (curRef = (McParticle*)daughterIter.Next()) ){
00041         curRef = (McParticle*)p.m_daughters.At(iPart);
00042         m_daughters.Add(curRef);
00043     }
00044 }
00045 
00046 McParticle::~McParticle() {
00047     Clear();
00048 }
00049 
00050 void* McParticle::operator new(size_t size)
00051 {
00052     McParticle* temp = McObjectManager::getPointer()->getNewMcParticle();
00053 
00054     // Since we recycle, make sure these member functions are cleared
00055     temp->m_daughters.Clear();
00056     temp->m_process = "";
00057 
00058     return temp;
00059 }
00060 
00061 void* McParticle::operator new(size_t size, void* vp)
00062 {
00063     return vp;
00064 }
00065 
00066 McParticle& McParticle::operator =(const McParticle& rhs)
00067 {
00068     m_particleId           = rhs.m_particleId;
00069     m_statusFlags          = rhs.m_statusFlags;
00070     m_initialPosition      = rhs.m_initialPosition;
00071     m_finalPosition        = rhs.m_finalPosition;
00072     m_initialFourMomentum  = rhs.m_initialFourMomentum;
00073     m_finalFourMomentum    = rhs.m_finalFourMomentum;
00074     m_mother               = rhs.m_mother;
00075     m_process              = rhs.m_process; 
00076 
00077     for(int idx = 0; idx < rhs.m_daughters.GetEntries(); idx++)
00078         m_daughters.Add(rhs.m_daughters[idx]);
00079 
00080     return *this;
00081 }
00082 
00083 void McParticle::Clear(Option_t *) {
00084     m_particleId = 0;
00085     m_statusFlags = 0;
00086     m_initialPosition = TVector3(0., 0., 0.);
00087     m_finalPosition = TVector3(0., 0., 0.);
00088     m_initialFourMomentum = TLorentzVector(0., 0., 0., 0.);
00089     m_finalFourMomentum = TLorentzVector(0., 0., 0., 0.);
00090     m_daughters.Clear();
00091 }
00092 
00093 // dummy data, just for tests
00094 void McParticle::Fake( Int_t ievent, UInt_t rank, Float_t randNum ) {
00095 
00096     Clear() ;
00097     Float_t f = Float_t(rank);
00098     Float_t fr = f*randNum;
00099     TLorentzVector initMom(f, f, f, f);
00100     TLorentzVector finalMom(fr+ievent, fr+ievent, fr+ievent, fr+ievent);
00101     TVector3 initPos(randNum, f*2.0*randNum, f*4.0*randNum);
00102     TVector3 finalPos(f*randNum, f*randNum, f*randNum);
00103     initialize(this, rank, 0, initMom, finalMom, initPos, finalPos);
00104 
00105 }
00106 
00107 #define COMPARE_IN_RANGE(att) rootdatautil::CompareInRange(get ## att(),ref.get ## att(),#att)
00108 
00109 Bool_t McParticle::CompareInRange( const McParticle & ref, const std::string & name ) const {
00110 
00111     Bool_t result = true ;
00112     
00113     result = COMPARE_IN_RANGE(ParticleId) && result ;
00114     result = COMPARE_IN_RANGE(StatusFlags) && result ;
00115     
00116     result = COMPARE_IN_RANGE(InitialFourMomentum) && result ;
00117     result = COMPARE_IN_RANGE(FinalFourMomentum) && result ;
00118 
00119     result = COMPARE_IN_RANGE(InitialPosition) && result ;
00120     result = COMPARE_IN_RANGE(FinalPosition) && result ;
00121         
00122     result = COMPARE_IN_RANGE(Process) && result ;
00123     
00124     // for fake data and comparison
00125     // particles should point to themselves
00126     rootdatautil::CompareInRange(ref.GetUniqueID(),ref.getMother()->GetUniqueID(),"Ref Mother") ;
00127     rootdatautil::CompareInRange(GetUniqueID(),getMother()->GetUniqueID(),"Mother") ;
00128       
00129     if (!result) {
00130         if ( name == "" ) {
00131             std::cout<<"Comparison ERROR for "<<ClassName()<<std::endl ;
00132         }
00133         else {
00134             std::cout<<"Comparison ERROR for "<<name<<std::endl ;
00135         }
00136     }
00137     return result ;
00138 
00139 }
00140 
00141 void McParticle::Print(Option_t *option) const {
00142     using namespace std;
00143     TObject::Print(option);
00144     cout.precision(2);
00145     cout << "ParticleId: " << m_particleId;
00146     cout << " StatusFlag: " << m_statusFlags << endl;
00147     cout << "Process: " << m_process.Data() << endl;
00148     cout << "InitialPos: (" << m_initialPosition.X() << "," << m_initialPosition.Y()
00149         << "," << m_initialPosition.Z() << ") ";
00150     cout << "FinalPos: (" << m_finalPosition.X() << "," << m_finalPosition.Y()
00151         << "," << m_finalPosition.Z() << ")" << endl;
00152     cout << "InitMom: (" << m_initialFourMomentum.X() << "," << m_initialFourMomentum.Y() << ","
00153         << m_initialFourMomentum.Z() << "," << m_initialFourMomentum.T() << ")    ";
00154     cout << "FinalMom: (" << m_finalFourMomentum.X() << "," << m_finalFourMomentum.Y() << ","
00155         << m_finalFourMomentum.Z() << "," << m_finalFourMomentum.T() << ")" << endl;
00156     cout << "Mother:  ";
00157     m_mother.Print();
00158     cout << "Number of Daughters: " << m_daughters.GetEntries() << endl;
00159 }
00160 
00161 
00162 void McParticle::initialize( McParticle* mother, Int_t id, UInt_t statusBits,
00163                       const TLorentzVector& initMom,
00164                       const TLorentzVector& finalMom,
00165                       const TVector3& initPos,
00166                       const TVector3& finalPos,
00167                       const char* process)
00168 {
00169     m_mother = mother;
00170     m_particleId = id;
00171     m_statusFlags = statusBits;
00172     m_initialFourMomentum = initMom;
00173     m_finalFourMomentum = finalMom;
00174     m_initialPosition = initPos;
00175     m_finalPosition = finalPos;
00176     m_process = TString(process);
00177     if ( mother == 0 ) return;
00178     if( mother != this) mother->m_daughters.Add(this);
00179 }
00180 
00181 
00182 const McParticle* McParticle::getMother() const {
00183 
00184     return ( (McParticle*)(m_mother.GetObject()) );
00185 }
00186 
00187 const McParticle* McParticle::getDaughter(Int_t index) const {
00188     return ( (McParticle*)m_daughters.At(index) );
00189 }
00190 
00191 
00192 Bool_t McParticle::primaryParticle() const
00193 {
00194   return (m_statusFlags & PRIMARY)==PRIMARY;
00195 }
00196 
00197 
00198 const TVector3& McParticle::getInitialPosition()const
00199 {
00200     return m_initialPosition;
00201 }
00202 
00203 
00204 const TVector3& McParticle::getFinalPosition() const {
00205     return m_finalPosition;
00206 }
00207 
00208     
00209 const TLorentzVector& McParticle::getInitialFourMomentum() const { 
00210     return m_initialFourMomentum; 
00211 }
00212 
00213 const TLorentzVector& McParticle::getFinalFourMomentum() const {
00214     return m_finalFourMomentum;
00215 };
00216 
00217 const TString& McParticle::getProcess() const {
00218     return m_process;
00219 }
00220 

Generated on Tue Dec 11 16:28:53 2007 by doxygen 1.3.3