FairRoot/PandaRoot
invexp.C
Go to the documentation of this file.
1 // ****************************************************************
2 // invexp.C
3 // ****************************************************************
4 // Some helper functions for producing a TTree string expression
5 // for several kinematic variables out of (4-)vector components
6 //
7 // If a TTree contains the branches Part0px, ... , Part0e, Part1px, ... , Part1e
8 // the function m("Part0+Part1") gives "sqrt((Part0e+Part1e)^2-(Part0px+Part1px)^2-(Part0py+Part1py)^2-(Part0pz+Part1pz)^2)"
9 // as result. Works with + and - sign and arbitrary number of particles.
10 //
11 // USAGE: .L invexp.C+
12 // fnc(TString expr, TString suff)
13 //
14 // - expr : formula without suffixes, e.g. "p0+p2-p3-p4";
15 // if 1st character is a '*', suffixes used as prefixes, e.g. p("*p0+p1") results in "sqrt((pxp0+pxp1)^2+(pyp0+pyp1)^2+(pzp0+pzp1)^2)"
16 // - suff : list with suffixes; default : "e px py pz"
17 //
18 // Implemented functions are:
19 // - m() : invariant mass
20 // - m2() : invariant mass squared
21 // - p() : momentum
22 // - pt() : transvers momentum
23 // - pz() : z-component of momentum
24 // - tht() : polar angle in radians
25 // - thtd() : polar angle in degrees
26 // - ctht() : cosine of polar angle
27 // - dalitz() : expr = list of 3 particles, e.g. "p0 p1 p2" -> returns 'm2("p0+p1"):m2("p0+p2")'
28 //
29 // ****************************************************************
30 // K.Goetzen, GSI, 10/2015
31 // ****************************************************************
32 
33 
34 
35 #include "TObjString.h"
36 #include "TString.h"
37 #include "TObjArray.h"
38 
39 #include <vector>
40 
41 typedef std::vector<TString> StrVec;
42 
43 int SplitString(TString s, TString delim, StrVec &toks)
44 {
45  toks.clear();
46  TObjArray *tok = s.Tokenize(delim);
47  int N = tok->GetEntries();
48  for (int i=0;i<N;++i)
49  {
50  TString token = (((TObjString*)tok->At(i))->String()).Strip(TString::kBoth);
51  toks.push_back(token);
52  }
53  return toks.size();
54 }
55 
56 // ---------------------------------
57 // prepares the TString arrays
58 // ---------------------------------
59 
60 bool prepare(TString pts, TString exts, StrVec &c, StrVec &vars)
61 {
62  bool invord = false;
63 
64  if (pts.BeginsWith("*")) invord=true;
65  pts.ReplaceAll("*","");
66 
67  SplitString(exts," ",c);
68 
69  if (invord)
70  {
71  pts.ReplaceAll("-","- ");
72  pts.ReplaceAll("+","+ ");
73  }
74  else
75  {
76  pts.ReplaceAll("-"," -");
77  pts.ReplaceAll("+"," +");
78  }
79 
80  SplitString(pts," ",vars);
81 
82  return invord;
83 }
84 
85 // ---------------------------------
86 // makes the formula out of the vector components
87 // ---------------------------------
88 
89 TString makefml(TString pts, TString exts, int ncmp=4, TString last="-")
90 {
91  StrVec c,vars;
92  bool invord = prepare(pts, exts, c, vars);
93 
94  TString r="";
95 
96  for (int i=0;i<ncmp;++i)
97  {
98  r += "(";
99  for (unsigned int j=0;j<vars.size();++j) invord ? r += c[i]+vars[j] : r += vars[j]+c[i];
100  r += ")^2";
101  if (i<ncmp-1) r += last;
102  }
103  return r;
104 }
105 
106 // ---------------------------------
107 // ---------------------------------
108 
109 TString m(TString pts, TString exts="e px py pz")
110 {
111  return "sqrt("+makefml(pts,exts)+")";
112 }
113 
114 // ---------------------------------
115 // ---------------------------------
116 
117 TString m2(TString pts, TString exts="e px py pz")
118 {
119  return "("+makefml(pts,exts)+")";
120 }
121 
122 // ---------------------------------
123 // ---------------------------------
124 
125 TString p(TString pts, TString exts="px py pz")
126 {
127  return "sqrt("+makefml(pts,exts,3,"+")+")";
128 }
129 
130 // ---------------------------------
131 // ---------------------------------
132 
133 TString pt(TString pts, TString exts="px py pz")
134 {
135  return "sqrt("+makefml(pts,exts,2,"+")+")";
136 }
137 
138 // ---------------------------------
139 // ---------------------------------
140 
141 TString pz(TString pts, TString exts="px py pz")
142 {
143  StrVec c,vars;
144  bool invord = prepare(pts, exts, c, vars);
145 
146  TString r = "(";
147 
148  for (unsigned int j=0;j<vars.size();++j) invord ? r += c[2]+vars[j] :r += vars[j]+c[2];
149  r += ")";
150 
151  return r;
152 }
153 
154 // ---------------------------------
155 // ---------------------------------
156 
157 TString thtd(TString pts, TString exts="px py pz")
158 {
159  TString tpt = pt(pts,exts);
160  TString tpz = pz(pts,exts);
161 
162  return "(atan2("+tpt+","+tpz+")*57.3)";
163 }
164 
165 // ---------------------------------
166 // ---------------------------------
167 
168 TString tht(TString pts, TString exts="px py pz")
169 {
170  TString tpt = pt(pts,exts);
171  TString tpz = pz(pts,exts);
172 
173  return "atan2("+tpt+","+tpz+")";
174 }
175 
176 // ---------------------------------
177 // ---------------------------------
178 
179 TString ctht(TString pts, TString exts="px py pz")
180 {
181  TString tp = p(pts,exts);
182  TString tpz = pz(pts,exts);
183 
184  return "("+tpz+"/"+tp+")";
185 }
186 
187 // ---------------------------------
188 // ---------------------------------
189 
190 TString dalitz(TString pts, TString exts="e px py pz")
191 {
192  bool invord = (pts.BeginsWith("*"));
193  pts.ReplaceAll("*","");
194 
195  StrVec c,vars;
196  SplitString(pts, " ", vars);
197 
198  if (vars.size()!=3) return "1";
199 
200  TString pts1=vars[0]+"+"+vars[1];
201  TString pts2=vars[0]+"+"+vars[2];
202 
203  TString m01 = m2((invord?"*":"")+pts1,exts);
204  TString m02 = m2((invord?"*":"")+pts2,exts);
205 
206  return m01+":"+m02;
207 }
208 
209 
210 
211 
212 // TString invexp(TString p1, TString p2="", TString p3="", TString p4="")
213 // {
214 // TString c[4]={"e","px","py","pz"};
215 // TString r = "sqrt(";
216 //
217 // for (int i=0;i<4;++i)
218 // {
219 // if (p2=="") r += TString::Format("%s%s^2",p1.Data(),c[i].Data());
220 // else if (p3=="") r += TString::Format("(%s%s%s%s)^2",p1.Data(),c[i].Data(),p2.Data(),c[i].Data());
221 // else if (p4=="") r += TString::Format("(%s%s%s%s%s%s)^2",p1.Data(),c[i].Data(),p2.Data(),c[i].Data(),p3.Data(),c[i].Data());
222 // else r += TString::Format("(%s%s%s%s%s%s%s%s)^2",p1.Data(),c[i].Data(),p2.Data(),c[i].Data(),p3.Data(),c[i].Data(),p4.Data(),c[i].Data());
223 //
224 // if (i<3) r += "-";
225 // }
226 //
227 // r += ")";
228 //
229 // }
230 
Double_t p
Definition: anasim.C:58
double r
Definition: RiemannTest.C:14
Int_t i
Definition: run_full.C:25
__m128 m
Definition: P4_F32vec4.h:28
TLorentzVector s
Definition: Pnd2DStar.C:50
TString ctht(TString pts, TString exts="px py pz")
Definition: invexp.C:179
TString thtd(TString pts, TString exts="px py pz")
Definition: invexp.C:157
TString pt(TString pts, TString exts="px py pz")
Definition: invexp.C:133
TString m2(TString pts, TString exts="e px py pz")
Definition: invexp.C:117
TString vars[MAX]
Definition: autocutx.C:34
TString makefml(TString pts, TString exts, int ncmp=4, TString last="-")
Definition: invexp.C:89
TString tht(TString pts, TString exts="px py pz")
Definition: invexp.C:168
int SplitString(TString s, TString delim, StrVec &toks)
Definition: invexp.C:43
std::vector< TString > StrVec
bool prepare(TString pts, TString exts, StrVec &c, StrVec &vars)
Definition: invexp.C:60
TString dalitz(TString pts, TString exts="e px py pz")
Definition: invexp.C:190
double pz[39]
Definition: pipisigmas.h:14