EvtDecayTable Class Reference

#include <EvtDecayTable.hh>

List of all members.

Static Public Member Functions

static int getNMode (int ipar)
static EvtDecayBasegetDecay (int ipar, int imode)
static EvtDecayBasegettheDecay (EvtId parent, int imode)
static void readDecayFile (const std::string dec_name)
static int findChannel (EvtId parent, std::string model, int ndaug, EvtId *daugs, int narg, std::string *args)
static int inChannelList (EvtId parent, int ndaug, EvtId *daugs)
static EvtDecayBasegetDecayFunc (EvtParticle *)
static void printSummary ()


Detailed Description

Definition at line 34 of file EvtDecayTable.hh.


Member Function Documentation

int EvtDecayTable::findChannel ( EvtId  parent,
std::string  model,
int  ndaug,
EvtId daugs,
int  narg,
std::string args 
) [static]

Definition at line 740 of file EvtDecayTable.cc.

References decaytable, EvtId::getAlias(), EvtDecayBase::getArgStr(), EvtDecayBase::getDaug(), getDecay(), EvtDecayBase::getModelName(), EvtDecayBase::getNArg(), EvtDecayBase::getNDaug(), genRecEmupikp::i, and ganga-rec::j.

00742                                                           {
00743 
00744    int i,j,right;
00745    EvtId daugs_scratch[50];
00746    int nmatch,k;
00747 
00748    for(i=0;i<decaytable[parent.getAlias()].getNMode();i++){
00749 
00750      right=1;
00751 
00752      right=right&&model==decaytable[parent.getAlias()].
00753                     getDecay(i).getDecayModel()->getModelName();
00754      right=right&&(ndaug==decaytable[parent.getAlias()].
00755              getDecay(i).getDecayModel()->getNDaug());
00756      right=right&&(narg==decaytable[parent.getAlias()].
00757              getDecay(i).getDecayModel()->getNArg());
00758 
00759      if ( right ){
00760 
00761        
00762 
00763        for(j=0;j<ndaug;j++){
00764          daugs_scratch[j]=daugs[j];
00765        }
00766 
00767        nmatch=0;
00768 
00769        for(j=0;j<decaytable[parent.getAlias()].
00770              getDecay(i).getDecayModel()->getNDaug();j++){
00771 
00772          for(k=0;k<ndaug;k++){
00773            if (daugs_scratch[k]==decaytable[parent.getAlias()].
00774                getDecay(i).getDecayModel()->getDaug(j)){
00775              daugs_scratch[k]=EvtId(-1,-1);
00776              nmatch++;
00777              break;
00778            }
00779          }
00780        } 
00781 
00782        right=right&&(nmatch==ndaug);
00783 
00784        for(j=0;j<decaytable[parent.getAlias()].
00785              getDecay(i).getDecayModel()->getNArg();j++){
00786          right=right&&(args[j]==decaytable[parent.getAlias()].
00787                  getDecay(i).getDecayModel()->getArgStr(j));
00788        } 
00789      }
00790      if (right) return i;
00791    }
00792    return -1;
00793 }

static EvtDecayBase* EvtDecayTable::getDecay ( int  ipar,
int  imode 
) [static]

Referenced by findChannel(), inChannelList(), and readDecayFile().

EvtDecayBase * EvtDecayTable::getDecayFunc ( EvtParticle  )  [static]

Definition at line 73 of file EvtDecayTable.cc.

References decaytable, EvtId::getAlias(), EvtParticle::getId(), and getNMode().

Referenced by EvtDDalitz::decay(), EvtBtoKD3P::decay(), EvtParticle::decay(), and EvtParticle::initDecay().

00073                                                        {
00074   int partnum;
00075   
00076   partnum=p->getId().getAlias();
00077 
00078   if ( decaytable[partnum].getNMode()==0 ) return 0;
00079   return decaytable[partnum].getDecayModel(p);
00080 
00081 }

int EvtDecayTable::getNMode ( int  ipar  )  [static]

Definition at line 49 of file EvtDecayTable.cc.

References decaytable.

Referenced by getDecayFunc(), and readDecayFile().

00049                                    {
00050    return decaytable[ipar].getNMode();
00051 } 

EvtDecayBase * EvtDecayTable::gettheDecay ( EvtId  parent,
int  imode 
) [static]

Definition at line 57 of file EvtDecayTable.cc.

References decaytable, and EvtId::getAlias().

Referenced by EvtDecay::getModel().

00057                                                                {
00058   int ipar=parent.getAlias();
00059   EvtDecayBase* thedecaymodel=decaytable[ipar].getDecay(imode).getDecayModel();
00060   return thedecaymodel;
00061 } 

int EvtDecayTable::inChannelList ( EvtId  parent,
int  ndaug,
EvtId daugs 
) [static]

Definition at line 795 of file EvtDecayTable.cc.

References decaytable, EvtId::getAlias(), getDecay(), EvtDecayBase::getNDaug(), genRecEmupikp::i, ganga-rec::j, and MAX_DAUG.

Referenced by EvtTauola::decay(), EvtPythia::decay(), EvtPyGaGa::decay(), EvtPycont::decay(), EvtPhokhara_ppbar::decay(), EvtPhokhara_pipipi0::decay(), EvtPhokhara_pipi::decay(), EvtPhokhara_pi0pi0pipi::decay(), EvtPhokhara_nnbar::decay(), EvtPhokhara_LLB::decay(), EvtPhokhara_KK::decay(), EvtPhokhara_K0K0::decay(), EvtPhokhara_4pi::decay(), EvtPhokhara::decay(), EvtOpenCharm::decay(), EvtLundCharm::decay(), EvtLunda::decay(), EvtJscont::decay(), EvtJetSet::decay(), and EvtConExc::selectMode().

00795                                                                       {
00796 
00797    int i,j,k;
00798    //  std::cout<<"=============MAX_DAUG = "<<MAX_DAUG<<endl;
00799    EvtId daugs_scratch[MAX_DAUG];
00800 
00801    int dsum=0;
00802    for(i=0;i<ndaug;i++){
00803      dsum+=daugs[i].getAlias();
00804    }
00805 
00806    int nmatch;
00807 
00808    int ipar=parent.getAlias();
00809 
00810    int nmode=decaytable[ipar].getNMode();
00811 
00812    for(i=0;i<nmode;i++){
00813 
00814      EvtDecayBase* thedecaymodel=decaytable[ipar].getDecay(i).getDecayModel();
00815 
00816      if (thedecaymodel->getDSum()==dsum){
00817 
00818        int nd=thedecaymodel->getNDaug();
00819 
00820        if (ndaug==nd){
00821          for(j=0;j<ndaug;j++){
00822            daugs_scratch[j]=daugs[j];
00823          }
00824          nmatch=0;
00825          for(j=0;j<nd;j++){
00826            for(k=0;k<ndaug;k++){
00827              if (EvtId(daugs_scratch[k])==thedecaymodel->getDaug(j)){
00828                daugs_scratch[k]=EvtId(-1,-1);
00829                nmatch++;
00830                break;
00831              }
00832            }
00833          } 
00834          if ((nmatch==ndaug)&&
00835              (!
00836               ((thedecaymodel->getModelName()=="JETSET")||
00837                (thedecaymodel->getModelName()=="LUNDCHARM")||
00838                (thedecaymodel->getModelName()=="PYTHIA")))){
00839            return i;
00840          }
00841        }
00842      }
00843    }
00844 
00845    return -1;
00846 }

void EvtDecayTable::printSummary (  )  [static]

Definition at line 63 of file EvtDecayTable.cc.

References decaytable, EvtPDL::entries(), and genRecEmupikp::i.

Referenced by EvtGen::~EvtGen().

00063                                 {
00064 
00065   int i;
00066   
00067   for(i=0;i<EvtPDL::entries();i++){
00068     decaytable[i].printSummary();
00069   }
00070 
00071 }

void EvtDecayTable::readDecayFile ( const std::string  dec_name  )  [static]

Definition at line 83 of file EvtDecayTable.cc.

References EvtPDL::addFactorPn(), EvtPDL::alias(), EvtPDL::aliasChgConj(), EvtCyclic3::c_str(), EvtPDL::changeLS(), EvtPDL::chargeConj(), Bes_Common::DEBUG, decaytable, EvtSymTable::Define(), EvtPDL::entries(), calibUtil::ERROR, EvtPDL::fixLSForSP8(), EvtSymTable::Get(), EvtId::getAlias(), getDecay(), EvtModel::getFcn(), EvtPDL::getId(), EvtParser::getLineofToken(), EvtPDL::getMaxMass(), EvtPDL::getMeanMass(), EvtPDL::getMinMass(), getNMode(), EvtParser::getNToken(), EvtParser::getToken(), EvtPDL::getWidth(), genRecEmupikp::i, EvtPDL::includeBirthFactor(), EvtPDL::includeDecayFactor(), Bes_Common::INFO, EvtModel::instance(), EvtModel::isCommand(), EvtModel::isModel(), MAX_DAUG, EvtPDL::name(), EvtDecayBase::nRealDaughters(), EvtParser::Read(), report(), EvtPDL::reSetBlatt(), EvtPDL::reSetMass(), EvtPDL::reSetMassMax(), EvtPDL::reSetMassMin(), EvtPDL::reSetWidth(), EvtDecayBase::saveDecayInfo(), EvtRadCorr::setAlwaysRadCorr(), EvtRadCorr::setNeverRadCorr(), EvtRadCorr::setNormalRadCorr(), EvtDecayBase::setPHOTOS(), EvtPDL::setPWForDecay(), EvtDecayBase::setSummary(), EvtDecayBase::setVerbose(), EvtModel::storeCommand(), deljobs::string, and subSeperate::temp.

Referenced by EvtGen::EvtGen(), and EvtGen::readUDecay().

00083                                                          {
00084 
00085   if ( decaytable.size() < EvtPDL::entries() ) decaytable.resize(EvtPDL::entries());
00086   EvtModel &modelist=EvtModel::instance();
00087   int i;
00088 
00089   report(INFO,"EvtGen") << "In readDecayFile, reading:"<<dec_name.c_str()<<endl;
00090   
00091   ifstream fin;
00092   
00093   fin.open(dec_name.c_str());
00094   if (!fin) {
00095     report(ERROR,"EvtGen") << "Could not open "<<dec_name.c_str()<<endl;
00096   }
00097   fin.close();
00098 
00099   EvtParser parser;
00100   parser.Read(dec_name);
00101 
00102   int itok;
00103 
00104   int hasend=0;
00105 
00106   std::string token;
00107 
00108   for(itok=0;itok<parser.getNToken();itok++){
00109 
00110     token=parser.getToken(itok);
00111     
00112     if (token=="End") hasend=1;
00113 
00114   }
00115 
00116   if (!hasend){
00117     report(ERROR,"EvtGen") << "Could not find an 'End' in "<<dec_name.c_str()<<endl;
00118     report(ERROR,"EvtGen") << "Will terminate execution."<<endl;
00119     ::abort();
00120   }
00121 
00122 
00123 
00124   std::string model,parent,sdaug;  
00125 
00126   EvtId ipar;
00127 
00128   int n_daugh;
00129   EvtId daught[MAX_DAUG];
00130   double brfr;
00131 
00132   int itoken=0;
00133 
00134   std::vector<EvtModelAlias> modelAliasList;
00135 
00136   
00137   do{
00138 
00139     token=parser.getToken(itoken++);
00140 
00141     //Easy way to turn off photos... Lange September 5, 2000
00142     if (token=="noPhotos"){ 
00143       EvtRadCorr::setNeverRadCorr();
00144       report(INFO,"EvtGen") 
00145         << "As requested, PHOTOS will be turned off."<<endl; 
00146     }
00147     else if (token=="yesPhotos"){ 
00148       EvtRadCorr::setAlwaysRadCorr();
00149       report(INFO,"EvtGen") 
00150         << "As requested, PHOTOS will be turned on."<<endl; 
00151     }
00152     else if (token=="normalPhotos"){ 
00153       EvtRadCorr::setNormalRadCorr();
00154       report(INFO,"EvtGen") 
00155         << "As requested, PHOTOS will be turned on only when requested."<<endl; 
00156     }
00157     else if (token=="Alias"){
00158 
00159       std::string newname;
00160       std::string oldname;
00161 
00162       newname=parser.getToken(itoken++);
00163       oldname=parser.getToken(itoken++);
00164 
00165       EvtId id=EvtPDL::getId(oldname);
00166 
00167       if (id==EvtId(-1,-1)) {
00168         report(ERROR,"EvtGen") <<"Unknown particle name:"<<oldname.c_str()
00169                                <<" on line "<<parser.getLineofToken(itoken)<<endl;
00170         report(ERROR,"EvtGen") <<"Will terminate execution!"<<endl;
00171         ::abort();
00172       }
00173 
00174       EvtPDL::alias(id,newname);
00175       if ( decaytable.size() < EvtPDL::entries() ) decaytable.resize(EvtPDL::entries());
00176 
00177     } else if (token=="ModelAlias"){
00178       std::vector<std::string> modelArgList;
00179 
00180       std::string aliasName=parser.getToken(itoken++);
00181       std::string modelName=parser.getToken(itoken++);
00182 
00183       std::string nameTemp;
00184       do{
00185         nameTemp=parser.getToken(itoken++);
00186         if (nameTemp!=";") {
00187           modelArgList.push_back(nameTemp);
00188         }
00189       }while(nameTemp!=";");
00190       EvtModelAlias newAlias(aliasName,modelName,modelArgList);
00191       modelAliasList.push_back(newAlias);
00192     } else if (token=="ChargeConj"){
00193 
00194       std::string aname;
00195       std::string abarname;
00196 
00197       aname=parser.getToken(itoken++);
00198       abarname=parser.getToken(itoken++);
00199 
00200       EvtId a=EvtPDL::getId(aname);
00201       EvtId abar=EvtPDL::getId(abarname);
00202 
00203       if (a==EvtId(-1,-1)) {
00204         report(ERROR,"EvtGen") <<"Unknown particle name:"<<aname.c_str()
00205                                <<" on line "<<parser.getLineofToken(itoken)<<endl;
00206         report(ERROR,"EvtGen") <<"Will terminate execution!"<<endl;
00207         ::abort();
00208       }
00209 
00210       if (abar==EvtId(-1,-1)) {
00211         report(ERROR,"EvtGen") <<"Unknown particle name:"<<abarname.c_str()
00212                                <<" on line "<<parser.getLineofToken(itoken)<<endl;
00213         report(ERROR,"EvtGen") <<"Will terminate execution!"<<endl;
00214         ::abort();
00215       }
00216 
00217 
00218       EvtPDL::aliasChgConj(a,abar);
00219 
00220     } else if (modelist.isCommand(token)){
00221 
00222       std::string cnfgstr;
00223 
00224       cnfgstr=parser.getToken(itoken++);
00225 
00226       modelist.storeCommand(token,cnfgstr);
00227 
00228     } else if (token=="CDecay"){
00229 
00230       std::string name;
00231 
00232       name=parser.getToken(itoken++);
00233       ipar=EvtPDL::getId(name);
00234 
00235       if (ipar==EvtId(-1,-1)) {
00236         report(ERROR,"EvtGen") <<"Unknown particle name:"<<name.c_str()
00237                                <<" on line "
00238                                <<parser.getLineofToken(itoken-1)<<endl;
00239         report(ERROR,"EvtGen") <<"Will terminate execution!"<<endl;
00240         ::abort();
00241       }
00242 
00243       EvtId cipar=EvtPDL::chargeConj(ipar);
00244 
00245       if (decaytable[ipar.getAlias()].getNMode()!=0) {
00246 
00247         report(DEBUG,"EvtGen") << 
00248           "Redefined decay of "<<name.c_str()<<" in CDecay"<<endl;
00249 
00250         decaytable[ipar.getAlias()].removeDecay();
00251       }
00252 
00253       //take contents of cipar and conjugate and store in ipar
00254       decaytable[ipar.getAlias()].makeChargeConj(&decaytable[cipar.getAlias()]);
00255 
00256     } else if (token=="Define"){
00257 
00258       std::string name;
00259 
00260       name=parser.getToken(itoken++);
00261       //      value=atof(parser.getToken(itoken++).c_str());
00262 
00263       EvtSymTable::Define(name,parser.getToken(itoken++));
00264 
00265       //New code Lange April 10, 2001 - allow the user
00266       //to change particle definitions of EXISTING
00267       //particles on the fly
00268     } else if (token=="Particle"){
00269 
00270       std::string pname;
00271       pname=parser.getToken(itoken++);
00272       report(INFO,"EvtGen") << pname.c_str() << endl;
00273       //There should be at least the mass 
00274       double newMass=atof(parser.getToken(itoken++).c_str());
00275       EvtId thisPart = EvtPDL::getId(pname);
00276       double newWidth=EvtPDL::getMeanMass(thisPart);
00277       if ( parser.getNToken() > 3 ) newWidth=atof(parser.getToken(itoken++).c_str());
00278 
00279       //Now make the change!
00280       EvtPDL::reSetMass(thisPart, newMass);
00281       EvtPDL::reSetWidth(thisPart, newWidth);
00282 
00283       report(INFO,"EvtGen") << "Changing particle properties of " <<
00284         pname.c_str() << " Mass=" << newMass << " Width="<<newWidth<<endl;
00285 
00286     } else if ( token=="ChangeMassMin") {
00287       std::string pname;
00288       pname=parser.getToken(itoken++);
00289       double tmass=atof(parser.getToken(itoken++).c_str());
00290 
00291       EvtId thisPart = EvtPDL::getId(pname);
00292       EvtPDL::reSetMassMin(thisPart,tmass);
00293       report(DEBUG,"EvtGen") <<"Refined minimum mass for " << EvtPDL::name(thisPart).c_str() << " to be " << tmass << endl;
00294 
00295     } else if ( token=="ChangeMassMax") {
00296       std::string pname;
00297       pname=parser.getToken(itoken++);
00298       double tmass=atof(parser.getToken(itoken++).c_str());
00299       EvtId thisPart = EvtPDL::getId(pname);
00300       EvtPDL::reSetMassMax(thisPart,tmass);
00301       report(DEBUG,"EvtGen") <<"Refined maximum mass for " << EvtPDL::name(thisPart).c_str() << " to be " << tmass << endl;
00302 
00303     } else if ( token=="IncludeBirthFactor") {
00304       std::string pname;
00305       pname=parser.getToken(itoken++);
00306       bool yesno=false;
00307       if ( parser.getToken(itoken++).c_str()=="yes") yesno=true;
00308       EvtId thisPart = EvtPDL::getId(pname);
00309       EvtPDL::includeBirthFactor(thisPart,yesno);
00310       if ( yesno ) report(DEBUG,"EvtGen") <<"Include birth factor for " << EvtPDL::name(thisPart).c_str() <<endl;
00311       if ( !yesno ) report(DEBUG,"EvtGen") <<"No longer include birth factor for " << EvtPDL::name(thisPart).c_str() <<endl;
00312      
00313 
00314     } else if ( token=="IncludeDecayFactor") {
00315       std::string pname;
00316       pname=parser.getToken(itoken++);
00317       bool yesno=false;
00318       if ( parser.getToken(itoken++).c_str()=="yes") yesno=true;
00319       EvtId thisPart = EvtPDL::getId(pname);
00320       EvtPDL::includeDecayFactor(thisPart,yesno);
00321       if ( yesno ) report(DEBUG,"EvtGen") <<"Include decay factor for " << EvtPDL::name(thisPart).c_str() <<endl;
00322       if ( !yesno ) report(DEBUG,"EvtGen") <<"No longer include decay factor for " << EvtPDL::name(thisPart).c_str() <<endl;
00323 
00324     }else if ( token=="AddFactorPn") {
00325       std::string pname;
00326       pname=parser.getToken(itoken++);
00327       double factor=atof(parser.getToken(itoken++).c_str());
00328       EvtId thisPart = EvtPDL::getId(pname);
00329       EvtPDL::addFactorPn(thisPart,factor);
00330       report(DEBUG,"EvtGen") <<"Include momentum factor Pn= "<<factor <<"  for " << EvtPDL::name(thisPart).c_str() <<endl;
00331     }else if ( token=="LSNONRELBW") {
00332       std::string pname;
00333       pname=parser.getToken(itoken++);
00334       EvtId thisPart = EvtPDL::getId(pname);
00335       std::string tstr="NONRELBW";
00336       EvtPDL::changeLS(thisPart,tstr);
00337       report(DEBUG,"EvtGen") <<"Change lineshape to non-rel BW for " << EvtPDL::name(thisPart).c_str() <<endl;
00338     } else if ( token=="SP6LSFIX") {
00339       std::string pname;
00340       pname=parser.getToken(itoken++);
00341       EvtId thisPart = EvtPDL::getId(pname);
00342       EvtPDL::fixLSForSP8(thisPart);
00343       report(DEBUG,"EvtGen") <<"Fixed lineshape for SP6 --from M.Baak " << EvtPDL::name(thisPart).c_str() <<endl;
00344 
00345     } else if ( token=="LSFLAT") {
00346       std::string pname;
00347       pname=parser.getToken(itoken++);
00348       EvtId thisPart = EvtPDL::getId(pname);
00349       std::string tstr="FLAT";
00350       EvtPDL::changeLS(thisPart,tstr);
00351       report(DEBUG,"EvtGen") <<"Change lineshape to flat for " << EvtPDL::name(thisPart).c_str() <<endl;
00352     } else if ( token=="LSMANYDELTAFUNC") {
00353       std::string pname;
00354       pname=parser.getToken(itoken++);
00355       EvtId thisPart = EvtPDL::getId(pname);
00356       std::string tstr="MANYDELTAFUNC";
00357       EvtPDL::changeLS(thisPart,tstr);
00358       report(DEBUG,"EvtGen") <<"Change lineshape to spikes for " << EvtPDL::name(thisPart).c_str() <<endl;
00359 
00360     } else if ( token=="BlattWeisskopf") {
00361       std::string pname;
00362       pname=parser.getToken(itoken++);
00363       double tnum=atof(parser.getToken(itoken++).c_str());
00364       EvtId thisPart = EvtPDL::getId(pname);
00365       EvtPDL::reSetBlatt(thisPart,tnum);
00366       report(DEBUG,"EvtGen") <<"Redefined Blatt-Weisskopf factor " << EvtPDL::name(thisPart).c_str() << " to be " << tnum << endl;
00367     } else if ( token=="SetLineshapePW") {
00368       std::string pname;
00369       pname=parser.getToken(itoken++);
00370       EvtId thisPart = EvtPDL::getId(pname);
00371       std::string pnameD1=parser.getToken(itoken++);
00372       EvtId thisD1 = EvtPDL::getId(pnameD1);
00373       std::string pnameD2=parser.getToken(itoken++);
00374       EvtId thisD2 = EvtPDL::getId(pnameD2);
00375       int pw=atoi(parser.getToken(itoken++).c_str());
00376       report(DEBUG,"EvtGen") <<"Redefined Partial wave for " << pname.c_str() << " to " << pnameD1.c_str() << " " << pnameD2.c_str() << " ("<<pw<<")"<<endl;
00377       EvtPDL::setPWForDecay(thisPart,pw,thisD1,thisD2);
00378 
00379     } else if (token=="Decay") {
00380 
00381       std::string temp_fcn_new_model;
00382 
00383       EvtDecayBase* temp_fcn_new;
00384       
00385       double brfrsum=0.0;
00386 
00387   
00388 
00389       parent=parser.getToken(itoken++);
00390       ipar=EvtPDL::getId(parent);
00391 
00392       if (ipar==EvtId(-1,-1)) {
00393         report(ERROR,"EvtGen") <<"Unknown particle name:"<<parent.c_str()
00394                                <<" on line "
00395                                <<parser.getLineofToken(itoken-1)<<endl;
00396         report(ERROR,"EvtGen") <<"Will terminate execution!"<<endl;
00397         ::abort();
00398       }
00399 
00400       if (decaytable[ipar.getAlias()].getNMode()!=0) {
00401         report(DEBUG,"EvtGen") <<"Redefined decay of "
00402                                <<parent.c_str()<<endl;
00403         decaytable[ipar.getAlias()].removeDecay();
00404       }
00405 
00406 
00407       do{
00408 
00409         token=parser.getToken(itoken++);
00410 
00411         if (token!="Enddecay"){
00412 
00413           i=0;
00414           while (token.c_str()[i++]!=0){
00415             if (isalpha(token.c_str()[i])){
00416               report(ERROR,"EvtGen") << 
00417                 "Expected to find a branching fraction or Enddecay "<<
00418                 "but found:"<<token.c_str()<<" on line "<<
00419                 parser.getLineofToken(itoken-1)<<endl;
00420               report(ERROR,"EvtGen") << "Possibly to few arguments to model "<<
00421                 "on previous line!"<<endl;
00422               report(ERROR,"EvtGen") << "Will terminate execution!"<<endl;
00423               ::abort();
00424             }
00425           }
00426           
00427           brfr=atof(token.c_str());
00428 
00429           int isname=EvtPDL::getId(parser.getToken(itoken)).getId()>=0;
00430           int ismodel=modelist.isModel(parser.getToken(itoken));
00431 
00432           if (!(isname||ismodel)){
00433             //see if this is an aliased model
00434             int iAlias;
00435             for(iAlias=0;iAlias<modelAliasList.size();iAlias++){
00436               if ( modelAliasList[iAlias].matchAlias(parser.getToken(itoken)) ) {
00437                 ismodel=2;
00438                 break;
00439               }
00440             }
00441           }
00442 
00443           if (!(isname||ismodel)){
00444 
00445             report(INFO,"EvtGen") << parser.getToken(itoken).c_str()
00446              << " is neither a particle name nor "
00447              << "the name of a model. "<<endl;
00448             report(INFO,"EvtGen") << "It was encountered on line "<<
00449               parser.getLineofToken(itoken)<<" of the decay file."<<endl;
00450             report(INFO,"EvtGen") << "Please fix it. Thank you."<<endl;
00451             report(INFO,"EvtGen") << "Be sure to check that the "
00452              << "correct case has been used. \n";
00453             report(INFO,"EvtGen") << "Terminating execution. \n";
00454             ::abort();
00455 
00456             itoken++;
00457           }
00458 
00459           n_daugh=0;
00460 
00461           while(EvtPDL::getId(parser.getToken(itoken)).getId()>=0){
00462             sdaug=parser.getToken(itoken++);
00463             daught[n_daugh++]=EvtPDL::getId(sdaug);
00464             if (daught[n_daugh-1]==EvtId(-1,-1)) {
00465               report(ERROR,"EvtGen") <<"Unknown particle name:"<<sdaug.c_str()
00466                                      <<" on line "<<parser.getLineofToken(itoken)<<endl;
00467               report(ERROR,"EvtGen") <<"Will terminate execution!"<<endl;
00468               ::abort();
00469             }
00470           }
00471 
00472           
00473           model=parser.getToken(itoken++);
00474 
00475 
00476           int photos=0;
00477           int verbose=0;
00478           int summary=0;
00479           
00480           do{
00481             if (model=="PHOTOS"){
00482               photos=1;
00483               model=parser.getToken(itoken++);
00484             }
00485             if (model=="VERBOSE"){
00486               verbose=1;
00487               model=parser.getToken(itoken++);
00488             }
00489             if (model=="SUMMARY"){
00490               summary=1;
00491               model=parser.getToken(itoken++);
00492             }
00493           }while(model=="PHOTOS"||
00494                  model=="VERBOSE"||
00495                  model=="SUMMARY");
00496 
00497           //see if this is an aliased model
00498           int iAlias;
00499           int foundAnAlias=-1;
00500           for(iAlias=0;iAlias<modelAliasList.size();iAlias++){
00501             if ( modelAliasList[iAlias].matchAlias(model) ) {
00502               foundAnAlias=iAlias;
00503               break;
00504             }
00505           }
00506 
00507           if ( foundAnAlias==-1 ) {
00508             if(!modelist.isModel(model)){
00509               report(ERROR,"EvtGen") << 
00510                 "Expected to find a model name,"<<
00511                 "found:"<<model.c_str()<<" on line "<<
00512                 parser.getLineofToken(itoken)<<endl;
00513               report(ERROR,"EvtGen") << "Will terminate execution!"<<endl;
00514               ::abort();
00515             }
00516           }
00517           else{
00518             model=modelAliasList[foundAnAlias].getName();
00519           }
00520 
00521           temp_fcn_new_model=model;
00522           temp_fcn_new=modelist.getFcn(model);
00523 
00524 
00525           if (photos){
00526             temp_fcn_new->setPHOTOS();
00527           }
00528           if (verbose){
00529             temp_fcn_new->setVerbose();
00530           }
00531           if (summary){
00532             temp_fcn_new->setSummary();
00533           }
00534           
00535 
00536           std::vector<std::string> temp_fcn_new_args;
00537 
00538           std::string name;
00539           int ierr;
00540 
00541           if ( foundAnAlias==-1 ) {
00542             do{
00543               name=parser.getToken(itoken++);
00544               if (name!=";") {
00545                 temp_fcn_new_args.push_back(EvtSymTable::Get(name,ierr));
00546                 if (ierr) {
00547                   report(ERROR,"EvtGen")
00548                     <<"Reading arguments and found:"<<
00549                     name.c_str()<<" on line:"<<
00550                     parser.getLineofToken(itoken-1)<<endl;
00551                   report(ERROR,"EvtGen") 
00552                     << "Will terminate execution!"<<endl;
00553                   ::abort();
00554                 }
00555               }
00556               //int isname=EvtPDL::getId(name).getId()>=0;
00557               int ismodel=modelist.isModel(name);
00558               if (ismodel) {
00559                 report(ERROR,"EvtGen")
00560                   <<"Expected ';' but found:"<<
00561                   name.c_str()<<" on line:"<<
00562                   parser.getLineofToken(itoken-1)<<endl;
00563                 report(ERROR,"EvtGen") 
00564                   << "Most probable error is omitted ';'."<<endl;
00565                 report(ERROR,"EvtGen") 
00566                   << "Will terminate execution!"<<endl;
00567                 ::abort();
00568               }
00569             }while(name!=";");
00570           }
00571           else{
00572             std::vector<std::string> copyMe=modelAliasList[foundAnAlias].getArgList();
00573             temp_fcn_new_args=copyMe;
00574             itoken++;
00575           }
00576           //Found one decay.
00577 
00578           brfrsum+=brfr;
00579 
00580           temp_fcn_new->saveDecayInfo(ipar,n_daugh,
00581                                       daught,
00582                                       temp_fcn_new_args.size(),
00583                                       temp_fcn_new_args,
00584                                       temp_fcn_new_model,
00585                                       brfr);
00586 
00587           double massmin=0.0;
00588 
00589           //          for (i=0;i<n_daugh;i++){
00590           for (i=0;i<temp_fcn_new->nRealDaughters();i++){
00591             if ( EvtPDL::getMinMass(daught[i])>0.0001 ){
00592               massmin+=EvtPDL::getMinMass(daught[i]);
00593             } else {
00594               massmin+=EvtPDL::getMeanMass(daught[i]);
00595             }  
00596           } 
00597           
00598           decaytable[ipar.getAlias()].addMode(temp_fcn_new,brfrsum,massmin);
00599           
00600 
00601         }
00602       } while(token!="Enddecay");      
00603 
00604       decaytable[ipar.getAlias()].finalize();
00605 
00606     }
00607     // Allow copying of decays from one particle to another; useful
00608     // in combination with RemoveDecay
00609     else if (token=="CopyDecay") {
00610       std::string newname;
00611       std::string oldname;
00612       
00613       newname=parser.getToken(itoken++);
00614       oldname=parser.getToken(itoken++);
00615       
00616       EvtId newipar=EvtPDL::getId(newname);
00617       EvtId oldipar=EvtPDL::getId(oldname);
00618       
00619       if (oldipar==EvtId(-1,-1)) {
00620         report(ERROR,"EvtGen") <<"Unknown particle name:"<<oldname.c_str()
00621                                <<" on line "<<parser.getLineofToken(itoken)<<endl;
00622         report(ERROR,"EvtGen") <<"Will terminate execution!"<<endl;
00623         ::abort();
00624       }
00625       if (newipar==EvtId(-1,-1)) {
00626         report(ERROR,"EvtGen") <<"Unknown particle name:"<<newname.c_str()
00627                                <<" on line "<<parser.getLineofToken(itoken)<<endl;
00628         report(ERROR,"EvtGen") <<"Will terminate execution!"<<endl;
00629         ::abort();
00630       }
00631       if (decaytable[newipar.getAlias()].getNMode()!=0) {
00632         report(DEBUG,"EvtGen") <<"Redefining decay of "
00633                                <<newname<<endl;
00634         decaytable[newipar.getAlias()].removeDecay();
00635       }
00636       decaytable[newipar.getAlias()] = decaytable[oldipar.getAlias()];
00637     }
00638     // Enable decay deletion; intended primarily for aliases
00639     // Peter Onyisi, March 2008
00640     else if (token=="RemoveDecay") {
00641       parent = parser.getToken(itoken++);
00642       ipar = EvtPDL::getId(parent);
00643       
00644       if (ipar==EvtId(-1,-1)) {
00645         report(ERROR,"EvtGen") <<"Unknown particle name:"<<parent.c_str()
00646                                <<" on line "
00647                                <<parser.getLineofToken(itoken-1)<<endl;
00648         report(ERROR,"EvtGen") <<"Will terminate execution!"<<endl;
00649         ::abort();
00650       }
00651        
00652       if (decaytable[ipar.getAlias()].getNMode()==0) {
00653         report(DEBUG,"EvtGen") << "No decays to delete for "
00654                                << parent.c_str() << endl;
00655       } else {
00656         report(DEBUG,"EvtGen") <<"Deleting selected decays of "
00657                                <<parent.c_str()<<endl;
00658       }
00659       
00660       do {
00661         token = parser.getToken(itoken);
00662         
00663         if (token != "Enddecay") {
00664           n_daugh = 0;
00665           while (EvtPDL::getId(parser.getToken(itoken)).getId() >= 0) {
00666             sdaug = parser.getToken(itoken++);
00667             daught[n_daugh++] = EvtPDL::getId(sdaug);
00668             if (daught[n_daugh-1]==EvtId(-1,-1)) {
00669               report(ERROR,"EvtGen") <<"Unknown particle name:"<<sdaug.c_str()
00670                                      <<" on line "<<parser.getLineofToken(itoken)<<endl;
00671               report(ERROR,"EvtGen") <<"Will terminate execution!"<<endl;
00672               ::abort();
00673             }
00674           }
00675           token = parser.getToken(itoken);
00676           if (token != ";") {
00677             report(ERROR,"EvtGen")
00678               <<"Expected ';' but found:"<<
00679               token <<" on line:"<<
00680               parser.getLineofToken(itoken-1)<<endl;
00681             report(ERROR,"EvtGen") 
00682               << "Most probable error is omitted ';'."<<endl;
00683             report(ERROR,"EvtGen") 
00684               << "Will terminate execution!"<<endl;
00685             ::abort();
00686           }
00687           token = parser.getToken(itoken++);
00688           EvtDecayBase* temp_fcn_new = modelist.getFcn("PHSP");
00689           std::vector<std::string> temp_fcn_new_args;
00690           std::string temp_fcn_new_model("PHSP");
00691           temp_fcn_new->saveDecayInfo(ipar, n_daugh,
00692                                       daught,
00693                                       0,
00694                                       temp_fcn_new_args,
00695                                       temp_fcn_new_model,
00696                                       0.);
00697           decaytable[ipar.getAlias()].removeMode(temp_fcn_new);
00698         }
00699       } while (token != "Enddecay");
00700       itoken++;
00701     }
00702     else if (token!="End"){
00703 
00704       report(ERROR,"EvtGen") << "Found unknown command:'"<<token.c_str()<<"' on line "
00705                              <<parser.getLineofToken(itoken)<<endl;
00706       report(ERROR,"EvtGen") << "Will terminate execution!"<<endl;
00707       ::abort();
00708 
00709     }
00710 
00711   } while ((token!="End")&&itoken!=parser.getNToken());
00712 
00713   //Now we may need to reset the minimum mass for some particles????
00714 
00715   int ii;
00716   for ( ii=0; ii<EvtPDL::entries(); ii++){
00717     EvtId temp(ii,ii);
00718     int nModTot=getNMode(ii);
00719     //no decay modes
00720     if ( nModTot == 0 ) continue;
00721     //0 width?
00722     if ( EvtPDL::getWidth(temp) < 0.0000001 ) continue;
00723     int jj;
00724     double minMass=EvtPDL::getMaxMass(temp);
00725     for (jj=0; jj<nModTot; jj++) {
00726       double tmass=decaytable[ii].getDecay(jj).getMassMin();
00727       if ( tmass< minMass) minMass=tmass;
00728     }
00729     if ( minMass > EvtPDL::getMinMass(temp) ) {
00730       
00731       report(INFO,"EvtGen") << "Given allowed decays, resetting minMass " << EvtPDL::name(temp).c_str() << " " 
00732            << EvtPDL::getMinMass(temp) << " to " << minMass << endl;
00733       EvtPDL::reSetMassMin(temp,minMass);
00734     }
00735   }
00736 
00737 
00738 }


Generated on Tue Nov 29 23:18:58 2016 for BOSS_7.0.2 by  doxygen 1.4.7