00001
00002
00003
00004
00005
00006
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>
00022
00023
00024
00025
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
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
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) {
00067
00068 dr = new Decayer(decayerName);
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();
00108 }
00109 void PDT::addDecayer(Decayer* aDecayer)
00110 {
00111
00112
00113
00114
00115
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
00129
00130
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
00140
00141 addInteractor(new Interactor(name));
00142
00143 }
00144 void PDT::addInteractor(Interactor* anInteractor)
00145 {
00146
00147
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
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
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