HYDRA_development_version
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
hmdctrackparam.cc
Go to the documentation of this file.
1 //*--- Author : V.Pechenov
2 //*--- Modified: 16.08.05 V.Pechenov
3 
4 using namespace std;
5 #include <iostream>
6 #include <iomanip>
7 
8 #include "hmdctrackparam.h"
9 #include "hmdcclusfit.h"
10 #include "hmdcgeomobj.h"
11 #include "hmdcwiredata.h"
12 
13 
14 //_HADES_CLASS_DESCRIPTION
15 //////////////////////////////////////////////////////////////////////////////
16 //
17 // HMdcTrackParam
18 //
19 // Class keep track fit parameters
20 //
21 //////////////////////////////////////////////////////////////////////////////
22 
24 
26  nParam = 4;
27  timeOffsetFlag = 3;
28  numOfGoodWires = 0;
29  isTmoffFixed = 0;
30  iterNumb = 0;
31  chi2perDF = -1.;
32  funct = -1.;
33  oldFunct = -1.;
34  nMods = 4;
35 }
36 
38  copyParam(tp);
39  copyTimeOffsets(tp);
40  funct = tp.funct;
41  iterNumb = tp.iterNumb;
42  numOfGoodWires = tp.numOfGoodWires;
43  chi2perDF = tp.chi2perDF;
44  sumWeight = tp.sumWeight;
45  nMods = tp.nMods;
46  for(Int_t m=0;m<nMods;m++) sWht[m] = tp.sWht[m]; //!!!!!!!!!!!!! mozhet perenesti v wires arr.
47 }
48 
49 void HMdcTrackParam::copyParAndAdd(const HMdcTrackParam& tp, Int_t ip, Double_t add) {
50  copyParam(tp);
51  addToParam(ip,add);
52  isTmoffFixed = tp.isTmoffFixed;
53  nMods = tp.nMods;
54 }
55 
57  Int_t ip1, Double_t add1, Int_t ip2, Double_t add2) {
58  copyParam(tp);
59  addToParam(ip1,add1,ip2,add2);
60  isTmoffFixed = tp.isTmoffFixed;
61  nMods = tp.nMods;
62 }
63 
65  funct = 0.;
66  sumWeight = 0.;
67  if(isTmoffFixed>0) isTmoffFixed = 0;
68  for(Int_t m=0;m<nMods;m++) {
69  sDev[m] = 0.;
70  sWht[m] = 0.;
71  }
72 }
73 
74 void HMdcTrackParam::calcTimeOffsets(Int_t tofFlag) {
75  // tofFlag=1 - calcul. timeOffsets for each Mdc
76  // tofFlag=2 - calcul. timeOffsets for each segment
77  // else - calcul. one timeOffset for all mdc's
78  if(isTmoffFixed < 0) return;
79  timeOffsetFlag = tofFlag;
80  if (timeOffsetFlag==0) for(Int_t m=0;m<nMods;m++) timeOffset[m] = 0.;
81  else if(timeOffsetFlag==1) for(Int_t m=0;m<nMods;m++) timeOffset[m] = sWht[m]>0. ? -sDev[m]/sWht[m]:0.;
82  else if(timeOffsetFlag==2) {
83  for(Int_t m=0;m<nMods;m+=2) {
84  Double_t sW = sWht[m]+sWht[m+1];
85  Double_t tos = sW >0. ? -(sDev[m]+sDev[m+1])/sW : 0.;
86  timeOffset[m] = sWht[m] >0. ? tos : 0.;
87  timeOffset[m+1] = sWht[m+1]>0. ? tos : 0.;
88  }
89  } else {
90  Double_t sD = 0;
91  Double_t sW = 0;
92  for(Int_t m=0;m<nMods;m++) sD += sDev[m];
93  for(Int_t m=0;m<nMods;m++) sW += sWht[m];
94  Double_t tos = -sD/sW;
95  for(Int_t m=0;m<nMods;m++) timeOffset[m] = sWht[m]>0. ? tos : 0.; // ! ???
96  }
97  isTmoffFixed = 0;
98 }
99 
100 Double_t HMdcTrackParam::getSumWtNorm(Int_t m) const {
101  // Return sum of weight/errTdcTime^2 for all valid wires
102  if(isTmoffFixed<0 || m<0 || m>=nMods || timeOffsetFlag==0) return 0.;
103  if(timeOffsetFlag == 3) { // One Toff per track
104  Double_t sW = 0;
105  for(Int_t im=0;im<nMods;im++) sW += sWht[im];
106  return sW;
107  }
108  if(timeOffsetFlag == 2) { // One Toff per segment
109  m &= 254; // = (m/2)*2
110  return sWht[m]+sWht[m+1];
111  }
112  if(timeOffsetFlag == 1) return sWht[m]; // One Toff per module
113  return 0.;
114 }
115 
117  // if timeOffset[m]<minTos timeOffset[m]=minTos
118  if(isTmoffFixed<0) return;
119  for(Int_t m=0;m<nMods;m++) if(sWht[m]>0. && timeOffset[m]<minTos) {
120  timeOffset[m] = minTos;
121  isTmoffFixed |= 1<<m;
122  }
123 }
124 
125 void HMdcTrackParam::addToTOffsetErr(Int_t m, Double_t* dTdA, Double_t wtNorm) {
126  for(Int_t ip=0;ip<nParam;ip++) dTdPar[ip][m] += dTdA[ip]*wtNorm;
127 }
128 
130  for(Int_t ip=0;ip<nParam;ip++) for(Int_t m=0;m<nMods;m++) dTdPar[ip][m] = 0.;
131 }
132 
133 void HMdcTrackParam::getTimeOffsetDer(Double_t* der) {
134  for(Int_t k=0;k<nParam;k++) der[k] = 0.;
135  if(isTmoffFixed<0 || timeOffsetFlag==0) return;
136  if(timeOffsetFlag==1) { // One timeoffset per module:
137  for(Int_t m=0;m<nMods;m++) if(sWht[m]>0. && !isMdcTimeOffsetFixed(m)) {
138  for(Int_t k=0;k<nParam;k++) der[k] -= dTdPar[k][m]/sWht[m];
139  }
140  } else if(timeOffsetFlag==2) { // One timeoffset per segment:
141  for(Int_t m=0;m<nMods;m+=2) {
142  Double_t sW = sWht[m]+sWht[m+1];
143  if(sW>0. && !isSegTimeOffsetFixed(m/2)) for(Int_t k=0;k<nParam;k++)
144  der[k] -= (dTdPar[k][m]+dTdPar[k][m+1])/sW;
145  }
146  } else { // One timeoffset per track:
147  Double_t sW = 0;
148  for(Int_t m=0;m<nMods;m++) sW += sWht[m];
149  if(sW>0. && !isTrackTimeOffsetFixed()) for(Int_t k=0;k<nParam;k++) {
150  Double_t sDT = 0.;
151  for(Int_t m=0;m<nMods;m++) sDT += dTdPar[k][m];
152  der[k] = -sDT/sW;
153  }
154  }
155 }
156 
157 void HMdcTrackParam::addTimeOffsetDer1(TMatrixD& grad2) {
158  if(isTmoffFixed<0 || timeOffsetFlag==0) return;
159  if(timeOffsetFlag==1) { // One timeoffset per module:
160  for(Int_t m=0;m<nMods;m++) if(sWht[m]>0. && !isMdcTimeOffsetFixed(m)) {
161  for(Int_t k=0;k<nParam;k++)
162  grad2(k,k) -= 2.*dTdPar[k][m]*dTdPar[k][m]/sWht[m];
163  }
164  } else if(timeOffsetFlag==2) { // One timeoffset per segment:
165  for(Int_t m=0;m<nMods;m+=2) {
166  Double_t sW = sWht[m]+sWht[m+1];
167  if(sW>0. && !isSegTimeOffsetFixed(m/2)) for(Int_t k=0;k<nParam;k++) {
168  Double_t dTdP = dTdPar[k][m]+dTdPar[k][m+1];
169  grad2(k,k) -= 2.*dTdP*dTdP/sW;
170  }
171  }
172  } else { // One timeoffset per track:
173  Double_t sW = 0;
174  for(Int_t m=0;m<nMods;m++) sW += sWht[m];
175  if(sW>0. && !isTrackTimeOffsetFixed()) for(Int_t k=0;k<nParam;k++) {
176  Double_t dTdP = 0;
177  for(Int_t m=0;m<nMods;m++) dTdP += dTdPar[k][m];
178  grad2(k,k) -= 2.*dTdP*dTdP/sW;
179  }
180  }
181 }
182 
183 void HMdcTrackParam::addTimeOffsetDer2(TMatrixD& grad2) {
184  if(isTmoffFixed<0 || timeOffsetFlag==0) return;
185  if(timeOffsetFlag==1) { // One timeoffset per module:
186  for(Int_t m=0;m<nMods;m++) if(sWht[m]>0. && !isMdcTimeOffsetFixed(m)) {
187  for(Int_t k=0;k<nParam;k++) {
188  Double_t dTdP = -2.*dTdPar[k][m]/sWht[m];
189  for(Int_t l=0;l<=k;l++) grad2(k,l) += dTdP*dTdPar[l][m];
190  }
191  }
192  } else if(timeOffsetFlag==2) { // One timeoffset per segment:
193  for(Int_t m=0;m<nMods;m+=2) {
194  Double_t sW = sWht[m]+sWht[m+1];
195  if(sW>0. && !isSegTimeOffsetFixed(m/2)) for(Int_t k=0;k<nParam;k++) {
196  Double_t dTdP = -2.*(dTdPar[k][m]+dTdPar[k][m+1])/sW;
197  for(Int_t l=0;l<=k;l++) grad2(k,l) += dTdP*(dTdPar[l][m]+dTdPar[l][m+1]);
198  }
199  }
200  } else { // One timeoffset per track:
201  Double_t sW = 0;
202  for(Int_t m=0;m<nMods;m++) sW += sWht[m];
203  if(sW>0. && !isTrackTimeOffsetFixed()) for(Int_t k=0;k<nParam;k++) {
204  Double_t dTdPk = 0;
205  for(Int_t m=0;m<nMods;m++) dTdPk += dTdPar[k][m];
206  dTdPk *= -2./sW;
207  for(Int_t l=0;l<=k;l++) {
208  Double_t dTdPl = 0;
209  for(Int_t m=0;m<nMods;m++) dTdPl += dTdPar[l][m];
210  grad2(k,l) += dTdPk*dTdPl;
211  }
212  }
213  }
214 }
215 
217  if(isTmoffFixed<0 || timeOffsetFlag==0) return;
218  if(timeOffsetFlag==1) for(Int_t m=0;m<nMods;m++) errTimeOffset[m] = calcTosErr(m);
219  else if(timeOffsetFlag==2) {
220  for(Int_t m=0;m<nMods;m+=2) {
221  Double_t err = calcTosErr(m,m+1);
222  errTimeOffset[m] = sWht[m] >0. ? err : 0.;
223  errTimeOffset[m+1] = sWht[m+1]>0. ? err : 0.;
224  }
225  } else {
226  Double_t err = calcTosErr();
227  for(Int_t m=0;m<nMods;m++) errTimeOffset[m] = sWht[m]>0. ? err : 0.;
228  }
229 }
230 
231 Double_t HMdcTrackParam::calcTosErr(Int_t m) {
232  if(isTmoffFixed < 0) return 0.;
233  if(sWht[m]==0.) return 0.;
234  Double_t sum=0.;
235  for(Int_t ip=0; ip<nParam; ip++) sum += calcTosErr(sWht[m],dTdPar[ip][m],errMatr(ip,ip));
236  return sqrt(sum);
237 }
238 
239 Double_t HMdcTrackParam::calcTosErr(Int_t m1, Int_t m2) {
240  if(isTmoffFixed<0) return 0.;
241  if(sWht[m1]==0. && sWht[m2]==0.) return 0.;
242  Double_t sum=0.;
243  if(sWht[m1]>0. || sWht[m2]>0.) for(Int_t ip=0; ip<nParam; ip++) sum +=
244  calcTosErr(sWht[m1]+sWht[m2],dTdPar[ip][m1]+dTdPar[ip][m2],errMatr(ip,ip));
245  return sqrt(sum);
246 }
247 
249  if(isTmoffFixed<0) return 0.;
250  Double_t sW = 0;
251  for(Int_t m=0;m<nMods;m++) sW += sWht[m];
252  Double_t sum=0.;
253  for(Int_t ip=0; ip<nParam; ip++) {
254  Double_t sTd = 0;
255  for(Int_t m=0;m<nMods;m++) sTd += dTdPar[ip][m];
256  sum += calcTosErr(sW,sTd,errMatr(ip,ip));
257  }
258  return sqrt(sum);
259 }
260 
261 void HMdcTrackParam::fillErrorsMatr(TMatrixD& matrH) {
262  for(Int_t i=0; i<nParam; i++) for(Int_t j=i; j<nParam; j++)
263  errMatr.setElement(i,j,matrH(i,j));
264 }
265 
266 Double_t HMdcTrackParam::calcChi2PerDF(Int_t nGWires) {
267  if(nGWires>0) numOfGoodWires=nGWires;
268  chi2perDF = (numOfGoodWires>nParam) ? funct/(numOfGoodWires - nParam) : -1.;
269  return chi2perDF;
270 }
271 
272 void HMdcTrackParam::printParam(const Char_t* title) const {
273  if(title) printf("%s ",title);
274  Char_t zf=(funct<=oldFunct) ? '+':'-';
275  printf("%3i%c fun.=%5.4g=>%5.4g Par.=%6.2f %6.2f %6.2f %6.2f TOF=",
276  iterNumb,zf,oldFunct,funct,point1.X(),point1.Y(),point2.X(),point2.Y());
277  for(Int_t m=0;m<nMods;m++) printf("%5.1f ",timeOffset[m]);
278  printf("\n");
279 }
280 
281 void HMdcTrackParam::printFunctChange(const Char_t* title) const {
282  if(title) printf("%s ",title);
283  printf("fun.=%-6g->%-6g\n",oldFunct,funct);
284 }
285 
287  errMatr.print();
288  printf(" timeoffsets:");
289  for(Int_t m=0;m<nMods;m++) if(errTimeOffset[m]>0)
290  printf(" mod%i=%g+/-%g",m+1,timeOffset[m],errTimeOffset[m]);
291  printf("\n");
292 }
293 
295  fClusFit->setNParam(nParam);
296  fClusFit->setFunMin(funct);
297  fClusFit->setTimeOff(timeOffset);
298  fClusFit->setX1(point1.X());
299  fClusFit->setY1(point1.Y());
300  fClusFit->setZ1(point1.Z());
301  fClusFit->setX2(point2.X());
302  fClusFit->setY2(point2.Y());
303  fClusFit->setZ2(point2.Z());
304  fClusFit->setNumIter(iterNumb);
305  fClusFit->setNumOfWires(numOfGoodWires);
306  fClusFit->setErrors(errMatr.getErr(0),errMatr.getErr(1),errMatr.getErr(2),errMatr.getErr(3));
307 }
308 
309 Bool_t HMdcTrackParam::testParameters(Double_t tosMin, Double_t tosMax) {
310  if(isTmoffFixed<0) return kTRUE;
311  for(Int_t m=0;m<nMods;m++) if(timeOffset[m]<tosMin||timeOffset[m]>tosMax) return kFALSE;
312  return kTRUE;
313 }
314 
315 void HMdcTrackParam::setFixedTimeOffset(Double_t o1,Double_t o2,Double_t o3,Double_t o4) {
316  timeOffset[0] = o1;
317  timeOffset[1] = o2;
318  timeOffset[2] = o3;
319  timeOffset[3] = o4;
320  isTmoffFixed = -1;
321  for(Int_t m=4;m<16;m++) timeOffset[m] = 0;
322 }
323 
324 void HMdcTrackParam::setTimeOffsets(Double_t* tos,Int_t size) {
325  if(size<0) size = 0;
326  if(size>0 && size<16) for(Int_t m=0;m<size;m++) timeOffset[m] = tos[m];
327  for(Int_t m=size;m<16;m++) timeOffset[m] = 0;
328 }
329 
331  ((HMdcLineParam*)this)->copyPlanes(p);
332  nMods = p.nMods;
333 }
335  for(Int_t m=0;m<nMods;m++) timeOffset[m] = 0.;
336 }
void addTimeOffsetDer2(TMatrixD &grad2)
Double_t calcTosErr(void)
void correctMinTimeOffsets(Double_t minTos)
Double_t sumWeight
Double_t calcChi2PerDF(Int_t nGWires=0)
void setFunMin(Float_t v)
Definition: hmdcclusfit.h:64
void copyNewParam(const HMdcTrackParam &tp)
void setNumOfWires(Int_t v)
Definition: hmdcclusfit.h:65
void setY1(Float_t v)
Definition: hmdcclusfit.h:68
void setErrors(Float_t x1e, Float_t y1e, Float_t x2e, Float_t y2e)
Definition: hmdcclusfit.h:81
void copyParAndAdd(const HMdcTrackParam &tp, Int_t ip, Double_t add)
void printParam(const Char_t *title=0) const
void fillClusFit(HMdcClusFit *fClusFit)
Double_t chi2perDF
void setY2(Float_t v)
Definition: hmdcclusfit.h:71
void setFixedTimeOffset(Double_t o1, Double_t o2, Double_t o3, Double_t o4)
Int_t m2
Definition: drawAccCuts.C:11
void setTimeOffsets(Double_t *tos, Int_t size=4)
Bool_t testParameters(Double_t tosMin, Double_t tosMax)
Int_t m1
Definition: drawAccCuts.C:11
void printFunctChange(const Char_t *title=0) const
void setX2(Float_t v)
Definition: hmdcclusfit.h:70
void cleanTO(void)
void addTimeOffsetDer1(TMatrixD &grad2)
void calcTimeOffsetsErr(void)
Double_t sum
void copyPlanes(HMdcTrackParam &p)
void setZ1(Float_t v)
Definition: hmdcclusfit.h:69
Double_t getSumWtNorm(Int_t m) const
void addToTOffsetErr(Int_t m, Double_t *dTdA, Double_t wtNorm)
void setTimeOff(const Double_t *tos)
void setZ2(Float_t v)
Definition: hmdcclusfit.h:72
void clearTOffsetDer(void)
void fillErrorsMatr(TMatrixD &matrH)
Double_t sWht[16]
ClassImp(HMdcTrackParam) HMdcTrackParam
void setX1(Float_t v)
Definition: hmdcclusfit.h:67
void calcTimeOffsets(Int_t tofFlag)
void setNParam(Char_t v)
Definition: hmdcclusfit.h:63
void clearFunct(void)
void printErrors(void)
void getTimeOffsetDer(Double_t *der)
void setNumIter(Short_t v)
Definition: hmdcclusfit.h:73