]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TEvtGen/EvtGenBase/EvtParticle.cxx
New plots for trending injector efficiencies (Melinda)
[u/mrichter/AliRoot.git] / TEvtGen / EvtGenBase / EvtParticle.cxx
1 //--------------------------------------------------------------------------
2 //
3 // Environment:
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.
7 //
8 // Copyright Information: See EvtGen/COPYRIGHT
9 //      Copyright (C) 1998      Caltech, UCSB
10 //
11 // Module: EvtParticle.cc
12 //
13 // Description: Class to describe all particles
14 //
15 // Modification history:
16 //
17 //    DJL/RYD     September 25, 1996         Module created
18 //
19 //------------------------------------------------------------------------
20 // 
21 #include "EvtGenBase/EvtPatches.hh"
22 #include <iostream>
23 #include <math.h>
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <sys/stat.h>
27 #include "EvtGenBase/EvtParticle.hh"
28 #include "EvtGenBase/EvtId.hh"
29 #include "EvtGenBase/EvtRandom.hh"
30 #include "EvtGenBase/EvtRadCorr.hh"
31 #include "EvtGenBase/EvtPDL.hh"
32 #include "EvtGenBase/EvtDecayTable.hh"
33 #include "EvtGenBase/EvtDiracParticle.hh"
34 #include "EvtGenBase/EvtScalarParticle.hh"
35 #include "EvtGenBase/EvtVectorParticle.hh"
36 #include "EvtGenBase/EvtTensorParticle.hh"
37 #include "EvtGenBase/EvtPhotonParticle.hh"
38 #include "EvtGenBase/EvtNeutrinoParticle.hh"
39 #include "EvtGenBase/EvtRaritaSchwingerParticle.hh"
40 #include "EvtGenBase/EvtStringParticle.hh"
41 #include "EvtGenBase/EvtStdHep.hh"
42 #include "EvtGenBase/EvtSecondary.hh"
43 #include "EvtGenBase/EvtReport.hh"
44 #include "EvtGenBase/EvtGenKine.hh"
45 #include "EvtGenBase/EvtCPUtil.hh"
46 #include "EvtGenBase/EvtParticleFactory.hh"
47 #include "EvtGenBase/EvtIdSet.hh"
48
49 using std::endl;
50
51
52
53 EvtParticle::~EvtParticle() {
54   delete _decayProb;
55 }
56
57 EvtParticle::EvtParticle() {
58    _ndaug=0;
59    _parent=0;
60    _channel=-10;
61    _t=0.0;
62    _genlifetime=1;
63    _first=1;
64    _isInit=false;
65    _validP4=false;
66    _isDecayed=false;
67    _decayProb=0;
68    //   _mix=false;
69 }
70
71 void EvtParticle::setFirstOrNot() {
72   _first=0;
73 }
74 void EvtParticle::resetFirstOrNot() {
75   _first=1;
76 }
77
78 void EvtParticle::setChannel( int i ) { 
79   _channel=i;
80 }
81
82 EvtParticle *EvtParticle::getDaug(int i) { return _daug[i]; }
83
84 EvtParticle *EvtParticle::getParent() const { return _parent;}
85
86 void EvtParticle::setLifetime(double tau){
87   _t=tau;
88 }
89
90 void EvtParticle::setLifetime(){
91   if (_genlifetime){
92     _t=-log(EvtRandom::Flat())*EvtPDL::getctau(getId());
93   }
94 }
95
96 double EvtParticle::getLifetime(){
97
98   return _t;
99 }
100
101 void EvtParticle::addDaug(EvtParticle *node) {
102   node->_daug[node->_ndaug++]=this;
103   _ndaug=0;
104   _parent=node; 
105 }
106
107
108 int EvtParticle::firstornot() const { return _first;}
109
110 EvtId EvtParticle::getId() const { return _id;}
111
112 EvtSpinType::spintype EvtParticle::getSpinType() const 
113       { return EvtPDL::getSpinType(_id);}
114
115 int EvtParticle::getSpinStates() const 
116   { return EvtSpinType::getSpinStates(EvtPDL::getSpinType(_id));}
117
118 const EvtVector4R& EvtParticle::getP4() const { return _p;}
119
120 int EvtParticle::getChannel() const { return _channel;}
121
122 size_t EvtParticle::getNDaug() const { return _ndaug;}
123
124 double EvtParticle::mass() const {
125
126      return _p.mass();
127 }
128
129
130 void EvtParticle::setDiagonalSpinDensity(){
131
132   _rhoForward.setDiag(getSpinStates());
133 }
134
135 void EvtParticle::setVectorSpinDensity(){
136
137   if (getSpinStates()!=3) {
138     report(ERROR,"EvtGen")<<"Error in EvtParticle::setVectorSpinDensity"<<endl;
139     report(ERROR,"EvtGen")<<"spin_states:"<<getSpinStates()<<endl;
140     report(ERROR,"EvtGen")<<"particle:"<<EvtPDL::name(_id).c_str()<<endl;
141     ::abort();
142   }
143
144   EvtSpinDensity rho;
145
146   //Set helicity +1 and -1 to 1.
147   rho.setDiag(getSpinStates());
148   rho.set(1,1,EvtComplex(0.0,0.0));
149
150   setSpinDensityForwardHelicityBasis(rho);
151
152 }
153
154
155 void EvtParticle::setSpinDensityForwardHelicityBasis(const EvtSpinDensity& rho){
156
157   EvtSpinDensity R=rotateToHelicityBasis();
158
159   assert(R.getDim()==rho.getDim());
160
161   int n=rho.getDim();
162
163   _rhoForward.setDim(n);
164
165   int i,j,k,l;
166
167   for(i=0;i<n;i++){
168     for(j=0;j<n;j++){
169       EvtComplex tmp=0.0;
170       for(k=0;k<n;k++){
171         for(l=0;l<n;l++){
172           tmp+=R.get(l,i)*rho.get(l,k)*conj(R.get(k,j));
173         }
174       }
175       _rhoForward.set(i,j,tmp);
176     }
177   }
178
179 }
180
181 void EvtParticle::setSpinDensityForwardHelicityBasis(const EvtSpinDensity& rho,
182                                                      double alpha,
183                                                      double beta,
184                                                      double gamma){
185
186   EvtSpinDensity R=rotateToHelicityBasis(alpha,beta,gamma);
187
188   assert(R.getDim()==rho.getDim());
189
190   int n=rho.getDim();
191
192   _rhoForward.setDim(n);
193
194   int i,j,k,l;
195
196   for(i=0;i<n;i++){
197     for(j=0;j<n;j++){
198       EvtComplex tmp=0.0;
199       for(k=0;k<n;k++){
200         for(l=0;l<n;l++){
201           tmp+=R.get(l,i)*rho.get(l,k)*conj(R.get(k,j));
202         }
203       }
204       _rhoForward.set(i,j,tmp);
205     }
206   }
207
208 }
209
210 void EvtParticle::initDecay(bool useMinMass) {
211
212   EvtParticle* p=this;
213   // carefull - the parent mass might be fixed in stone..
214   EvtParticle* par=p->getParent();
215   double parMass=-1.;
216   if ( par != 0 ) {
217     if ( par->hasValidP4() ) parMass=par->mass();
218     for (size_t i=0;i<par->getNDaug();i++) {
219       EvtParticle *tDaug=par->getDaug(i);
220       if ( p != tDaug )
221         parMass-=EvtPDL::getMinMass(tDaug->getId());
222     }
223   }
224
225   if ( _isInit ) {
226     //we have already been here - just reroll the masses!
227     if ( _ndaug>0) {
228       for(size_t ii=0;ii<_ndaug;ii++){
229         if ( _ndaug==1 ||  EvtPDL::getWidth(p->getDaug(ii)->getId()) > 0.0000001)
230           p->getDaug(ii)->initDecay(useMinMass);
231         else p->getDaug(ii)->setMass(EvtPDL::getMeanMass(p->getDaug(ii)->getId()));
232       }
233     }
234
235     EvtId *dauId=0;
236     double *dauMasses=0;
237     if ( _ndaug > 0) {
238       dauId=new EvtId[_ndaug];
239       dauMasses=new double[_ndaug];
240       for (size_t j=0;j<_ndaug;j++) { 
241         dauId[j]=p->getDaug(j)->getId();
242         dauMasses[j]=p->getDaug(j)->mass();
243       }
244     }
245     EvtId *parId=0;
246     EvtId *othDauId=0;
247     EvtParticle *tempPar=p->getParent();
248     if (tempPar) {
249       parId=new EvtId(tempPar->getId());
250       if ( tempPar->getNDaug()==2 ) {
251         if ( tempPar->getDaug(0) == this ) othDauId=new EvtId(tempPar->getDaug(1)->getId());
252         else othDauId=new EvtId(tempPar->getDaug(0)->getId());
253       }
254     }
255     if ( p->getParent() && _validP4==false ) {
256       if ( !useMinMass ) {
257         p->setMass(EvtPDL::getRandMass(p->getId(),parId,_ndaug,dauId,othDauId,parMass,dauMasses));
258       }
259       else p->setMass(EvtPDL::getMinMass(p->getId()));
260     }
261     if ( parId) delete parId;
262     if ( othDauId) delete othDauId;
263     if ( dauId) delete [] dauId;
264     if ( dauMasses) delete [] dauMasses;
265     return;
266   }
267
268   
269   //Will include effects of mixing here
270   //added by Lange Jan4,2000
271   static EvtId BS0=EvtPDL::getId("B_s0");
272   static EvtId BSB=EvtPDL::getId("anti-B_s0");
273   static EvtId BD0=EvtPDL::getId("B0");
274   static EvtId BDB=EvtPDL::getId("anti-B0");
275   static EvtId D0=EvtPDL::getId("D0");
276   static EvtId D0B=EvtPDL::getId("anti-D0");
277   static EvtId U4S=EvtPDL::getId("Upsilon(4S)");
278   static EvtIdSet borUps(BS0,BSB,BD0,BDB,U4S);
279
280   //only makes sense if there is no parent particle which is a B or an Upsilon
281   bool hasBorUps=false;
282   if ( getParent() && borUps.contains(getParent()->getId()) ) hasBorUps=true;
283   //    if ( (getNDaug()==0)&&(getParent()==0) && (getId()==BS0||getId()==BSB||getId()==BD0||getId()==BDB)){
284   EvtId thisId=getId();
285   // remove D0 mixing for now.
286   //  if ( (getNDaug()==0 && !hasBorUps) && (thisId==BS0||thisId==BSB||thisId==BD0||thisId==BDB||thisId==D0||thisId==D0B)){
287   if ( (getNDaug()==0 && !hasBorUps) && (thisId==BS0||thisId==BSB||thisId==BD0||thisId==BDB)){
288     double t;
289     int mix;
290     EvtCPUtil::incoherentMix(getId(), t, mix);
291     setLifetime(t);
292     
293     if (mix) {
294
295       EvtScalarParticle* scalar_part;
296     
297       scalar_part=new EvtScalarParticle;
298       if (getId()==BS0) {
299         EvtVector4R p_init(EvtPDL::getMass(BSB),0.0,0.0,0.0);
300         scalar_part->init(BSB,p_init);
301       }
302       else if (getId()==BSB) {
303         EvtVector4R p_init(EvtPDL::getMass(BS0),0.0,0.0,0.0);
304         scalar_part->init(BS0,p_init);
305       }
306       else if (getId()==BD0) {
307         EvtVector4R p_init(EvtPDL::getMass(BDB),0.0,0.0,0.0);
308         scalar_part->init(BDB,p_init);
309       }
310       else if (getId()==BDB) {
311         EvtVector4R p_init(EvtPDL::getMass(BD0),0.0,0.0,0.0);
312         scalar_part->init(BD0,p_init);
313       }
314       else if (getId()==D0) {
315         EvtVector4R p_init(EvtPDL::getMass(D0B),0.0,0.0,0.0);
316         scalar_part->init(D0B,p_init);
317       }
318       else if (getId()==D0B) {
319         EvtVector4R p_init(EvtPDL::getMass(D0),0.0,0.0,0.0);
320         scalar_part->init(D0,p_init);
321       }
322
323       scalar_part->setLifetime(0);
324       scalar_part->setDiagonalSpinDensity();      
325     
326       insertDaugPtr(0,scalar_part);
327
328       _ndaug=1;
329       _isInit=true;
330       p=scalar_part;
331       p->initDecay(useMinMass);
332       return;
333
334
335     }
336   }
337   if ( _ndaug==1 ) std::cout << "hi " << EvtPDL::name(this->getId()) << std::endl;
338
339   EvtDecayBase *decayer;
340   decayer = EvtDecayTable::getDecayFunc(p);
341
342   if ( decayer ) {
343     p->makeDaughters(decayer->nRealDaughters(),decayer->getDaugs());
344     //then loop over the daughters and init their decay
345     for(size_t i=0;i<p->getNDaug();i++){
346       //      std::cout << EvtPDL::name(p->getDaug(i)->getId()) << " " << i << " " << p->getDaug(i)->getSpinType() << " " << EvtPDL::name(p->getId()) << std::endl;
347       if ( EvtPDL::getWidth(p->getDaug(i)->getId()) > 0.0000001)
348         p->getDaug(i)->initDecay(useMinMass);
349       else p->getDaug(i)->setMass(EvtPDL::getMeanMass(p->getDaug(i)->getId()));
350     }
351   }
352   
353   int j;
354   EvtId *dauId=0;
355   double *dauMasses=0;
356   int nDaugT=p->getNDaug();
357   if ( nDaugT > 0) {
358     dauId=new EvtId[nDaugT];
359     dauMasses=new double[nDaugT];
360     for (j=0;j<nDaugT;j++) { 
361       dauId[j]=p->getDaug(j)->getId();
362       dauMasses[j]=p->getDaug(j)->mass();
363     }
364   }
365
366   EvtId *parId=0;
367   EvtId *othDauId=0;
368   EvtParticle *tempPar=p->getParent();
369   if (tempPar) {
370     parId=new EvtId(tempPar->getId());
371     if ( tempPar->getNDaug()==2 ) {
372       if ( tempPar->getDaug(0) == this ) othDauId=new EvtId(tempPar->getDaug(1)->getId());
373       else othDauId=new EvtId(tempPar->getDaug(0)->getId());
374     }
375   }
376   if ( p->getParent() && p->hasValidP4()==false ) {
377     if ( !useMinMass ) {
378       p->setMass(EvtPDL::getRandMass(p->getId(),parId,p->getNDaug(),dauId,othDauId,parMass,dauMasses));
379     }
380     else {
381       p->setMass(EvtPDL::getMinMass(p->getId()));
382     }
383   }
384   if ( parId) delete parId;
385   if ( othDauId) delete othDauId;
386   if ( dauId) delete [] dauId;
387   if ( dauMasses) delete [] dauMasses;
388   _isInit=true;
389 }
390
391
392 void EvtParticle::decay(){
393   //P is particle to decay, typically 'this' but sometime
394   //modified by mixing 
395   EvtParticle* p=this;
396   //Did it mix?
397   //if ( p->getMixed() ) {
398     //should take C(p) - this should only
399     //happen the first time we call decay for this
400     //particle
401   //p->takeCConj();
402   // p->setUnMixed();
403   //}
404
405   EvtDecayBase *decayer;
406   decayer = EvtDecayTable::getDecayFunc(p);
407   //  if ( decayer ) {
408   //    report(INFO,"EvtGen") << "calling decay for " << EvtPDL::name(p->getId()) << " " << p->mass() << " " << p->getP4() << " " << p->getNDaug() << " " << p << endl;
409   //    report(INFO,"EvtGen") << "NDaug= " << decayer->getNDaug() << endl;
410   //    int ti;
411   //    for ( ti=0; ti<decayer->getNDaug(); ti++) 
412   //      report(INFO,"EvtGen") << "Daug " << ti << " " << EvtPDL::name(decayer->getDaug(ti)) << endl;
413   //  }
414   //if (p->_ndaug>0) {
415   //      report(INFO,"EvtGen") <<"Is decaying particle with daughters!!!!!"<<endl;
416   //     ::abort();
417     //return;
418     //call initdecay first - April 29,2002 - Lange
419   //}
420
421   //if there are already daughters, then this step is already done!
422   // figure out the masses
423   if ( _ndaug == 0 ) generateMassTree();
424   
425   static EvtId BS0=EvtPDL::getId("B_s0");
426   static EvtId BSB=EvtPDL::getId("anti-B_s0");
427   static EvtId BD0=EvtPDL::getId("B0");
428   static EvtId BDB=EvtPDL::getId("anti-B0"); 
429   static EvtId D0=EvtPDL::getId("D0");
430   static EvtId D0B=EvtPDL::getId("anti-D0");
431
432   EvtId thisId=getId();
433   // remove D0 mixing for now..
434   //  if ( _ndaug==1 &&  (thisId==BS0||thisId==BSB||thisId==BD0||thisId==BDB||thisId==D0||thisId==D0B) ) {
435   if ( _ndaug==1 &&  (thisId==BS0||thisId==BSB||thisId==BD0||thisId==BDB) ) {
436     p=p->getDaug(0);
437     decayer = EvtDecayTable::getDecayFunc(p);
438   }
439   //now we have accepted a set of masses - time
440   if ( decayer != 0) {
441     decayer->makeDecay(p);
442   }
443   else{
444     p->_rhoBackward.setDiag(p->getSpinStates());
445   }
446
447   _isDecayed=true;
448   return;  
449 }
450
451 void EvtParticle::generateMassTree() {
452   double massProb=1.;
453   double ranNum=2.;
454   int counter=0;
455   EvtParticle *p=this;
456   while (massProb<ranNum) {
457     //check it out the first time.
458     p->initDecay();
459     massProb=p->compMassProb();
460     ranNum=EvtRandom::Flat();
461     counter++;
462
463     if ( counter > 10000 ) {
464       if ( counter == 10001 ) {
465         report(INFO,"EvtGen") << "Too many iterations to determine the mass tree. Parent mass= "<< p->mass() << " " << massProb <<endl;
466         p->printTree();
467         report(INFO,"EvtGen") << "will take next combo with non-zero likelihood\n"; 
468       }
469       if ( massProb>0. ) massProb=2.0;
470       if ( counter > 20000 ) {
471         // one last try - take the minimum masses
472         p->initDecay(true);
473         p->printTree();
474         massProb=p->compMassProb();
475         if ( massProb>0. ) {
476           massProb=2.0;
477           report(INFO,"EvtGen") << "Taking the minimum mass of all particles in the chain\n";
478         }
479         else {
480           report(INFO,"EvtGen") << "Sorry, no luck finding a valid set of masses.  This may be a pathological combo\n";
481           assert(0);
482         }
483       }
484     }
485   }
486 }
487
488 double EvtParticle::compMassProb() {
489
490   EvtParticle *p=this;
491   double mass=p->mass();
492   double parMass=0.;
493   if ( p->getParent()) { 
494     parMass=p->getParent()->mass();
495   }
496
497   int nDaug=p->getNDaug();
498   double *dMasses=0;
499
500   int i;
501   if ( nDaug>0 ) {
502     dMasses=new double[nDaug];
503     for (i=0; i<nDaug; i++) dMasses[i]=p->getDaug(i)->mass();
504   }
505
506   double temp=1.0;
507   temp=EvtPDL::getMassProb(p->getId(), mass, parMass, nDaug, dMasses);
508
509   //If the particle already has a mass, we dont need to include
510   //it in the probability calculation
511   if ( (!p->getParent() || _validP4 ) && temp>0.0 ) temp=1.; 
512
513   delete [] dMasses;
514   for (i=0; i<nDaug; i++) {
515     temp*=p->getDaug(i)->compMassProb();
516   }
517   return temp;
518 }
519
520 void EvtParticle::deleteDaughters(bool keepChannel){
521
522   for(size_t i=0;i<_ndaug;i++){
523     _daug[i]->deleteTree();
524   }
525   
526   _ndaug=0;
527   if ( !keepChannel) _channel=-10;
528   _first=1;
529   _isInit=false;
530 }
531
532 void EvtParticle::deleteTree(){
533
534   this->deleteDaughters();
535   
536   delete this;
537   
538 }
539
540 EvtVector4C EvtParticle::epsParent(int i) const {
541   EvtVector4C temp;
542   printParticle();
543   report(ERROR,"EvtGen") << "and you have asked for the:"<<i
544                          <<"th polarization vector."
545                          <<" I.e. you thought it was a"
546                          <<" vector particle!" << endl;
547   ::abort();
548   return temp;
549 }
550
551 EvtVector4C EvtParticle::eps(int i) const {
552   EvtVector4C temp;
553   printParticle();
554   report(ERROR,"EvtGen") << "and you have asked for the:"<<i
555                          <<"th polarization vector."
556                          <<" I.e. you thought it was a"
557                          <<" vector particle!" << endl;
558   ::abort();
559   return temp;
560 }
561
562 EvtVector4C EvtParticle::epsParentPhoton(int i){
563   EvtVector4C temp;
564   printParticle();
565   report(ERROR,"EvtGen") << "and you have asked for the:"<<i
566                          <<"th polarization vector of photon."
567                          <<" I.e. you thought it was a"
568                          <<" photon particle!" << endl;
569   ::abort();
570   return temp;
571 }
572
573 EvtVector4C EvtParticle::epsPhoton(int i){
574   EvtVector4C temp;
575   printParticle();
576   report(ERROR,"EvtGen") << "and you have asked for the:"<<i
577                          <<"th polarization vector of a photon."
578                          <<" I.e. you thought it was a"
579                          <<" photon particle!" << endl;
580   ::abort();
581   return temp;
582 }
583
584 EvtDiracSpinor EvtParticle::spParent(int i) const {
585   EvtDiracSpinor tempD;
586   int temp;
587   temp = i;
588   printParticle();
589   report(ERROR,"EvtGen") << "and you have asked for the:"<<i
590                          <<"th dirac spinor."
591                          <<" I.e. you thought it was a"
592                          <<" Dirac particle!" << endl;
593   ::abort();
594   return tempD;
595 }
596
597 EvtDiracSpinor EvtParticle::sp(int i) const {
598   EvtDiracSpinor tempD;
599   int temp;
600   temp = i;
601   printParticle();
602   report(ERROR,"EvtGen") << "and you have asked for the:"<<i
603                          <<"th dirac spinor."
604                          <<" I.e. you thought it was a"
605                          <<" Dirac particle!" << endl;
606   ::abort();
607   return tempD;
608 }
609
610 EvtDiracSpinor EvtParticle::spParentNeutrino() const {
611   EvtDiracSpinor tempD;
612   printParticle();
613   report(ERROR,"EvtGen") << "and you have asked for the "
614                          <<"dirac spinor."
615                          <<" I.e. you thought it was a"
616                          <<" neutrino particle!" << endl;
617   ::abort();
618   return tempD;
619 }
620
621 EvtDiracSpinor EvtParticle::spNeutrino() const {
622   EvtDiracSpinor tempD;
623   printParticle();
624   report(ERROR,"EvtGen") << "and you have asked for the "
625                          <<"dirac spinor."
626                          <<" I.e. you thought it was a"
627                          <<" neutrino particle!" << endl;
628   ::abort();
629   return tempD;
630 }
631
632 EvtTensor4C EvtParticle::epsTensorParent(int i) const {
633   int temp;
634   temp = i;
635   EvtTensor4C tempC; 
636   printParticle();
637   report(ERROR,"EvtGen") << "and you have asked for the:"<<i
638                          <<"th tensor."
639                          <<" I.e. you thought it was a"
640                          <<" Tensor particle!" << endl;
641   ::abort();
642   return tempC;
643 }
644
645 EvtTensor4C EvtParticle::epsTensor(int i) const {
646   int temp;
647   temp = i;
648   EvtTensor4C tempC; 
649   printParticle();
650   report(ERROR,"EvtGen") << "and you have asked for the:"<<i
651                          <<"th tensor."
652                          <<" I.e. you thought it was a"
653                          <<" Tensor particle!" << endl;
654   ::abort();
655   return tempC;
656 }
657
658
659 EvtRaritaSchwinger EvtParticle::spRSParent(int i) const {
660   EvtRaritaSchwinger tempD;
661   int temp;
662   temp = i;
663   printParticle();
664   report(ERROR,"EvtGen") << "and you have asked for the:"<<i
665                          <<"th Rarita-Schwinger spinor."
666                          <<" I.e. you thought it was a"
667                          <<" RaritaSchwinger particle!" << std::endl;
668   ::abort();
669   return tempD;
670 }
671
672 EvtRaritaSchwinger EvtParticle::spRS(int i) const {
673   EvtRaritaSchwinger tempD;
674   int temp;
675   temp = i;
676   printParticle();
677   report(ERROR,"EvtGen") << "and you have asked for the:"<<i
678                          <<"th Rarita-Schwinger spinor."
679                          <<" I.e. you thought it was a"
680                          <<" RaritaSchwinger particle!" << std::endl;
681   ::abort();
682   return tempD;
683 }
684
685
686
687 EvtVector4R EvtParticle::getP4Lab() const {
688   EvtVector4R temp,mom;
689   const EvtParticle *ptemp;
690   
691   temp=this->getP4();
692   ptemp=this;
693   
694   while (ptemp->getParent()!=0) {
695     ptemp=ptemp->getParent();
696     mom=ptemp->getP4();
697     temp=boostTo(temp,mom);   
698   } 
699   return temp;
700 }
701
702 EvtVector4R EvtParticle::getP4LabBeforeFSR() {
703   EvtVector4R temp,mom;
704   EvtParticle *ptemp;
705
706   temp=this->_pBeforeFSR;
707   ptemp=this;
708
709   while (ptemp->getParent()!=0) {
710     ptemp=ptemp->getParent();
711     mom=ptemp->getP4();
712     temp=boostTo(temp,mom);
713   }
714   return temp;
715 }
716
717
718
719 EvtVector4R EvtParticle::getP4Restframe() const {
720
721   return EvtVector4R(mass(),0.0,0.0,0.0);
722
723 }
724
725 EvtVector4R EvtParticle::get4Pos() const {
726
727   EvtVector4R temp,mom;
728   EvtParticle *ptemp;
729   
730   temp.set(0.0,0.0,0.0,0.0);
731   ptemp=getParent();
732
733   if (ptemp==0) return temp;
734
735   temp=(ptemp->_t/ptemp->mass())*(ptemp->getP4());
736
737   while (ptemp->getParent()!=0) {
738     ptemp=ptemp->getParent();
739     mom=ptemp->getP4();
740     temp=boostTo(temp,mom);
741     temp=temp+(ptemp->_t/ptemp->mass())*(ptemp->getP4());
742   } 
743   
744   return temp;
745 }
746
747
748 EvtParticle * EvtParticle::nextIter(EvtParticle *rootOfTree) {
749
750   EvtParticle *bpart;
751   EvtParticle *current;
752
753   current=this;
754   size_t i;
755
756   if (_ndaug!=0) return _daug[0];
757
758   do{
759     bpart=current->_parent;
760     if (bpart==0) return 0;
761     i=0;
762     while (bpart->_daug[i]!=current) {i++;}
763
764     if ( bpart==rootOfTree ) {
765       if ( i+1 == bpart->_ndaug ) return 0;
766     }
767
768     i++;
769     current=bpart;
770
771   }while(i>=bpart->_ndaug);
772
773   return bpart->_daug[i];
774
775 }
776
777
778 void EvtParticle::makeStdHep(EvtStdHep& stdhep,EvtSecondary& secondary,
779                              EvtId *list_of_stable){
780
781   //first add particle to the stdhep list;
782   stdhep.createParticle(getP4Lab(),get4Pos(),-1,-1,
783                         EvtPDL::getStdHep(getId()));
784
785   int ii=0;
786
787   //lets see if this is a longlived particle and terminate the 
788   //list building!
789   
790   while (list_of_stable[ii]!=EvtId(-1,-1)) {
791     if (getId()==list_of_stable[ii]){
792       secondary.createSecondary(0,this);
793       return;
794     }
795     ii++;
796   }
797
798
799
800   for(size_t i=0;i<_ndaug;i++){
801     stdhep.createParticle(_daug[i]->getP4Lab(),_daug[i]->get4Pos(),0,0,
802                           EvtPDL::getStdHep(_daug[i]->getId()));
803   }
804
805   for(size_t i=0;i<_ndaug;i++){
806     _daug[i]->makeStdHepRec(1+i,1+i,stdhep,secondary,list_of_stable);
807   }
808   return;
809
810 }
811
812 void EvtParticle::makeStdHep(EvtStdHep& stdhep){
813
814   //first add particle to the stdhep list;
815   stdhep.createParticle(getP4Lab(),get4Pos(),-1,-1,
816                         EvtPDL::getStdHep(getId()));
817
818   for(size_t i=0;i<_ndaug;i++){
819     stdhep.createParticle(_daug[i]->getP4Lab(),_daug[i]->get4Pos(),0,0,
820                           EvtPDL::getStdHep(_daug[i]->getId()));
821   }
822
823   for(size_t i=0;i<_ndaug;i++){
824     _daug[i]->makeStdHepRec(1+i,1+i,stdhep);
825   }
826   return;
827
828 }
829
830
831 void EvtParticle::makeStdHepRec(int firstparent,int lastparent,
832                                 EvtStdHep& stdhep,
833                                 EvtSecondary& secondary,
834                                 EvtId *list_of_stable){
835
836
837   int ii=0;
838
839   //lets see if this is a longlived particle and terminate the 
840   //list building!
841   
842   while (list_of_stable[ii]!=EvtId(-1,-1)) {
843     if (getId()==list_of_stable[ii]){
844       secondary.createSecondary(firstparent,this);
845       return;
846     }
847     ii++;
848   }
849
850
851
852   int parent_num=stdhep.getNPart();
853   for(size_t i=0;i<_ndaug;i++){
854     stdhep.createParticle(_daug[i]->getP4Lab(),_daug[i]->get4Pos(),
855                           firstparent,lastparent,
856                           EvtPDL::getStdHep(_daug[i]->getId()));
857   }
858
859   for(size_t i=0;i<_ndaug;i++){
860     _daug[i]->makeStdHepRec(parent_num+i,parent_num+i,stdhep,
861                            secondary,list_of_stable);
862   }
863   return;
864
865 }
866
867 void EvtParticle::makeStdHepRec(int firstparent,int lastparent,
868                                 EvtStdHep& stdhep){
869
870   int parent_num=stdhep.getNPart();
871   for(size_t i=0;i<_ndaug;i++){
872     stdhep.createParticle(_daug[i]->getP4Lab(),_daug[i]->get4Pos(),
873                           firstparent,lastparent,
874                           EvtPDL::getStdHep(_daug[i]->getId()));
875   }
876
877   for(size_t i=0;i<_ndaug;i++){
878     _daug[i]->makeStdHepRec(parent_num+i,parent_num+i,stdhep);
879   }
880   return;
881
882 }
883
884 void EvtParticle::printTreeRec(unsigned int level) const {
885
886   size_t newlevel,i;
887   newlevel = level +1;
888
889   
890   if (_ndaug!=0) {
891     if ( level > 0 ) {
892       for (i=0;i<(5*level);i++) {
893         report(INFO,"") <<" ";
894       }
895     }
896     report(INFO,"") << EvtPDL::name(_id).c_str();  
897     report(INFO,"") << " -> ";
898     for(i=0;i<_ndaug;i++){
899       report(INFO,"") << EvtPDL::name(_daug[i]->getId()).c_str()<<" ";
900     }
901     for(i=0;i<_ndaug;i++){
902       report(INFO,"") << _daug[i]->mass()<<" " << _daug[i]->getSpinStates() << " ";
903     }
904     report(INFO,"")<<endl;
905     for(i=0;i<_ndaug;i++){
906       _daug[i]->printTreeRec(newlevel);
907     }
908   }
909 }
910
911 void EvtParticle::printTree() const {
912   
913   report(INFO,"EvtGen") << "This is the current decay chain"<<endl;
914   report(INFO,"") << "This top particle is "<<
915     EvtPDL::name(_id).c_str()<<" " << this->mass() << " " << this->getP4() << endl;  
916   
917   this->printTreeRec(0);
918   report(INFO,"EvtGen") << "End of decay chain."<<endl;
919
920 }
921
922 std::string EvtParticle::treeStrRec(unsigned int level) const {
923
924   size_t newlevel,i;
925   newlevel = level +1;
926
927   std::string retval="";
928
929   for(i=0;i<_ndaug;i++){
930     retval+=EvtPDL::name(_daug[i]->getId());
931     if ( _daug[i]->getNDaug() > 0 ) {
932       retval+= " (";
933       retval+= _daug[i]->treeStrRec(newlevel);
934       retval+= ") ";
935     }
936     else{
937       if ( i+1 !=_ndaug) retval+=" ";
938     }
939   }
940
941   return retval;
942 }
943
944
945 std::string EvtParticle::treeStr() const {
946
947   std::string retval=EvtPDL::name(_id);
948   retval+=" -> ";
949
950   retval+=treeStrRec(0);
951
952   return retval;
953 }
954
955 void EvtParticle::printParticle() const {
956
957   switch (EvtPDL::getSpinType(_id)){ 
958   case EvtSpinType::SCALAR:
959     report(INFO,"EvtGen") << "This is a scalar particle:"<<EvtPDL::name(_id).c_str()<<"\n";
960     break;     
961   case EvtSpinType::VECTOR:
962     report(INFO,"EvtGen") << "This is a vector particle:"<<EvtPDL::name(_id).c_str()<<"\n";
963     break;     
964   case EvtSpinType::TENSOR:
965     report(INFO,"EvtGen") << "This is a tensor particle:"<<EvtPDL::name(_id).c_str()<<"\n";
966     break;
967   case EvtSpinType::DIRAC:
968     report(INFO,"EvtGen") << "This is a dirac particle:"<<EvtPDL::name(_id).c_str()<<"\n";
969     break;
970   case EvtSpinType::PHOTON:
971     report(INFO,"EvtGen") << "This is a photon:"<<EvtPDL::name(_id).c_str()<<"\n";
972     break;
973   case EvtSpinType::NEUTRINO:
974     report(INFO,"EvtGen") << "This is a neutrino:"<<EvtPDL::name(_id).c_str()<<"\n";
975     break;
976   case EvtSpinType::STRING:
977     report(INFO,"EvtGen") << "This is a string:"<<EvtPDL::name(_id).c_str()<<"\n";
978     break;
979   default:
980     report(INFO,"EvtGen") <<"Unknown particle type in EvtParticle::printParticle()"<<endl;
981     break;
982   }
983   report(INFO,"EvtGen") << "Number of daughters:"<<_ndaug<<"\n";
984
985
986 }
987
988
989
990 void init_vector( EvtParticle **part ){
991   *part = (EvtParticle *) new EvtVectorParticle;
992
993
994
995 void init_scalar( EvtParticle **part ){
996   *part = (EvtParticle *) new EvtScalarParticle;
997
998
999 void init_tensor( EvtParticle **part ){
1000   *part = (EvtParticle *) new EvtTensorParticle;
1001
1002
1003 void init_dirac( EvtParticle **part ){
1004   *part = (EvtParticle *) new EvtDiracParticle;
1005
1006
1007 void init_photon( EvtParticle **part ){
1008   *part = (EvtParticle *) new EvtPhotonParticle;
1009
1010
1011 void init_neutrino( EvtParticle **part ){
1012   *part = (EvtParticle *) new EvtNeutrinoParticle;
1013
1014
1015 void init_string( EvtParticle **part ){
1016   *part = (EvtParticle *) new EvtStringParticle;
1017
1018
1019 double EvtParticle::initializePhaseSpace(
1020                    unsigned int numdaughter,EvtId *daughters, 
1021                    bool forceDaugMassReset, double poleSize,
1022                    int whichTwo1, int whichTwo2) {
1023
1024   double m_b;
1025   unsigned int i;
1026   //lange
1027   //  this->makeDaughters(numdaughter,daughters);
1028
1029   static EvtVector4R p4[100];
1030   static double mass[100];
1031
1032   m_b = this->mass();
1033
1034   //lange - Jan2,2002 - Need to check to see if the daughters of the parent
1035   // have changed. If so, delete them and start over.
1036   //report(INFO,"EvtGen") << "the parent is\n";
1037   //if ( this->getParent() ) {
1038   //  if ( this->getParent()->getParent() ) this->getParent()->getParent()->printTree();
1039     //    this->getParent()->printTree();
1040   //}
1041   //report(INFO,"EvtGen") << "and this is\n";
1042   //if ( this) this->printTree();
1043   bool resetDaughters=false;
1044   
1045   if ( numdaughter != this->getNDaug() && this->getNDaug() > 0 ) resetDaughters=true;
1046   if ( numdaughter == this->getNDaug() ) 
1047     for (i=0; i<numdaughter;i++) {
1048       if ( this->getDaug(i)->getId() != daughters[i] ) resetDaughters=true;
1049       //report(INFO,"EvtGen") << EvtPDL::name(this->getDaug(i)->getId()) 
1050       //                    << " " << EvtPDL::name(daughters[i]) << endl;
1051     }
1052
1053   if ( resetDaughters || forceDaugMassReset) {
1054     bool t1=true;
1055     //but keep the decay channel of the parent.
1056     this->deleteDaughters(t1);
1057     this->makeDaughters(numdaughter,daughters);
1058     this->generateMassTree();
1059   }
1060
1061   double weight=0.;
1062   for (i=0; i<numdaughter;i++) {
1063     mass[i]=this->getDaug(i)->mass();
1064   }
1065
1066   if ( poleSize<-0.1) {
1067     //special case to enforce 4-momentum conservation in 1->1 decays
1068     if (numdaughter==1) {
1069       this->getDaug(0)->init(daughters[0],EvtVector4R(m_b,0.0,0.0,0.0));
1070     }
1071     else{
1072       EvtGenKine::PhaseSpace( numdaughter, mass, p4, m_b );
1073       for(i=0;i<numdaughter;i++){
1074         this->getDaug(i)->init(daughters[i],p4[i]);
1075       }
1076     }
1077   }
1078   else  {
1079     if ( numdaughter != 3 ) {
1080       report(ERROR,"EvtGen") << "Only can generate pole phase space "
1081                              << "distributions for 3 body final states"
1082                              << endl<<"Will terminate."<<endl;
1083       ::abort();
1084     }
1085     bool ok=false;
1086     if ( (whichTwo1 == 1 && whichTwo2 == 0 ) ||
1087          (whichTwo1 == 0 && whichTwo2 == 1 ) ) {
1088       weight=EvtGenKine::PhaseSpacePole( m_b, mass[0], mass[1], mass[2], 
1089                                           poleSize, p4);
1090       this->getDaug(0)->init(daughters[0],p4[0]);
1091       this->getDaug(1)->init(daughters[1],p4[1]);
1092       this->getDaug(2)->init(daughters[2],p4[2]);
1093       ok=true;
1094     }
1095     if ( (whichTwo1 == 1 && whichTwo2 == 2 ) ||
1096          (whichTwo1 == 2 && whichTwo2 == 1 ) ) {
1097       weight=EvtGenKine::PhaseSpacePole( m_b, mass[2], mass[1], mass[0], 
1098                                           poleSize, p4);
1099       this->getDaug(0)->init(daughters[0],p4[2]);
1100       this->getDaug(1)->init(daughters[1],p4[1]);
1101       this->getDaug(2)->init(daughters[2],p4[0]);
1102       ok=true;
1103     }
1104     if ( (whichTwo1 == 0 && whichTwo2 == 2 ) ||
1105          (whichTwo1 == 2 && whichTwo2 == 0 ) ) {
1106       weight=EvtGenKine::PhaseSpacePole( m_b, mass[1], mass[0], mass[2], 
1107                                           poleSize, p4);
1108       this->getDaug(0)->init(daughters[0],p4[1]);
1109       this->getDaug(1)->init(daughters[1],p4[0]);
1110       this->getDaug(2)->init(daughters[2],p4[2]);
1111       ok=true;
1112     }
1113     if ( !ok) {
1114       report(ERROR,"EvtGen") << "Invalid pair of particle to generate a pole dist "
1115                              << whichTwo1 << " " << whichTwo2
1116                              << endl<<"Will terminate."<<endl;
1117       ::abort();
1118     }
1119   }
1120
1121   return weight;
1122 }
1123
1124 void EvtParticle::makeDaughters( unsigned int ndaugstore, EvtId *id){
1125
1126   unsigned int i;
1127   if ( _channel < 0 ) {
1128     setChannel(0);
1129   }
1130   EvtParticle* pdaug;  
1131   if (_ndaug!=0 ){
1132     if (_ndaug!=ndaugstore){
1133       report(ERROR,"EvtGen") << "Asking to make a different number of "
1134                              << "daughters than what was previously created."<<endl;
1135       report(ERROR,"EvtGen") << "Original parent:"<<EvtPDL::name(_id)<<endl;
1136       for (size_t i=0;i<_ndaug;i++){
1137           report(ERROR,"EvtGen") << "Original daugther:"<<EvtPDL::name(getDaug(i)->getId())<<endl;
1138       }
1139       for (size_t i=0;i<ndaugstore;i++){
1140           report(ERROR,"EvtGen") << "New Daug:"<<EvtPDL::name(id[i])<<endl;
1141       }
1142       report(ERROR,"EvtGen") << "Will terminate."<<endl;
1143       ::abort();
1144     }
1145   } 
1146   else{
1147     for(i=0;i<ndaugstore;i++){
1148       pdaug=EvtParticleFactory::particleFactory(EvtPDL::getSpinType(id[i]));
1149       pdaug->setId(id[i]);
1150       pdaug->addDaug(this);     
1151     }
1152
1153   } //else
1154 } //makeDaughters
1155
1156
1157 void EvtParticle::setDecayProb(double prob) {
1158
1159   if ( _decayProb == 0 )  _decayProb=new double;
1160   *_decayProb=prob;
1161 }