//*--- Author : V.Pechenov //*--- Modified: 16.08.05 V.Pechenov using namespace std; #include #include #include "hmdctrackparam.h" #include "hmdcclusfit.h" #include "hmdcgeomobj.h" #include "hmdcwiredata.h" //_HADES_CLASS_DESCRIPTION ////////////////////////////////////////////////////////////////////////////// // // HMdcTrackParam // // Class keep track fit parameters // ////////////////////////////////////////////////////////////////////////////// ClassImp(HMdcTrackParam) HMdcTrackParam::HMdcTrackParam(void) { nParam = 4; timeOffsetFlag = 3; numOfGoodWires = 0; isTmoffFixed = 0; iterNumb = 0; chi2perDF = -1.; funct = -1.; oldFunct = -1.; nMods = 4; } void HMdcTrackParam::copyNewParam(const HMdcTrackParam& tp) { copyParam(tp); copyTimeOffsets(tp); funct = tp.funct; iterNumb = tp.iterNumb; numOfGoodWires = tp.numOfGoodWires; chi2perDF = tp.chi2perDF; sumWeight = tp.sumWeight; nMods = tp.nMods; for(Int_t m=0;m0) isTmoffFixed = 0; for(Int_t m=0;m0. ? -sDev[m]/sWht[m]:0.; else if(timeOffsetFlag==2) { for(Int_t m=0;m0. ? -(sDev[m]+sDev[m+1])/sW : 0.; timeOffset[m] = sWht[m] >0. ? tos : 0.; timeOffset[m+1] = sWht[m+1]>0. ? tos : 0.; } } else { Double_t sD = 0; Double_t sW = 0; for(Int_t m=0;m0. ? tos : 0.; // ! ??? } isTmoffFixed = 0; } Double_t HMdcTrackParam::getSumWtNorm(Int_t m) const { // Return sum of weight/errTdcTime^2 for all valid wires if(isTmoffFixed<0 || m<0 || m>=nMods || timeOffsetFlag==0) return 0.; if(timeOffsetFlag == 3) { // One Toff per track Double_t sW = 0; for(Int_t im=0;im0. && timeOffset[m]0. && !isMdcTimeOffsetFixed(m)) { for(Int_t k=0;k0. && !isSegTimeOffsetFixed(m/2)) for(Int_t k=0;k0. && !isTrackTimeOffsetFixed()) for(Int_t k=0;k0. && !isMdcTimeOffsetFixed(m)) { for(Int_t k=0;k0. && !isSegTimeOffsetFixed(m/2)) for(Int_t k=0;k0. && !isTrackTimeOffsetFixed()) for(Int_t k=0;k0. && !isMdcTimeOffsetFixed(m)) { for(Int_t k=0;k0. && !isSegTimeOffsetFixed(m/2)) for(Int_t k=0;k0. && !isTrackTimeOffsetFixed()) for(Int_t k=0;k0. ? err : 0.; errTimeOffset[m+1] = sWht[m+1]>0. ? err : 0.; } } else { Double_t err = calcTosErr(); for(Int_t m=0;m0. ? err : 0.; } } Double_t HMdcTrackParam::calcTosErr(Int_t m) { if(isTmoffFixed < 0) return 0.; if(sWht[m]==0.) return 0.; Double_t sum=0.; for(Int_t ip=0; ip0. || sWht[m2]>0.) for(Int_t ip=0; ip0) numOfGoodWires=nGWires; chi2perDF = (numOfGoodWires>nParam) ? funct/(numOfGoodWires - nParam) : -1.; return chi2perDF; } void HMdcTrackParam::printParam(const Char_t* title) const { if(title) printf("%s ",title); Char_t zf=(funct<=oldFunct) ? '+':'-'; printf("%3i%c fun.=%5.4g=>%5.4g Par.=%6.2f %6.2f %6.2f %6.2f TOF=", iterNumb,zf,oldFunct,funct,point1.X(),point1.Y(),point2.X(),point2.Y()); for(Int_t m=0;m%-6g\n",oldFunct,funct); } void HMdcTrackParam::printErrors(void) { errMatr.print(); printf(" timeoffsets:"); for(Int_t m=0;m0) printf(" mod%i=%g+/-%g",m+1,timeOffset[m],errTimeOffset[m]); printf("\n"); } void HMdcTrackParam::fillClusFit(HMdcClusFit* fClusFit) const { fClusFit->setNParam(nParam); fClusFit->setFunMin(funct); fClusFit->setTimeOff(timeOffset); fClusFit->setX1(point1.X()); fClusFit->setY1(point1.Y()); fClusFit->setZ1(point1.Z()); fClusFit->setX2(point2.X()); fClusFit->setY2(point2.Y()); fClusFit->setZ2(point2.Z()); fClusFit->setNumIter(iterNumb); fClusFit->setNumOfWires(numOfGoodWires); } Bool_t HMdcTrackParam::testParameters(Double_t tosMin, Double_t tosMax) { if(isTmoffFixed<0) return kTRUE; for(Int_t m=0;mtosMax) return kFALSE; return kTRUE; } void HMdcTrackParam::setFixedTimeOffset(Double_t o1,Double_t o2,Double_t o3,Double_t o4) { timeOffset[0] = o1; timeOffset[1] = o2; timeOffset[2] = o3; timeOffset[3] = o4; isTmoffFixed = -1; for(Int_t m=4;m<16;m++) timeOffset[m] = 0; } void HMdcTrackParam::setTimeOffsets(Double_t* tos,Int_t size) { if(size<0) size = 0; if(size>0 && size<16) for(Int_t m=0;mcopyPlanes(p); nMods = p.nMods; }