StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
TwistPatch.cxx
1 /***********************************************************************
2  *
3  * Author: Gene Van Buren, BNL, 24-May-2005
4  *
5  ***********************************************************************
6  *
7  * Description: Code to patch incorrect data from using the wrong
8  * Twist distortion correction.
9  * Default is to patch P05ia production.
10  *
11  ***********************************************************************/
12 
13 #include "TwistPatch.h"
14 #include "TMath.h"
15 #include "StMessMgr.h"
16 
17 
18 ClassImp(TwistPatch)
19 
21  magf = -1; // int
22 
23  vtxpars = 0; // Double_t*
24  etapars = 0; // Double_t*
25  ptpars = 0; // Double_t*
26  phipars = 0; // Double_t*
27 
28  CorrectP05ia();
29 
30 }
31 
32 TwistPatch::~TwistPatch() {}
33 
35 
36 void TwistPatch::SetMagF(double mag) {
37  // Require full strength mag field (+/- 10%)
38  if (TMath::Abs(TMath::Abs(mag/4.98) - 1) > 0.1) {
39  gMessMgr->Error() << "TwistPatch: Invalid magnetic field: " << mag
40  << "\n Need +/- 4.98 (+/- 10%)" << endm;
41  return;
42  }
43  // Neg field -> 0, Pos field -> 1
44  magf = (int) (0.5 + TMath::Sign(0.5,mag));
45  SetVtxPars();
46  SetEtaPars();
47 }
48 
49 void TwistPatch::SetVtxPars() {
50  Double_t* arr = vtxparsFull.GetArray();
51  int offset = magf*3*2;
52  vtxpars = &(arr[offset]);
53 }
54 
55 void TwistPatch::SetEtaPars() {
56  Double_t* arr = etaparsFull.GetArray();
57  int offset = magf*2;
58  etapars = &(arr[offset]);
59 }
60 
61 void TwistPatch::SetPtPars(int ew, int ch) {
62  Double_t* arr = ptparsFull.GetArray();
63  int offset = ((magf*2 + ew)*2 + ch)*4*2;
64  ptpars = &(arr[offset]);
65 }
66 
67 void TwistPatch::SetPhiPars(int ew, int ch) {
68  Double_t* arr = phiparsFull.GetArray();
69  int offset = ((magf*2 + ew)*2 + ch)*5*2;
70  phipars = &(arr[offset]);
71 }
72 
74 
75 void TwistPatch::PrimaryVertex(StThreeVectorF& vtx, double mag) {
76  double vx = vtx.x(); double vy = vtx.y(); double vz = vtx.z();
77  PrimaryVertex(vx,vy,vz,mag);
78  vtx.setX(vx); vtx.setY(vy); vtx.setZ(vz);
79 }
80 
81 void TwistPatch::PrimaryVertex(double& vx, double& vy, double& vz, double mag) {
82  if (mag != -999.) SetMagF(mag);
83  if (magf == -1) {
84  gMessMgr->Error() << "TwistPatch: unassigned magnetic field." << endm;
85  return;
86  }
87  if (TMath::Abs(vz)>40.) {
88  gMessMgr->Warning() << "TwistPatch: corrections invalid outsize |vz|<40cm." << endm;
89  vx = -999.; vy = -999.; vz = -999.;
90  return;
91  }
92  vx += vtxpars[0] + vtxpars[1]*vz;
93  vy += vtxpars[2] + vtxpars[3]*vz;
94  vz += vtxpars[4] + vtxpars[5]*vz;
95 }
96 
97 void TwistPatch::PrimaryTrack(double& pt, double& phi, double& eta,
98  int ch, double vz, double mag) {
99  if (mag != -999.) SetMagF(mag);
100  if (magf == -1) {
101  gMessMgr->Error() << "TwistPatch: unassigned magnetic field." << endm;
102  return;
103  }
104  if (TMath::Abs(vz)>40.) {
105  gMessMgr->Warning() << "TwistPatch: corrections invalid outsize |vz|<40cm."
106  << endm;
107  pt = -999.; phi = 0.; eta = -999.;
108  return;
109  }
110 
111  // Corrections are invalid (and unimportant?) for low-pt tracks:
112  if (pt < 0.5) return;
113 
114  int ewi = -1;
115  double seta = TMath::SinH(eta);
116  if (seta < TMath::Min(-vz/60.0,-vz/200.0)) {
117  ewi = 0; // east TPC tracks
118  } else if (seta > TMath::Max(-vz/60.0,-vz/200.0)) {
119  ewi = 1; // west TPC tracks
120  } else {
121  // Invalid: track passes through Central Membrane in TPC
122  pt = -999.; phi = 0.; eta = -999.;
123  return;
124  }
125  int chi = ( (ch>0) ? 1 : 0 );
126  SetPtPars(ewi,chi);
127  SetPhiPars(ewi,chi);
128 
129  double Amp, Phase;
130 
131  Amp = etapars[0];
132  Phase = etapars[1];
133  eta += Amp*sin(phi-Phase);
134 
135  Amp = ptpars[0] + ptpars[1]*eta + ptpars[2]*vz + ptpars[3]*eta*vz;
136  Phase = ptpars[4] + ptpars[5]*eta + ptpars[6]*vz + ptpars[7]*eta*vz;
137  pt += pt*pt*Amp*sin(phi-Phase);
138 
139  Amp = phipars[0] + phipars[1]*eta + phipars[2]*vz +
140  phipars[3]*eta*vz + phipars[4]*eta*eta;
141  Phase = phipars[5] + phipars[6]*eta + phipars[7]*vz +
142  phipars[8]*eta*vz + phipars[9]*eta*eta;
143  phi += Amp*sin(phi-Phase);
144 
145 }
146 
148 
150  double vtxparsP05ia[12] = {
151  // RFF:
152  // x:
153  2.30466e-02, // +/- 9.88135e-06
154  -1.32527e-03, // +/- 6.14399e-07
155  // y:
156  -9.30086e-02, // +/- 9.66327e-06
157  7.34537e-04, // +/- 5.66952e-07
158  // z:
159  -1.35367e-02, // +/- 1.75835e-05
160  -1.58680e-05, // +/- 6.25426e-07
161 
162  // FF:
163  // x:
164  2.37662e-02, // +/- 4.07841e-06
165  -3.26507e-04, // +/- 2.52854e-07
166  // y:
167  -9.14897e-02, // +/- 4.06082e-06
168  4.78500e-04, // +/- 2.48710e-07
169  // z:
170  -1.30379e-02, // +/- 1.13662e-05
171  6.15786e-06 // +/- 5.71219e-07
172  };
173  vtxparsFull.Set(12,vtxparsP05ia);
174 
175  double etaparsP05ia[4] = {
176  // RFF:
177  -5.00077e-04, // +/- 5.40643e-07
178  1.31853e+00, // +/- 1.03448e-03
179 
180  // FF:
181  3.89157e-04, // +/- 2.78473e-07
182  -1.82777e+00 // +/- 7.13594e-04
183  };
184  etaparsFull.Set(4,etaparsP05ia);
185 
186  double ptparsP05ia[64] ={
187  // RFF:
188  // east neg:
189  2.32846e-03, // +/- 1.99903e-05
190  -3.40209e-04, // +/- 3.37835e-05
191  6.60694e-05, // +/- 1.43984e-06
192  9.85024e-06, // +/- 2.41392e-06
193  -4.95131e-01, // +/- 9.73165e-03
194  4.82614e-02, // +/- 1.64392e-02
195  -2.38376e-03, // +/- 7.51324e-04
196  -1.56343e-03, // +/- 1.17801e-03
197  // east pos:
198  2.25788e-03, // +/- 1.86541e-05
199  3.33810e-04, // +/- 3.15036e-05
200  5.91728e-05, // +/- 1.21662e-06
201  -2.54143e-06, // +/- 2.04576e-06
202  2.61730e+00, // +/- 9.82629e-03
203  -1.06788e-01, // +/- 1.85022e-02
204  -4.76870e-03, // +/- 7.19356e-04
205  -4.34837e-04, // +/- 1.25031e-03
206  // west neg:
207  2.32846e-03, // +/- 1.99903e-05
208  -3.40209e-04, // +/- 3.37835e-05
209  6.60694e-05, // +/- 1.43984e-06
210  9.85024e-06, // +/- 2.41392e-06
211  -4.95131e-01, // +/- 9.73165e-03
212  4.82614e-02, // +/- 1.64392e-02
213  -2.38376e-03, // +/- 7.51324e-04
214  -1.56343e-03, // +/- 1.17801e-03
215  // west pos:
216  2.54657e-03, // +/- 1.78081e-05
217  -4.67158e-04, // +/- 3.20610e-05
218  -6.49651e-05, // +/- 1.20041e-06
219  6.93050e-06, // +/- 2.15511e-06
220  -6.42205e-01, // +/- 6.89840e-03
221  7.98875e-02, // +/- 1.37710e-02
222  2.84334e-04, // +/- 5.50864e-04
223  8.89173e-04, // +/- 1.02173e-03
224 
225  // FF:
226  // east neg:
227  8.88408e-04, // +/- 1.23449e-05
228  1.05058e-03, // +/- 2.29742e-05
229  2.30728e-05, // +/- 8.66520e-07
230  2.93934e-06, // +/- 1.60371e-06
231  1.41523e+00, // +/- 1.80226e-02
232  -1.58434e-01, // +/- 5.03514e-02
233  4.30552e-03, // +/- 1.50170e-03
234  1.22534e-02, // +/- 3.13251e-03
235  // east pos:
236  8.01270e-04, // +/- 1.22456e-05
237  -9.31071e-04, // +/- 2.24259e-05
238  2.02355e-05, // +/- 8.61748e-07
239  -4.55626e-07, // +/- 1.56680e-06
240  -1.64989e+00, // +/- 1.08019e-02
241  -3.21806e-01, // +/- 1.79223e-02
242  1.81404e-04, // +/- 8.76902e-04
243  2.80395e-03, // +/- 1.41348e-03
244  // west neg:
245  8.88408e-04, // +/- 1.23449e-05
246  1.05058e-03, // +/- 2.29742e-05
247  2.30728e-05, // +/- 8.66520e-07
248  2.93934e-06, // +/- 1.60371e-06
249  1.41523e+00, // +/- 1.80226e-02
250  -1.58434e-01, // +/- 5.03514e-02
251  4.30552e-03, // +/- 1.50170e-03
252  1.22534e-02, // +/- 3.13251e-03
253  // west pos:
254  1.03332e-03, // +/- 1.10946e-05
255  7.57373e-04, // +/- 1.94757e-05
256  -2.41674e-05, // +/- 7.29351e-07
257  1.02034e-06, // +/- 1.34588e-06
258  1.57296e+00, // +/- 8.47273e-03
259  2.25255e-01, // +/- 1.41731e-02
260  1.34373e-05, // +/- 7.06803e-04
261  1.96348e-03 // +/- 1.14546e-03
262 
263  };
264  ptparsFull.Set(64,ptparsP05ia);
265 
266  double phiparsP05ia[80] ={
267  // RFF:
268  // east neg:
269  4.93131e-04, // +/- 4.01012e-06
270  -4.23908e-05, // +/- 1.76226e-05
271  1.31741e-05, // +/- 2.10474e-07
272  -7.03829e-08, // +/- 3.64895e-07
273  1.51012e-04, // +/- 1.76204e-05
274  2.89801e+00, // +/- 9.55759e-03
275  -1.45601e-01, // +/- 3.97013e-02
276  -2.42827e-03, // +/- 5.07492e-04
277  4.78493e-03, // +/- 7.68787e-04
278  9.33780e-03, // +/- 3.74458e-02
279  // east pos:
280  4.52643e-04, // +/- 4.28775e-06
281  -2.45860e-05, // +/- 1.78107e-05
282  1.20074e-05, // +/- 2.36478e-07
283  -1.90426e-06, // +/- 3.97117e-07
284  1.28262e-04, // +/- 1.76248e-05
285  2.47569e+00, // +/- 9.99750e-03
286  -1.19158e-01, // +/- 4.35742e-02
287  -2.04744e-05, // +/- 5.71813e-04
288  8.56369e-03, // +/- 8.99748e-04
289  1.85302e-01, // +/- 4.24722e-02
290  // west neg:
291  4.93131e-04, // +/- 4.01012e-06
292  -4.23908e-05, // +/- 1.76226e-05
293  1.31741e-05, // +/- 2.10474e-07
294  -7.03829e-08, // +/- 3.64895e-07
295  1.51012e-04, // +/- 1.76204e-05
296  2.89801e+00, // +/- 9.55759e-03
297  -1.45601e-01, // +/- 3.97013e-02
298  -2.42827e-03, // +/- 5.07492e-04
299  4.78493e-03, // +/- 7.68787e-04
300  9.33780e-03, // +/- 3.74458e-02
301  // west pos:
302  5.08061e-04, // +/- 3.74512e-06
303  9.58800e-06, // +/- 1.53306e-05
304  -1.27918e-05, // +/- 1.95678e-07
305  -4.98383e-07, // +/- 3.25354e-07
306  1.32884e-04, // +/- 1.50385e-05
307  -7.77448e-01, // +/- 7.14028e-03
308  2.44479e-01, // +/- 3.12072e-02
309  3.67018e-04, // +/- 4.18872e-04
310  5.51353e-03, // +/- 6.46282e-04
311  5.67082e-02, // +/- 3.02489e-02
312 
313  // FF:
314  // east neg:
315  1.74816e-04, // +/- 2.68167e-06
316  1.33818e-04, // +/- 1.11078e-05
317  4.61758e-06, // +/- 1.43821e-07
318  3.63453e-06, // +/- 2.33195e-07
319  3.29694e-04, // +/- 1.08453e-05
320  1.20753e+00, // +/- 1.53169e-02
321  -2.84916e+00, // +/- 6.42459e-02
322  -1.17895e-02, // +/- 9.24726e-04
323  5.26084e-03, // +/- 1.26590e-03
324  -1.32828e+00, // +/- 5.98208e-02
325  // east pos:
326  1.59700e-04, // +/- 2.52246e-06
327  -1.00637e-04, // +/- 1.07372e-05
328  4.01605e-06, // +/- 1.30586e-07
329  1.43594e-06, // +/- 2.19201e-07
330  1.92839e-04, // +/- 1.04302e-05
331  1.78569e+00, // +/- 1.47063e-02
332  -2.14438e+00, // +/- 5.74426e-02
333  -9.44847e-03, // +/- 6.96743e-04
334  7.87320e-04, // +/- 9.87320e-04
335  -1.15795e+00, // +/- 5.06799e-02
336  // west neg:
337  1.74816e-04, // +/- 2.68167e-06
338  1.33818e-04, // +/- 1.11078e-05
339  4.61758e-06, // +/- 1.43821e-07
340  3.63453e-06, // +/- 2.33195e-07
341  3.29694e-04, // +/- 1.08453e-05
342  1.20753e+00, // +/- 1.53169e-02
343  -2.84916e+00, // +/- 6.42459e-02
344  -1.17895e-02, // +/- 9.24726e-04
345  5.26084e-03, // +/- 1.26590e-03
346  -1.32828e+00, // +/- 5.98208e-02
347  // west pos:
348  1.93766e-04, // +/- 2.35454e-06
349  5.79827e-05, // +/- 9.32671e-06
350  -4.49880e-06, // +/- 1.19739e-07
351  1.40342e-06, // +/- 1.95492e-07
352  2.00904e-04, // +/- 8.90481e-06
353  -1.40318e+00, // +/- 1.13584e-02
354  1.86508e+00, // +/- 4.34266e-02
355  7.21917e-03, // +/- 5.34498e-04
356  2.70015e-03, // +/- 7.54637e-04
357  -8.63279e-01 // +/- 3.81182e-02
358 
359  };
360  phiparsFull.Set(80,phiparsP05ia);
361 
362 }
363 
364 /***********************************************************************
365  * $Id: TwistPatch.cxx,v 1.2 2005/05/26 17:25:55 genevb Exp $
366  * $Log: TwistPatch.cxx,v $
367  * Revision 1.2 2005/05/26 17:25:55 genevb
368  * Fixed typo with ptpars,phipars
369  *
370  * Revision 1.1 2005/05/24 19:05:02 genevb
371  * Introduce TwistPatch
372  *
373  *
374  ***********************************************************************/
void CorrectP05ia()
Turn on corrections for P05ia (on by default)
Definition: TwistPatch.cxx:149
virtual void SetMagF(double mag)
Enter magnetic field manually (if you leave it blank in patch functions)
Definition: TwistPatch.cxx:36
virtual void PrimaryTrack(double &pt, double &phi, double &eta, int ch, double vz, double mag=-999.)
Patch primary tracks.
Definition: TwistPatch.cxx:97