#include "IParticleDetails.hxx" #include #include #include COMET::IParticleDetails* COMET::IParticleDetails::fThis=NULL; COMET::IParticle COMET::IParticleDetails::fInvalidParticle; COMET::IParticleDetails::IParticleDetails(){ // Setup the particle table AddParticle("geantino" , 0 , NULL , kRed , 1); AddParticle("alpha" , 1000020040 , NULL , kRed , 1); AddParticle("deuteron" , 1000010020 , NULL , kRed , 1); AddParticle("triton" , 1000010030 , NULL , kRed , 1); } void COMET::IParticleDetails::Initialise(){ if(!fThis){ fThis=new COMET::IParticleDetails(); } } const COMET::IParticle* COMET::IParticleDetails::MakeNewParticle( int pdgCode){ const TParticlePDG* rooParticle=TDatabasePDG::Instance()->GetParticle(pdgCode); const COMET::IParticle* particle=NULL; if(rooParticle) { particle=AddParticle(rooParticle->GetName(),pdgCode,rooParticle); } else particle=MakeOrGetDynamicParticle(pdgCode); return particle; } const COMET::IParticle* COMET::IParticleDetails::MakeNewParticle( const std::string& name){ const TParticlePDG* rooParticle=TDatabasePDG::Instance()->GetParticle(name.c_str()); const COMET::IParticle* particle=NULL; if(rooParticle) { particle=AddParticle(name,rooParticle->PdgCode(),rooParticle); } else if(name=="dynamic") particle=MakeOrGetDynamicParticle(); return particle; } const COMET::IParticle* COMET::IParticleDetails::MakeOrGetDynamicParticle(int pdgCode){ if (pdgCodesecond; return AddParticle("dynamic",kDynamicParticle,NULL); } const COMET::IParticle& COMET::IParticleDetails::GetParticle( const std::string& name){ Initialise(); TString lowName=name; lowName.ToLower(); COMETNamedTrace("IParticleDetails",name<<", "<fParticleDetailsMap.begin(); i_particle!=fThis->fParticleDetailsMap.end(); ++i_particle){ COMETNamedTrace("IParticleDetails",std::boolalpha<second->Name()<<"=="<second->Name()==lowName)); if(i_particle->second->Name()==lowName){ return *i_particle->second; } } const COMET::IParticle* particle=fThis->MakeNewParticle(lowName.Data()); if(!particle){ COMETNamedError("IParticleDetails","Unknown particle: "<fParticleDetailsMap.find(pdgCode); const COMET::IParticle* particle=NULL; if(i_particle==fThis->fParticleDetailsMap.end() ) particle=fThis->MakeNewParticle(pdgCode); else particle=i_particle->second; if(!particle){ COMETNamedError("IParticleDetails","Unknown particle PDG Code: "<IsDynamic()) COMETNamedTrace("IParticleDetails",pdgCode<<" => "<Name()); return *particle; } COMET::IParticle* COMET::IParticleDetails::AddParticle( const std::string& name, int pdgCode, const TParticlePDG* rooParticle, int lineColour, int lineStyle){ auto particle=new COMET::IParticle(name,pdgCode,rooParticle); particle->fLineColour=lineColour; particle->fLineStyle=lineStyle; fParticleDetailsMap[pdgCode]=particle; return particle; } COMET::IParticle::IParticle( const std::string& name, int pdgCode, const TParticlePDG* rooParticle ): fParticleName(name), fParticleCode(pdgCode), fLineColour(-1), fLineStyle(-1), fRootParticle(rooParticle), fIsValid(true){ }