MINT2
SpinFactors4Body_ScalarsAndVectors.cpp
Go to the documentation of this file.
1 // author: Jonas Rademacker (Jonas.Rademacker@bristol.ac.uk)
2 // status: Mon 9 Feb 2009 19:18:13 GMT
3 #include "Mint/SpinFactors.h"
5 #include "Mint/DecayTree.h"
6 //#include "Mint/DecayTreeComparisons.h"
7 
8 #include "Mint/Utils.h"
10 
11 #include "Mint/ZTspin1.h"
12 #include "Mint/ZTspin2.h"
13 #include "Mint/LeviCivita.h"
14 #include "Mint/SpinSumT.h"
15 
16 using namespace std;
17 using namespace MINT;
18 
19 // Most of these come from:
20 // D. Coffman et al: "Resonant substructure in Kbar pi pi pi decays of D mesons"
21 // Physical Review D, Vol 45, Number 7, page 2196
22 // The spin factors are in Table II, page 2201.
23 
34 
36 
38 
41 
42 
43 // ============================================================
44 
46  // D->a(1) pi, a(1)->rho pi, rho->pipi
47  // with a(1) decaying in D-wave
48  if(0 == _exampleDecayD){
49  _exampleDecayD = new DecayTree(421);
50  DecayTree a1(20213);
51  a1.getVal().setL(2);
52  a1.addDgtr(211, 113)->addDgtr(211, -211);
53  _exampleDecayD->addDgtr(-211);
54  _exampleDecayD->addDgtr(&a1);
55  }
56  return *_exampleDecayD;
57 }
59  return getExampleDecay();
60 }
61 
62 const DecayTree& SF_DtoPP1P2_PtoP3P4::getExampleDecay(){//Lauren's wide KsSpin
63  if(0 == _exampleDecay){
64  _exampleDecay = new DecayTree(421);
65  _exampleDecay->addDgtr(888310)->addDgtr(211, -211);
66  _exampleDecay->addDgtr(321, -321);
67  }
68  return *_exampleDecay;
69 }
71  return getExampleDecay();
72 }
73 
75  if(0 == _exampleDecay){
76  _exampleDecay = new DecayTree(421);
77  _exampleDecay->addDgtr(9010221)->addDgtr(211, -211);
78  _exampleDecay->addDgtr(9010221)->addDgtr(211, -211);
79  }
80  return *_exampleDecay;
81 }
83  return getExampleDecay();
84 }
85 
87  if(0 == _exampleDecay){
88  _exampleDecay = new DecayTree(421);
89  _exampleDecay->addDgtr(-211, 100211)->addDgtr(211, 9000221)->addDgtr(-211,211);
90  }
91  return *_exampleDecay;
92 }
94  return getExampleDecay();
95 }
96 
97 // the following is not implemented, beccause Axial vector -> PP violates
98 // parity conservation of the strong interaction.
99 // The example decay was, however, until recently associated
100 // to SF_DtoPP0_PtoVP1_VtoP2P3
101 //const DecayTree& SF_DtoPP0_PtoAP1_AtoP2P3::getExampleDecay(){
102 // if(0==_exampleDecay){
103 // _exampleDecay = new DecayTree(421);
104 // // remark: addDgtr always returns a pointer to the
105 // // last daughter that was added, thus allowing these
106 // // chains:
107 // _exampleDecay->addDgtr(-211, 200321)->addDgtr(321, -10323)->addDgtr(-321,211);
108 // }
109 // return *_exampleDecay;
110 //}
111 //
112 
114  if(0==_exampleDecay){
115  _exampleDecay = new DecayTree(421);
116  // remark: addDgtr always returns a pointer to the
117  // last daughter that was added, thus allowing these
118  // chains:
119  _exampleDecay->addDgtr(-211, 100211)->addDgtr(211, 113)->addDgtr(-211,211);
120  }
121  return *_exampleDecay;
122 }
123 
125  return getExampleDecay();
126 }
127 
129  // bool debugThis=false;
130  if(fsPS.size() < 4) fsPS.reserve(4);
131  for(int i=0; i< theDecay(pat).nDgtr(); i++){
132  const_counted_ptr<AssociatedDecayTree> dgtr= theDecay(pat).getDgtrTreePtr(i);
133  if (dgtr->getVal().SVPAT() == "P" && ! dgtr->isFinalState()) P = dgtr;
134  else if(dgtr->getVal().SVPAT() == "P" && dgtr->isFinalState()) fsPS[0] = dgtr;
135  }
136  if(0==P || 0==fsPS[0]){
137  cout << "ERROR in SF_DtoPP0_PtoVP1_VtoP2P3::parseTree"
138  << " Didn't find P or P1 " << P.get() << ", " << fsPS[0].get() << endl;
139  return false;
140  }
141 
142  for(int i=0; i< P->nDgtr(); i++){
143  const_counted_ptr<AssociatedDecayTree> dgtr= P->getDgtrTreePtr(i);
144  if (dgtr->getVal().SVPAT() == "V" && ! dgtr->isFinalState()) V = dgtr;
145  else if(dgtr->getVal().SVPAT() == "P" && dgtr->isFinalState()) fsPS[1] = dgtr;
146  }
147  if(0==V || 0==fsPS[1]){
148  cout << "ERROR in SF_DtoPP0_PtoVP1_VtoP2P3::parseTree"
149  << " Didn't find V or P2 " << V.get() << ", " << fsPS[1].get() << endl;
150  return false;
151  }
152 
153  if(V->nDgtr() != 2){
154  cout << "ERROR in SF_DtoAP0_AtoVP1_VtoP2P3::parseTree"
155  << " V should have 2 daughters, but it says it has "
156  << V->nDgtr() << "."
157  << endl;
158  return false;
159  }
160  fsPS[2] = V->getDgtrTreePtr(0);
161  fsPS[3] = V->getDgtrTreePtr(1);
162  // normalOrder(fsPS[2], fsPS[3]);
163 
164  // this->printYourself();
165 
166  return true;
167 }
168 
170  // bool debugThis = false;
171 
172  if(! ( fsPS[0] && fsPS[1] && fsPS[2] && fsPS[3]) ) parseTree(evt.eventPattern());
173  TLorentzVector pV = p(2, evt) + p(3, evt);
174  TLorentzVector qV = p(2, evt) - p(3, evt);
175 
176  double MassV = mRes(V, evt);
177 
178  if (_useZemachTensors) {
179  double MP = mRes(P, evt);
180  TLorentzVector pP= pV + p(1, evt);
181  TLorentzVector qP= pV - p(1, evt);
182 
183  ZTspin1 LP(qP,pP,MP);
184  ZTspin1 LV(qV,pV,MassV);
185  return (LP.Dot(LV))/(GeV*GeV);
186  }
187 
188  return (p(1, evt).Dot(qV)
189  - p(1, evt).Dot(pV) * pV.Dot(qV) / (MassV*MassV))
190  /(GeV*GeV)
191  ;
192 }
194  // bool debugThis = false;
195 
196  if(! ( fsPS[0] && fsPS[1] && fsPS[2] && fsPS[3]) ) return;
197  os << "---------------------------------------------------------"
198  << "\n spin factor SF_DtoPP0_PtoVP1_VtoP2P3 "
199  << "\n (p(1).Dot(qV) -p(1).Dot(pV) * pV.Dot(qV) / (MassV*MassV)) / (GeV*GeV)"
200  << "\n with pV = p(2) + p(3); qV = p(2) - p(3)"
201  << "\n parsed tree " << theDecay().oneLiner()
202  << "\n like this:" << endl;
203  this->printParsing(os);
204 }
205 
206 //==================================================================
207 
209  if(0==_exampleDecay){
210  _exampleDecay = new DecayTree(421);
211  // remark: addDgtr always returns a pointer to the
212  // last daughter that was added, thus allowing these
213  // chains:
214  _exampleDecay->addDgtr(-321, 10323)->addDgtr(321, 113)->addDgtr(211,-211);
215  }
216  return *_exampleDecay;
217 }
218 
220  return getExampleDecay();
221 }
222 
223 //==================================================================
224 //==================================================================
225 
227  bool debugThis=false;
228 
229  if(fsPS.size() < 4) fsPS.reserve(4);
230  for(int i=0; i< theDecay(pat).nDgtr(); i++){
232  theDecay(pat).getDgtrTreePtr(i);
233 
234  if(dgtr->getVal().SVPAT() == "A") A = dgtr;
235  else if(dgtr->getVal().SVPAT() == "P") fsPS[0] = dgtr;
236  }
237  if(0==A || 0==fsPS[0]){
238  cout << "ERROR in SF_DtoAP0_AtoVP1_VtoP2P3::parseTree"
239  << " Didn't find A or P1 " << A.get() << ", " << fsPS[0].get() << endl;
240  return false;
241  }
242 
243  for(int i=0; i< A->nDgtr(); i++){
244  const_counted_ptr<AssociatedDecayTree> dgtr= A->getDgtrTreePtr(i);
245  if(dgtr->getVal().SVPAT() == "V") V = dgtr;
246  else if(dgtr->getVal().SVPAT() == "P") fsPS[1] = dgtr;
247  }
248  if(0==V || 0==fsPS[1]){
249  cout << "ERROR in SF_DtoAP0_AtoVP1_VtoP2P3::parseTree"
250  << " Didn't find V or P2 " << V.get() << ", " << fsPS[1].get() << endl;
251  return false;
252  }
253 
254  if(V->nDgtr() != 2){
255  cout << "ERROR in SF_DtoAP0_AtoVP1_VtoP2P3::parseTree"
256  << " V should have 2 daughters, but it says it has "
257  << V->nDgtr() << "."
258  << endl;
259  return false;
260  }
261  fsPS[2] = V->getDgtrTreePtr(0);
262  fsPS[3] = V->getDgtrTreePtr(1);
263 
264  // normalOrder(fsPS[2], fsPS[3]);
265 
266  if(debugThis){
267  cout << "parsed Tree: V:\n"
268  << *V
269  << "\n A:"
270  << *A
271  << endl;
272  for(int i=0; i<4; i++){
273  cout << "fsPS[" << i << "]\n"
274  << *(fsPS[i])
275  << endl;
276  }
277  }
278  // this->printYourself();
279  return true;
280 }
281 
283  bool debugThis = false;
284 
285  if(! ( fsPS[0] && fsPS[1] && fsPS[2] && fsPS[3]) ) parseTree(evt.eventPattern());
286 
287  TLorentzVector pV = p(2, evt) + p(3, evt);
288  TLorentzVector qV = p(2, evt) - p(3, evt);
289  TLorentzVector pA = p(1, evt) + p(2, evt) + p(3, evt);
290  TLorentzVector p0 = p(0, evt);
291  TLorentzVector pD = p(0, evt) + pA ;
292  TLorentzVector qD = pA - p(0, evt) ;
293 
294  double MA = mRes(A, evt);
295  double MassV = mRes(V, evt);
296 
297  if(debugThis){
298  for(int i=0; i<4; i++){
299  cout << " numbered by SF: p(" << i << ") " << p(i, evt) << endl;
300  }
301  for(int i=0; i<4; i++){
302  cout << " numbered 'normally' p(" << i << ") "
303  << p(i, evt) << endl;
304  }
305  cout << "got pV " << pV << endl;
306  }
307 
308  if(_useZemachTensors){
309  ZTspin1 LB(qD,pD,pD.M());
310  ZTspin1 LV(qV,pV,MassV);
311  SpinSumV PA(pA,MA);
312 
313  TLorentzVector tmp= PA.Dot(LV);
314  return (LB.Dot(tmp))/(GeV*GeV);
315  }
316 
317 
318 
319  return (p(0, evt).Dot(qV)
320  - p0.Dot(pA) * pA.Dot(qV) / (MA*MA)
321  - p0.Dot(pV) * pV.Dot(qV) / (MassV*MassV)
322  + p0.Dot(pA) * pA.Dot(pV) * pV.Dot(qV) / (MA*MA * MassV*MassV)
323  )
324  /(GeV*GeV)
325  ;
326 }
328  // bool debugThis = false;
329 
330  if(! ( fsPS[0] && fsPS[1] && fsPS[2] && fsPS[3]) ) return;
331  os << "spin factor SF_DtoAP0_AtoVP1_VtoP2P3"
332  << "\n\t (p(0).Dot(qV)"
333  << "\n\t - p(0).Dot(pA) * pA.Dot(qV) / (MA*MA)"
334  << "\n\t - p(0).Dot(pV) * pV.Dot(qV) / (MassV*MassV)"
335  << "\n\t + p(0).Dot(pA) * pA.Dot(pV) * pV.Dot(qV) / (MA*MA * MassV*MassV)"
336  << "\n\t )"
337  << "\n\t /(GeV*GeV)"
338  << "\n\t with qV = p(2) - p(3) and pA = p(1) + p(2) + p(3)"
339  << "\n\t parsed tree " << theDecay().oneLiner()
340  << "\n like this:" << endl;
341  this->printParsing(os);
342 }
343 //=========================================================
344 
346  if(0==_exampleDecay){
347  _exampleDecay = new DecayTree(421);
348  // remark: addDgtr always returns a pointer to the
349  // last daughter that was added, thus allowing these
350  // chains:
351  _exampleDecay->addDgtr(-321, 10323)->addDgtr(211, 10311)->addDgtr(321,-211);
352  }
353  return *_exampleDecay;
354 }
355 
357  return getExampleDecay();
358 }
359 
361  // bool debugThis=false;
362  if(fsPS.size() < 4) fsPS.reserve(4);
363  for(int i=0; i< theDecay(pat).nDgtr(); i++){
365  theDecay(pat).getDgtrTreePtr(i);
366 
367  if (dgtr->getVal().SVPAT() == "A" && ! dgtr->isFinalState()) A = dgtr;
368  else if(dgtr->getVal().SVPAT() == "P" && dgtr->isFinalState()) fsPS[0] = dgtr;
369  }
370  if(0==A || 0==fsPS[0]){
371  cout << "ERROR in SF_DtoAP0_AtoSP1_StoP2P3::parseTree"
372  << " Didn't find A or P1 " << A.get() << ", " << fsPS[0].get() << endl;
373  return false;
374  }
375 
376  for(int i=0; i< A->nDgtr(); i++){
377  const_counted_ptr<AssociatedDecayTree> dgtr= A->getDgtrTreePtr(i);
378  if (dgtr->getVal().SVPAT() == "S" && ! dgtr->isFinalState()) S = dgtr;
379  else if(dgtr->getVal().SVPAT() == "P" && dgtr->isFinalState()) fsPS[1] = dgtr;
380  }
381  if(0==S || 0==fsPS[1]){
382  cout << "ERROR in SF_DtoAP0_AtoSP1_StoP2P3::parseTree"
383  << " Didn't find S or P2 " << S.get() << ", " << fsPS[1].get() << endl;
384  return false;
385  }
386 
387  if(S->nDgtr() != 2){
388  cout << "ERROR in SF_DtoAP0_AtoSP1_StoP2P3::parseTree"
389  << " S should have 2 daughters, but it says it has "
390  << S->nDgtr() << "."
391  << endl;
392  return false;
393  }
394  fsPS[2] = S->getDgtrTreePtr(0);
395  fsPS[3] = S->getDgtrTreePtr(1);
396 
397  // normalOrder(fsPS[2], fsPS[3]);
398 
399  // this->printYourself();
400  return true;
401 }
402 
404  if(! ( fsPS[0] && fsPS[1] && fsPS[2] && fsPS[3]) ) parseTree(evt.eventPattern());
405 
406  TLorentzVector p0(p(0, evt)), p1(p(1, evt)), p2(p(2, evt)), p3(p(3, evt));
407  TLorentzVector pV = p2+p3;
408 
409  TLorentzVector pA = p1 + p2 + p3;
410  TLorentzVector qA = (p2 + p3) - p1;
411 
412  TLorentzVector pD = pA + p0;
413  TLorentzVector qD = pA - p0;
414 
415  double MA = mRes(A, evt);
416 
417  if(_useZemachTensors){
418  ZTspin1 LD(qD,pD,pD.M());
419  ZTspin1 LA(qA,pA,MA);
420  return (LD.Dot(LA))/(GeV*GeV);
421  }
422 
423 
424  return (p0.Dot(qA)
425  - p0.Dot(pA) * pA.Dot(qA) / (MA*MA)
426  )
427  /(GeV*GeV)
428  ;
429 }
431  // bool debugThis = false;
432 
433  if(! ( fsPS[0] && fsPS[1] && fsPS[2] && fsPS[3]) ) return;
434  os << "spin factor SF_DtoAP0_AtoSP1_StoP2P3"
435  << "\n\t ( p(0).Dot(qA) - p(0).Dot(pA) * pA.Dot(qA) / (MA*MA) ) / (GeV*GeV)"
436  << "\n\t with pV = p(2) + p(3), pA = p(1) + p(2) + p(3), qA = (p(2) + p(3)) - p(1)"
437  << "\n\t parsed tree " << theDecay().oneLiner()
438  << "\n like this:" << endl;
439  this->printParsing(os);
440 }
441 //=========================================================
442 
444  if(0==_exampleDecayS){
445  _exampleDecayS = new DecayTree(421);
446  // remark: addDgtr always returns a pointer to the
447  // last daughter that was added, thus allowing these
448  // chains:
449  _exampleDecayS->addDgtr( 313)->addDgtr( 321, -211);
450  _exampleDecayS->addDgtr(-313)->addDgtr(-321, 211);
451  }
452  return *_exampleDecayS;
453 }
454 
456  if(0==_exampleDecayP){
457  _exampleDecayP = new DecayTree(421);
458  // remark: addDgtr always returns a pointer to the
459  // last daughter that was added, thus allowing these
460  // chains:
461  _exampleDecayP->addDgtr( 313)->addDgtr( 321, -211);
462  _exampleDecayP->addDgtr(-313)->addDgtr(-321, 211);
463 
464  _exampleDecayP->getVal().setL(1);
465  }
466  return *_exampleDecayP;
467 }
468 
470  if(0==_exampleDecayD){
471  _exampleDecayD = new DecayTree(421);
472  // remark: addDgtr always returns a pointer to the
473  // last daughter that was added, thus allowing these
474  // chains:
475  _exampleDecayD->addDgtr( 313)->addDgtr( 321, -211);
476  _exampleDecayD->addDgtr(-313)->addDgtr(-321, 211);
477 
478  _exampleDecayD->getVal().setL(2);
479  }
480  return *_exampleDecayD;
481 }
482 
484  return getExampleDecay();
485 }
487  return getExampleDecay();
488 }
489 
491  return getExampleDecay();
492 }
493 
495  // bool debugThis=false;
496  if(fsPS.size() < 4) fsPS.reserve(4);
497  if(theDecay(pat).nDgtr() != 2){
498  cout << "ERROR in SF_DtoV1V2_V1toP0P1_V1toP2P3_BASE::parseTree"
499  << " expected exactly 2 daughers of D, have "
500  << theDecay(pat).nDgtr();
501  return false;
502  }
503  V1 = theDecay(pat).getDgtrTreePtr(0);
504  V2 = theDecay(pat).getDgtrTreePtr(1);
505 
506  if(0==V1 || 0==V2){
507  cout << "ERROR in SF_DtoV1V2_V1toP0P1_V1toP2P3_BASE::parseTree"
508  << " Didn't find V1 or V2 " << V1.get() << ", " << V2.get() << endl;
509  return false;
510  }
511  if(V1->nDgtr() != 2){
512  cout << "ERROR in SF_DtoV1V2_V1toP0P1_V1toP2P3_BASE::parseTree"
513  << " V1 should have 2 daughters, but it says it has "
514  << V1->nDgtr() << "."
515  << endl;
516  return false;
517  }
518  fsPS[0] = V1->getDgtrTreePtr(0);
519  fsPS[1] = V1->getDgtrTreePtr(1);
520  // normalOrder(fsPS[0], fsPS[1]);
521 
522  if(V2->nDgtr() != 2){
523  cout << "ERROR in SF_DtoV1V2_V1toP0P1_V1toP2P3_BASE::parseTree"
524  << " V2 should have 2 daughters, but it says it has "
525  << V2->nDgtr() << "."
526  << endl;
527  return false;
528  }
529  fsPS[2] = V2->getDgtrTreePtr(0);
530  fsPS[3] = V2->getDgtrTreePtr(1);
531 
532  // normalOrder(fsPS[2], fsPS[3]);
533 
534  return true;
535 }
536 
538  bool dbThis=false;
539  if(! ( fsPS[0] && fsPS[1] && fsPS[2] && fsPS[3]) ){
540  parseTree(evt.eventPattern());
541  }
542 
543  TLorentzVector pV1 = p(0, evt) + p(1, evt);
544  TLorentzVector qV1 = p(0, evt) - p(1, evt);
545  TLorentzVector pV2 = p(2, evt) + p(3, evt);
546  TLorentzVector qV2 = p(2, evt) - p(3, evt);
547 
548  double MV1 = mRes(V1, evt);
549  double MV2 = mRes(V2, evt);
550 
551 
552  double returnVal= (qV1.Dot(qV2)
553  - qV1.Dot(pV1) * pV1.Dot(qV2) / (MV1*MV1)
554  - qV1.Dot(pV2) * pV2.Dot(qV2) / (MV2*MV2)
555  + qV1.Dot(pV1) * pV1.Dot(pV2) * pV2.Dot(qV2)
556  / (MV1*MV1 * MV2*MV2)
557  )
558  /(GeV*GeV)
559  ;
560 
561  if(dbThis){
562  ZTspin1 tV1(qV1, pV1, MV1);
563  ZTspin1 tV2(qV2, pV2, MV2);
564 
565  double zResult = tV1.Contract(tV2);
566  cout << "SF_DtoV1V2_V1toP0P1_V1toP2P3_S compare: " << zResult << " / "
567  << returnVal << " = " << zResult/returnVal << endl;
568  }
569  return returnVal;
570 }
571 
573  // bool debugThis = false;
574 
575  if(! ( fsPS[0] && fsPS[1] && fsPS[2] && fsPS[3]) ) return;
576  os << "spin factor SF_DtoV1V2_V1toP0P1_V1toP2P3_S"
577  << "\n\t ( qV1.Dot(qV2)"
578  << "\n\t - qV1.Dot(pV1) * pV1.Dot(qV2) / (MV1*MV1)"
579  << "\n\t - qV1.Dot(pV2) * pV2.Dot(qV2) / (MV2*MV2)"
580  << "\n\t + qV1.Dot(pV1) * pV1.Dot(pV2) * pV2.Dot(qV2) "
581  << "\n\t / (MV1*MV1 * MV2*MV2)"
582  << "\n\t )"
583  << "\n\t /(GeV*GeV)"
584  << "\n\t with pV1 = p(0) + p(1), qV1 = p(0) - p(1), pV2 = p(2) + p(3), qV2 = p(2) - p(3)"
585  << "\n\t parsed tree " << theDecay().oneLiner()
586  << "\n like this:" << endl;
587  this->printParsing(os);
588 }
589 // -------------------------
590 
592  bool dbThis=false;
593  // double check this!!
594  if(! ( fsPS[0] && fsPS[1] && fsPS[2] && fsPS[3]) ) parseTree(evt.eventPattern());
595 
596  TLorentzVector pV1 = p(0, evt) + p(1, evt);
597  TLorentzVector qV1 = p(0, evt) - p(1, evt);
598  TLorentzVector pV2 = p(2, evt) + p(3, evt);
599  TLorentzVector qV2 = p(2, evt) - p(3, evt);
600 
601  TLorentzVector pD = pV1 + pV2;
602  TLorentzVector qD = pV1 - pV2;
603 
604  if (_useZemachTensors) {
605  double MV1 = mRes(V1, evt);
606  double MV2 = mRes(V2, evt);
607 
608  ZTspin1 LD(qD,pD,pD.M());
609  ZTspin1 LV1(qV1,pV1,MV1);
610  ZTspin1 LV2(qV2,pV2,MV2);
611 
612  if(dbThis){
613  cout << LeviCivita(pD,LD,LV1).Dot(LV2) << endl;
614  cout << LeviCivita(pD,LD,LV1,LV2) << endl << endl;
615  }
616  return LeviCivita(pD,LD,LV1).Dot(LV2)/(GeV*GeV*GeV*GeV);
617  }
618 
619  /*
620  double sum=0;
621  for(int a=0; a<4; a++){
622  for(int b=0; b<4; b++){
623  if(a==b) continue;
624  for(int c=0; c<4; c++){
625  if(a==c || b==c) continue;
626  for(int d=0; d<4; d++){
627  if(a==d || b==d || c==d) continue;
628  sum += LeviCita(a, b, c, d)
629  * pD[ (a + 3)%4 ] // coping with the stupid, stupid
630  * qD[ (b + 3)%4 ] // stupid, stupid convention in TLorentzVector
631  * qV1[ (c + 3)%4 ] // that index 0 = p_x, 1=py, 2=pz, 3=Energy
632  * qV2[ (d + 3)%4 ] // arrrrgh. ARRRRRRRGH!!! Rene!!! Why????
633  ; // (0 + 3)%4 = 3, (1+3)%4 = 0, (2+3)%4 = 1 (3+3)%4 = 2
634  }
635  }
636  }
637  }
638 
639  if(dbThis){
640  cout << " compare leviCivitas " << sum << ", "
641  << LeviCivita(pD, qD, qV1, qV2)
642  << endl;
643  }
644  return sum;
645  */
646  return LeviCivita(pD, qD, qV1, qV2)/(GeV*GeV*GeV*GeV);
647 }
649  // bool debugThis = false;
650  if(! ( fsPS[0] && fsPS[1] && fsPS[2] && fsPS[3]) ) return;
651  os << "spin factor SF_DtoV1V2_V1toP0P1_V1toP2P3_P"
652  << "\n\t LeviCivita(pD, qD, qV1, qV2)"
653  << "\n\t with pV1 = p(0) + p(1), qV1 = p(0) - p(1), pV2 = p(2) + p(3), qV2 = p(2) - p(3)"
654  << "\n\t parsed tree " << theDecay().oneLiner()
655  << "\n like this:" << endl;
656  this->printParsing(os);
657 }
658 // -------------------------
659 
661  // double check this!!
662  bool dbThis=false;
663 
664  if(! ( fsPS[0] && fsPS[1] && fsPS[2] && fsPS[3]) ) parseTree(evt.eventPattern());
665 
666  TLorentzVector pV1 = p(0, evt) + p(1, evt);
667  TLorentzVector qV1 = p(0, evt) - p(1, evt);
668  TLorentzVector pV2 = p(2, evt) + p(3, evt);
669  TLorentzVector qV2 = p(2, evt) - p(3, evt);
670 
671  double MV1 = mRes(V1, evt);
672  double MV2 = mRes(V2, evt);
673 
674 
675  if (_useZemachTensors) {
676  TLorentzVector pD = pV1 + pV2;
677  TLorentzVector qD = pV1 - pV2;
678  double mD = pD.M();
679 
680  ZTspin1 tV1(qV1, pV1, MV1);
681  ZTspin1 tV2(qV2, pV2, MV2);
682  ZTspin2 tD(qD, pD, mD);
683 
684  return tV1.Contract(tD.Contract(tV2))/(GeV*GeV*GeV*GeV);
685  }
686 
687  double returnVal =
688  ( qV1.Dot(pV2) - qV1.Dot(pV1) * pV1.Dot(pV2)/(MV1*MV1)
689  )*(
690  qV2.Dot(pV1) - qV2.Dot(pV2) * pV2.Dot(pV1)/(MV2*MV2)
691  )
692  / (GeV*GeV*GeV*GeV)
693  ;
694 
695  if(dbThis){
696  TLorentzVector pD = -(pV1 + pV2);
697  TLorentzVector qD = pV1 - pV2;
698  double mD = pD.M();
699 
700 
701  ZTspin1 tV1(qV1, pV1, MV1);
702  ZTspin1 tV2(qV2, pV2, MV2);
703  //ZTspin2 tD(pD + pV1, pD - pV1, mD);
704  ZTspin2 tD(qD, pD, mD);
705  //ZTspin2 tD(qD, pD, mD);
706 
707  double z1Result = tV1.Contract(tD.Contract(tV2))/(GeV*GeV*GeV*GeV);
708  double z2Result = tV1.Dot(pV2) * tV2.Dot(pV1)/(GeV*GeV*GeV*GeV);
709  double z3Result = tV1.Dot(tV2) * tD.Contract_2(tD)/(GeV*GeV* GeV*GeV*GeV*GeV *GeV*GeV*GeV*GeV);
710  cout << "SF_DtoV1V2_V1toP0P1_V1toP2P3_D compare: 1/n " << z1Result << " / "
711  << returnVal << " = " << z1Result/returnVal << endl;
712  cout << " .... and compare: 2/n " << z2Result << " / "
713  << returnVal << " = " << z2Result/returnVal << endl;
714  cout << " .... and compare: 2/1 " << z2Result << " / "
715  << z1Result << " = " << z2Result/z1Result << endl;
716  cout << " .... and compare: 3/n " << z3Result << " / "
717  << returnVal << " = " << z3Result/returnVal << endl;
718  cout << " .... and compare: 3/1 " << z3Result << " / "
719  << z1Result << " = " << z3Result/z1Result << endl;
720 
721  }
722 
723  return returnVal;
724 
725 }
727  // bool debugThis = false;
728  if(! ( fsPS[0] && fsPS[1] && fsPS[2] && fsPS[3]) ) return;
729  os << "spin factor SF_DtoV1V2_V1toP0P1_V1toP2P3_D"
730  << "\n\t ( qV1.Dot(pV2) - qV1.Dot(pV1) * pV1.Dot(pV2)/(MV1*MV1)"
731  << "\n\t )*( "
732  << "\n\t qV2.Dot(pV1) - qV2.Dot(pV2) * pV2.Dot(pV1)/(MV2*MV2)"
733  << "\n\t )"
734  << "\n\t / (GeV*GeV*GeV*GeV)"
735  << "\n\t with pV1 = p(0) + p(1), qV1 = p(0) - p(1), pV2 = p(2) + p(3), qV2 = p(2) - p(3)"
736  << "\n\t parsed tree " << theDecay().oneLiner()
737  << "\n like this:" << endl;
738  this->printParsing(os);
739 }
740 
741 //=========================================================
742 
744  if(0==_exampleDecay){
745  _exampleDecay = new DecayTree(421);
746  // remark: addDgtr always returns a pointer to the
747  // last daughter that was added, thus allowing these
748  // chains:
749  _exampleDecay->addDgtr(-321, 321);
750  _exampleDecay->addDgtr( 113)->addDgtr( 211, -211);
751  }
752  return *_exampleDecay;
753 }
754 
756  return getExampleDecay();
757 }
758 
760  // bool debugThis=false;
761  if(fsPS.size() < 4) fsPS.reserve(4);
762  int P_index=0;
763  for(int i=0; i< theDecay(pat).nDgtr(); i++){
764  const_counted_ptr<AssociatedDecayTree> dgtr= theDecay(pat).getDgtrTreePtr(i);
765  if(dgtr->getVal().SVPAT() == "V" && ! dgtr->isFinalState()) V2 = dgtr;
766  else if(dgtr->getVal().SVPAT() == "P" && dgtr->isFinalState()){
767  fsPS[P_index++] = dgtr;
768  }
769  }
770  if(0==V2){
771  cout << "ERROR in SF_DtoV1V2_V1toP0P1_V1toP2P3_S_nonResV1::parseTree"
772  << " Didn't find V " << V2.get() << endl;
773  return false;
774  }
775  if(P_index != 2 || 0==(fsPS[0]) || 0==(fsPS[1]) ){
776  cout << "ERROR in SF_DtoV1V2_V1toP0P1_V1toP2P3_S_nonResV1::parseTree"
777  << " Didn't find P1, P2 " << endl;
778  return false;
779  }
780  if(V2->nDgtr() != 2){
781  cout << "ERROR in SF_DtoV1V2_V1toP0P1_V1toP2P3_S_nonResV1::parseTree"
782  << " V should have 2 daughters, but it says it has "
783  << V2->nDgtr() << "."
784  << endl;
785  return false;
786  }
787  fsPS[2] = V2->getDgtrTreePtr(0);
788  fsPS[3] = V2->getDgtrTreePtr(1);
789  // normalOrder(fsPS[2], fsPS[3]);
790 
791  // this->printYourself();
792  return true;
793 }
794 
796  if(! ( fsPS[0] && fsPS[1] && fsPS[2] && fsPS[3]) ) parseTree(evt.eventPattern());
797 
798  TLorentzVector pV1 = p(0, evt) + p(1, evt);
799  TLorentzVector qV1 = p(0, evt) - p(1, evt);
800  TLorentzVector pV2 = p(2, evt) + p(3, evt);
801  TLorentzVector qV2 = p(2, evt) - p(3, evt);
802 
803  double MV1 = pV1.M();
804  double MV2 = mRes(V2, evt);
805 
806  return (qV1.Dot(qV2)
807  - qV1.Dot(pV1) * pV1.Dot(qV2) / (MV1*MV1)
808  - qV1.Dot(pV2) * pV2.Dot(qV2) / (MV2*MV2)
809  + qV1.Dot(pV1) * pV1.Dot(pV2) * pV2.Dot(qV2)
810  / (MV1*MV1 * MV2*MV2)
811  )
812  /(GeV*GeV)
813  ;
814 
815 }
817  // bool debugThis = false;
818  if(! ( fsPS[0] && fsPS[1] && fsPS[2] && fsPS[3]) ) return;
819  os << "spin factor SF_DtoV1V2_V1toP0P1_V1toP2P3_S_nonResV1"
820  << " - I recommend not to use this, use nonRes particles insted "
821  << " anyway, this is what I do:"
822  << "\n\t (qV1.Dot(qV2)"
823  << "\n\t - qV1.Dot(pV1) * pV1.Dot(qV2) / (MV1*MV1)"
824  << "\n\t - qV1.Dot(pV2) * pV2.Dot(qV2) / (MV2*MV2)"
825  << "\n\t + qV1.Dot(pV1) * pV1.Dot(pV2) * pV2.Dot(qV2) "
826  << "\n\t / (MV1*MV1 * MV2*MV2)"
827  << "\n\t )"
828  << "\n\t /(GeV*GeV)"
829  << "\n\t with: pV1 = p(0) + p(1), qV1 = p(0) - p(1), pV2 = p(2) + p(3) qV2 = p(2) - p(3);"
830  << "\n\t parsed tree " << theDecay().oneLiner()
831  << "\n like this:" << endl;
832  this->printParsing(os);
833 }
834 //=========================================================
835 
837  if(0==_exampleDecay){
838  _exampleDecay = new DecayTree(421);
839  // remark: addDgtr always returns a pointer to the
840  // last daughter that was added, thus allowing these
841  // chains:
842  _exampleDecay->addDgtr( 333)->addDgtr( 321, -321); // V
843  _exampleDecay->addDgtr(9010221)->addDgtr(-211, 211); // S
844  }
845  return *_exampleDecay; // this example is not necessarily physical.
846 }
847 
849  return getExampleDecay();
850 }
851 
853  // bool debugThis=false;
854  if(fsPS.size() < 4) fsPS.reserve(4);
855  for(int i=0; i< theDecay(pat).nDgtr(); i++){
856  const_counted_ptr<AssociatedDecayTree> dgtr= theDecay(pat).getDgtrTreePtr(i);
857  if (dgtr->getVal().SVPAT() == "V" && ! dgtr->isFinalState()) V = dgtr;
858  else if(dgtr->getVal().SVPAT() == "S" && ! dgtr->isFinalState()) S = dgtr;
859  }
860  if(0==V || 0==S){
861  cout << "ERROR in SF_DtoVS_VtoP0P1_StoP2P3::parseTree"
862  << " Didn't find V or S " << V.get() << ", " << S.get() << endl;
863  return false;
864  }
865  if(V->nDgtr() != 2){
866  cout << "ERROR in SF_DtoVS_VtoP0P1_StoP2P3::parseTree"
867  << " V should have 2 daughters, but it says it has "
868  << V->nDgtr() << "."
869  << endl;
870  return false;
871  }
872  fsPS[0] = V->getDgtrTreePtr(0);
873  fsPS[1] = V->getDgtrTreePtr(1);
874  // normalOrder(fsPS[0], fsPS[1]);
875 
876  if(S->nDgtr() != 2){
877  cout << "ERROR in SF_DtoVS_VtoP0P1_StoP2P3::parseTree"
878  << " S should have 2 daughters, but it says it has "
879  << S->nDgtr() << "."
880  << endl;
881  return false;
882  }
883  fsPS[2] = S->getDgtrTreePtr(0);
884  fsPS[3] = S->getDgtrTreePtr(1);
885  // normalOrder(fsPS[2], fsPS[3]);
886 
887  // this->printYourself();
888  return true;
889 }
890 
892  if(! ( fsPS[0] && fsPS[1] && fsPS[2] && fsPS[3]) ) parseTree(evt.eventPattern());
893 
894  TLorentzVector pS = p(2, evt) + p(3, evt);
895  TLorentzVector pV = p(0, evt) + p(1, evt);
896  TLorentzVector qV = p(0, evt) - p(1, evt);
897 
898  double MassV = mRes(V, evt);
899 
900  if(_useZemachTensors){
901  TLorentzVector pD= pV + pS;
902  TLorentzVector qD= pV - pS;
903  ZTspin1 LD(qD,pD,pD.M());
904  ZTspin1 LV(qV,pV,MassV);
905  return (LD.Dot(LV))/(GeV*GeV);
906  }
907 
908  return (pS.Dot(qV)
909  - pS.Dot(pV) * pV.Dot(qV) / (MassV*MassV)
910  )
911  /(GeV*GeV)
912  ;
913 }
915  // bool debugThis = false;
916  if(! ( fsPS[0] && fsPS[1] && fsPS[2] && fsPS[3]) ) return;
917  os << "spin factor SF_DtoVS_VtoP0P1_StoP2P3"
918  << "\n\t ( pS.Dot(qV) - pS.Dot(pV) * pV.Dot(qV) / (MassV*MassV) ) / (GeV*GeV)"
919  << "\n\t with: pS = p(2) + p(3), pV = p(0) + p(1), qV = p(0) - p(1)"
920  << "\n\t parsed tree " << theDecay().oneLiner()
921  << "\n like this:" << endl;
922  this->printParsing(os);
923 }
924 //=========================================================
925 
927  if(0==_exampleDecay){
928  _exampleDecay = new DecayTree(421);
929  // remark: addDgtr always returns a pointer to the
930  // last daughter that was added, thus allowing these
931  // chains:
932  _exampleDecay->addDgtr( 321, -321); // V (non res)
933  _exampleDecay->addDgtr(9010221)->addDgtr(-211, 211); // S
934  }
935  return *_exampleDecay; // this example is not necessarily physical.
936 }
937 
939  return getExampleDecay();
940 }
941 
943  // bool debugThis=false;
944  if(fsPS.size() < 4) fsPS.reserve(4);
945  int P_index=0;
946  for(int i=0; i< theDecay(pat).nDgtr(); i++){
947  const_counted_ptr<AssociatedDecayTree> dgtr= theDecay(pat).getDgtrTreePtr(i);
948  if(dgtr->getVal().SVPAT() == "S" && ! dgtr->isFinalState()) S = dgtr;
949  else if(dgtr->getVal().SVPAT() == "P" && dgtr->isFinalState()){
950  fsPS[P_index++] = dgtr;
951  }
952  }
953  if(0==S){
954  cout << "ERROR in SF_DtoVS_VtoP0P1_StoP2P3_nonResV::parseTree"
955  << " Didn't find S " << S.get() << endl;
956  return false;
957  }
958  if(P_index != 2 || 0==(fsPS[0]) || 0==(fsPS[1]) ){
959  cout << "ERROR in SF_DtoVS_VtoP0P1_StoP2P3_nonResV::parseTree"
960  << " Didn't find P1, P2 " << endl;
961  return false;
962  }
963  if(S->nDgtr() != 2){
964  cout << "ERROR in SF_DtoVS_VtoP0P1_StoP2P3_nonResV::parseTree"
965  << " S should have 2 daughters, but it says it has "
966  << S->nDgtr() << "."
967  << endl;
968  return false;
969  }
970  fsPS[2] = S->getDgtrTreePtr(0);
971  fsPS[3] = S->getDgtrTreePtr(1);
972  // normalOrder(fsPS[2], fsPS[3]);
973 
974  // this->printYourself();
975  return true;
976 }
977 
979  if(! ( fsPS[0] && fsPS[1] && fsPS[2] && fsPS[3]) ) parseTree(evt.eventPattern());
980 
981  TLorentzVector pS = p(2, evt) + p(3, evt);
982  TLorentzVector pV = p(0, evt) + p(1, evt);
983  TLorentzVector qV = p(0, evt) - p(1, evt);
984 
985  double MassV = pV.M();
986 
987  return (pS.Dot(qV)
988  - pS.Dot(pV) * pV.Dot(qV) / (MassV*MassV)
989  )
990  /(GeV*GeV)
991  ;
992 }
994  // bool debugThis = false;
995  if(! ( fsPS[0] && fsPS[1] && fsPS[2] && fsPS[3]) ) return;
996  os << "spin factor SF_DtoVS_VtoP0P1_StoP2P3_nonResV"
997  << " - recommend not to use this, use nonRes particles instead"
998  << "\n anyway, I return:"
999  << "\n\t (pS.Dot(qV) - pS.Dot(pV) * pV.Dot(qV) / (MassV*MassV) ) / (GeV*GeV)"
1000  << "\n\t with: pS = p(2) + p(3), pV = p(0) + p(1), qV = p(0) - p(1)"
1001  << "\n\t parsed tree " << theDecay().oneLiner()
1002  << "\n like this:" << endl;
1003  this->printParsing(os);
1004 }
1005 
1006 //=========================================================
1007 // provided by Loic Esteve:
1009  if(0==_exampleDecay){
1010  _exampleDecay = new DecayTree(421);
1011  // remark: addDgtr always returns a pointer to the
1012  // last daughter that was added, thus allowing these
1013  // chains:
1014  _exampleDecay->addDgtr(310, 223)->addDgtr(111, 113)->addDgtr(211, -211);
1015  }
1016  return *_exampleDecay;
1017 }
1019  return getExampleDecay();
1020 }
1021 
1022 
1024  // bool debugThis=false;
1025  if(fsPS.size() < 4) fsPS.reserve(4);
1026  for(int i=0; i< theDecay(pat).nDgtr(); i++){
1027  const_counted_ptr<AssociatedDecayTree> dgtr= theDecay(pat).getDgtrTreePtr(i);
1028  if (dgtr->getVal().SVPAT() == "P" && dgtr->isFinalState()) fsPS[0] = dgtr;
1029  else if(dgtr->getVal().SVPAT() == "V" && ! dgtr->isFinalState()) V1 = dgtr;
1030  }
1031  if(0==V1 || 0==fsPS[0]){
1032  cout << "ERROR in SF_DtoV1P0_V1toV2P1_V2toP2P3::parseTree"
1033  << " Didn't find V1 or P0 " << V1.get() << ", " << fsPS[0].get() << endl;
1034  return false;
1035  }
1036 
1037  for(int i=0; i< V1->nDgtr(); i++){
1038  const_counted_ptr<AssociatedDecayTree> dgtr= V1->getDgtrTreePtr(i);
1039  if (dgtr->getVal().SVPAT() == "V" && ! dgtr->isFinalState()) V2 = dgtr;
1040  else if(dgtr->getVal().SVPAT() == "P" && dgtr->isFinalState()) fsPS[1] = dgtr;
1041  }
1042  if(0==V2 || 0==fsPS[1]){
1043  cout << "ERROR in SF_DtoV1P0_V1toV2P1_V2toP2P3::parseTree"
1044  << " Didn't find V2 or P1 " << V2.get() << ", " << fsPS[1].get() << endl;
1045  return false;
1046  }
1047 
1048  if(V2->nDgtr() != 2){
1049  cout << "ERROR in SF_DtoV1P0_V1toV2P1_V2toP2P3::parseTree"
1050  << " V should have 2 daughters, but it says it has "
1051  << V2->nDgtr() << "."
1052  << endl;
1053  return false;
1054  }
1055  fsPS[2] = V2->getDgtrTreePtr(0);
1056  fsPS[3] = V2->getDgtrTreePtr(1);
1057  // normalOrder(fsPS[2], fsPS[3]);
1058 
1059  // this->printYourself();
1060  return true;
1061 }
1062 
1064  if(! ( fsPS[0] && fsPS[1] && fsPS[2] && fsPS[3]) ) parseTree(evt.eventPattern());
1065 
1066  TLorentzVector pV1 = p(1, evt) + p(2, evt) + p(3, evt);
1067  TLorentzVector pV2 = p(2, evt) + p(3, evt);
1068  TLorentzVector pP1 = p(0, evt);
1069 
1070  TLorentzVector qV1 = (p(2, evt) + p(3, evt)) - p(1, evt);
1071  TLorentzVector qV2 = p(2, evt) - p(3, evt);
1072 
1073  double units = GeV*GeV*GeV*GeV;
1074 
1075  if (_useZemachTensors) {
1076  double MV1 = mRes(V1, evt);
1077  double MV2 = mRes(V2, evt);
1078 
1079  TLorentzVector pD = pV1 + p(0, evt);
1080  TLorentzVector qD = pV1 - p(0, evt);
1081 
1082  ZTspin1 LD(qD,pD,pD.M());
1083  ZTspin1 LV1(qV1,pV1,MV1);
1084  ZTspin1 LV2(qV2,pV2,MV2);
1085  SpinSumV PV1(pV1,MV1);
1086 
1087  TLorentzVector tmp = PV1.Dot(LD);
1088 
1089  return LeviCivita(pV1,LV1,LV2).Dot(tmp)/units;
1090  }
1091 
1092 
1093  return LeviCivita(pV1, qV1, pP1, qV2)/units;
1094 }
1095 
1097  // bool debugThis = false;
1098  if(! ( fsPS[0] && fsPS[1] && fsPS[2] && fsPS[3]) ) return;
1099  os << "spin factor SF_DtoV1P0_V1toV2P1_V2toP2P3"
1100  << "\n\t return: LeviCivita(pV1, qV1, pP1, qV2)/ / GeV^4"
1101  << "\n\t with pV1 = p(1) + p(2) + p(3), pP1 = p(0)"
1102  << "\n\t and qV1 = (p(2) + p(3)) - p(1), qV2 = p(2) - p(3)"
1103  << "\n\t parsed tree " << theDecay().oneLiner()
1104  << "\n like this:" << endl;
1105  this->printParsing(os);
1106 }
1107 
1108 //=========================================================
1109 
1111  // bool debugThis = false;
1112 
1113  // from pg 35 of Phys.Rev.D75:052003,2007
1114  // at http://prd.aps.org/abstract/PRD/v75/i5/e052003
1115  // and at http://arxiv.org/abs/hep-ex/0701001
1116  // except that we use MA^2 instead of p_a^2 and MV^2 instead of p_v^2
1117 
1118  if(! ( fsPS[0] && fsPS[1] && fsPS[2] && fsPS[3]) ) parseTree(evt.eventPattern());
1119 
1120  TLorentzVector pV = p(2, evt) + p(3, evt);
1121  TLorentzVector qV = p(2, evt) - p(3, evt);
1122 
1123  TLorentzVector pA = p(1, evt) + p(2, evt) + p(3, evt);
1124  TLorentzVector qA = p(1, evt) - (p(2, evt) + p(3, evt));
1125 
1126  TLorentzVector pD = p(0, evt) + pA;
1127  TLorentzVector qD = pA - p(0, evt);
1128 
1129  double MA = mRes(A, evt);
1130  double MV = mRes(V, evt);
1131 
1132  ZTspin1 tA(qA, pA, MA);
1133  ZTspin1 tV(qV, pV, MV);
1134 
1135  double units = GeV*GeV*GeV*GeV;
1136 
1137  if(_useZemachTensors){
1138  ZTspin1 LD(qD,pD,pD.M());
1139  ZTspin1 LV(qV,pV,MV);
1140  ZTspin2 LA(qA,pA,MA);
1141  TLorentzVector tmp= LA.Contract(LV);
1142 
1143  //ZTspin1 LA1(qA,pA,MA);
1144  //SpinSumV PA(pA,MA);
1145  //return LD.Dot(LA1)*(LA1.Dot(LV)) + 1./3. * LD.Dot(PA.Dot(LV)) * LA1.Dot(LA1);
1146 
1147  return (LD.Dot(tmp))/units;
1148  }
1149 
1150  return p(0, evt).Dot(tA) * tV.Dot(pA) / units;
1151 }
1153  // bool debugThis = false;
1154 
1155  if(! ( fsPS[0] && fsPS[1] && fsPS[2] && fsPS[3]) ) return;
1156  os << "spin factor SF_DtoAP0_AtoVP1Dwavve_VtoP2P3"
1157  << " with\t pV = p(2) + p(3), qV = p(2) - p(3) "
1158  << "\n\t and pA = p(1) + p(2) + p(3), qA = p(1) - (p(2) + p(3));"
1159  << "\n\t evaluates as:"
1160  << "\n\t ZTspin1 tA(qA, pA, MA);"
1161  << "\n\t ZTspin1 tV(qV, pV, MV);"
1162  << "\n\t p(0).Dot(tA) * tV.Dot(pA) / (GeV*GeV*GeV*GeV);"
1163  << "\n\t parsed tree " << theDecay().oneLiner()
1164  << "\n like this:" << endl;
1165  this->printParsing(os);
1166 }
1167 //=========================================================
1168 //
1169 //
double Contract_2(const SymmLorentzMatrix &M)
virtual bool parseTree(const DalitzEventPattern &pat)
virtual void printYourself(std::ostream &os=std::cout) const
const X * get() const
Definition: counted_ptr.h:217
MINT::counted_ptr< DDTree< ValueType > > addDgtr(const DDTree< ValueType > *treePtr)
Definition: DDTree.h:211
virtual void printYourself(std::ostream &os=std::cout) const
virtual void printYourself(std::ostream &os=std::cout) const
virtual bool parseTree(const DalitzEventPattern &pat)
virtual double getVal(IDalitzEvent &evt)
std::string SVPAT() const
TLorentzVector Dot(const TLorentzVector &rhs) const
Definition: SpinSumV.h:20
virtual void printYourself(std::ostream &os=std::cout) const
virtual double getVal(IDalitzEvent &evt)
virtual bool parseTree(const DalitzEventPattern &pat)
virtual bool parseTree(const DalitzEventPattern &pat)
virtual bool parseTree(const DalitzEventPattern &pat)
const ValueType & getVal() const
Definition: DDTree.h:102
virtual void printYourself(std::ostream &os=std::cout) const
bool isFinalState() const
Definition: DDTree.h:93
static const DecayTree & getExampleDecay()
virtual const DecayTree & exampleDecay()
double Contract(const TLorentzVector &rhs) const
Definition: ZTspin1.h:15
void setL(int l)
Definition: DecayTreeItem.h:61
virtual bool parseTree(const DalitzEventPattern &pat)
virtual void printYourself(std::ostream &os=std::cout) const
virtual bool parseTree(const DalitzEventPattern &pat)
virtual const DalitzEventPattern & eventPattern() const =0
virtual void printYourself(std::ostream &os=std::cout) const
static const double GeV
Definition: ZTspin1.h:9
virtual bool parseTree(const DalitzEventPattern &pat)
double LeviCivita(const TLorentzVector &p0, const TLorentzVector &p1, const TLorentzVector &p2, const TLorentzVector &p3)
Definition: LeviCivita.h:12
virtual void printYourself(std::ostream &os=std::cout) const
int nDgtr() const
Definition: DDTree.h:96
virtual void printYourself(std::ostream &os=std::cout) const
DDTree< DecayTreeItem > DecayTree
Definition: DecayTree.h:35
virtual double getVal(IDalitzEvent &evt)
virtual void printYourself(std::ostream &os=std::cout) const
virtual double getVal(IDalitzEvent &evt)
virtual void printYourself(std::ostream &os=std::cout) const
TLorentzVector Contract(const TLorentzVector &vec)