1 //--------------------------------------------------------------------------
4 // This software is part of the EvtGen package developed jointly
5 // for the BaBar and CLEO collaborations. If you use all or part
6 // of it, please give an appropriate acknowledgement.
8 // Copyright Information: See EvtGen/COPYRIGHT
9 // Copyright (C) 1998 Caltech, UCSB
13 // Description: routines to store particle properties in EvtPDL structure.
15 // Modification history:
17 // DJL/RYD September 25, 1996 Module created
19 //------------------------------------------------------------------------
21 #include "EvtGenBase/EvtPatches.hh"
27 #include "EvtGenBase/EvtPDL.hh"
28 #include "EvtGenBase/EvtPartProp.hh"
29 #include "EvtGenBase/EvtId.hh"
30 #include "EvtGenBase/EvtParticle.hh"
31 #include "EvtGenBase/EvtReport.hh"
38 unsigned int EvtPDL::_firstAlias;
39 int EvtPDL::_nentries;
41 std::map<std::string,int> EvtPDL::_particleNameLookup;
58 void EvtPDL::read(const char* fname)
63 void EvtPDL::readPDT(const std::string fname){
68 indec.open(fname.c_str());
85 report(ERROR,"EvtGen") << "Could not open:"<<fname.c_str()<<"EvtPDL"<<endl;
96 if (ch=='\n') indec.get(ch);
101 while (indec.get(ch1),ch1!='\n');
107 if (strcmp(cmnd,"end")){
109 if (!strcmp(cmnd,"add")){
124 i=EvtId(_nentries,_nentries);
128 tmp.setSpinType(EvtSpinType::SCALAR);
131 if (spin2==0) tmp.setSpinType(EvtSpinType::SCALAR);
132 if (spin2==1) tmp.setSpinType(EvtSpinType::DIRAC);
133 if (spin2==2) tmp.setSpinType(EvtSpinType::VECTOR);
134 if (spin2==3) tmp.setSpinType(EvtSpinType::RARITASCHWINGER);
135 if (spin2==4) tmp.setSpinType(EvtSpinType::TENSOR);
136 if (spin2==5) tmp.setSpinType(EvtSpinType::SPIN5HALF);
137 if (spin2==6) tmp.setSpinType(EvtSpinType::SPIN3);
138 if (spin2==7) tmp.setSpinType(EvtSpinType::SPIN7HALF);
139 if (spin2==8) tmp.setSpinType(EvtSpinType::SPIN4);
140 if (spin2==2 && mass < 0.0001 ) tmp.setSpinType(EvtSpinType::PHOTON);
141 if (spin2==1 && mass < 0.0001 ) tmp.setSpinType(EvtSpinType::NEUTRINO);
144 if (!strcmp(pname,"string")){
145 tmp.setSpinType(EvtSpinType::STRING);
148 if (!strcmp(pname,"vpho")){
149 tmp.setSpinType(EvtSpinType::VECTOR);
154 tmp.setIdChgConj(EvtId(-1,-1));
155 tmp.setStdHep(stdhepid);
156 tmp.setLundKC(lundkc);
158 if (_particleNameLookup.find(std::string(pname))!=
159 _particleNameLookup.end()) {
160 report(ERROR,"EvtGen")<<"The particle name:"<<pname<<" is already defined."<<endl;
161 report(ERROR,"EvtGen") << "Will terminate execution.";
164 _particleNameLookup[std::string(pname)]=_nentries;
168 tmp.initLineShape(mass,pwidth,pmaxwidth);
171 partlist().push_back(tmp);
176 // if find a set read information and discard it
178 if (!strcmp(cmnd,"set")){
188 }while(strcmp(cmnd,"end"));
195 void EvtPDL::aliasChgConj(EvtId a,EvtId abar){
197 if (EvtPDL::chargeConj(EvtId(a.getId(),a.getId()))!=
198 EvtId(abar.getId(),abar.getId())) {
200 report(ERROR,"EvtGen")<<"Can't charge conjugate the two aliases:"
201 <<EvtPDL::name(a).c_str()<<" and "<<EvtPDL::name(abar).c_str()<<endl;
207 partlist()[a.getAlias()].setIdChgConj(abar);
208 partlist()[abar.getAlias()].setIdChgConj(a);
212 EvtId EvtPDL::chargeConj(EvtId id){
213 EvtId idchg=partlist()[id.getAlias()].getIdChgConj();
215 if (idchg!=EvtId(-1,-1)) return idchg;
217 if (id.getId()!=id.getAlias()){
218 if (chargeConj(EvtId(id.getId(),id.getId()))==EvtId(id.getId(),id.getId())){
220 partlist()[id.getAlias()].setIdChgConj(id);
225 if (id.getAlias()!=id.getId()) {
227 report(ERROR,"EvtGen")<<"Trying to charge conjugate alias particle:"
228 <<name(id).c_str()<<" without defining the alias!"<<endl;
234 for (size_t i=0;i<partlist().size();i++){
235 if (partlist()[i].getStdHep()==-partlist()[id.getId()].getStdHep()){
236 partlist()[id.getId()].setIdChgConj(partlist()[i].getId());
237 return partlist()[i].getId();
241 partlist()[id.getId()].setIdChgConj(id);
246 EvtId EvtPDL::evtIdFromStdHep(int stdhep){
248 for (size_t i=0;i<partlist().size();i++){
249 if (partlist()[i].getStdHep()==stdhep)
250 return partlist()[i].getId();
259 void EvtPDL::alias(EvtId num,const std::string& newname){
261 if ( _firstAlias < partlist().size() ) {
262 for(size_t i=_firstAlias;i<partlist().size();i--){
263 if (newname==partlist()[i].getName()){
264 report(WARNING,"EvtGen")<<"Redefining alias:"<<newname.c_str()<<" will be ignored!"<<endl;
270 _firstAlias=partlist().size();
273 partlist().push_back(partlist()[num.getId()]);
274 int entry=partlist().size()-1;
275 partlist()[entry].setName(newname);
276 if (_particleNameLookup.find(std::string(newname))!=
277 _particleNameLookup.end()){
278 report(ERROR,"EvtGen")<<"The particle name:"<<newname<<" is already defined."<<endl;
279 report(ERROR,"EvtGen") << "Will terminate execution.";
282 _particleNameLookup[std::string(newname)]=entry;
283 partlist()[entry].setId(EvtId(num.getId(),entry));
284 //Lange - Dec7, 2003. Unset the charge conjugate.
285 partlist()[entry].setIdChgConj(EvtId(-1,-1));
289 EvtId EvtPDL::getId(const std::string& name ){
291 std::map<std::string,int>::iterator it=_particleNameLookup.find(std::string(name));
292 if (it==_particleNameLookup.end()) return EvtId(-1,-1);
294 return partlist()[it->second].getId();
298 void EvtPDL::setUpConstsPdt(){
303 // Function to get EvtId from LundKC ( == Pythia Hep Code , KF )
304 EvtId EvtPDL::evtIdFromLundKC(int pythiaId){
308 for (i=0;i<partlist().size();i++){
309 if (partlist()[i].getLundKC()==pythiaId)
310 return partlist()[i].getId();
317 double EvtPDL::getMeanMass(EvtId i ) {
318 return partlist()[i.getId()].getMass();
321 double EvtPDL::getMass(EvtId i ) {
322 return partlist()[i.getId()].rollMass();
325 double EvtPDL::getRandMass(EvtId i, EvtId *parId, int nDaug, EvtId *dauId,
326 EvtId *othDaugId,double maxMass,
327 double *dauMasses ) {
328 return partlist()[i.getId()].getRandMass(parId,nDaug,dauId,
329 othDaugId,maxMass,dauMasses);
332 double EvtPDL::getMassProb(EvtId i, double mass, double massPar, int nDaug,
334 return partlist()[i.getId()].getMassProb(mass,massPar,nDaug,massDau);
337 double EvtPDL::getMaxMass(EvtId i ) {
338 return partlist()[i.getId()].getMassMax();
341 double EvtPDL::getMinMass(EvtId i ) {
342 return partlist()[i.getId()].getMassMin();
345 double EvtPDL::getMaxRange(EvtId i ) {
346 return partlist()[i.getId()].getMaxRange();
349 double EvtPDL::getWidth(EvtId i ) {
350 return partlist()[i.getId()].getWidth();
353 double EvtPDL::getctau(EvtId i ) {
354 return partlist()[i.getId()].getctau();
357 int EvtPDL::getStdHep(EvtId id ) {
358 return partlist()[id.getId()].getStdHep();
361 int EvtPDL::getLundKC(EvtId id ) {
362 return partlist()[id.getId()].getLundKC();
365 int EvtPDL::chg3(EvtId i ) {
366 return partlist()[i.getId()].getChg3();
369 EvtSpinType::spintype EvtPDL::getSpinType(EvtId i ) {
370 return partlist()[i.getId()].getSpinType();
373 std::string EvtPDL::name(EvtId i) {
374 return partlist()[i.getAlias()].getName();
377 size_t EvtPDL::entries() {
378 return partlist().size();
381 EvtId EvtPDL::getEntry(int i) {
382 return partlist()[i].getId();
385 void EvtPDL::reSetMass(EvtId i, double mass) {
386 partlist()[i.getId()].reSetMass(mass);
389 void EvtPDL::reSetWidth(EvtId i, double width) {
390 partlist()[i.getId()].reSetWidth(width);
393 void EvtPDL::reSetMassMin(EvtId i, double mass) {
394 partlist()[i.getId()].reSetMassMin(mass);
397 void EvtPDL::reSetMassMax(EvtId i,double mass) {
398 partlist()[i.getId()].reSetMassMax(mass);
401 void EvtPDL::reSetBlatt(EvtId i,double blatt) {
402 partlist()[i.getId()].reSetBlatt(blatt);
405 void EvtPDL::reSetBlattBirth(EvtId i,double blatt) {
406 partlist()[i.getId()].reSetBlattBirth(blatt);
409 void EvtPDL::includeBirthFactor(EvtId i,bool yesno) {
410 partlist()[i.getId()].includeBirthFactor(yesno);
413 void EvtPDL::includeDecayFactor(EvtId i,bool yesno) {
414 partlist()[i.getId()].includeDecayFactor(yesno);
417 void EvtPDL::changeLS(EvtId i, std::string &newLS ) {
418 partlist()[i.getId()].newLineShape(newLS);
421 void EvtPDL::setPWForDecay(EvtId i, int spin, EvtId d1, EvtId d2) {
422 partlist()[i.getId()].setPWForDecay(spin,d1,d2);
425 void EvtPDL::setPWForBirthL(EvtId i, int spin, EvtId par, EvtId othD) {
426 partlist()[i.getId()].setPWForBirthL(spin,par,othD);