00001
00002
00003
00004
00005
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
00024
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
00035
00036
00037 McParticle *curRef;
00038 Int_t iPart;
00039 for (iPart = 0; iPart < p.m_daughters.GetEntries(); iPart++) {
00040
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
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
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
00125
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