46 for(Int_t m=0;m<nMods;m++) sWht[m] = tp.
sWht[m];
57 Int_t ip1, Double_t add1, Int_t ip2, Double_t add2) {
59 addToParam(ip1,add1,ip2,add2);
67 if(isTmoffFixed>0) isTmoffFixed = 0;
68 for(Int_t m=0;m<nMods;m++) {
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.;
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.;
102 if(isTmoffFixed<0 || m<0 || m>=nMods || timeOffsetFlag==0)
return 0.;
103 if(timeOffsetFlag == 3) {
105 for(Int_t im=0;im<nMods;im++) sW += sWht[im];
108 if(timeOffsetFlag == 2) {
110 return sWht[m]+sWht[m+1];
112 if(timeOffsetFlag == 1)
return sWht[m];
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;
126 for(Int_t ip=0;ip<nParam;ip++) dTdPar[ip][m] += dTdA[ip]*wtNorm;
130 for(Int_t ip=0;ip<nParam;ip++)
for(Int_t m=0;m<nMods;m++) dTdPar[ip][m] = 0.;
134 for(Int_t k=0;k<nParam;k++) der[k] = 0.;
135 if(isTmoffFixed<0 || timeOffsetFlag==0)
return;
136 if(timeOffsetFlag==1) {
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];
140 }
else if(timeOffsetFlag==2) {
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;
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++) {
151 for(Int_t m=0;m<nMods;m++) sDT += dTdPar[k][m];
158 if(isTmoffFixed<0 || timeOffsetFlag==0)
return;
159 if(timeOffsetFlag==1) {
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];
164 }
else if(timeOffsetFlag==2) {
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;
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++) {
177 for(Int_t m=0;m<nMods;m++) dTdP += dTdPar[k][m];
178 grad2(k,k) -= 2.*dTdP*dTdP/sW;
184 if(isTmoffFixed<0 || timeOffsetFlag==0)
return;
185 if(timeOffsetFlag==1) {
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];
192 }
else if(timeOffsetFlag==2) {
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]);
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++) {
205 for(Int_t m=0;m<nMods;m++) dTdPk += dTdPar[k][m];
207 for(Int_t l=0;l<=k;l++) {
209 for(Int_t m=0;m<nMods;m++) dTdPl += dTdPar[l][m];
210 grad2(k,l) += dTdPk*dTdPl;
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.;
226 Double_t err = calcTosErr();
227 for(Int_t m=0;m<nMods;m++) errTimeOffset[m] = sWht[m]>0. ? err : 0.;
232 if(isTmoffFixed < 0)
return 0.;
233 if(sWht[m]==0.)
return 0.;
235 for(Int_t ip=0; ip<nParam; ip++) sum += calcTosErr(sWht[m],dTdPar[ip][m],errMatr(ip,ip));
240 if(isTmoffFixed<0)
return 0.;
241 if(sWht[m1]==0. && sWht[m2]==0.)
return 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));
249 if(isTmoffFixed<0)
return 0.;
251 for(Int_t m=0;m<nMods;m++) sW += sWht[m];
253 for(Int_t ip=0; ip<nParam; ip++) {
255 for(Int_t m=0;m<nMods;m++) sTd += dTdPar[ip][m];
256 sum += calcTosErr(sW,sTd,errMatr(ip,ip));
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));
267 if(nGWires>0) numOfGoodWires=nGWires;
268 chi2perDF = (numOfGoodWires>nParam) ? funct/(numOfGoodWires - nParam) : -1.;
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]);
282 if(title) printf(
"%s ",title);
283 printf(
"fun.=%-6g->%-6g\n",oldFunct,funct);
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]);
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());
306 fClusFit->
setErrors(errMatr.getErr(0),errMatr.getErr(1),errMatr.getErr(2),errMatr.getErr(3));
310 if(isTmoffFixed<0)
return kTRUE;
311 for(Int_t m=0;m<nMods;m++) if(timeOffset[m]<tosMin||timeOffset[m]>tosMax)
return kFALSE;
321 for(Int_t m=4;m<16;m++) timeOffset[m] = 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;
335 for(Int_t m=0;m<nMods;m++) timeOffset[m] = 0.;
void addTimeOffsetDer2(TMatrixD &grad2)
Double_t calcTosErr(void)
void correctMinTimeOffsets(Double_t minTos)
Double_t calcChi2PerDF(Int_t nGWires=0)
void setFunMin(Float_t v)
void copyNewParam(const HMdcTrackParam &tp)
void setNumOfWires(Int_t v)
void setErrors(Float_t x1e, Float_t y1e, Float_t x2e, Float_t y2e)
void copyParAndAdd(const HMdcTrackParam &tp, Int_t ip, Double_t add)
void printParam(const Char_t *title=0) const
void fillClusFit(HMdcClusFit *fClusFit)
void setFixedTimeOffset(Double_t o1, Double_t o2, Double_t o3, Double_t o4)
void setTimeOffsets(Double_t *tos, Int_t size=4)
Bool_t testParameters(Double_t tosMin, Double_t tosMax)
void printFunctChange(const Char_t *title=0) const
void addTimeOffsetDer1(TMatrixD &grad2)
void calcTimeOffsetsErr(void)
void copyPlanes(HMdcTrackParam &p)
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 clearTOffsetDer(void)
void fillErrorsMatr(TMatrixD &matrH)
ClassImp(HMdcTrackParam) HMdcTrackParam
void calcTimeOffsets(Int_t tofFlag)
void getTimeOffsetDer(Double_t *der)
void setNumIter(Short_t v)