/************************************************************************** * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * * * * Author: The ALICE Off-line Project. * * Contributors are mentioned in the code where appropriate. * * * * Permission to use, copy, modify and distribute this software and its * * documentation strictly for non-commercial purposes is hereby granted * * without fee, provided that the above copyright notice appears in all * * copies and that both the copyright notice and this permission notice * * appear in the supporting documentation. The authors make no claims * * about the suitability of this software for any purpose. It is * * provided "as is" without express or implied warranty. * **************************************************************************/ /////////////////////////////////////////////////////////////////////////////// // // // TPC cluster error, shape and charge parameterization as function // of drift length, and inclination angle // // // Following notation is used in following // Int_t dim 0 - y direction // 1 - z direction // // Int_t type 0 - short pads // 1 - medium pads // 2 - long pads // Float_t z - drift length // // Float_t angle - tangent of inclination angle at given dimension // // Implemented parameterization // // // 1. Resolution as function of drift length and inclination angle // 1.a) GetError0(Int_t dim, Int_t type, Float_t z, Float_t angle) // Simple error parameterization as derived from analytical formula // only linear term in drift length and angle^2 // The formula is valid only with precission +-5% // Separate parameterization for differnt pad geometry // 1.b) GetError0Par // Parabolic term correction - better precision // // 1.c) GetError1 - JUST FOR Study // Similar to GetError1 // The angular and diffusion effect is scaling with pad length // common parameterization for different pad length // // 2. Error parameterization using charge // 2.a) GetErrorQ // GetError0+ // adding 1/Q component to diffusion and angluar part // 2.b) GetErrorQPar // GetError0Par+ // adding 1/Q component to diffusion and angluar part // 2.c) GetErrorQParScaled - Just for study // One parameterization for all pad shapes // Smaller precission as previous one // // // Example how to retrieve the paramterization: /* AliCDBManager::Instance()->SetRun(1) AliCDBManager::Instance()->SetDefaultStorage("local://$ALICE_ROOT"); AliTPCClusterParam * param = AliTPCcalibDB::Instance()->GetClusterParam(); // // AliTPCClusterParam::SetInstance(param); TF1 f1("f1","AliTPCClusterParam::SGetError0Par(1,0,x,0)",0,250); */ // // // /////////////////////////////////////////////////////////////////////////////// #include "AliTPCClusterParam.h" #include "TMath.h" #include "TFile.h" #include "TTree.h" #include #include #include #include #include #include ClassImp(AliTPCClusterParam) AliTPCClusterParam* AliTPCClusterParam::fgInstance = 0; /* Example usage fitting parameterization: TFile fres("resol.root"); //tree with resolution and shape TTree * treeRes =(TTree*)fres.Get("Resol"); AliTPCClusterParam param; param.SetInstance(¶m); param.FitResol(treeRes); param.FitRMS(treeRes); TFile fparam("TPCClusterParam.root","recreate"); param.Write("Param"); // // TFile fparam("TPCClusterParam.root"); AliTPCClusterParam *param2 = (AliTPCClusterParam *) fparam.Get("Param"); param2->SetInstance(param2); param2->Test(treeRes); treeRes->Draw("(Resol-AliTPCClusterParam::SGetError0(Dim,Pad,Zm,AngleM))/Resol","Dim==0&&QMean<0") */ //_ singleton implementation __________________________________________________ AliTPCClusterParam* AliTPCClusterParam::Instance() { // // Singleton implementation // Returns an instance of this class, it is created if neccessary // if (fgInstance == 0){ fgInstance = new AliTPCClusterParam(); } return fgInstance; } void AliTPCClusterParam::FitResol0(TTree * tree, Int_t dim, Int_t type, Float_t *param0, Float_t *error){ // // Fit z - angular dependence of resolution // // Int_t dim=0, type=0; char varVal[100]; sprintf(varVal,"Resol:AngleM:Zm"); char varErr[100]; sprintf(varErr,"Sigma:AngleS:Zs"); char varCut[100]; sprintf(varCut,"Dim==%d&&Pad==%d&&QMean<0",dim,type); // Int_t entries = tree->Draw(varVal,varCut); Float_t px[10000], py[10000], pz[10000]; Float_t ex[10000], ey[10000], ez[10000]; // tree->Draw(varErr,varCut); for (Int_t ipoint=0; ipointGetV3()[ipoint]; ey[ipoint]= tree->GetV2()[ipoint]; ez[ipoint]= tree->GetV1()[ipoint]; } tree->Draw(varVal,varCut); for (Int_t ipoint=0; ipointGetV3()[ipoint]; py[ipoint]= tree->GetV2()[ipoint]; pz[ipoint]= tree->GetV1()[ipoint]; } // TLinearFitter fitter(3,"hyp2"); for (Int_t ipoint=0; ipointDraw(varVal,varCut); Float_t px[10000], py[10000], pz[10000]; Float_t ex[10000], ey[10000], ez[10000]; // tree->Draw(varErr,varCut); for (Int_t ipoint=0; ipointGetV3()[ipoint]; ey[ipoint]= tree->GetV2()[ipoint]; ez[ipoint]= tree->GetV1()[ipoint]; } tree->Draw(varVal,varCut); for (Int_t ipoint=0; ipointGetV3()[ipoint]; py[ipoint]= tree->GetV2()[ipoint]; pz[ipoint]= tree->GetV1()[ipoint]; } // TLinearFitter fitter(6,"hyp5"); for (Int_t ipoint=0; ipointDraw(varVal,varCut); Float_t px[10000], py[10000], pz[10000]; Float_t ex[10000], ey[10000], ez[10000]; // tree->Draw(varErr,varCut); for (Int_t ipoint=0; ipointGetV3()[ipoint]; ey[ipoint]= tree->GetV2()[ipoint]; ez[ipoint]= tree->GetV1()[ipoint]; } tree->Draw(varVal,varCut); for (Int_t ipoint=0; ipointGetV3()[ipoint]; py[ipoint]= tree->GetV2()[ipoint]; pz[ipoint]= tree->GetV1()[ipoint]; } // TLinearFitter fitter(3,"hyp2"); for (Int_t ipoint=0; ipoint0",dim,type); // Int_t entries = tree->Draw(varVal,varCut); Float_t px[20000], py[20000], pz[20000], pu[20000], pt[20000]; Float_t ex[20000], ey[20000], ez[20000]; // tree->Draw(varErr,varCut); for (Int_t ipoint=0; ipointGetV3()[ipoint]; ey[ipoint]= tree->GetV2()[ipoint]; ez[ipoint]= tree->GetV1()[ipoint]; } tree->Draw(varVal,varCut); for (Int_t ipoint=0; ipointGetV3()[ipoint]; py[ipoint]= tree->GetV2()[ipoint]; pz[ipoint]= tree->GetV1()[ipoint]; } tree->Draw(varVal0,varCut); for (Int_t ipoint=0; ipointGetV3()[ipoint]; pt[ipoint]= tree->GetV2()[ipoint]; } // TLinearFitter fitter(5,"hyp4"); for (Int_t ipoint=0; ipoint0",dim,type); // Int_t entries = tree->Draw(varVal,varCut); Float_t px[20000], py[20000], pz[20000], pu[20000], pt[20000]; Float_t ex[20000], ey[20000], ez[20000]; // tree->Draw(varErr,varCut); for (Int_t ipoint=0; ipointGetV3()[ipoint]; ey[ipoint]= tree->GetV2()[ipoint]; ez[ipoint]= tree->GetV1()[ipoint]; } tree->Draw(varVal,varCut); for (Int_t ipoint=0; ipointGetV3()[ipoint]; py[ipoint]= tree->GetV2()[ipoint]; pz[ipoint]= tree->GetV1()[ipoint]; } tree->Draw(varVal0,varCut); for (Int_t ipoint=0; ipointGetV3()[ipoint]; pt[ipoint]= tree->GetV2()[ipoint]; } // TLinearFitter fitter(8,"hyp7"); for (Int_t ipoint=0; ipointDraw(varVal,varCut); Float_t px[10000], py[10000], pz[10000]; Float_t ex[10000], ey[10000], ez[10000]; // tree->Draw(varErr,varCut); for (Int_t ipoint=0; ipointGetV3()[ipoint]; ey[ipoint]= tree->GetV2()[ipoint]; ez[ipoint]= tree->GetV1()[ipoint]; } tree->Draw(varVal,varCut); for (Int_t ipoint=0; ipointGetV3()[ipoint]; py[ipoint]= tree->GetV2()[ipoint]; pz[ipoint]= tree->GetV1()[ipoint]; } // TLinearFitter fitter(3,"hyp2"); for (Int_t ipoint=0; ipointDraw(varVal,varCut); Float_t px[10000], py[10000], pz[10000]; Float_t type[10000], ey[10000], ez[10000]; // tree->Draw(varErr,varCut); for (Int_t ipoint=0; ipointGetV3()[ipoint]; ey[ipoint] = tree->GetV2()[ipoint]; ez[ipoint] = tree->GetV1()[ipoint]; } tree->Draw(varVal,varCut); for (Int_t ipoint=0; ipointGetV3()[ipoint]; py[ipoint]= tree->GetV2()[ipoint]; pz[ipoint]= tree->GetV1()[ipoint]; } // TLinearFitter fitter(4,"hyp3"); for (Int_t ipoint=0; ipoint0",dim,type); // Int_t entries = tree->Draw(varVal,varCut); Float_t px[20000], py[20000], pz[20000], pu[20000], pt[20000]; Float_t ex[20000], ey[20000], ez[20000]; // tree->Draw(varErr,varCut); for (Int_t ipoint=0; ipointGetV3()[ipoint]; ey[ipoint]= tree->GetV2()[ipoint]; ez[ipoint]= tree->GetV1()[ipoint]; } tree->Draw(varVal,varCut); for (Int_t ipoint=0; ipointGetV3()[ipoint]; py[ipoint]= tree->GetV2()[ipoint]; pz[ipoint]= tree->GetV1()[ipoint]; } tree->Draw(varVal0,varCut); for (Int_t ipoint=0; ipointGetV3()[ipoint]; pt[ipoint]= tree->GetV2()[ipoint]; } // TLinearFitter fitter(5,"hyp4"); for (Int_t ipoint=0; ipointDraw(varVal,varCut); Float_t px[20000], py[20000]; // tree->Draw(varVal,varCut); for (Int_t ipoint=0; ipointGetV2()[ipoint]; py[ipoint]= tree->GetV1()[ipoint]; } TLinearFitter fitter(2,"pol1"); for (Int_t ipoint=0; ipoint2.0*(rmsSigma+fErrorRMSSys[dim])){ //1.5 sigma cut on mean value+= rmsL*rmsL+2*rmsM*rmsM-3*rmsMeanQ*rmsMeanQ; }else{ if ((rmsL-rmsMeanQ)>3.*(rmsSigma+fErrorRMSSys[dim])){ //3 sigma cut on local value+= rmsL*rmsL-rmsMeanQ*rmsMeanQ; } } return TMath::Sqrt(TMath::Abs(value)); } void AliTPCClusterParam::FitData(TTree * tree){ // // make fits for error param and shape param // FitResol(tree); FitRMS(tree); } void AliTPCClusterParam::FitResol(TTree * tree){ // SetInstance(this); for (Int_t idir=0;idir<2; idir++){ for (Int_t itype=0; itype<3; itype++){ Float_t param0[10]; Float_t error0[10]; // model error param FitResol0(tree, idir, itype,param0,error0); printf("\nResol\t%d\t%d\tchi2=%f\n",idir,itype,param0[3]); printf("%f\t%f\t%f\n", param0[0],param0[1],param0[2]); printf("%f\t%f\t%f\n", error0[0],error0[1],error0[2]); for (Int_t ipar=0;ipar<4; ipar++){ fParamS0[idir][itype][ipar] = param0[ipar]; fErrorS0[idir][itype][ipar] = param0[ipar]; } // error param with parabolic correction FitResol0Par(tree, idir, itype,param0,error0); printf("\nResolPar\t%d\t%d\tchi2=%f\n",idir,itype,param0[6]); printf("%f\t%f\t%f\t%f\t%f\t%f\n", param0[0],param0[1],param0[2],param0[3],param0[4],param0[5]); printf("%f\t%f\t%f\t%f\t%f\t%f\n", error0[0],error0[1],error0[2],error0[3],error0[4],error0[5]); for (Int_t ipar=0;ipar<7; ipar++){ fParamS0Par[idir][itype][ipar] = param0[ipar]; fErrorS0Par[idir][itype][ipar] = param0[ipar]; } // FitResolQ(tree, idir, itype,param0,error0); printf("\nResolQ\t%d\t%d\tchi2=%f\n",idir,itype,param0[5]); printf("%f\t%f\t%f\t%f\t%f\n", param0[0],param0[1],param0[2],param0[3],param0[4]); printf("%f\t%f\t%f\t%f\t%f\n", error0[0],error0[1],error0[2],error0[3],error0[4]); for (Int_t ipar=0;ipar<6; ipar++){ fParamSQ[idir][itype][ipar] = param0[ipar]; fErrorSQ[idir][itype][ipar] = param0[ipar]; } // FitResolQPar(tree, idir, itype,param0,error0); printf("\nResolQ\t%d\t%d\tchi2=%f\n",idir,itype,param0[8]); printf("%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\n", param0[0],param0[1],param0[2],param0[3],param0[4],param0[5],param0[6],param0[7]); printf("%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\n", error0[0],error0[1],error0[2],error0[3],error0[4],error0[5],error0[6],error0[7]); for (Int_t ipar=0;ipar<9; ipar++){ fParamSQPar[idir][itype][ipar] = param0[ipar]; fErrorSQPar[idir][itype][ipar] = param0[ipar]; } } } // printf("Resol z-scaled\n"); for (Int_t idir=0;idir<2; idir++){ Float_t param0[4]; Float_t error0[4]; FitResol1(tree, idir,param0,error0); printf("\nResol\t%d\tchi2=%f\n",idir,param0[3]); printf("%f\t%f\t%f\n", param0[0],param0[1],param0[2]); printf("%f\t%f\t%f\n", error0[0],error0[1],error0[2]); for (Int_t ipar=0;ipar<4; ipar++){ fParamS1[idir][ipar] = param0[ipar]; fErrorS1[idir][ipar] = param0[ipar]; } } for (Int_t idir=0;idir<2; idir++){ printf("\nDirection %d\n",idir); printf("%d\t%f\t%f\t%f\n", -1,fParamS1[idir][0],fParamS1[idir][1],fParamS1[idir][2]); for (Int_t itype=0; itype<3; itype++){ Float_t length=0.75; if (itype==1) length=1; if (itype==2) length=1.5; printf("%d\t%f\t%f\t%f\n", itype,fParamS0[idir][itype][0],fParamS0[idir][itype][1]*TMath::Sqrt(length),fParamS0[idir][itype][2]/TMath::Sqrt(length)); } } } void AliTPCClusterParam::FitRMS(TTree * tree){ // SetInstance(this); for (Int_t idir=0;idir<2; idir++){ for (Int_t itype=0; itype<3; itype++){ Float_t param0[6]; Float_t error0[6]; FitRMS0(tree, idir, itype,param0,error0); printf("\nRMS\t%d\t%d\tchi2=%f\n",idir,itype,param0[3]); printf("%f\t%f\t%f\n", param0[0],param0[1],param0[2]); printf("%f\t%f\t%f\n", error0[0],error0[1],error0[2]); for (Int_t ipar=0;ipar<4; ipar++){ fParamRMS0[idir][itype][ipar] = param0[ipar]; fErrorRMS0[idir][itype][ipar] = param0[ipar]; } FitRMSQ(tree, idir, itype,param0,error0); printf("\nRMSQ\t%d\t%d\tchi2=%f\n",idir,itype,param0[5]); printf("%f\t%f\t%f\t%f\t%f\n", param0[0],param0[1],param0[2],param0[3],param0[4]); printf("%f\t%f\t%f\t%f\t%f\n", error0[0],error0[1],error0[2],error0[3],error0[4]); for (Int_t ipar=0;ipar<6; ipar++){ fParamRMSQ[idir][itype][ipar] = param0[ipar]; fErrorRMSQ[idir][itype][ipar] = param0[ipar]; } } } // printf("RMS z-scaled\n"); for (Int_t idir=0;idir<2; idir++){ Float_t param0[5]; Float_t error0[5]; FitRMS1(tree, idir,param0,error0); printf("\nRMS\t%d\tchi2=%f\n",idir,param0[4]); printf("%f\t%f\t%f\t%f\n", param0[0],param0[1],param0[2], param0[3]); printf("%f\t%f\t%f\t%f\n", error0[0],error0[1],error0[2], error0[3]); for (Int_t ipar=0;ipar<5; ipar++){ fParamRMS1[idir][ipar] = param0[ipar]; fErrorRMS1[idir][ipar] = param0[ipar]; } } for (Int_t idir=0;idir<2; idir++){ printf("\nDirection %d\n",idir); printf("%d\t%f\t%f\t%f\t%f\n", -1,fParamRMS1[idir][0],fParamRMS1[idir][1],fParamRMS1[idir][2], fParamRMS1[idir][3]); for (Int_t itype=0; itype<3; itype++){ Float_t length=0.75; if (itype==1) length=1; if (itype==2) length=1.5; if (itype==0) printf("%d\t%f\t\t\t%f\t%f\n", itype,fParamRMS0[idir][itype][0],fParamRMS0[idir][itype][1],fParamRMS0[idir][itype][2]/length); if (itype>0) printf("%d\t\t\t%f\t%f\t%f\n", itype,fParamRMS0[idir][itype][0],fParamRMS0[idir][itype][1],fParamRMS0[idir][itype][2]/length); } } // // Fit RMS sigma // printf("RMS fluctuation parameterization \n"); for (Int_t idir=0;idir<2; idir++){ for (Int_t itype=0; itype<3; itype++){ Float_t param0[5]; Float_t error0[5]; FitRMSSigma(tree, idir,itype,param0,error0); printf("\t%d\t%d\t%f\t%f\n", idir, itype, param0[0],param0[1]); for (Int_t ipar=0;ipar<2; ipar++){ fRMSSigmaFit[idir][itype][ipar] = param0[ipar]; } } } // // store systematic error end RMS fluctuation parameterization // TH1F hratio("hratio","hratio",100,-0.1,0.1); tree->Draw("(RMSm-AliTPCClusterParam::SGetRMSQ(Dim,Pad,Zm,AngleM,QMean))/RMSm>>hratio","Dim==0&&QMean>0"); fErrorRMSSys[0] = hratio.GetRMS(); tree->Draw("(RMSm-AliTPCClusterParam::SGetRMSQ(Dim,Pad,Zm,AngleM,QMean))/RMSm>>hratio","Dim==1&&QMean>0"); fErrorRMSSys[1] = hratio.GetRMS(); TH1F hratioR("hratioR","hratioR",100,0,0.2); tree->Draw("RMSs/RMSm>>hratioR","Dim==0&&QMean>0"); fRMSSigmaRatio[0][0]=hratioR.GetMean(); fRMSSigmaRatio[0][1]=hratioR.GetRMS(); tree->Draw("RMSs/RMSm>>hratioR","Dim==1&&QMean>0"); fRMSSigmaRatio[1][0]=hratioR.GetMean(); fRMSSigmaRatio[1][1]=hratioR.GetRMS(); } void AliTPCClusterParam::Test(TTree * tree, const char *output){ // // Draw standard quality histograms to output file // SetInstance(this); TFile f(output,"recreate"); f.cd(); // // 1D histograms - resolution // for (Int_t idim=0; idim<2; idim++){ for (Int_t ipad=0; ipad<3; ipad++){ char hname1[300]; char hcut1[300]; char hexp1[300]; // sprintf(hname1,"Delta0 Dir %d Pad %d",idim,ipad); sprintf(hcut1,"Dim==%d&&QMean<0&&Pad==%d",idim,ipad); sprintf(hexp1,"(Resol-AliTPCClusterParam::SGetError0(Dim,Pad,Zm,AngleM))/Resol>>%s",hname1); TH1F his1DRel0(hname1, hname1, 100,-0.2, 0.2); sprintf(hname1,"Dim==%d&&QMean<0&&Pad=%d",idim,ipad); tree->Draw(hexp1,hcut1,""); his1DRel0.Write(); // sprintf(hname1,"Delta0Par Dir %d Pad %d",idim,ipad); sprintf(hcut1,"Dim==%d&&QMean<0&&Pad==%d",idim,ipad); sprintf(hexp1,"(Resol-AliTPCClusterParam::SGetError0Par(Dim,Pad,Zm,AngleM))/Resol>>%s",hname1); TH1F his1DRel0Par(hname1, hname1, 100,-0.2, 0.2); sprintf(hname1,"Dim==%d&&QMean<0&&Pad=%d",idim,ipad); tree->Draw(hexp1,hcut1,""); his1DRel0Par.Write(); // } } // // 2D histograms - resolution // for (Int_t idim=0; idim<2; idim++){ for (Int_t ipad=0; ipad<3; ipad++){ char hname1[300]; char hcut1[300]; char hexp1[300]; // sprintf(hname1,"2DDelta0 Dir %d Pad %d",idim,ipad); sprintf(hcut1,"Dim==%d&&QMean<0&&Pad==%d",idim,ipad); sprintf(hexp1,"(Resol-AliTPCClusterParam::SGetError0(Dim,Pad,Zm,AngleM))/Resol:AngleM:Zm>>%s",hname1); TProfile2D profDRel0(hname1, hname1, 6,0,250,6,0,1); sprintf(hname1,"Dim==%d&&QMean<0&&Pad=%d",idim,ipad); tree->Draw(hexp1,hcut1,""); profDRel0.Write(); // sprintf(hname1,"2DDelta0Par Dir %d Pad %d",idim,ipad); sprintf(hcut1,"Dim==%d&&QMean<0&&Pad==%d",idim,ipad); sprintf(hexp1,"(Resol-AliTPCClusterParam::SGetError0Par(Dim,Pad,Zm,AngleM))/Resol:AngleM:Zm>>%s",hname1); TProfile2D profDRel0Par(hname1, hname1,6,0,250,6,0,1); sprintf(hname1,"Dim==%d&&QMean<0&&Pad=%d",idim,ipad); tree->Draw(hexp1,hcut1,""); profDRel0Par.Write(); // } } } void AliTPCClusterParam::Print(Option_t* /*option*/) const{ // // Print param Information // // // Error parameterization // printf("\nResolution Scaled factors\n"); printf("Dir\tPad\tP0\t\tP1\t\tP2\t\tchi2\n"); printf("Y\tall\t%f\t%f\t%f\t%f\n", TMath::Sqrt(TMath::Abs(fParamS1[0][0])),TMath::Sqrt(TMath::Abs(fParamS1[0][1])), TMath::Sqrt(TMath::Abs(fParamS1[0][2])),TMath::Sqrt(TMath::Abs(fParamS1[0][3]))); for (Int_t ipad=0; ipad<3; ipad++){ Float_t length=0.75; if (ipad==1) length=1; if (ipad==2) length=1.5; printf("\t%d\t%f\t%f\t%f\t%f\n", ipad, TMath::Sqrt(TMath::Abs(fParamS0[0][ipad][0])), TMath::Sqrt(TMath::Abs(fParamS0[0][ipad][1]*length)), TMath::Sqrt(TMath::Abs(fParamS0[0][ipad][2]/length)), TMath::Sqrt(TMath::Abs(fParamS0[0][ipad][3]))); } for (Int_t ipad=0; ipad<3; ipad++){ Float_t length=0.75; if (ipad==1) length=1; if (ipad==2) length=1.5; printf("\t%dPar\t%f\t%f\t%f\t%f\n", ipad, TMath::Sqrt(TMath::Abs(fParamS0Par[0][ipad][0])), TMath::Sqrt(TMath::Abs(fParamS0Par[0][ipad][1]*length)), TMath::Sqrt(TMath::Abs(fParamS0Par[0][ipad][2]/length)), TMath::Sqrt(TMath::Abs(fParamS0Par[0][ipad][6]))); } printf("Z\tall\t%f\t%f\t%f\t%f\n", TMath::Sqrt(TMath::Abs(fParamS1[1][0])),TMath::Sqrt(fParamS1[1][1]), TMath::Sqrt(fParamS1[1][2]), TMath::Sqrt(fParamS1[1][3])); for (Int_t ipad=0; ipad<3; ipad++){ Float_t length=0.75; if (ipad==1) length=1; if (ipad==2) length=1.5; printf("\t%d\t%f\t%f\t%f\t%f\n", ipad, TMath::Sqrt(TMath::Abs(fParamS0[1][ipad][0])), TMath::Sqrt(TMath::Abs(fParamS0[1][ipad][1]*length)), TMath::Sqrt(TMath::Abs(fParamS0[1][ipad][2]/length)), TMath::Sqrt(TMath::Abs(fParamS0[1][ipad][3]))); } for (Int_t ipad=0; ipad<3; ipad++){ Float_t length=0.75; if (ipad==1) length=1; if (ipad==2) length=1.5; printf("\t%dPar\t%f\t%f\t%f\t%f\n", ipad, TMath::Sqrt(TMath::Abs(TMath::Abs(fParamS0Par[1][ipad][0]))), TMath::Sqrt(TMath::Abs(fParamS0Par[1][ipad][1]*length)), TMath::Sqrt(TMath::Abs(fParamS0Par[1][ipad][2]/length)), TMath::Sqrt(TMath::Abs(fParamS0Par[1][ipad][6]))); } // // RMS scaling // printf("\n"); printf("\nRMS Scaled factors\n"); printf("Dir\tPad\tP00\t\tP01\t\tP1\t\tP2\t\tchi2\n"); printf("Y\tall\t%f\t%f\t%f\t%f\t%f\n", TMath::Sqrt(TMath::Abs(fParamRMS1[0][0])), TMath::Sqrt(TMath::Abs(fParamRMS1[0][1])), TMath::Sqrt(TMath::Abs(fParamRMS1[0][2])), TMath::Sqrt(TMath::Abs(fParamRMS1[0][3])), TMath::Sqrt(TMath::Abs(fParamRMS1[0][4]))); for (Int_t ipad=0; ipad<3; ipad++){ Float_t length=0.75; if (ipad==1) length=1; if (ipad==2) length=1.5; if (ipad==0){ printf("\t%d\t%f\t%f\t%f\t%f\t%f\n", ipad, TMath::Sqrt(TMath::Abs(fParamRMS0[0][ipad][0])), 0., TMath::Sqrt(TMath::Abs(fParamRMS0[0][ipad][1])), TMath::Sqrt(TMath::Abs(fParamRMS0[0][ipad][2]/(length*length))), TMath::Sqrt(TMath::Abs(fParamRMS0[0][ipad][3]))); }else{ printf("\t%d\t%f\t%f\t%f\t%f\t%f\n", ipad, 0., TMath::Sqrt(TMath::Abs(fParamRMS0[0][ipad][0])), TMath::Sqrt(TMath::Abs(fParamRMS0[0][ipad][1])), TMath::Sqrt(TMath::Abs(fParamRMS0[0][ipad][2]/(length*length))), TMath::Sqrt(TMath::Abs(fParamRMS0[0][ipad][3]))); } } printf("\n"); printf("Z\tall\t%f\t%f\t%f\t%f\t%f\n", TMath::Sqrt(TMath::Abs(fParamRMS1[1][0])), TMath::Sqrt(TMath::Abs(fParamRMS1[1][1])), TMath::Sqrt(TMath::Abs(fParamRMS1[1][2])), TMath::Sqrt(TMath::Abs(fParamRMS1[1][3])), TMath::Sqrt(TMath::Abs(fParamRMS1[1][4]))); for (Int_t ipad=0; ipad<3; ipad++){ Float_t length=0.75; if (ipad==1) length=1; if (ipad==2) length=1.5; if (ipad==0){ printf("\t%d\t%f\t%f\t%f\t%f\t%f\n", ipad, TMath::Sqrt(TMath::Abs(fParamRMS0[1][ipad][0])), 0., TMath::Sqrt(TMath::Abs(fParamRMS0[1][ipad][1])), TMath::Sqrt(TMath::Abs(fParamRMS0[1][ipad][2]/(length*length))), TMath::Sqrt(TMath::Abs(fParamRMS0[1][ipad][3]))); }else{ printf("\t%d\t%f\t%f\t%f\t%f\t%f\n", ipad, 0., TMath::Sqrt(TMath::Abs(fParamRMS0[1][ipad][0])), TMath::Sqrt(TMath::Abs(fParamRMS0[1][ipad][1])), TMath::Sqrt(TMath::Abs(fParamRMS0[1][ipad][2]/(length*length))), TMath::Sqrt(TMath::Abs(fParamRMS0[1][ipad][3]))); } } } Float_t AliTPCClusterParam::Qnorm(Int_t ipad, Int_t itype, Float_t dr, Float_t ty, Float_t tz){ // get Q normalization // type - 0 Qtot 1 Qmax // ipad - 0 (0.75 cm) ,1 (1 cm), 2 (1.5 cm) // //expession formula - TString *strq0 = toolkit.FitPlane(chain,"dedxQ.fElements[2]","dr++ty++tz++dr*ty++dr*tz++ty*tz++ty^2++tz^2","IPad==0",chi2,npoints,param,covar,0,100000); if (!fQNorm) return 0; TVectorD * norm = (TVectorD*)fQNorm->At(3*itype+ipad); if (!norm) return 0; TVectorD &no = *norm; Float_t res = no[0]+ no[1]*dr+ no[2]*ty+ no[3]*tz+ no[4]*dr*ty+ no[5]*dr*tz+ no[6]*ty*tz+ no[7]*dr*dr+ no[8]*ty*ty+ no[9]*tz*tz; res/=no[0]; return res; } void AliTPCClusterParam::SetQnorm(Int_t ipad, Int_t itype, TVectorD * norm){ // // set normalization // // type - 0 Qtot 1 Qmax // ipad - 0 (0.75 cm) ,1 (1 cm), 2 (1.5 cm) // if (fQNorm==0) fQNorm = new TObjArray(6); fQNorm->AddAt(new TVectorD(*norm), itype*3+ipad); }