ROOT logo
/**************************************************************************
 * 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.                  *
 **************************************************************************/

//************************************************************************
//
//   ESD track and V0 fast resolution parameterization
//   Fast algorithm to make parameterization
//   Track covariance used
//   
//             
//    Origin: Marian Ivanov marian.ivanov@cern.ch
//-------------------------------------------------------------------------

/*
  EXAMPLE USAGE:
  //
  // Make esd chain
  //
  .x ~/rootlogon.C
  gSystem->AddIncludePath("-I$ALICE_ROOT/TPC/macros");
  gROOT->LoadMacro("$ALICE_ROOT/TPC/macros/AliXRDPROOFtoolkit.cxx+");  
  AliXRDPROOFtoolkit tool;
  TChain * tree = tool.MakeChain("esd.txt","esdTree",0,1000);
  tree->Lookup();
  //
  // Load macros
  //
  gSystem->Load("libSTAT.so");
  .L $ALICE_ROOT/PWGPP/AliESDresolParams.cxx+
  .L $ALICE_ROOT/PWGPP/AliESDresolMakerFast.cxx+
  TCut cutDCA="Tracks[].fCchi2<100&&abs(Tracks[].fP[4])<8&&abs(Tracks[].fP[3])<1&&sqrt(Tracks[].fC[0])/(0.2+abs(Tracks[].fP[4]))<0.02&&abs(Tracks[].fX)<3&&Tracks[].fITSncls>4&&Tracks.fTPCncls>40"
  //
  // Create resolution
  //
  TObjArray * array = AliESDresolMakerFast::MakeParamPrimFast(tree,cutDCA,0.95,2000);
  AliESDresolParams params; 
  params.SetResolPrimFast(array);
  params.SetInstance(&params);
  TFile f("resolParams.root","recreate");
  param.Write("resolParams");
  //
  //
  TF2 f2sy("f2sy","AliESDresolParams::SGetResolPrimFast(0,x,y)",0,10,0,2);
  TF1 f1sy("f1sy","AliESDresolParams::SGetResolPrimFast(0,x,0)",0,10);
  f2sy->Draw("surf2")
  f1sy->Draw();

*/



#include "TVectorD.h"
#include "../STAT/TStatToolkit.h"
#include "TMath.h"
#include "TCut.h"
#include "TTree.h"

#include "AliESDresolParams.h"
#include "AliESDresolMakerFast.h"


ClassImp(AliESDresolMakerFast)




AliESDresolMakerFast::AliESDresolMakerFast() :
  TObject()
{
  //
  // Default constructor
  //
}


TObjArray * AliESDresolMakerFast::MakeParamPrimFast(TTree * tree, TCut & cutDCA, Float_t fraction, Int_t entries){
  //
  // DCA resolution linear parameterization
  // Only valid in ITS acceptance
  // Arguments:
  // tree     - esdTree or chain
  // cutDCA   - track selection criteria
  // fraction - robust fitter fraction
  // entries  - total number of entries (tracks) used

  /* Example
     // its adjusted cuts

     TCut cut1pt= "sqrt(Tracks[].fC[14])/(1+abs(Tracks[].fP[4]))^2.5<0.01";   
     TCut cutsy = "sqrt(Tracks[].fC[0])/(0.2+abs(Tracks[].fP[4]))<0.02";
     
     TCut cutDCA="Tracks[].fCchi2<100&&abs(Tracks[].fP[4])<8&&abs(Tracks[].fP[3])<1&&abs(Tracks[].fX)<3&&Tracks[].fITSncls>4&&Tracks.fTPCncls>40"+cut1pt+cutsy;
     fraction =0.90;
     entries  = 1000;
  */

  TObjArray *array = new TObjArray();
  Double_t chi2=0;
  Int_t    npoints=0;
  TVectorD fitParam;
  TMatrixD covMatrix;
  //
  // y param
  //
  TString * dcayParam=  TStatToolkit::FitPlane(tree,"sqrt(Tracks[].fC[0])/(0.2+abs(Tracks[].fP[4]))","(abs(Tracks[].fP[4]))++(abs(Tracks[].fP[4]))^2++(abs(Tracks[].fP[3]))++(abs(Tracks[].fP[3]))^2++(abs(Tracks[].fP[4]))*(abs(Tracks[].fP[3]))", cutDCA, chi2,npoints,fitParam,covMatrix,fraction, 0, entries);
  tree->SetAlias("dcayParam",dcayParam->Data());
  array->AddAt(new TVectorD(fitParam),0);
  printf("Y resol\t%s\n",dcayParam->Data());
  //
  // z param
  //
  TString * dcazParam= TStatToolkit::FitPlane(tree, "sqrt(Tracks[].fC[2])/(0.2+abs(Tracks[].fP[4]))", "(abs(Tracks[].fP[4]))++(abs(Tracks[].fP[4]))^2++(abs(Tracks[].fP[3]))++(abs(Tracks[].fP[3]))^2++(abs(Tracks[].fP[4]))*(abs(Tracks[].fP[3]))",  cutDCA, chi2,npoints,fitParam,covMatrix,fraction,0,entries);  
  printf("Z resol\t%s\n",dcazParam->Data());  
  tree->SetAlias("dcazParam",dcazParam->Data());
  array->AddAt(new TVectorD(fitParam),1);
  //
  // Phi param
  //
  TString * dcaphiParam= TStatToolkit::FitPlane(tree, "sqrt(Tracks[].fC[5])/(0.1+abs(Tracks[].fP[4]))", "(abs(Tracks[].fP[4]))++(abs(Tracks[].fP[4]))^2++(abs(Tracks[].fP[3]))++(abs(Tracks[].fP[3]))^2++(abs(Tracks[].fP[4]))*(abs(Tracks[].fP[3]))",  cutDCA, chi2,npoints,fitParam,covMatrix,fraction,0,entries);  
  printf("Phi resol\t%s\n",dcaphiParam->Data());   
  tree->SetAlias("dcaphiParam",dcaphiParam->Data());
  array->AddAt(new TVectorD(fitParam),2);
  //
  // theta param
  //
  TString * dcathParam=  TStatToolkit::FitPlane(tree, "sqrt(Tracks[].fC[9])/((0.1+abs(Tracks[].fP[4])*(1+abs(Tracks[].fParamP.fP[3]^2))))", "(abs(Tracks[].fP[4]))++(abs(Tracks[].fP[4]))^2++(abs(Tracks[].fP[3]))++(abs(Tracks[].fP[3]))^2++(abs(Tracks[].fP[4]))*(abs(Tracks[].fP[3]))",  cutDCA, chi2,npoints,fitParam,covMatrix,fraction,0,entries);  
  printf("Theta resol\t%s\n",dcathParam->Data());   
  tree->SetAlias("dcathParam",dcathParam->Data());
  array->AddAt(new TVectorD(fitParam),3);
  //
  // 1pt param
  //
  TString * dca1ptParam=  TStatToolkit::FitPlane(tree, "sqrt(Tracks[].fC[14])/(1+abs(Tracks[].fP[4]))^2", "(abs(Tracks[].fP[4]))++(abs(Tracks[].fP[4]))^2++(abs(Tracks[].fP[3]))++(abs(Tracks[].fP[3]))^2++(abs(Tracks[].fP[4]))*(abs(Tracks[].fP[3]))",  cutDCA, chi2,npoints,fitParam,covMatrix,fraction,0,entries);  
  printf("1pt resol\t%s\n",dca1ptParam->Data());  
  tree->SetAlias("dca1ptParam",dca1ptParam->Data());
  array->AddAt(new TVectorD(fitParam),4);
  return array;
}

/*
void scalePt(){
  //
  TString * dca1ptParamS4=  TStatToolkit::FitPlane(tree, "(Tracks[].fC[14])", "abs(Tracks[].fP[4])^4",  cutDCA, chi2,npoints,fitParam,covMatrix,fraction,0,entries);  
  printf("1pt resol\t%s\n",dca1ptParamS4->Data());  
  tree->SetAlias("dca1ptParam4",dca1ptParamS4->Data());
  //
  TString * dca1ptParamS34=  TStatToolkit::FitPlane(tree, "(Tracks[].fC[14])", "abs(Tracks[].fP[4])^4++abs(Tracks[].fP[4])^3",  cutDCA, chi2,npoints,fitParam,covMatrix,fraction,0,entries);  
  printf("1pt resol\t%s\n",dca1ptParamS34->Data());  
  tree->SetAlias("dca1ptParam34",dca1ptParamS34->Data());
  //
  TString * dca1ptParamS234=  TStatToolkit::FitPlane(tree, "(Tracks[].fC[14])", "abs(Tracks[].fP[4])^4++abs(Tracks[].fP[4])^3++abs(Tracks[].fP[4])^2",  cutDCA, chi2,npoints,fitParam,covMatrix,fraction,0,entries);  
  printf("1pt resol\t%s\n",dca1ptParamS234->Data());  
  tree->SetAlias("dca1ptParam234",dca1ptParamS234->Data());
}

*/






TObjArray * AliESDresolMakerFast::MakeParamRFast(TTree * tree,  TCut &cutV0, Float_t fraction, Int_t entries){
  //
  // 
  //
  TObjArray *array = new TObjArray;
 
  Double_t chi2=0;
  Int_t    npoints=0;
  TVectorD fitParam;
  TMatrixD covMatrix;
  //
  //
  /*
    //TCut cutGood="abs(V0s[].GetEffMass(0,0))<0.05||abs(V0s[].GetEffMass(2,2)-0.5)<0.05"
    TCut  cutV0 = "abs((V0s[].fParamP.fC[0]))<3&&abs(V0s[].fParamP.fP[3])<1&&abs(V0s[].fParamP.fP[4])<8";//
  */
  //
  //
  //
  TString * v0sigmaY= TStatToolkit::FitPlane(tree,"sqrt(sqrt((V0s[].fParamP.fC[0]))/(0.2+abs(V0s[].fParamP.fP[4])))","abs(V0s[].fParamP.fP[4])++V0s[].fParamP.fX++abs(V0s[].fParamP.fP[4])^2++V0s[].fParamP.fX^2++abs(V0s[].fParamP.fP[4])*V0s[].fParamP.fX++abs(V0s[].fParamP.fP[4])*V0s[].fParamP.fX^2", cutV0, chi2,npoints,fitParam,covMatrix,fraction,0,entries);
  tree->SetAlias("v0sigmaY",v0sigmaY->Data());
  array->AddAt(new TVectorD(fitParam),0);
  //
  //
  //
  TString * v0sigmaZ= TStatToolkit::FitPlane(tree,"sqrt(sqrt((V0s[].fParamP.fC[2])))","abs(V0s[].fParamP.fP[4])++V0s[].fParamP.fX++abs(V0s[].fParamP.fP[4])^2++V0s[].fParamP.fX^2++abs(V0s[].fParamP.fP[4])*V0s[].fParamP.fX++abs(V0s[].fParamP.fP[4])*V0s[].fParamP.fX^2", cutV0, chi2,npoints,fitParam,covMatrix,fraction,0,entries);
  tree->SetAlias("v0sigmaZ",v0sigmaZ->Data());
  array->AddLast(new TVectorD(fitParam));
  //
  //
  //
  TString * v0sigmaPhi= TStatToolkit::FitPlane(tree,"sqrt(sqrt((V0s[].fParamP.fC[5]))/(0.1+abs(V0s[].fParamP.fP[4])))","abs(V0s[].fParamP.fP[4])++V0s[].fParamP.fX++abs(V0s[].fParamP.fP[4])^2++abs(V0s[].fParamP.fP[4])*V0s[].fParamP.fX", cutV0, chi2,npoints,fitParam,covMatrix,fraction,0,entries);
  tree->SetAlias("v0sigmaPhi",v0sigmaPhi->Data());
  array->AddAt(new TVectorD(fitParam),2);
  //
  //
  //
  TString * v0sigmaTh= TStatToolkit::FitPlane(tree,"sqrt(sqrt((V0s[].fParamP.fC[9]))/((0.1+abs(V0s[].fParamP.fP[4])*(1+abs(V0s[].fParamP.fP[3])^2))))","abs(V0s[].fParamP.fP[4])++V0s[].fParamP.fX++abs(V0s[].fParamP.fP[4])^2++abs(V0s[].fParamP.fP[4])*V0s[].fParamP.fX", cutV0, chi2,npoints,fitParam,covMatrix,fraction,0,entries);
  tree->SetAlias("v0sigmaTh",v0sigmaTh->Data());
  array->AddAt(new TVectorD(fitParam),3);
  //
  //
  //
  TString * v0sigma1pt= TStatToolkit::FitPlane(tree,"sqrt(sqrt((V0s[].fParamP.fC[14])))","abs(V0s[].fParamP.fP[4])++V0s[].fParamP.fX++abs(V0s[].fParamP.fP[4])^2++V0s[].fParamP.fX^2++abs(V0s[].fParamP.fP[4])*V0s[].fParamP.fX++abs(V0s[].fParamP.fP[4])*V0s[].fParamP.fX^2", cutV0, chi2,npoints,fitParam,covMatrix,fraction,0,entries);
  tree->SetAlias("v0sigma1pt",v0sigma1pt->Data());
  array->AddAt(new TVectorD(fitParam),4);
  return array;

}
 AliESDresolMakerFast.cxx:1
 AliESDresolMakerFast.cxx:2
 AliESDresolMakerFast.cxx:3
 AliESDresolMakerFast.cxx:4
 AliESDresolMakerFast.cxx:5
 AliESDresolMakerFast.cxx:6
 AliESDresolMakerFast.cxx:7
 AliESDresolMakerFast.cxx:8
 AliESDresolMakerFast.cxx:9
 AliESDresolMakerFast.cxx:10
 AliESDresolMakerFast.cxx:11
 AliESDresolMakerFast.cxx:12
 AliESDresolMakerFast.cxx:13
 AliESDresolMakerFast.cxx:14
 AliESDresolMakerFast.cxx:15
 AliESDresolMakerFast.cxx:16
 AliESDresolMakerFast.cxx:17
 AliESDresolMakerFast.cxx:18
 AliESDresolMakerFast.cxx:19
 AliESDresolMakerFast.cxx:20
 AliESDresolMakerFast.cxx:21
 AliESDresolMakerFast.cxx:22
 AliESDresolMakerFast.cxx:23
 AliESDresolMakerFast.cxx:24
 AliESDresolMakerFast.cxx:25
 AliESDresolMakerFast.cxx:26
 AliESDresolMakerFast.cxx:27
 AliESDresolMakerFast.cxx:28
 AliESDresolMakerFast.cxx:29
 AliESDresolMakerFast.cxx:30
 AliESDresolMakerFast.cxx:31
 AliESDresolMakerFast.cxx:32
 AliESDresolMakerFast.cxx:33
 AliESDresolMakerFast.cxx:34
 AliESDresolMakerFast.cxx:35
 AliESDresolMakerFast.cxx:36
 AliESDresolMakerFast.cxx:37
 AliESDresolMakerFast.cxx:38
 AliESDresolMakerFast.cxx:39
 AliESDresolMakerFast.cxx:40
 AliESDresolMakerFast.cxx:41
 AliESDresolMakerFast.cxx:42
 AliESDresolMakerFast.cxx:43
 AliESDresolMakerFast.cxx:44
 AliESDresolMakerFast.cxx:45
 AliESDresolMakerFast.cxx:46
 AliESDresolMakerFast.cxx:47
 AliESDresolMakerFast.cxx:48
 AliESDresolMakerFast.cxx:49
 AliESDresolMakerFast.cxx:50
 AliESDresolMakerFast.cxx:51
 AliESDresolMakerFast.cxx:52
 AliESDresolMakerFast.cxx:53
 AliESDresolMakerFast.cxx:54
 AliESDresolMakerFast.cxx:55
 AliESDresolMakerFast.cxx:56
 AliESDresolMakerFast.cxx:57
 AliESDresolMakerFast.cxx:58
 AliESDresolMakerFast.cxx:59
 AliESDresolMakerFast.cxx:60
 AliESDresolMakerFast.cxx:61
 AliESDresolMakerFast.cxx:62
 AliESDresolMakerFast.cxx:63
 AliESDresolMakerFast.cxx:64
 AliESDresolMakerFast.cxx:65
 AliESDresolMakerFast.cxx:66
 AliESDresolMakerFast.cxx:67
 AliESDresolMakerFast.cxx:68
 AliESDresolMakerFast.cxx:69
 AliESDresolMakerFast.cxx:70
 AliESDresolMakerFast.cxx:71
 AliESDresolMakerFast.cxx:72
 AliESDresolMakerFast.cxx:73
 AliESDresolMakerFast.cxx:74
 AliESDresolMakerFast.cxx:75
 AliESDresolMakerFast.cxx:76
 AliESDresolMakerFast.cxx:77
 AliESDresolMakerFast.cxx:78
 AliESDresolMakerFast.cxx:79
 AliESDresolMakerFast.cxx:80
 AliESDresolMakerFast.cxx:81
 AliESDresolMakerFast.cxx:82
 AliESDresolMakerFast.cxx:83
 AliESDresolMakerFast.cxx:84
 AliESDresolMakerFast.cxx:85
 AliESDresolMakerFast.cxx:86
 AliESDresolMakerFast.cxx:87
 AliESDresolMakerFast.cxx:88
 AliESDresolMakerFast.cxx:89
 AliESDresolMakerFast.cxx:90
 AliESDresolMakerFast.cxx:91
 AliESDresolMakerFast.cxx:92
 AliESDresolMakerFast.cxx:93
 AliESDresolMakerFast.cxx:94
 AliESDresolMakerFast.cxx:95
 AliESDresolMakerFast.cxx:96
 AliESDresolMakerFast.cxx:97
 AliESDresolMakerFast.cxx:98
 AliESDresolMakerFast.cxx:99
 AliESDresolMakerFast.cxx:100
 AliESDresolMakerFast.cxx:101
 AliESDresolMakerFast.cxx:102
 AliESDresolMakerFast.cxx:103
 AliESDresolMakerFast.cxx:104
 AliESDresolMakerFast.cxx:105
 AliESDresolMakerFast.cxx:106
 AliESDresolMakerFast.cxx:107
 AliESDresolMakerFast.cxx:108
 AliESDresolMakerFast.cxx:109
 AliESDresolMakerFast.cxx:110
 AliESDresolMakerFast.cxx:111
 AliESDresolMakerFast.cxx:112
 AliESDresolMakerFast.cxx:113
 AliESDresolMakerFast.cxx:114
 AliESDresolMakerFast.cxx:115
 AliESDresolMakerFast.cxx:116
 AliESDresolMakerFast.cxx:117
 AliESDresolMakerFast.cxx:118
 AliESDresolMakerFast.cxx:119
 AliESDresolMakerFast.cxx:120
 AliESDresolMakerFast.cxx:121
 AliESDresolMakerFast.cxx:122
 AliESDresolMakerFast.cxx:123
 AliESDresolMakerFast.cxx:124
 AliESDresolMakerFast.cxx:125
 AliESDresolMakerFast.cxx:126
 AliESDresolMakerFast.cxx:127
 AliESDresolMakerFast.cxx:128
 AliESDresolMakerFast.cxx:129
 AliESDresolMakerFast.cxx:130
 AliESDresolMakerFast.cxx:131
 AliESDresolMakerFast.cxx:132
 AliESDresolMakerFast.cxx:133
 AliESDresolMakerFast.cxx:134
 AliESDresolMakerFast.cxx:135
 AliESDresolMakerFast.cxx:136
 AliESDresolMakerFast.cxx:137
 AliESDresolMakerFast.cxx:138
 AliESDresolMakerFast.cxx:139
 AliESDresolMakerFast.cxx:140
 AliESDresolMakerFast.cxx:141
 AliESDresolMakerFast.cxx:142
 AliESDresolMakerFast.cxx:143
 AliESDresolMakerFast.cxx:144
 AliESDresolMakerFast.cxx:145
 AliESDresolMakerFast.cxx:146
 AliESDresolMakerFast.cxx:147
 AliESDresolMakerFast.cxx:148
 AliESDresolMakerFast.cxx:149
 AliESDresolMakerFast.cxx:150
 AliESDresolMakerFast.cxx:151
 AliESDresolMakerFast.cxx:152
 AliESDresolMakerFast.cxx:153
 AliESDresolMakerFast.cxx:154
 AliESDresolMakerFast.cxx:155
 AliESDresolMakerFast.cxx:156
 AliESDresolMakerFast.cxx:157
 AliESDresolMakerFast.cxx:158
 AliESDresolMakerFast.cxx:159
 AliESDresolMakerFast.cxx:160
 AliESDresolMakerFast.cxx:161
 AliESDresolMakerFast.cxx:162
 AliESDresolMakerFast.cxx:163
 AliESDresolMakerFast.cxx:164
 AliESDresolMakerFast.cxx:165
 AliESDresolMakerFast.cxx:166
 AliESDresolMakerFast.cxx:167
 AliESDresolMakerFast.cxx:168
 AliESDresolMakerFast.cxx:169
 AliESDresolMakerFast.cxx:170
 AliESDresolMakerFast.cxx:171
 AliESDresolMakerFast.cxx:172
 AliESDresolMakerFast.cxx:173
 AliESDresolMakerFast.cxx:174
 AliESDresolMakerFast.cxx:175
 AliESDresolMakerFast.cxx:176
 AliESDresolMakerFast.cxx:177
 AliESDresolMakerFast.cxx:178
 AliESDresolMakerFast.cxx:179
 AliESDresolMakerFast.cxx:180
 AliESDresolMakerFast.cxx:181
 AliESDresolMakerFast.cxx:182
 AliESDresolMakerFast.cxx:183
 AliESDresolMakerFast.cxx:184
 AliESDresolMakerFast.cxx:185
 AliESDresolMakerFast.cxx:186
 AliESDresolMakerFast.cxx:187
 AliESDresolMakerFast.cxx:188
 AliESDresolMakerFast.cxx:189
 AliESDresolMakerFast.cxx:190
 AliESDresolMakerFast.cxx:191
 AliESDresolMakerFast.cxx:192
 AliESDresolMakerFast.cxx:193
 AliESDresolMakerFast.cxx:194
 AliESDresolMakerFast.cxx:195
 AliESDresolMakerFast.cxx:196
 AliESDresolMakerFast.cxx:197
 AliESDresolMakerFast.cxx:198
 AliESDresolMakerFast.cxx:199
 AliESDresolMakerFast.cxx:200
 AliESDresolMakerFast.cxx:201
 AliESDresolMakerFast.cxx:202
 AliESDresolMakerFast.cxx:203
 AliESDresolMakerFast.cxx:204
 AliESDresolMakerFast.cxx:205
 AliESDresolMakerFast.cxx:206
 AliESDresolMakerFast.cxx:207
 AliESDresolMakerFast.cxx:208
 AliESDresolMakerFast.cxx:209
 AliESDresolMakerFast.cxx:210
 AliESDresolMakerFast.cxx:211
 AliESDresolMakerFast.cxx:212
 AliESDresolMakerFast.cxx:213
 AliESDresolMakerFast.cxx:214
 AliESDresolMakerFast.cxx:215
 AliESDresolMakerFast.cxx:216
 AliESDresolMakerFast.cxx:217
 AliESDresolMakerFast.cxx:218
 AliESDresolMakerFast.cxx:219
 AliESDresolMakerFast.cxx:220
 AliESDresolMakerFast.cxx:221
 AliESDresolMakerFast.cxx:222
 AliESDresolMakerFast.cxx:223