Line data Source code
1 : #include "EvtGenBase/EvtPatches.hh"
2 : /*******************************************************************************
3 : * Project: BaBar detector at the SLAC PEP-II B-factory
4 : * Package: EvtGenBase
5 : * File: $Id: EvtTwoBodyKine.cpp,v 1.3 2009-03-16 15:37:54 robbep Exp $
6 : * Author: Alexei Dvoretskii, dvoretsk@slac.stanford.edu, 2001-2002
7 : *
8 : * Copyright (C) 2002 Caltech
9 : *******************************************************************************/
10 :
11 : #include <iostream>
12 : #include <assert.h>
13 : #include <math.h>
14 : #include "EvtGenBase/EvtTwoBodyKine.hh"
15 : #include "EvtGenBase/EvtReport.hh"
16 : using std::endl;
17 : using std::ostream;
18 :
19 :
20 : EvtTwoBodyKine::EvtTwoBodyKine()
21 0 : : _mA(0.), _mB(0.), _mAB(0.)
22 0 : {}
23 :
24 : EvtTwoBodyKine::EvtTwoBodyKine(double mA, double mB, double mAB)
25 0 : : _mA(mA), _mB(mB), _mAB(mAB)
26 0 : {
27 0 : if(mAB < mA + mB) {
28 :
29 0 : report(Severity::Info,"EvtGen") << mAB << " < " << mA << " + " << mB << endl;
30 0 : assert(0);
31 : }
32 0 : }
33 :
34 : EvtTwoBodyKine::EvtTwoBodyKine(const EvtTwoBodyKine& other)
35 0 : : _mA(other._mA), _mB(other._mB), _mAB(other._mAB)
36 0 : {}
37 :
38 : EvtTwoBodyKine::~EvtTwoBodyKine()
39 0 : {}
40 :
41 :
42 : double EvtTwoBodyKine::m(Index i) const
43 : {
44 0 : double ret = _mAB;
45 0 : if(A == i) ret = _mA;
46 : else
47 0 : if(B == i) ret = _mB;
48 :
49 0 : return ret;
50 : }
51 :
52 :
53 : double EvtTwoBodyKine::p(Index i) const
54 : {
55 : double p0 = 0.;
56 :
57 0 : if(i == AB) {
58 :
59 0 : double x = _mAB*_mAB - _mA*_mA - _mB*_mB;
60 0 : double y = 2*_mA*_mB;
61 0 : p0 = sqrt(x*x - y*y)/2./_mAB;
62 0 : }
63 : else
64 0 : if(i == A) {
65 :
66 0 : double x = _mA*_mA - _mAB*_mAB - _mB*_mB;
67 0 : double y = 2*_mAB*_mB;
68 0 : p0 = sqrt(x*x - y*y)/2./_mA;
69 0 : }
70 : else {
71 :
72 0 : double x = _mB*_mB - _mAB*_mAB - _mA*_mA;
73 0 : double y = 2*_mAB*_mA;
74 0 : p0 = sqrt(x*x - y*y)/2./_mB;
75 : }
76 :
77 0 : return p0;
78 : }
79 :
80 :
81 : double EvtTwoBodyKine::e(Index i, Index j) const
82 : {
83 0 : double ret = m(i);
84 0 : if(i != j) {
85 :
86 0 : double pD = p(j);
87 0 : ret = sqrt(ret*ret + pD*pD);
88 0 : }
89 0 : return ret;
90 : }
91 :
92 :
93 : void EvtTwoBodyKine::print(ostream& os) const
94 : {
95 0 : os << " mA = " << _mA << endl;
96 0 : os << " mB = " << _mB << endl;
97 0 : os << "mAB = " << _mAB << endl;
98 0 : }
99 :
100 :
101 : ostream& operator<<(ostream& os, const EvtTwoBodyKine& p)
102 : {
103 0 : p.print(os);
104 0 : return os;
105 : }
|