HYDRA_development_version
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
hmdctrackfitter.cc
Go to the documentation of this file.
1 //*--- Author : G.Agakichiev
2 //*--- Modified: 23.01.07 V.Pechenov
3 //*--- Modified: 16.06.2005 by V.Pechenov
4 //*--- Modified: 21.07.2003 by V.Pechenov
5 //*--- Modified: 28.07.2002 by V.Pechenov
6 //*--- Modified: 07.05.2002 by V.Pechenov
7 
8 using namespace std;
9 #include "hmdctrackfitter.h"
10 #include "hdebug.h"
11 #include "hades.h"
12 #include "hevent.h"
13 #include "hmdctrackfitpar.h"
14 #include "hruntimedb.h"
15 #include "hmdcsizescells.h"
16 #include "hgeomvector.h"
17 #include "hmdcgetcontainers.h"
18 #include "hmdclistcells.h"
19 #include "hmdcwirefitsim.h"
20 #include "hmdcclusfitsim.h"
21 #include "hmdcclussim.h"
22 #include "hmdctrackdset.h"
23 #include "hmdcdigitpar.h"
24 
25 //_HADES_CLASS_DESCRIPTION
26 //////////////////////////////////////////////////////////////////////////////
27 //
28 // HMdcTrackFitInOut
29 //
30 // Service class for for Dubna track piece fitters
31 //
32 //
33 // HMdcTrackFitter
34 //
35 // Base class for Dubna track piece fitters
36 //
37 //////////////////////////////////////////////////////////////////////////////
38 
41 
43  fSizesCells=0;
44  setDefaultFitParam();
45  useRndbPar = kTRUE;
46 }
47 
49  // parameters:
51  if(version==0) {
52  Warning("init","track fit version 0 is not supported more, version 1 will used");
53  version=1;
54  }
55  if(!useRndbPar) fitPar = 0;
56  else fitPar = (HMdcTrackFitPar*)gHades->getRuntimeDb()->getContainer("MdcTrackFitPar");
57  fprint = HMdcTrackDSet::fPrint();
59 
60  fDriftTimePar = HMdcDriftTimePar::getObject();
61  HMdcWireData::setDriftTimePar(fDriftTimePar);
62  wireOffsetFlag=HMdcTrackDSet::getUseWireOffset();
63  if(wireOffsetFlag) {
64  fDigitPar=(HMdcDigitPar*)gHades->getRuntimeDb()->getContainer("MdcDigitPar");
65  if(!fDigitPar) {
66  Error("init:","Zero pointer for HMdcDigitPar recieved!");
67  return kFALSE;
68  }
69  } else fDigitPar=0;
70 
71  fSizesCells=HMdcSizesCells::getObject();
72  if (!fSizesCells) {
73  Error("init","HMdcSizesCells is absent");
74  return kFALSE;
75  }
76 
77  // categoryes:
78  geantFlag=HMdcGetContainers::isGeant();
79  if(geantFlag && HMdcTrackDSet::fNTuple()) {
80  fGeantKineCat = fGetCont->getCatGeantKine();
81  fGeantMdcCat = fGetCont->getCatGeantMdc();
82  } else {
83  fGeantKineCat = 0;
84  fGeantMdcCat = 0;
85  }
86  fCalCat = fGetCont->getCatMdcCal1();
87  if (!fCalCat) return kFALSE;
89  fClusFitCat = fGetCont->getCatMdcClusFit(kTRUE);
90  fWireFitCat = fGetCont->getCatMdcWireFit(kTRUE);
91  if(!fClusFitCat || !fWireFitCat) return kFALSE;
92  } else {
93  fClusFitCat = 0;
94  fWireFitCat = 0;
95  }
96  locClusFit.set(1,0);
97  locWireFit.set(1,0);
98  loc.set(4,0,0,0,0);
99  return kTRUE;
100 }
101 
103  if(!fSizesCells->initContainer()) return kFALSE;
104  if(!fDriftTimePar->initContainer()) return kFALSE;
105  for(Int_t sec=0; sec<6; sec++) {
106  HMdcSizesCellsSec& fSCSec=(*fSizesCells)[sec];
107  for(Int_t mod=0; mod<4; mod++)
108  fSCModAr[sec][mod]=(fSizesCells->modStatus(sec,mod)) ? &fSCSec[mod] : 0;
109  }
110  if( fitPar ) {
111  if( !HMdcGetContainers::isInited(fitPar) ) return kFALSE;
112  else {
113  if(useRtdbTofFlag) tofFlag = fitPar->getTofFlag();
114  cutWeight = fitPar->getCutWeight ();
115  if(useRtdbTScFlag) doTargScan = fitPar->getDoTargScan();
116 
117  minTimeOffset = fitPar->getMinTimeOffset ();
118  maxTimeOffset = fitPar->getMaxTimeOffset ();
119  minCellsNum = fitPar->getMinCellsNum ();
120  chi2CutFlag = fitPar->getChi2CutFlag ();
121  totalChi2Cut = fitPar->getTotalChi2Cut ();
122  chi2PerNdfCut = fitPar->getChi2PerNdfCut ();
123 
124  if(useRtdbTFlag) useTukeyFlag = fitPar->getUseTukeyFlag();
125  cnWs = fitPar->getCnWs ();
126  cn2s = fitPar->getCn2s ();
127  cn4s = fitPar->getCn4s ();
128  cn2s = cn4s*cn4s/cnWs; //No need to keep it RTDB
129  minSig2 = fitPar->getMinSig2 ();
130  maxNFilterIter= fitPar->getMaxNFilterIter();
131  minWeight = fitPar->getMinWeight ();
132  maxChi2 = fitPar->getMaxChi2 ();
133 
134  minTOffsetIter= fitPar->getMinTOffsetIter();
135 
136  funCt1 = fitPar->getFunCt1 ();
137  stepD1 = fitPar->getStepD1 ();
138  funCt2 = fitPar->getFunCt2 ();
139  stepD2 = fitPar->getStepD2 ();
140  stepD3 = fitPar->getStepD3 ();
141  }
142  }
143  if(wireOffsetFlag) {
144  if( !HMdcGetContainers::isInited(fDigitPar) ) return kFALSE;
145  signalSpeed=fDigitPar->getSignalSpeed();
146  } else signalSpeed=0.;
147  return kTRUE;
148 }
149 
151  // Default parameters of track fitter setting
152  // If it calls by user Rtdb fit parameters will not used.
153  useRndbPar = kFALSE;
154 
155  fprint = kFALSE;
156  printStartEv = 0;
157  nEventPrint = 1000000000;
158 
159  version = 1;
160  geantFlag = kFALSE;
161  wireOffsetFlag = 0;
162  signalSpeed = 0.005;
163  cutWeight = 0.01;
164  useRtdbTofFlag = kTRUE;
165  tofFlag = 3;
166  doTargScan = kTRUE;
167  calcInitValue = HMdcTrackDSet::getCalcInitValueFlag();
168 
169  minTimeOffset = -30.; // Time offset cut
170  maxTimeOffset = 60.; // -/-
171  minCellsNum = 5;
172 
173  chi2CutFlag = kTRUE; // kTRUE - do cut for funct., else for chi2/ndf
174  totalChi2Cut = 300.; // default value for funct. cut
175  chi2PerNdfCut = 50.; // default value for chi2/ndf cut
176 
177  // Tukey weight constants:
178  useTukeyFlag = kTRUE;
179  useRtdbTFlag = kTRUE;
180  useRtdbTScFlag = kTRUE;
181  cnWs = 6.4516; //2.54*2.54;
182  cn4s = 10.6276; //3.26*3.26;
183  cn2s = cn4s*cn4s/cnWs; //17.5561; //4.19*4.19;
184  minSig2 = 2.5*2.5;
185  tukeyScale = 1.;
186  maxNFilterIter = 4;
187  minWeight = 0.5; // wt[time]=(wt[time]<minWeight) ? 0.:1.;
188  maxChi2 = 25.; /*36.;6.0*/; // wt[time]=(chi2[time]>maxChi2) ? 0.:1.;
189 
190  minTOffsetIter = -50.; // if(timeOffset<minTOffsetIter) timeOffset=minTOffsetIter
191 
192  // Fit parameters for derivatives calc.:
193  funCt1 = 500.; // if(fun0 < funCt1)
194  stepD1 = 0.0001; // stepD = stepD1;
195  funCt2 = 10000.0; // else if(fun0 < funCt2)
196  stepD2 = 0.001; // stepD = stepD2;
197  stepD3 = 0.01; // else stepD = stepD3;
198 
199  // For alignment check:
200  for(Int_t s=0;s<6;s++) for(Int_t m=0;m<4;m++) for(Int_t l=0;l<6;l++) exclLay[s][m][l] = kFALSE;
201 }
202 
203 void HMdcTrackFitInOut::setNEventsPrint(Int_t start,Int_t nev) {
204  printStartEv = start;
205  nEventPrint = nev;
206 }
207 
208 void HMdcTrackFitInOut::setTukeyConstants(Double_t cw,Double_t c2,Double_t c4) {
209  // Setting of tukey weights constants:
210  // if (chi2<cnWs*sig2) weight=(1-(chi2/(cn4s*sig2))^2)^2
211  // else if(chi2<cn2s*sig2) weight=(1- chi2/(cn2s*sig2) )^2
212  // else weight=0.
213  cnWs = cw*cw;
214  cn4s = c4*c4;
215  cn2s = cn4s*cn4s/cnWs; // cn2s = c2*c2;
216 }
217 
218 void HMdcTrackFitInOut::getTukeyConstants(Double_t& cw,Double_t& c2,
219  Double_t& c4) const {
220  cw = sqrt(cnWs);
221  c2 = sqrt(cn2s);
222  c4 = sqrt(cn4s);
223 }
224 
226  TObject* fWireFit=fWireFitCat->getNewSlot(locWireFit,indWireFit);
227  if(!fWireFit) {
228  Warning("getNewWireFitSlot","No slot HMdcWireFit available");
229  return 0;
230  }
231  if(geantFlag) return new(fWireFit) HMdcWireFitSim;
232  else return new(fWireFit) HMdcWireFit;
233 }
234 
236  TObject* fClusFit=fClusFitCat->getNewSlot(locClusFit,indClusFit);
237  if(!fClusFit) {
238  Warning("getNewClusFitSlot","No slot HMdcClusFit available");
239  return 0;
240  }
241  if(geantFlag) return new(fClusFit) HMdcClusFitSim;
242  else return new(fClusFit) HMdcClusFit;
243 }
244 
245 Double_t HMdcTrackFitInOut::getStepDer(Double_t funct) const {
246  return (funct<funCt1) ? stepD1:((funct<funCt2) ? stepD2:stepD3);
247 }
248 
249 void HMdcTrackFitInOut::setPrintFlag(Int_t currentEvent) {
250  fprint = currentEvent>=printStartEv && currentEvent<printStartEv+nEventPrint;
251 }
252 
254  chi2CutFlag = kFALSE;
255  chi2PerNdfCut = cut;
256 }
257 
259  chi2CutFlag = kTRUE;
260  totalChi2Cut = cut;
261 }
262 
263 void HMdcTrackFitInOut::excludeLayer(UInt_t s,UInt_t m,UInt_t l) {
264  if(s<6 && m<4 && l<6) exclLay[s][m][l] = kTRUE;
265 }
266 
267 void HMdcTrackFitInOut::excludeModule(UInt_t s,UInt_t m) {
268  if(s<6 && m<4) for(UInt_t l=0;l<6;l++) exclLay[s][m][l] = kTRUE;
269 }
270 
271 Bool_t HMdcTrackFitInOut::isLayerExcluded(Int_t s,Int_t m,Int_t l) const {
272  return s<6 && m<4 && l<6 ? exclLay[s][m][l] : kFALSE;
273 }
274 
275 //============================================================================
276 
278  fitInOut=fIO;
279  init();
280 }
281 
283  fprint = fitInOut->getPrintFlag();
284  tofFlag = fitInOut->getTofFlag();
285  wires.setPrintFlag(fprint);
286  wires.setTrackFitInOut(fitInOut);
287 }
288 
289 void HMdcTrackFitter::setPrintFlag(Bool_t prnt) {
290  fprint=prnt;
291  wires.setPrintFlag(fprint);
292 }
293 
295  segIndex=-1;
296  indClusFit=-1; //??? mozhet v drugoe mesto?
297  if(!wires.fillListHits(cl1,cl2)) return kFALSE;
298  setPlanes();
299  return kTRUE;
300 }
301 
303  HMdcClus* cl5,HMdcClus* cl6,HMdcClus* cl7,HMdcClus* cl8) {
304  // Cosmic two sectors data
305  segIndex=-1;
306  indClusFit=-1; //??? mozhet v drugoe mesto?
307  if( !wires.fillListHits(cl1,cl2,cl3,cl4,cl5,cl6,cl7,cl8) ) return kFALSE;
308  setPlanes();
309  return kTRUE;
310 }
311 
313  segIndex=-1;
314  indClusFit=-1; //??? mozhet v drugoe mesto?
315  if(!wires.fillListHits(store,clus1,clus2)) return kFALSE;
316  setPlanes();
317  return kTRUE;
318 }
319 
321  segIndex=-1;
322  indClusFit=-1; //??? mozhet v drugoe mesto?
323  if(!wires.fillListHits(store)) return kFALSE;
324  setPlanes();
325  return kTRUE;
326 }
327 
329  Int_t sec = wires.getSector();
330  HMdcSizesCellsMod** fSCModAr = fitInOut->getSCellsModArr(sec);
331 // Int_t nClTimes=wires.getNDriftTimes();
332  Int_t nClTimes = wires.getNDrTmFirstSec();
333  initParam.setFirstPlane(&((*(fSCModAr[wires[0].getModule()]))[0]));
334  initParam.setSecondPlane(&((*(fSCModAr[wires[nClTimes-1].getModule()]))[5]));
335  initParam.setCoorSys(sec);
336 }
337 
339  HMdcClusFit* fClusFit=fitInOut->getNewClusFitSlot(&indClusFit);
340  if(!fClusFit) return kFALSE;
341  fClusFit->setFitStatus(fitStatus);
342  finalParam.fillClusFit(fClusFit);
343  fClusFit->setExitFlag(exitFlag);
344  wires.calcDistanceSign(finalParam);
345  wires.fillClusFitSim(fClusFit,finalParam);
346  wires.fillClusFitAndWireFit(fClusFit); // must be after fillClusFitSim
347  return kTRUE;
348 }
349 
350 Bool_t HMdcTrackFitter::fitCluster(Int_t fittingMod) {
351  if(wires.getNCellsInInput(fittingMod) < 5) return kFALSE;
352  wires.setHitStatM1toP1(); // if(hitStatus==-1) hitStatus=1 ???
353  wires.subtractWireOffset(initParam);
354 
355  // CalcInitValueFlag = 1:
356  if(HMdcTrackDSet::getCalcInitValueFlag()==1) wires.calcInitialValue(initParam);
357 
358  wires.fillLookupTableForDer(initParam);
359  fitStatus = fit(fittingMod);
360 
361  // CalcInitValueFlag = 2:
362  if(HMdcTrackDSet::getCalcInitValueFlag()==2 && wires.getNWiresInFit()<30) {
363  if(!fitStatus) refitCluster(fittingMod); // Fit is not accepted
364  else { // Fit is accepted
365  Int_t nInputLayers = wires.getInputListCells().getNLayers();
366  Int_t nFittedLayers = wires.getOutputListCells().getNLayers();
367  if(nInputLayers-nFittedLayers >= 3) {
368  refitCluster(fittingMod);
369  nFittedLayers = wires.getOutputListCells().getNLayers();
370  }
371  }
372  }
373 
374  if(fitInOut->getClusFitCat() && HMdcTrackDSet::fNTuple()) fillClusFitCont();
375  return fitStatus;
376 }
377 
378 void HMdcTrackFitter::refitCluster(Int_t fittingMod) {
379  if(wires.calcInitialValue(initParam)) {
380  wires.reinitWtSt();
381  fitStatus = fit(fittingMod);
382  }
383 }
384 
385 Bool_t HMdcTrackFitter::fit(Int_t fittingMod) {
386  Int_t iter = 0;
387  while(kTRUE) {
388  Int_t exit = minimize(iter++);
389  Double_t delW = wires.testFitResult();
390  Int_t nCells = wires.getNCellsInOutput(fittingMod);
391  if( delW<0.5 || nCells<6 ) {
392  if(exit == 0) return kFALSE;
393  if(delW > 0.)
394  if(finalParam.calcChi2PerDF(wires.getNumOfGoodWires())<0. || !testChi2Cut()) return kFALSE;
395  if(finalParam.testParameters(fitInOut->getMinTimeOffset(),fitInOut->getMaxTimeOffset()) &&
396  nCells >= fitInOut->getMinCellsNum()) return kTRUE;
397  break;
398  }
399  if(fprint) printf("TestFit: num.of deleted cells=%.1f, refit this!\n",delW);
400  }
401  return kFALSE;
402 }
403 
405  if(fitInOut->getChi2CutFlag()) {
406  if(finalParam.functional()<fitInOut->getTotalChi2Cut() ) return kTRUE;
407  } else if(finalParam.getChi2() <fitInOut->getChi2PerNdfCut()) return kTRUE;
408  return kFALSE;
409 }
410 
412  wires.setRegionOfWires(mod);
413 }
414 
416  if(fprint != fitInOut->getPrintFlag()) setPrintFlag(fitInOut->getPrintFlag());
417  if(fprint) {
418  cl1->print();
419  if(cl2) cl2->print();
420  }
421  if(!fillListHits(cl1,cl2)) return kFALSE;
422  initParam.setParam(cl1->getXTarg(),cl1->getYTarg(),cl1->getZTarg(),
423  cl1->getX(), cl1->getY(), cl1->getZ());
424  return kTRUE;
425 }
426 
428  HMdcClus* cl5,HMdcClus* cl6,HMdcClus* cl7,HMdcClus* cl8) {
429  // Cosmic two sectors data
430  if(fprint != fitInOut->getPrintFlag()) setPrintFlag(fitInOut->getPrintFlag());
431  if(fprint) {
432  cl1->print();
433  if(cl2 != NULL) cl2->print();
434  if(cl3 != NULL) cl3->print();
435  if(cl4 != NULL) cl4->print();
436  if(cl5 != NULL) cl5->print();
437  if(cl6 != NULL) cl6->print();
438  if(cl7 != NULL) cl7->print();
439  if(cl8 != NULL) cl8->print();
440  }
441  Int_t nSecs = 2;
442  if(cl5 != NULL) nSecs = 3;
443  if(cl7 != NULL) nSecs = 4;
444  initParam.setNMods(nSecs); //setTwoSecData();
445  finalParam.setNMods(nSecs); //setTwoSecData();
446  if(!fillListHits(cl1,cl2,cl3,cl4,cl5,cl6,cl7,cl8)) return kFALSE;
447  initParam.setParam(cl1->getXTarg(),cl1->getYTarg(),cl1->getZTarg(),
448  cl1->getX(), cl1->getY(), cl1->getZ());
449  return kTRUE;
450 }
451 
453  Double_t x1, Double_t y1, Double_t z1,
454  Double_t x2, Double_t y2, Double_t z2) {
455  if(fprint != fitInOut->getPrintFlag()) setPrintFlag(fitInOut->getPrintFlag());
456  if(fprint) printf("x1=%f y1=%f z1=%f x2=%f y2=%f z2=%f \n",x1,y1,z1,x2,y2,z2);
457  if(!fillListHits(store)) return kFALSE;
458  initParam.setParam(x1, y1, z1, x2, y2, z2);
459  wires.setXYZClust(x2, y2, z2);
460  return kTRUE;
461 }
462 
464  finalParam.copyLine(initParam);
465  wires.calcNGoodWiresAndChi2(finalParam);
466  wires.valueOfFunctional(finalParam,2);
467  wires.calculateErrors(finalParam); //Errors calculations
468 }
void setTukeyConstants(Double_t cw, Double_t c2, Double_t c4)
void setPlanes(void)
Bool_t fit(Int_t fittingMod=-1)
HCategory * getCatMdcWireFit(Bool_t create=kFALSE)
void setRegionOfWires(Int_t mod=-1)
void print(Bool_t fl=kTRUE) const
Definition: hmdcclus.cc:69
void excludeLayer(UInt_t s, UInt_t m, UInt_t l)
static HMdcGetContainers * getObject()
static Bool_t fPrint(void)
void setDefaultFitParam(void)
void getTukeyConstants(Double_t &cw, Double_t &c2, Double_t &c4) const
Float_t getY(void) const
Definition: hmdcclus.h:142
static Int_t getUseWireOffset(void)
void setPrintFlag(Bool_t prnt)
Float_t getZ(void) const
Definition: hmdcclus.h:143
HRuntimeDb * getRuntimeDb(void)
Definition: hades.h:111
Bool_t testChi2Cut(void)
Bool_t fitCluster(Int_t fittingMod=-1)
Float_t getYTarg(void) const
Definition: hmdcclus.h:145
static HMdcSizesCells * getObject(void)
static Bool_t isInited(HParSet *par)
Bool_t fillClusFitCont(void)
void excludeModule(UInt_t s, UInt_t m)
static Bool_t isGeant(void)
static Bool_t fNTuple(void)
HCategory * getCatMdcCal1(void)
ClassImp(HMdcTrackFitInOut) ClassImp(HMdcTrackFitter) HMdcTrackFitInOut
Bool_t isLayerExcluded(Int_t s, Int_t m, Int_t l) const
static UChar_t getCalcInitValueFlag(void)
void setChi2PerNdfCut(Double_t cut=50.)
Hades * gHades
Definition: hades.cc:1213
HCategory * getCatGeantMdc(void)
Bool_t setClustAndFill(HMdcClus *cl1, HMdcClus *cl2=NULL)
HParSet * getContainer(const Text_t *)
Definition: hruntimedb.cc:124
static Int_t getFitVersion(void)
void setTotalChi2Cut(Double_t cut=300.)
Bool_t fillListHits(HMdcClus *cl1, HMdcClus *cl2)
Float_t getXTarg(void) const
Definition: hmdcclus.h:144
Double_t getStepDer(Double_t funct) const
Float_t getZTarg(void) const
Definition: hmdcclus.h:146
void setFitStatus(Bool_t stat)
Definition: hmdcclusfit.h:79
void refitCluster(Int_t fittingMod=-1)
void setNEventsPrint(Int_t start, Int_t nev)
HCategory * getCatMdcClusFit(Bool_t create=kFALSE)
void setPrintFlag(Bool_t prnt)
static void setDriftTimePar(HMdcDriftTimePar *par)
Definition: hmdcwiredata.h:129
HCategory * getCatGeantKine(void)
HMdcClusFit * getNewClusFitSlot(Int_t *indClusFit)
Float_t getX(void) const
Definition: hmdcclus.h:141
HMdcTrackFitter(HMdcTrackFitInOut *fIO)
HMdcWireFit * getNewWireFitSlot(Int_t *indWireFit)
void setExitFlag(Char_t fl)
Definition: hmdcclusfit.h:77
static HMdcDriftTimePar * getObject(void)