/* * TpcCalibCluster.cxx * * Created on: Apr 10, 2015 * Author: mberger */ #include #include #include "TpcCalibCluster.h" #include "TRandom.h" #include "TNtupleD.h" #include "TMatrixDSymEigen.h" #include "TVectorD.h" #include "TMatrixD.h" #include "TMatrixDSym.h" #include "TString.h" #include "TMath.h" #include "RooRealVar.h" #include "RooMultiVarGaussian.h" #include "RooDataSet.h" #include "RooArgList.h" #include "RooArgSet.h" #include "RooFitResult.h" #include "GFDetPlane.h" #include "TpcClusterErrorScaler.h" TpcCalibCluster::TpcCalibCluster() : fPos(0,0,0), fPosUV(0,0,0), fRefPos(0,0,0), fRefPosPlane(0,0,0), fev1Glob(0,0,0), fev2Glob(0,0,0), fResPlane(0,0,0), fRes(0,0,0), fev1(0,0,0), fev2(0,0,0), fParams(22,0), fID(0), fDafWeight(1), fisFake(false), fEigenVecIsSet(false), fPlaneM(3,2), fResPlaneD(2), fsize(1,1,1), fShapeCov(2), fMeigenVec(2,2), fMeigenVec_i(2,2) { ; } TpcCalibCluster::~TpcCalibCluster() {;} void TpcCalibCluster::setID(int i) { fID=i; } void TpcCalibCluster::setPlane(TVector3 O, TVector3 U, TVector3 V) { fPlane.set(O,U,V); fRefPosPlane=getPosOnPlane(fRefPos); //std::cout<<"make frefpos\n"; //fRefPosPlane.Print(); //fPlane.getU().Print(); //fPlane.getV().Print(); for (int i=0;i<3;i++) { fPlaneM[i][0]=fPlane.getU()[i]; fPlaneM[i][1]=fPlane.getV()[i]; } } void TpcCalibCluster::setPlaneON(TVector3 O,TVector3 N) { fPlane.setON(O,N); fRefPosPlane=getPosOnPlane(fRefPos); for (int i=0;i<3;i++) { fPlaneM[i][0]=fPlane.getU()[i]; fPlaneM[i][1]=fPlane.getV()[i]; } } TVector3 TpcCalibCluster::getPulls(Bool_t fake) { if (fake) {return produceFakePulls();} else {return calcPulls();} } Double_t TpcCalibCluster::getTheta() { double theta=fPlane.getNormal().Theta(); return theta; } TVector3 TpcCalibCluster::produceFakePulls() { TVector3 retVec(0,0,0); //params: 0 offsetxy 1:diffusion 2:Amp 3: offsetZ //std::cout<<"producing fake pulls with parameters:"<Gaus(0,fParams[1])); //retVec.SetY(fParams[0]+fPos.Z()*fParams[2]+gRandom->Gaus(0,fParams[1])); //retVec.SetZ(fParams[0]+fPos.Z()*fParams[2]+gRandom->Gaus(0,fParams[1])); //retVec.SetX(fParams[0]+fPos.Z()*fParams[2]+fParams[1]*fDigiPos[0].X()); //retVec.SetY(fParams[0]+fPos.Z()*fParams[2]+fParams[1]*fDigiPos[0].X()); //retVec.SetZ(fParams[0]+fPos.Z()*fParams[2]+fParams[1]*fDigiPos[0].Z()); //TVector3 Res(fpos); //Res.SetX(0.003+0.001*sqrt(fPos.Z()));//+0.02*cos(2*getTheta())); //Res.SetY(0.003+0.001*sqrt(fPos.Z()));//+0.02*cos(2*getTheta())); //Res.SetZ(0.003+0.001*sqrt(fPos.Z()));//+0.02*cos(2*getTheta())); //retVec=TVector3(1000*Res); //fResPlane=getPosOnPlane(Res); TVector3 cog=getPosOnPlane(fPos); //std::cout<<"vectors:\n"; //fPos.Print(); //cog.Print(); TMatrixDSym cov(2,getErrorCovPlane().GetMatrixArray()); TMatrixDSymEigen eigenproblem(cov); TMatrixD eigenvects=eigenproblem.GetEigenVectors(); TVectorD eigenvalues=eigenproblem.GetEigenValues(); TVector3 ev1(eigenvects[0][0],eigenvects[1][0],0); TVector3 ev2(eigenvects[0][1],eigenvects[1][1],0); //return calcPulls(cog,ev1,ev2,eigenvalues[0],eigenvalues[1]); return retVec; } TVector3 TpcCalibCluster::calcPulls() { TVector3 ret; TMatrixDSym cov(2,getErrorCovPlane().GetMatrixArray()); TVector3 posOnPlane; posOnPlane=getPosOnPlane(fPos); //std::cout<<"cov on plane\n"; //cov.Print(); TMatrixDSymEigen eigenproblem(cov); TMatrixD eigenvects=eigenproblem.GetEigenVectors(); TVectorD eigenvalues=eigenproblem.GetEigenValues(); TVector3 ev1(eigenvects[0][0],eigenvects[1][0],0); TVector3 ev2(eigenvects[0][1],eigenvects[1][1],0); TVector3 retVec(0,0,0); TVector3 tmp_ev1Glob=ev1[0]*fPlane.getU()+ev1[1]*fPlane.getV(); TVector3 tmp_ev2Glob=ev2[0]*fPlane.getU()+ev2[1]*fPlane.getV(); tmp_ev1Glob.SetMag(1); tmp_ev2Glob.SetMag(1); fResPlane.SetXYZ(posOnPlane.X()-fRefPosPlane.X(),posOnPlane.Y()-fRefPosPlane.Y(),0.); fResPlaneD[0]=fResPlane.X(); fResPlaneD[1]=fResPlane.Y(); fRes=fPos-fRefPos; TVector3 resAxis((fResPlane*ev1)/ev1.Mag(),(fResPlane*ev2)/ev2.Mag(),0); fev1Glob=TVector3(tmp_ev1Glob*sqrt(eigenvalues[0])); fev2Glob=TVector3(tmp_ev2Glob*sqrt(eigenvalues[1])); retVec[0]=resAxis.X()/sqrt(eigenvalues[0]); retVec[1]=resAxis.Y()/sqrt(eigenvalues[1]); //std::cout<<"calib cluster axis errors: "<