/************************************************************************** * 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 and shape parameterization // // // // // /////////////////////////////////////////////////////////////////////////////// #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(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(fParamS1[0][1]), TMath::Sqrt(fParamS1[0][2]),TMath::Sqrt(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(fParamS0[0][ipad][1]*length), TMath::Sqrt(fParamS0[0][ipad][2]/length), TMath::Sqrt(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(fParamS0Par[0][ipad][1]*length), TMath::Sqrt(fParamS0Par[0][ipad][2]/length), TMath::Sqrt(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(fParamS0[1][ipad][1]*length), TMath::Sqrt(fParamS0[1][ipad][2]/length), TMath::Sqrt(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(fParamS0Par[1][ipad][0])), TMath::Sqrt(fParamS0Par[1][ipad][1]*length), TMath::Sqrt(fParamS0Par[1][ipad][2]/length), TMath::Sqrt(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(fParamRMS1[0][1]), TMath::Sqrt(fParamRMS1[0][2]),TMath::Sqrt(fParamRMS1[0][3]),TMath::Sqrt(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(fParamRMS0[0][ipad][1]), TMath::Sqrt(fParamRMS0[0][ipad][2]/(length*length)), TMath::Sqrt(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(fParamRMS0[0][ipad][1]), TMath::Sqrt(fParamRMS0[0][ipad][2]/(length*length)), TMath::Sqrt(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(fParamRMS1[1][1]), TMath::Sqrt(fParamRMS1[1][2]),TMath::Sqrt(fParamRMS1[1][3]),TMath::Sqrt(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(fParamRMS0[1][ipad][1]), TMath::Sqrt(fParamRMS0[1][ipad][2]/(length*length)), TMath::Sqrt(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(fParamRMS0[1][ipad][1]), TMath::Sqrt(fParamRMS0[1][ipad][2]/(length*length)), TMath::Sqrt(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) // // //formula= dr++tz++ty++dr*tz++dr*ty++ty*tz++dr**2++ty**2++tz**2 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]*tz+no[3]*ty+no[4]*dr*tz+no[5]*dr*ty+no[6]*ty*tz +no[7]*dr*dr+no[8]*ty*ty+no[9]*tz*tz; 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); }