//*--- 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.; } HMdcTrackParam::HMdcTrackParam(HMdcTrackParam& tp) { numOfGoodWires=0; copyParam(tp); copyPlanes(tp); nParam = tp.nParam; chi2perDF = tp.chi2perDF; isTmoffFixed = tp.isTmoffFixed; iterNumb = tp.iterNumb; } HMdcTrackParam::~HMdcTrackParam(void) { } 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; for(Int_t ip=0;ip0) isTmoffFixed = 0; for(Int_t m=0;m<4;m++) { sDev[m]=0.; sWht[m]=0.; } } void HMdcTrackParam::calcTimeOffsets(Int_t tofFlag) { // tofFlag=1 - calcul. timeOffsets for each Mdc // tofFlag=2 - calcul. timeOffsets for each segment // else - calcul. one timeOffset for all mdc's if(isTmoffFixed<0) return; timeOffsetFlag=tofFlag; if(timeOffsetFlag==1) for(Int_t m=0;m<4;m++) timeOffset[m]=(sWht[m]>0.) ? -sDev[m]/sWht[m]:0.; else if(timeOffsetFlag==2) { Double_t tos=(sWht[0]>0. || sWht[1]>0.) ? -(sDev[0]+sDev[1])/(sWht[0]+sWht[1]) : 0.; timeOffset[0]=(sWht[0]>0.) ? tos : 0.; timeOffset[1]=(sWht[1]>0.) ? tos : 0.; tos=(sWht[2]>0. || sWht[3]>0.) ? -(sDev[2]+sDev[3])/(sWht[2]+sWht[3]) : 0.; timeOffset[2]=(sWht[2]>0.) ? tos : 0.; timeOffset[3]=(sWht[3]>0.) ? tos : 0.; } else { Double_t tos=-(sDev[0]+sDev[1]+sDev[2]+sDev[3]) / (sWht[0]+sWht[1]+sWht[2]+sWht[3]); for(Int_t m=0;m<4;m++) timeOffset[m]=(sWht[m]>0.) ? tos : 0.; //! ??? } isTmoffFixed=0; } void HMdcTrackParam::correctMinTimeOffsets(Double_t minTos) { // if timeOffset[m]0. && timeOffset[m]0. && !isMdcTimeOffsetFixed(m)) { for(Int_t k=0;k0. && !isSegTimeOffsetFixed(0)) { for(Int_t k=0;k0. && !isSegTimeOffsetFixed(1)) { for(Int_t k=0;k0. && !isTrackTimeOffsetFixed()) { for(Int_t k=0;k0. && !isMdcTimeOffsetFixed(m)) { for(Int_t k=0;k0. && !isSegTimeOffsetFixed(0)) { for(Int_t k=0;k0. && !isSegTimeOffsetFixed(1)) { for(Int_t k=0;k0. && !isTrackTimeOffsetFixed()) { for(Int_t k=0;k0.) ? err : 0.; errTimeOffset[1]=(sWht[1]>0.) ? err : 0.; err=calcTosErr(2,3); errTimeOffset[2]=(sWht[2]>0.) ? err : 0.; errTimeOffset[3]=(sWht[3]>0.) ? err : 0.; } else { Double_t err=calcTosErr(); for(Int_t m=0;m<4;m++) errTimeOffset[m]=(sWht[m]>0.) ? 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 ip=0; ip0. || sWht[m2]>0.) for(int ip=0; ip0) numOfGoodWires=nGWires; chi2perDF = (numOfGoodWires>nParam) ? funct/(numOfGoodWires - nParam) : -1.; return chi2perDF; } void HMdcTrackParam::printParam(const char* title) const { if(title) printf("%s ",title); char zf=(funct<=oldFunct) ? '+':'-'; printf("%3i%c fun.=%5.4g=>%5.4g Par.=%6.2f %6.2f %6.2f %6.2f TOF=%5.1f %5.1f %5.1f %5.1f\n", iterNumb,zf,oldFunct,funct, point1.X(),point1.Y(),point2.X(),point2.Y(), timeOffset[0],timeOffset[1],timeOffset[2],timeOffset[3]); } void HMdcTrackParam::printFunctChange(const char* title) const { if(title) printf("%s ",title); printf("fun.=%-6g->%-6g\n",oldFunct,funct); } void HMdcTrackParam::printErrors(void) { errMatr.print(); printf(" timeoffsets:"); for(Int_t m=0;m<4;m++) if(errTimeOffset[m]>0) 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;m<4;m++) if(timeOffset[m]tosMax) 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; }