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

PDT.cxx

Go to the documentation of this file.
00001 //   $Id: PDT.cxx,v 1.2 2000/01/17 23:37:31 burnett Exp $
00002 //
00003 // This file is part of Gismo 2
00004 
00005 //
00006 //   implement the PDT class
00007 
00008 #include "gismo/PDT.h"
00009 
00010 
00011 #include "DecayEntry.h"
00012 #include "PDTEntry.h"
00013 #include "AntiPData.h"
00014 
00015 #include "gismo/Units.h"
00016 #include "facilities/error.h"
00017 
00018 #include <strstream>
00019 #include <iostream>
00020 
00021 #include <algorithm> // for find
00022 
00023 
00024 
00025 // ----------------------- PDT implementation ------------------------
00026 
00027 void PDT::addDecay(const char* pname, float bf, const char * decayerName,
00028             const char* child1, const char* child2, const char* child3,
00029             const char* child4, const char* child5)
00030 {
00031    PData* primary = lookUp(pname);
00032         if (primary == 0) return;
00033 
00034    const char *kids[5] = {child1, child2, child3, child4, child5};
00035 
00036    PData *children[5] = { 0, 0, 0, 0, 0};
00037 
00038    for( int nkids=0; nkids<5; nkids++ )
00039    {    PData* secondary = lookUp(kids[nkids]);
00040         if( secondary ==0 ) break;
00041         children[nkids] = secondary;
00042    }
00043 
00044     DecayEntry* de = new DecayEntry(bf, children);
00045 
00046     // link into list of decays for this particle/anti particle
00047     PDTEntry* data = primary->theData;
00048     de->next = data->decayInfo;
00049 
00050     data->sumBR += bf;
00051     data->decayInfo = de;
00052 
00053     Decayer * dr;
00054     int found=0;
00055 
00056     // look for the decayer
00057 
00058     for( Decayer_list::iterator dit=decayers.begin();
00059             dit < decayers.end(); ++dit) {
00060         dr = *dit;
00061         if (strcmp(dr->name(),decayerName)==0) {
00062             found=1;
00063             break;
00064         }
00065     }
00066     if (!found)   {   // not found: create, add the list
00067 
00068         dr = new Decayer(decayerName);   // define the default
00069         decayers.push_back(dr);
00070     }
00071     de->decayer = dr;
00072 
00073 }
00074 PDT::~PDT()
00075 {
00076     Decayer_list::iterator dit = decayers.begin();
00077     while( dit != decayers.end() )
00078         delete *dit++;
00079 
00080     Interactor_list::iterator iit = interactors.begin();
00081     while( iit != interactors.end() )   
00082         delete *iit++;
00083 
00084     PData_list::iterator pit = particles.begin();
00085     while( pit != particles.end() )
00086         delete *pit++;
00087 
00088 }
00089 
00090 PData * PDT::getParticleAt(unsigned i)const
00091 {
00092     return particles[i];
00093 }
00094 
00095 unsigned PDT::getIndexOf(PData* look)
00096 {
00097     return std::find(particles.begin(), particles.end(), look)-particles.begin();
00098 }
00099 
00100 unsigned PDT::getIndexOf(long id)
00101 {
00102     for( PData_list::iterator pit= particles.begin(); pit < particles.end(); ++pit )    {
00103         PData* pd = *pit;
00104         if( id == pd->idCode() ) return pit-particles.begin();
00105     }
00106     WARNING("PDT: search for id unsuccessful");
00107     return count();  // sort of an error?
00108 }
00109 void PDT::addDecayer(Decayer* aDecayer)
00110 {
00111 
00112     // if an entry with the same name already exists, set its
00113     // replacement field
00114 
00115     // look for the decayer
00116     for( Decayer_list::iterator dit = decayers.begin(); dit<decayers.end(); ++dit){
00117         Decayer *dr = *dit;
00118         if (strcmp(dr->name(),aDecayer->name())==0)      {
00119             dr->replacement = aDecayer;
00120             break;
00121         }
00122     }
00123     decayers.push_back(aDecayer);
00124 }
00125 
00126 void PDT::setInteraction(const char * name)
00127 {
00128     // Use while defining particle table to specify interaction type
00129 
00130     // first see if interactor with same name already exists
00131 
00132     for( Interactor_list::iterator it=interactors.begin(); it<interactors.end(); ++it){
00133         Interactor* i = *it;
00134         if( strcmp(i->name(), name)==0 ) {
00135             type  = i;
00136             return;
00137         }
00138     }
00139     // a new interaction: define it with default, so it may be replaced
00140     // by user later
00141     addInteractor(new Interactor(name));
00142 
00143 }
00144 void PDT::addInteractor(Interactor* anInteractor)
00145 {
00146     // if an entry with the same name already exists, set its
00147     // replacement field
00148 
00149     for( Interactor_list::iterator it=interactors.begin(); it<interactors.end(); ++it){
00150         Interactor* i = *it;
00151         if( strcmp(i->name(), anInteractor->name())==0 ){
00152             i->replacement = anInteractor;
00153             break;
00154         }
00155     }
00156     interactors.push_back(anInteractor);
00157 
00158     // set pointer to be used for subsequent particle definitions
00159     type = anInteractor;
00160 
00161 }
00162 
00163 PData* PDT::addParticle(const char* pname, const char* aname,long id,
00164         int spin,int charge, float mass,float width)
00165 {
00166     PDTEntry * data = new PDTEntry(id, spin, charge, mass,width);
00167     PData * pd = new PData(pname, data);
00168     data->intobject = type;
00169     particles.push_back(pd);
00170     particles.push_back(new AntiPData(aname,pd));
00171     return pd;
00172 }
00173 
00174 PData*  PDT::addParticle(const char* pname, long id,
00175         int spin, int charge, float mass,float width)
00176 {
00177     PDTEntry * data = new PDTEntry(id,spin,charge,mass,width);
00178     data->intobject = type;
00179     PData * pd = new PData(pname,data);
00180     particles.push_back(pd);
00181     return pd;
00182 }
00183 
00184 PData* PDT::lookUp(const char * name)
00185 {
00186     if (name == 0)   return 0;
00187     if (*name=='\0') return 0;
00188 
00189     for(PData_list::iterator pit=particles.begin(); pit<particles.end(); ++pit){
00190         if( strcmp((*pit)->name(),name)==0 ) return *pit;
00191 
00192         if( strcmp(name,"unknown")==0 )
00193             return addParticle((char*)name,0L,0,0,0.,0.);
00194 
00195         if( strcmp(name,"decay list")==0 ) {
00196             printOn(std::cout);
00197             return 0;
00198         }
00199     }
00200     return 0;
00201 }
00202 
00203 PData* PDT::lookUp(long id)const
00204 {
00205     // look for the particle by Particle Data Group id
00206 
00207     for(PData_list::const_iterator pit=particles.begin(); pit<particles.end(); ++pit){
00208         if ((*pit)->idCode() == id) return *pit;
00209     }
00210     return 0;
00211 }
00212 
00213 
00214 void PDT::printOn(std::ostream& cout) const
00215 {
00216     int i;
00217     cout << '\n'; for (i=0;i<72;i++)cout << '-'; cout<<'\n';
00218 
00219     cout << "                 The GISMO Particle Data Table\n";
00220     for (i=0;i<72;i++)cout << '-'; cout<<'\n';
00221 
00222     cout << "                                      -------- decays ---------\n";
00223     cout << "   id  name     mass     width        fraction  type   products";
00224     cout <<'\n'; for ( i=0;i<72;i++)cout << '-';
00225 
00226     for(PData_list::const_iterator pit=particles.begin(); pit<particles.end(); ++pit){
00227         (*pit)->printOn(cout);
00228     }
00229     cout << '\n'; for ( i=0;i<72;i++)cout << '-';
00230     cout << '\n';
00231 }
00232 
00233 
00234 

Generated at Mon Nov 26 18:18:33 2001 by doxygen1.2.3 written by Dimitri van Heesch, © 1997-2000