]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Bayesian PID: new parametrization and code update (E. Biolcati - F.Prino)
authormasera <masera@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 23 Dec 2009 15:31:54 +0000 (15:31 +0000)
committermasera <masera@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 23 Dec 2009 15:31:54 +0000 (15:31 +0000)
12 files changed:
ITS/AliITSPidParItem.cxx [deleted file]
ITS/AliITSPidParItem.h [deleted file]
ITS/AliITSPidParams.cxx [new file with mode: 0644]
ITS/AliITSPidParams.h [new file with mode: 0644]
ITS/AliITSPident.cxx
ITS/AliITSPident.h
ITS/AliITSSteerPid.cxx [deleted file]
ITS/AliITSSteerPid.h [deleted file]
ITS/AliITSpidESD2.cxx
ITS/AliITSpidESD2.h
ITS/ITSrecLinkDef.h
ITS/libITSrec.pkg

diff --git a/ITS/AliITSPidParItem.cxx b/ITS/AliITSPidParItem.cxx
deleted file mode 100644 (file)
index 5f77626..0000000
+++ /dev/null
@@ -1,273 +0,0 @@
-/**************************************************************************
- * 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.                  *
- **************************************************************************/
-
-/* $Id$ */
-
-/////////////////////////////////////////////////////////
-//Class for PID in the ITS                             //
-//                                                     //
-//                                                     //
-/////////////////////////////////////////////////////////
-
-#include <Riostream.h>
-#include <TF1.h>
-#include <TMath.h>
-
-#include "AliITSPidParItem.h"
-
-ClassImp(AliITSPidParItem)
-//____________________________________________________________________
-AliITSPidParItem::AliITSPidParItem():
-fPCenter(0),
-fPWidth(0)
-{
-  // default constructor
-  for(Int_t i=0;i<39;i++){
-  fBuff[i]=0;
-  }
-}//____________________________________________________________________
-AliITSPidParItem::AliITSPidParItem(Float_t center,Float_t width,Double_t *buff):
-fPCenter(center),
-fPWidth(width)
-{
-  // standard constructor
-  for (Int_t i=0;i<39;i++) fBuff[i]=buff[i];
-
-}
-
-//____________________________________________________________________
-void AliITSPidParItem::GetParameters(Double_t *buff) const{
-  //get all the parameters
-  for (Int_t i=0;i<39;i++) buff[i]=fBuff[i];
-
-}
-//____________________________________________________________________
-void AliITSPidParItem::GetProtonPar(Double_t *buffp) const{
-  //get the protons' parameters (Width Landau, Most Probable, Area, Width Gaussian, Chi2 fit, NDF fit, Integral fit)
-  buffp[0]=fBuff[0];
-  buffp[1]=fBuff[1];
-  buffp[2]=fBuff[2];
-  buffp[3]=fBuff[3];
-  buffp[4]=fBuff[8];
-  buffp[5]=fBuff[9];
-  buffp[6]=fBuff[10];
-}
-//____________________________________________________________________
-void AliITSPidParItem::GetKaonPar(Double_t *buffk) const{
-  //get the kaons' parameters (Width Landau, Most Probable, Area, Width Gaussian, Chi2 fit, NDF fit, Integral fit)
-  buffk[0]=fBuff[13];
-  buffk[1]=fBuff[14];
-  buffk[2]=fBuff[15];
-  buffk[3]=fBuff[16];
-  buffk[4]=fBuff[21];
-  buffk[5]=fBuff[22];
-  buffk[6]=fBuff[23];
-}
-//____________________________________________________________________
-void AliITSPidParItem::GetPionPar(Double_t *buffpi) const{
-  //get the pions' parameters (Width Landau, Most Probable, Area, Width Gaussian, Chi2 fit, NDF fit, Integral fit)
-  buffpi[0]=fBuff[26];
-  buffpi[1]=fBuff[27];
-  buffpi[2]=fBuff[28];
-  buffpi[3]=fBuff[29];
-  buffpi[4]=fBuff[34];
-  buffpi[5]=fBuff[35];
-  buffpi[6]=fBuff[36];
-}
-//____________________________________________________________________
-void AliITSPidParItem::GetPar0(Double_t *buff0) const{
-  //Width Landau for protons, kaons, pions.
-  buff0[0]=fBuff[0];
-  buff0[1]=fBuff[13];
-  buff0[2]=fBuff[26];
-}
-//____________________________________________________________________
-void AliITSPidParItem::GetPar1(Double_t *buff1) const{
-  //Most Probable for protons, kaons, pions.
-  buff1[0]=fBuff[1];
-  buff1[1]=fBuff[14];
-  buff1[2]=fBuff[27];
-}
-//____________________________________________________________________
-void AliITSPidParItem::GetPar2(Double_t *buff2) const{
-  //Area for protons, kaons, pions.
-  buff2[0]=fBuff[2];
-  buff2[1]=fBuff[15];
-  buff2[2]=fBuff[28];
-}
-//____________________________________________________________________
-void AliITSPidParItem::GetPar3(Double_t *buff3) const{
-  //Width Gaussian for protons, kaons, pions.
-  buff3[0]=fBuff[3];
-  buff3[1]=fBuff[16];
-  buff3[2]=fBuff[29];
-}
-//____________________________________________________________________
-void AliITSPidParItem::GetChisquare(Double_t *buffchi) const{
-  //Chi2 of the fit for protons, kaons, pions.
-  buffchi[0]=fBuff[8];
-  buffchi[1]=fBuff[21];
-  buffchi[2]=fBuff[34];
-}
-//____________________________________________________________________
-void AliITSPidParItem::GetNDF(Double_t *buffndf) const{
-  //NDF of the fit for protons, kaons, pions.
-  buffndf[0]=fBuff[9];
-  buffndf[1]=fBuff[22];
-  buffndf[2]=fBuff[35];
-}
-//____________________________________________________________________
-void AliITSPidParItem::GetProParFun(Double_t *pfun) const{
-  //some Protons parameters: Width Landau, Most Probable, Area, Width Gaussian, Integral fit
-  pfun[0]=fBuff[0];
-  pfun[1]=fBuff[1];
-  pfun[2]=fBuff[2];
-  pfun[3]=fBuff[3];
-  pfun[4]=fBuff[10];
-}
-//____________________________________________________________________
-void AliITSPidParItem::GetKaoParFun(Double_t *kfun) const{
-  //some Kaons parameters: Width Landau, Most Probable, Area, Width Gaussian, Integral fit
-  kfun[0]=fBuff[13];
-  kfun[1]=fBuff[14];
-  kfun[2]=fBuff[15];
-  kfun[3]=fBuff[16];
-  kfun[4]=fBuff[23];
-}
-//____________________________________________________________________
-void AliITSPidParItem::GetPiParFun(Double_t *pifun) const{
-  //some Pions parameters: Width Landau, Most Probable, Area, Width Gaussian, Integral fit
-  pifun[0]=fBuff[26];
-  pifun[1]=fBuff[27];
-  pifun[2]=fBuff[28];
-  pifun[3]=fBuff[29];
-  pifun[4]=fBuff[36];
-}
-//____________________________________________________________________
-void AliITSPidParItem::GetRangeLim(Double_t *range) const{
-  //Range limits for the response functions
-  range[0]=fBuff[11];//proton low
-  range[1]=fBuff[12];//proton high
-  range[2]=fBuff[24];//kaon low
-  range[3]=fBuff[25];//kaon high
-  range[4]=fBuff[37];//pion low
-  range[5]=fBuff[38];//pion high
-}
-//____________________________________________________________________
-void AliITSPidParItem::GetProtonParErr(Double_t *bufferp)const{
-  //errors on the protons' parameters
-  bufferp[0]=fBuff[4];
-  bufferp[1]=fBuff[5];
-  bufferp[2]=fBuff[6];
-  bufferp[3]=fBuff[7];
-}
-//____________________________________________________________________
-void AliITSPidParItem::GetKaonParErr(Double_t *bufferk)const{
-  //errors on the kaons' parameters
-  bufferk[0]=fBuff[17];
-  bufferk[1]=fBuff[18];
-  bufferk[2]=fBuff[19];
-  bufferk[3]=fBuff[20];
-}
-//____________________________________________________________________
-void AliITSPidParItem::GetPionParErr(Double_t *bufferpi)const{
-  //errors on the pions' parameters
-  bufferpi[0]=fBuff[30];
-  bufferpi[1]=fBuff[31];
-  bufferpi[2]=fBuff[32];
-  bufferpi[3]=fBuff[33];
-}
-//____________________________________________________________________
-void AliITSPidParItem::PrintParameters() const {
-  // Prints the data members of this class
-cout<<"==============================***************"<<endl;
-cout<<"Momentum (GeV/c) - center of the bin - "<<fPCenter<<endl;
-cout<<" Width of momentum bin (GeV/c) "<<fPWidth<<endl;
-for (Int_t i=0;i<39;i++) cout<<"Parameter"<<i<<" = "<<fBuff[i]<<endl;
-
-}
-
-//_______________________________________________________________________
-TF1* AliITSPidParItem::CookFunIts(TString namefun,Double_t *par,Double_t rangei,Double_t rangef,TString comment){
-  //
-  TF1 *fun;
-    if (par[4]!=0) {
-      fun=new TF1(comment,Langaufun2,rangei,rangef,5);
-      fun->SetParameters(par);
-     
-    }
-    else {fun=new TF1(namefun,"0");}
-    return fun;
-}
-
-//_________________________________________________________________________
-Double_t AliITSPidParItem::Langaufun(Double_t *x, Double_t *par) {
-
-  //Fit parameters:
-  //par[0]=Width (scale) parameter of Landau density
-  //par[1]=Most Probable (MP, location) parameter of Landau density
-  //par[2]=Total area (integral -inf to inf, normalization constant)
-  //par[3]=Width (sigma) of convoluted Gaussian function
-  //
-  //In the Landau distribution (represented by the CERNLIB approximation), 
-  //the maximum is located at x=-0.22278298 with the location parameter=0.
-  //This shift is corrected within this function, so that the actual
-  //maximum is identical to the MP parameter.
-
-  // Numeric constants
-  Double_t invsq2pi = 0.3989422804014;   // (2 pi)^(-1/2)
-  Double_t mpshift  = -0.22278298;       // Landau maximum location
-
-  // Control constants
-  Double_t np = 100.0;      // number of convolution steps
-  Double_t sc =   5.0;      // convolution extends to +-sc Gaussian sigmas
-
-  // Variables
-  Double_t xx;
-  Double_t mpc;
-  Double_t fland;
-  Double_t sum = 0.0;
-  Double_t xlow,xupp;
-  Double_t step;
-  Double_t i;
-
-
-  // MP shift correction
-  mpc = par[1] - mpshift * par[0]; 
-
-  // Range of convolution integral
-  xlow = x[0] - sc * par[3];
-  xupp = x[0] + sc * par[3];
-
-  step = (xupp-xlow) / np;
-
-  // Convolution integral of Landau and Gaussian by sum
-  for(i=1.0; i<=np/2; i++) {
-    xx = xlow + (i-.5) * step;
-    fland = TMath::Landau(xx,mpc,par[0]) / par[0];
-    sum += fland * TMath::Gaus(x[0],xx,par[3]);
-
-    xx = xupp - (i-.5) * step;
-    fland = TMath::Landau(xx,mpc,par[0]) / par[0];
-    sum += fland * TMath::Gaus(x[0],xx,par[3]);
-  }
-
-  return (par[2] * step * sum * invsq2pi / par[3]);
-}
-//_______________________________________________________________________
-Double_t AliITSPidParItem::Langaufun2(Double_t *x, Double_t *par){
-  //
-  return 1/par[4]*Langaufun(x,par);
-}
diff --git a/ITS/AliITSPidParItem.h b/ITS/AliITSPidParItem.h
deleted file mode 100644 (file)
index 6f45305..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-#ifndef AliITSPIDPARITEM_H
-#define AliITSPIDPARITEM_H
-//////////////////////////////////////////////////////////
-//Class for PID in the ITS                              //
-//Origin: Elena Bruna bruna@to.infn.it                  //
-//////////////////////////////////////////////////////////
-
-class AliITSPidParItem : public TObject{
-  
- public:
-  AliITSPidParItem();  
-  AliITSPidParItem(Float_t center,Float_t width,Double_t *buff);  
-  virtual ~AliITSPidParItem(){;}
-  Float_t GetMomentumCenter() const {return fPCenter;}
-  Float_t GetWidthMom() const {return fPWidth;}
-  void GetParameters(Double_t *buff) const;
-  void PrintParameters() const;
-  void GetProtonPar(Double_t *buffp) const;
-  void GetKaonPar(Double_t *buffk) const;
-  void GetPionPar(Double_t *buffpi) const;
-  void GetPar0(Double_t *buff0) const;
-  void GetPar1(Double_t *buff1) const;
-  void GetPar2(Double_t *buff2) const;
-  void GetPar3(Double_t *buff3) const;
-  void GetChisquare(Double_t *buffchi) const;
-  void GetNDF(Double_t *buffndf) const;
-  void GetProParFun(Double_t *pfun) const;
-  void GetKaoParFun(Double_t *kfun) const;
-  void GetPiParFun(Double_t *pifun) const;
-  void GetRangeLim(Double_t *range) const;
-  void GetProtonParErr(Double_t *bufferp)const;
-  void GetKaonParErr(Double_t *bufferk)const;
-  void GetPionParErr(Double_t *bufferpi) const;
-  static TF1* CookFunIts(TString namefun,Double_t *par,Double_t rangei,Double_t rangef,TString comment);
-  static Double_t Langaufun(Double_t *x, Double_t *par);
-  static Double_t Langaufun2(Double_t *x, Double_t *par);
-  
- private:
-  Float_t fPCenter;     //value for center
-  Float_t fPWidth;      //value for width
-  Double_t fBuff[39];   //array for PID parameters
-  
-  ClassDef(AliITSPidParItem,1);
-};
-#endif
diff --git a/ITS/AliITSPidParams.cxx b/ITS/AliITSPidParams.cxx
new file mode 100644 (file)
index 0000000..2c3c77a
--- /dev/null
@@ -0,0 +1,284 @@
+/**************************************************************************
+ * Copyright(c) 2007-2009, 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.                  *
+ **************************************************************************/
+
+/* $Id: */
+
+///////////////////////////////////////////////////////////////////
+//                                                               //
+// Implementation of the class to store parameters of ITS        //
+// response funcions for dE/dx based PID                         //
+// Origin: F.Prino, Torino, prino@to.infn.it                     //
+//                                                               //
+///////////////////////////////////////////////////////////////////
+
+#include <TFormula.h>
+#include <TNamed.h>
+#include <TMath.h>
+#include "AliITSPidParams.h"
+#include "AliPID.h"
+
+ClassImp(AliITSPidParams)
+
+//______________________________________________________________________
+AliITSPidParams::AliITSPidParams():
+  TNamed("default",""),
+  fSDDPionMPV(0),
+  fSDDPionLandauWidth(0),
+  fSDDPionGaussWidth(0),
+  fSSDPionMPV(0),
+  fSSDPionLandauWidth(0),
+  fSSDPionGaussWidth(0),
+  fSDDKaonMPV(0),
+  fSDDKaonLandauWidth(0),
+  fSDDKaonGaussWidth(0),
+  fSSDKaonMPV(0),
+  fSSDKaonLandauWidth(0),
+  fSSDKaonGaussWidth(0),
+  fSDDProtMPV(0),
+  fSDDProtLandauWidth(0),
+  fSDDProtGaussWidth(0),
+  fSSDProtMPV(0),
+  fSSDProtLandauWidth(0),
+  fSSDProtGaussWidth(0)
+{
+  // default constructor
+  InitDefaults();
+}
+//______________________________________________________________________
+AliITSPidParams::AliITSPidParams(Char_t * name):
+  TNamed(name,""),
+  fSDDPionMPV(0),
+  fSDDPionLandauWidth(0),
+  fSDDPionGaussWidth(0),
+  fSSDPionMPV(0),
+  fSSDPionLandauWidth(0),
+  fSSDPionGaussWidth(0),
+  fSDDKaonMPV(0),
+  fSDDKaonLandauWidth(0),
+  fSDDKaonGaussWidth(0),
+  fSSDKaonMPV(0),
+  fSSDKaonLandauWidth(0),
+  fSSDKaonGaussWidth(0),
+  fSDDProtMPV(0),
+  fSDDProtLandauWidth(0),
+  fSDDProtGaussWidth(0),
+  fSSDProtMPV(0),
+  fSSDProtLandauWidth(0),
+  fSSDProtGaussWidth(0)
+{
+  // standard constructor
+  InitDefaults();
+}
+//______________________________________________________________________
+AliITSPidParams::~AliITSPidParams(){
+  // 
+  if(fSDDPionMPV) delete fSDDPionMPV;
+  if(fSDDPionLandauWidth) delete fSDDPionLandauWidth;
+  if(fSDDPionGaussWidth) delete fSDDPionGaussWidth;
+
+  if(fSSDPionMPV) delete fSSDPionMPV;
+  if(fSSDPionLandauWidth) delete fSSDPionLandauWidth;
+  if(fSSDPionGaussWidth) delete fSSDPionGaussWidth;
+
+  if(fSDDKaonMPV) delete fSDDKaonMPV;
+  if(fSDDKaonLandauWidth) delete fSDDKaonLandauWidth;
+  if(fSDDKaonGaussWidth) delete fSDDKaonGaussWidth;
+
+  if(fSSDKaonMPV) delete fSSDKaonMPV;
+  if(fSSDKaonLandauWidth) delete fSSDKaonLandauWidth;
+  if(fSSDKaonGaussWidth) delete fSSDKaonGaussWidth;
+
+  if(fSDDProtMPV) delete fSDDProtMPV;
+  if(fSDDProtLandauWidth) delete fSDDProtLandauWidth;
+  if(fSDDProtGaussWidth) delete fSDDProtGaussWidth;
+
+  if(fSSDProtMPV) delete fSSDProtMPV;
+  if(fSSDProtLandauWidth) delete fSSDProtLandauWidth;
+  if(fSSDProtGaussWidth) delete fSSDProtGaussWidth;
+}
+
+//______________________________________________________________________
+void AliITSPidParams::InitDefaults(){
+  // initialize TFormulas to default values (=p-p simulations PYTHIA+GEANT)
+  // parameter values from Emanuele Biolcati
+
+  // pions
+  if(fSDDPionMPV) delete fSDDPionMPV;
+  fSDDPionMPV=new TFormula("fSDDPionMPV","[0]/(x*x)+[1]/(x*x*x*x)*TMath::Log(x*x)+[2]*TMath::Log(x*x)+[3]");
+  fSDDPionMPV->SetParameters(1.4831933,-0.000403,3.9722756,92.710680);
+
+  if(fSDDPionLandauWidth) delete fSDDPionLandauWidth;
+  fSDDPionLandauWidth=new TFormula("fSDDPionLandauWidth","[0]/(x*x)+[1]/(x*x*x*x)*TMath::Log(x*x)+[2]");
+  fSDDPionLandauWidth->SetParameters(-0.091098,-0.001355,8.3019280);
+
+  if(fSDDPionGaussWidth) delete fSDDPionGaussWidth;
+  fSDDPionGaussWidth=new TFormula("fSDDPionGaussWidth","[0]/(x*x)+[1]/(x*x*x*x)*TMath::Log(x*x)+[2]");
+  fSDDPionGaussWidth->SetParameters(-0.129570,-0.002686,15.287701);
+
+  if(fSSDPionMPV) delete fSSDPionMPV;
+  fSSDPionMPV=new TFormula("fSSDPionMPV","[0]/(x*x)+[1]/(x*x*x*x)*TMath::Log(x*x)+[2]*TMath::Log(x*x)+[3]");
+  fSSDPionMPV->SetParameters(1.2455667,-0.000743,3.2260119,84.237030);
+
+  if(fSSDPionLandauWidth) delete fSSDPionLandauWidth;
+  fSSDPionLandauWidth=new TFormula("fSSDPionLandauWidth","[0]/(x*x)+[1]/(x*x*x*x)*TMath::Log(x*x)+[2]");
+  fSSDPionLandauWidth->SetParameters(-0.083918,-0.001246,7.4750478);
+
+  if(fSSDPionGaussWidth) delete fSSDPionGaussWidth;
+  fSSDPionGaussWidth=new TFormula("fSSDPionGaussWidth","[0]/(x*x)+[1]/(x*x*x*x)*TMath::Log(x*x)+[2]");
+  fSSDPionGaussWidth->SetParameters(-0.140441,-0.002984,10.936747);
+
+  // kaons
+  if(fSDDKaonMPV) delete fSDDKaonMPV;
+  fSDDKaonMPV=new TFormula("fSDDKaonMPV","[0]/(x*x)+[1]/(x*x*x*x)*TMath::Log(x*x)+[2]");
+  fSDDKaonMPV->SetParameters(16.998674,-0.058006,89.660709);
+
+  if(fSDDKaonLandauWidth) delete fSDDKaonLandauWidth;
+  fSDDKaonLandauWidth=new TFormula("fSDDKaonLandauWidth","[0]/(x*x)+[1]/(x*x*x*x)*TMath::Log(x*x)+[2]");
+  fSDDKaonLandauWidth->SetParameters(1.0014235,-5.61e-15,9.2672327);
+
+  if(fSDDKaonGaussWidth) delete fSDDKaonGaussWidth;
+  fSDDKaonGaussWidth=new TFormula("fSDDKaonGaussWidth","[0]/(x*x)+[1]/(x*x*x*x)*TMath::Log(x*x)+[2]");
+  fSDDKaonGaussWidth->SetParameters(0.7919025,-0.103579,14.016803);
+
+  if(fSSDKaonMPV) delete fSSDKaonMPV;
+  fSSDKaonMPV=new TFormula("fSSDKaonMPV","[0]/(x*x)+[1]/(x*x*x*x)*TMath::Log(x*x)+[2]");
+  fSSDKaonMPV->SetParameters(14.090845,-0.087253,81.782088);
+
+  if(fSSDKaonLandauWidth) delete fSSDKaonLandauWidth;
+  fSSDKaonLandauWidth=new TFormula("fSSDKaonLandauWidth","[0]/(x*x)+[1]/(x*x*x*x)*TMath::Log(x*x)+[2]");
+  fSSDKaonLandauWidth->SetParameters(1.0769127,-9.06e-13,7.5221492);
+
+  if(fSSDKaonGaussWidth) delete fSSDKaonGaussWidth;
+  fSSDKaonGaussWidth=new TFormula("fSSDKaonGaussWidth","[0]/(x*x)+[1]/(x*x*x*x)*TMath::Log(x*x)+[2]");
+  fSSDKaonGaussWidth->SetParameters(0.5155878,-0.098696,10.771975);
+
+  // protons
+  if(fSDDProtMPV) delete fSDDProtMPV;
+  fSDDProtMPV=new TFormula("fSDDProtMPV","[0]/(x*x)+[1]/(x*x*x*x)*TMath::Log(x*x)+[2]");
+  fSDDProtMPV->SetParameters(70.325146,0.0386808,87.797052);
+
+  if(fSDDProtLandauWidth) delete fSDDProtLandauWidth;
+  fSDDProtLandauWidth=new TFormula("fSDDProtLandauWidth","[0]/(x*x)+[1]/(x*x*x*x)*TMath::Log(x*x)+[2]");
+  fSDDProtLandauWidth->SetParameters(4.0476840,-3.77e-14,10.294707);
+
+  if(fSDDProtGaussWidth) delete fSDDProtGaussWidth;
+  fSDDProtGaussWidth=new TFormula("fSDDProtGaussWidth","[0]/(x*x)+[1]/(x*x*x*x)*TMath::Log(x*x)+[2]");
+  fSDDProtGaussWidth->SetParameters(5.9780498,-2.16e-11,13.357744);
+
+  if(fSSDProtMPV) delete fSSDProtMPV;
+  fSSDProtMPV=new TFormula("fSSDProtMPV","[0]/(x*x)+[1]/(x*x*x*x)*TMath::Log(x*x)+[2]");
+  fSSDProtMPV->SetParameters(58.918831,-0.303855,80.341765);
+                            
+  if(fSSDProtLandauWidth) delete fSSDProtLandauWidth;
+  fSSDProtLandauWidth=new TFormula("fSSDProtLandauWidth","[0]/(x*x)+[1]/(x*x*x*x)*TMath::Log(x*x)+[2]");
+  fSSDProtLandauWidth->SetParameters(3.0814273,-1.26e-13,8.8353833);
+
+  if(fSSDProtGaussWidth) delete fSSDProtGaussWidth;
+  fSSDProtGaussWidth=new TFormula("fSSDProtGaussWidth","[0]/(x*x)+[1]/(x*x*x*x)*TMath::Log(x*x)+[2]");
+  fSSDProtGaussWidth->SetParameters(5.6177229,-1.67e-13,10.538921);
+
+}
+//_______________________________________________________________________
+Double_t AliITSPidParams::GetLandauGausNormPdgCode(Double_t dedx, Int_t pdgCode, Double_t mom, Int_t lay) const {
+  // Computes Landau Gauss convolution for given particle specie and given momentum in a given ITS layer
+  if(TMath::Abs(pdgCode)==211) return GetLandauGausNorm(dedx,AliPID::kPion,mom,lay);
+  else if(TMath::Abs(pdgCode)==321) return GetLandauGausNorm(dedx,AliPID::kKaon,mom,lay);
+  else if(TMath::Abs(pdgCode)==2212) return GetLandauGausNorm(dedx,AliPID::kProton,mom,lay);
+  else return 0.;
+}
+//_______________________________________________________________________
+  Double_t AliITSPidParams::GetLandauGausNorm(Double_t dedx, Int_t partType, Double_t mom, Int_t lay) const{
+  // Computes Landau Gauss convolution for given particle specie and given momentum in a given ITS layer
+
+  Double_t par[3];
+  Bool_t isSet=kFALSE;
+  if(partType==AliPID::kPion){
+    if(lay==3 || lay==4){
+      par[0]=GetSDDPionLandauWidth(mom);
+      par[1]=GetSDDPionMPV(mom);
+      par[2]=GetSDDPionGaussWidth(mom);
+      isSet=kTRUE;
+    }
+    else if(lay==5 || lay==6){
+      par[0]=GetSSDPionLandauWidth(mom);
+      par[1]=GetSSDPionMPV(mom);
+      par[2]=GetSSDPionGaussWidth(mom);
+      isSet=kTRUE;
+    }
+  }else if(partType==AliPID::kKaon){
+    if(lay==3 || lay==4){
+      par[0]=GetSDDKaonLandauWidth(mom);
+      par[1]=GetSDDKaonMPV(mom);
+      par[2]=GetSDDKaonGaussWidth(mom);
+      isSet=kTRUE;
+    }
+    else if(lay==5 || lay==6){
+      par[0]=GetSSDKaonLandauWidth(mom);
+      par[1]=GetSSDKaonMPV(mom);
+      par[2]=GetSSDKaonGaussWidth(mom);
+      isSet=kTRUE;
+    }
+  }else if(partType==AliPID::kProton){
+    if(lay==3 || lay==4){
+      par[0]=GetSDDProtLandauWidth(mom);
+      par[1]=GetSDDProtMPV(mom);
+      par[2]=GetSDDProtGaussWidth(mom);
+      isSet=kTRUE;
+    }
+    else if(lay==5 || lay==6){
+      par[0]=GetSSDProtLandauWidth(mom);
+      par[1]=GetSSDProtMPV(mom);
+      par[2]=GetSSDProtGaussWidth(mom);
+      isSet=kTRUE;
+    }
+  }
+  if(!isSet) return 0.;
+  // Numeric constants
+  Double_t invsq2pi = 0.3989422804014;   // (2 pi)^(-1/2)
+  Double_t mpshift  = -0.22278298;       // Landau maximum location
+  // Control constants
+  Double_t np = 100.0;      // number of convolution steps
+  Double_t sc =   5.0;      // convolution extends to +-sc Gaussian sigmas
+  // Variables
+  Double_t xx;
+  Double_t mpc;
+  Double_t fland;
+  Double_t sum = 0.0;
+  Double_t xlow,xupp;
+  Double_t step;
+  Double_t i;
+  
+  // MP shift correction
+  mpc = par[1] - mpshift * par[0];
+  // Range of convolution integral
+  xlow = dedx - sc * par[2];
+  xupp = dedx + sc * par[2];
+  if(np!=0) step = (xupp-xlow) / np;
+  
+  // Convolution integral of Landau and Gaussian by sum
+  for(i=1.0; i<=np/2; i++) {
+    xx = xlow + (i-.5) * step;
+   
+    fland = TMath::Landau(xx,mpc,par[0]) / par[0];
+    sum += fland * TMath::Gaus(dedx,xx,par[2]);
+    
+    xx = xupp - (i-.5) * step;
+    fland = TMath::Landau(xx,mpc,par[0]) / par[0];
+    sum += fland * TMath::Gaus(dedx,xx,par[2]);
+  }
+  
+  return (step * sum * invsq2pi / par[2]);
+}
+
diff --git a/ITS/AliITSPidParams.h b/ITS/AliITSPidParams.h
new file mode 100644 (file)
index 0000000..eba876b
--- /dev/null
@@ -0,0 +1,200 @@
+#ifndef ALIITSPIDPARAMS_H
+#define ALIITSPIDPARAMS_H
+/* Copyright(c) 2007-2009, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+/* $Id: $ */
+
+///////////////////////////////////////////////////////////////////
+//                                                               //
+// Class to store parameters of ITS response funcions            //
+// Origin: F.Prino, Torino, prino@to.infn.it                     //
+//                                                               //
+///////////////////////////////////////////////////////////////////
+
+#include <TFormula.h>
+#include <TNamed.h>
+
+class AliITSPidParams : public TNamed {
+
+ public:
+  AliITSPidParams();
+  AliITSPidParams(Char_t * name);
+  ~AliITSPidParams();
+
+  void InitDefaults();
+  Double_t GetLandauGausNormPdgCode(Double_t dedx, Int_t pdgCode, Double_t mom, Int_t lay) const;
+  Double_t GetLandauGausNorm(Double_t dedx, Int_t partType, Double_t mom, Int_t lay) const;
+
+  // pion setters
+  void SetSDDPionMPV(TFormula* form){
+    if(fSDDPionMPV) delete fSDDPionMPV;
+    fSDDPionMPV=new TFormula(*form);
+  }
+  void SetSDDPionLandauWidth(TFormula* form){
+    if(fSDDPionLandauWidth) delete fSDDPionLandauWidth;
+    fSDDPionLandauWidth=new TFormula(*form);
+  }
+  void SetSDDPionGaussWidth(TFormula* form){
+    if(fSDDPionGaussWidth) delete fSDDPionGaussWidth;
+    fSDDPionGaussWidth=new TFormula(*form);
+  }
+  void SetSSDPionMPV(TFormula* form){
+    if(fSSDPionMPV) delete fSSDPionMPV;
+    fSSDPionMPV=new TFormula(*form);
+  }
+  void SetSSDPionLandauWidth(TFormula* form){
+    if(fSSDPionLandauWidth) delete fSSDPionLandauWidth;
+    fSSDPionLandauWidth=new TFormula(*form);
+  }
+  void SetSSDPionGaussWidth(TFormula* form){
+    if(fSSDPionGaussWidth) delete fSSDPionGaussWidth;
+    fSSDPionGaussWidth=new TFormula(*form);
+  }
+
+  // kaon setters
+  void SetSDDKaonMPV(TFormula* form){
+    if(fSDDKaonMPV) delete fSDDKaonMPV;
+    fSDDKaonMPV=new TFormula(*form);
+  }
+  void SetSDDKaonLandauWidth(TFormula* form){
+    if(fSDDKaonLandauWidth) delete fSDDKaonLandauWidth;
+    fSDDKaonLandauWidth=new TFormula(*form);
+  }
+  void SetSDDKaonGaussWidth(TFormula* form){
+    if(fSDDKaonGaussWidth) delete fSDDKaonGaussWidth;
+    fSDDKaonGaussWidth=new TFormula(*form);
+  }
+  void SetSSDKaonMPV(TFormula* form){
+    if(fSSDKaonMPV) delete fSSDKaonMPV;
+    fSSDKaonMPV=new TFormula(*form);
+  }
+  void SetSSDKaonLandauWidth(TFormula* form){
+    if(fSSDKaonLandauWidth) delete fSSDKaonLandauWidth;
+    fSSDKaonLandauWidth=new TFormula(*form);
+  }
+  void SetSSDKaonGaussWidth(TFormula* form){
+    if(fSSDKaonGaussWidth) delete fSSDKaonGaussWidth;
+    fSSDKaonGaussWidth=new TFormula(*form);
+  }
+
+
+  // proton setters
+  void SetSDDProtMPV(TFormula* form){
+    if(fSDDProtMPV) delete fSDDProtMPV;
+    fSDDProtMPV=new TFormula(*form);
+  }
+  void SetSDDProtLandauWidth(TFormula* form){
+    if(fSDDProtLandauWidth) delete fSDDProtLandauWidth;
+    fSDDProtLandauWidth=new TFormula(*form);
+  }
+  void SetSDDProtGaussWidth(TFormula* form){
+    if(fSDDProtGaussWidth) delete fSDDProtGaussWidth;
+    fSDDProtGaussWidth=new TFormula(*form);
+  }
+  void SetSSDProtMPV(TFormula* form){
+    if(fSSDProtMPV) delete fSSDProtMPV;
+    fSSDProtMPV=new TFormula(*form);
+  }
+  void SetSSDProtLandauWidth(TFormula* form){
+    if(fSSDProtLandauWidth) delete fSSDProtLandauWidth;
+    fSSDProtLandauWidth=new TFormula(*form);
+  }
+  void SetSSDProtGaussWidth(TFormula* form){
+    if(fSSDProtGaussWidth) delete fSSDProtGaussWidth;
+    fSSDProtGaussWidth=new TFormula(*form);
+  }
+
+
+  // pion getters
+  Double_t GetSDDPionMPV(Double_t mom) const {
+    return fSDDPionMPV->Eval(mom);
+  }
+  Double_t GetSDDPionLandauWidth(Double_t mom) const {
+    return fSDDPionLandauWidth->Eval(mom);
+  }
+  Double_t GetSDDPionGaussWidth(Double_t mom) const {
+    return fSDDPionGaussWidth->Eval(mom);
+  }
+  Double_t GetSSDPionMPV(Double_t mom) const {
+    return fSSDPionMPV->Eval(mom);
+  }
+  Double_t GetSSDPionLandauWidth(Double_t mom) const {
+    return fSSDPionLandauWidth->Eval(mom);
+  }
+  Double_t GetSSDPionGaussWidth(Double_t mom) const {
+    return fSSDPionGaussWidth->Eval(mom);
+  }
+
+  // kaon getters
+  Double_t GetSDDKaonMPV(Double_t mom) const {
+    return fSDDKaonMPV->Eval(mom);
+  }
+  Double_t GetSDDKaonLandauWidth(Double_t mom) const {
+    return fSDDKaonLandauWidth->Eval(mom);
+  }
+  Double_t GetSDDKaonGaussWidth(Double_t mom) const {
+    return fSDDKaonGaussWidth->Eval(mom);
+  }
+  Double_t GetSSDKaonMPV(Double_t mom) const {
+    return fSSDKaonMPV->Eval(mom);
+  }
+  Double_t GetSSDKaonLandauWidth(Double_t mom) const {
+    return fSSDKaonLandauWidth->Eval(mom);
+  }
+  Double_t GetSSDKaonGaussWidth(Double_t mom) const {
+    return fSSDKaonGaussWidth->Eval(mom);
+  }
+
+  // proton getters
+  Double_t GetSDDProtMPV(Double_t mom) const {
+    return fSDDProtMPV->Eval(mom);
+  }
+  Double_t GetSDDProtLandauWidth(Double_t mom) const {
+    return fSDDProtLandauWidth->Eval(mom);
+  }
+  Double_t GetSDDProtGaussWidth(Double_t mom) const {
+    return fSDDProtGaussWidth->Eval(mom);
+  }
+  Double_t GetSSDProtMPV(Double_t mom) const {
+    return fSSDProtMPV->Eval(mom);
+  }
+  Double_t GetSSDProtLandauWidth(Double_t mom) const {
+    return fSSDProtLandauWidth->Eval(mom);
+  }
+  Double_t GetSSDProtGaussWidth(Double_t mom) const {
+    return fSSDProtGaussWidth->Eval(mom);
+  }
+
+ private:
+
+  AliITSPidParams(const AliITSPidParams& rec);
+  AliITSPidParams& operator=(const AliITSPidParams &source);
+
+  TFormula* fSDDPionMPV;         // pion dE/dx MPV vs. p in SDD
+  TFormula* fSDDPionLandauWidth; // pion dE/dx Landau width vs. p in SDD
+  TFormula* fSDDPionGaussWidth;  // pion dE/dx Gaussian width vs. p in SDD
+
+  TFormula* fSSDPionMPV;         // pion dE/dx MPV vs. p in SSD
+  TFormula* fSSDPionLandauWidth; // pion dE/dx Landau width vs. p in SSD
+  TFormula* fSSDPionGaussWidth;  // pion dE/dx Gaussian width vs. p in SSD
+
+  TFormula* fSDDKaonMPV;         // kaon dE/dx MPV vs. p in SDD
+  TFormula* fSDDKaonLandauWidth; // kaon dE/dx Landau width vs. p in SDD
+  TFormula* fSDDKaonGaussWidth;  // kaon dE/dx Gaussian width vs. p in SDD
+
+  TFormula* fSSDKaonMPV;         // kaon dE/dx MPV vs. p in SSD
+  TFormula* fSSDKaonLandauWidth; // kaon dE/dx Landau width vs. p in SSD
+  TFormula* fSSDKaonGaussWidth;  // kaon dE/dx Gaussian width vs. p in SSD
+
+  TFormula* fSDDProtMPV;         // kaon dE/dx MPV vs. p in SDD
+  TFormula* fSDDProtLandauWidth; // kaon dE/dx Landau width vs. p in SDD
+  TFormula* fSDDProtGaussWidth;  // kaon dE/dx Gaussian width vs. p in SDD
+
+  TFormula* fSSDProtMPV;         // kaon dE/dx MPV vs. p in SSD
+  TFormula* fSSDProtLandauWidth; // kaon dE/dx Landau width vs. p in SSD
+  TFormula* fSSDProtGaussWidth;  // kaon dE/dx Gaussian width vs. p in SSD
+
+  ClassDef(AliITSPidParams,1);
+};
+#endif
index f2e3715cc7be7ff3ef01343ecdcdd9710304549e..94b5fadb0cd38ec86ad4fd47a8a3c1868802416a 100644 (file)
@@ -6,14 +6,13 @@
 // Origin: Elena Bruna bruna@to.infn.it,, Massimo Masera masera@to.infn.it//
 //////////////////////////////////////////////////////////////////////////
 #include "AliESDtrack.h"
+#include "AliITSPidParams.h"
+#include "AliPID.h"
 #include "AliITSPident.h"
-#include "AliITSSteerPid.h"
-#include <Riostream.h>
 
 ClassImp(AliITSPident)
   //_______________________________________________________________________
 AliITSPident::AliITSPident():
-fMom(0),
 fPBayesp(0),
 fPBayesk(0),
 fPBayespi(0),
@@ -28,38 +27,13 @@ fPPriorie(0)
     fCondFunKLay[i]=0;
     fCondFunPiLay[i]=0;
   }
-  for (Int_t i=0;i<4;i++)fNcls[i]=0;
 }
 //_______________________________________________________________________
 AliITSPident::~AliITSPident(){
   // destructor
 }
-//______________________________________________________________________
-AliITSPident::AliITSPident(const AliITSPident &ob) :TObject(ob),
-fMom(ob.fMom),
-fPBayesp(ob.fPBayesp),
-fPBayesk(ob.fPBayesk),
-fPBayespi(ob.fPBayespi),
-fPPriorip(ob.fPPriorip),
-fPPriorik(ob.fPPriorik),
-fPPrioripi(ob.fPPrioripi),
-fPPriorie(ob.fPPriorie)
-{
-  // Copy constructor
-}
-
-//______________________________________________________________________
-AliITSPident& AliITSPident::operator=(const AliITSPident&  ob){
-  // Assignment operator
-  this->~AliITSPident();
-  new(this) AliITSPident(ob);
-  return *this;
-}
-
-
 //_______________________________________________________________________
-AliITSPident::AliITSPident(Double_t mom,AliITSSteerPid *sp,Float_t *Qlay,Float_t *nlay,Float_t priorip,Float_t priorik,Float_t prioripi,Float_t priorie):
-fMom(mom),
+AliITSPident::AliITSPident(Double_t mom,AliITSPidParams *pars, Double_t *Qlay,Double_t priorip,Double_t priorik,Double_t prioripi,Double_t priorie):
 fPBayesp(0),
 fPBayesk(0),
 fPBayespi(0),
@@ -69,59 +43,10 @@ fPPrioripi(prioripi),
 fPPriorie(priorie)
 {
   //
-  for (Int_t i=0;i<8;i++){
-    fCondFunProLay[i]=-1;
-    fCondFunKLay[i]=-1;
-    fCondFunPiLay[i]=-1;
-  }
-  for(Int_t la=0;la<4;la++){//loop on layers
-    Double_t parp[3];Double_t park[3];Double_t parpi[3];
-    fNcls[la]=0;
-    Double_t range[6];
-    range[0]=0.3*parp[1];
-    range[1]=2.*parp[1];
-
-    range[2]=0.3*park[1];
-    range[3]=2.*park[1];
-    
-    range[4]=0.3*parpi[1];
-    range[5]=2.*parpi[1];
-    Int_t layer=la+2;
-    for(Int_t ii=0;ii<8;ii++){
-      if(nlay[ii]==layer){
-       fNcls[la]++;
-       if(Qlay[ii]>0){
-         sp->GetParFitLayer(la,fMom,parp,park,parpi);
-         CookFunItsLay(ii,0,parp,Qlay[ii],fMom,range[0],range[1],"fPro");
-         CookFunItsLay(ii,1,park,Qlay[ii],fMom,range[2],range[3],"fKao");
-         CookFunItsLay(ii,2,parpi,Qlay[ii],fMom,range[4],range[5],"fPi");
-       }  
-      }
-    }
-    
-  }
-  Float_t prior[4];Double_t condFun[8][3];
-
-  prior[0]=fPPriorip;
-  prior[1]=fPPriorik;
-  prior[2]=fPPrioripi;
-  prior[3]=fPPriorie;
-  for(Int_t la=0;la<8;la++){
-    condFun[la][0]= fCondFunProLay[la];
-    condFun[la][1]= fCondFunKLay[la]; 
-    condFun[la][2]= fCondFunPiLay[la];
-    
-  }
-
-  fPBayesp=CookCombinedBayes(condFun,prior,0);
-  fPBayesk=CookCombinedBayes(condFun,prior,1); 
-  fPBayespi=CookCombinedBayes(condFun,prior,2); 
+  CalculateResponses(mom,pars,Qlay);
 }
-
 //__________________________________________________________________________________________
-AliITSPident::AliITSPident(AliESDtrack *track,AliITSSteerPid *sp,Float_t *Qlay,Float_t *nlay,Float_t priorip,Float_t priorik,Float_t prioripi,Float_t priorie):
-fMom(0),
+AliITSPident::AliITSPident(AliESDtrack *track,AliITSPidParams *pars,Double_t priorip,Double_t priorik,Double_t prioripi,Double_t priorie):
 fPBayesp(0),
 fPBayesk(0),
 fPBayespi(0),
@@ -131,74 +56,52 @@ fPPrioripi(prioripi),
 fPPriorie(priorie)
 {
   //
+  Double_t mom=track->GetP();
+  Double_t Qlay[4]={0.,0.,0.,0.};
+  track->GetITSdEdxSamples(Qlay);
+  CalculateResponses(mom,pars,Qlay);
+} 
+//_______________________________________________________________________
+void AliITSPident::CalculateResponses(Double_t mom,AliITSPidParams *pars, Double_t *Qlay){
+  // calculates conditional probabilities
+
   for (Int_t i=0;i<8;i++){
     fCondFunProLay[i]=-1;
     fCondFunKLay[i]=-1;
     fCondFunPiLay[i]=-1;
   }
-  Double_t xr;
-  Double_t par[5];
-  track->GetExternalParameters(xr,par);
-  if (par[4]!=0) {
-    Float_t lamb=TMath::ATan(par[3]);
-    fMom=1/(TMath::Abs(par[4])*TMath::Cos(lamb));
-  }
-  for(Int_t la=0;la<4;la++){//loop on layers
-    Double_t parp[3];Double_t park[3];Double_t parpi[3];
-    fNcls[la]=0;
-    Double_t range[8];
-    range[0]=0.3*parp[1];
-    range[1]=2.*parp[1];
 
-    range[2]=0.3*park[1];
-    range[3]=2.*park[1];
-
-    range[4]=0.3*parpi[1];
-    range[5]=2.*parpi[1];
-
-    Int_t layer=la+2;
-    for(Int_t ii=0;ii<8;ii++){
-      if(nlay[ii]==layer){
-       fNcls[la]++;
-       if(Qlay[ii]>0){
-         sp->GetParFitLayer(la,fMom,parp,park,parpi);
-         CookFunItsLay(ii,0,parp,Qlay[ii],fMom,range[0],range[1],"fPro");
-         CookFunItsLay(ii,1,park,Qlay[ii],fMom,range[2],range[3],"fKao");
-         CookFunItsLay(ii,2,parpi,Qlay[ii],fMom,range[4],range[5],"fPi");
-       }  
-      }
+  for(Int_t iLay=0; iLay<4; iLay++){//loop on layers (3=SDD inner 6=SSD outer)
+    Double_t dedx=Qlay[iLay];
+    if(dedx>0){
+      fCondFunProLay[iLay]=pars->GetLandauGausNorm(dedx,AliPID::kProton,mom,iLay+3);
+      if(mom<0.4 && dedx<100)fCondFunProLay[iLay]=0.00001;
+      if(mom<0.4 &&dedx<50)fCondFunProLay[iLay]=0.0000001;
+      fCondFunKLay[iLay]=pars->GetLandauGausNorm(dedx,AliPID::kKaon,mom,iLay+3);
+      if(mom<0.25 && dedx<100)fCondFunKLay[iLay]=0.00001;
+      if(mom<0.4 &&dedx<30)fCondFunKLay[iLay]=0.0000001;   
+      fCondFunPiLay[iLay]=pars->GetLandauGausNorm(dedx,AliPID::kPion,mom,iLay+3);
+      if(mom<0.6 &&dedx<20)fCondFunPiLay[iLay]=0.001;
     }
-    
   }
-
-  Float_t prior[4];Double_t condFun[8][3];
+  Double_t prior[4];
+  Double_t condFun[8][3];
 
   prior[0]=fPPriorip;
   prior[1]=fPPriorik;
   prior[2]=fPPrioripi;
   prior[3]=fPPriorie;
-  for(Int_t la=0;la<8;la++){
-    condFun[la][0]= fCondFunProLay[la];
-    condFun[la][1]= fCondFunKLay[la]; 
-    condFun[la][2]= fCondFunPiLay[la];
-    
+  for(Int_t iLay=0;iLay<8;iLay++){
+    condFun[iLay][0]= fCondFunProLay[iLay];
+    condFun[iLay][1]= fCondFunKLay[iLay]; 
+    condFun[iLay][2]= fCondFunPiLay[iLay];
   }
 
   fPBayesp=CookCombinedBayes(condFun,prior,0);
   fPBayesk=CookCombinedBayes(condFun,prior,1); 
   fPBayespi=CookCombinedBayes(condFun,prior,2); 
-
 }
 //_______________________________________________________________________
-void AliITSPident::GetNclsPerLayer(Int_t *ncls) const{
-  //number of clusters for each layer (sdd1,sdd2,ssd1,ssd2)
- for(Int_t la=0;la<4;la++){
-   ncls[la]=fNcls[la];
- }
-
-}//_______________________________________________________________________
 Double_t AliITSPident::GetProdCondFunPro() const {
   //Product of conditional probability functions for protons
     Double_t rv=1.;
@@ -220,175 +123,30 @@ Double_t AliITSPident::GetProdCondFunK() const {
 //_______________________________________________________________________
 Double_t AliITSPident::GetProdCondFunPi() const {
   //Product of conditional probability functions for pions
-    Double_t rv=1.; 
-    for(Int_t i=0;i<8;i++){
-      Double_t fun=GetCondFunPi(i);
-      if(fun>=0)rv*=fun;
-    }
-    return rv;
-}
-//_______________________________________________________________________
-void AliITSPident::PrintParameters() const{
- //print parameters
-  cout<<"___________________________\n";
-  cout<<"Track Local Momentum = "<<"  "<<fMom<<endl;
-}
-
-//_______________________________________________________________________
-Double_t AliITSPident::Langaufun(Double_t *x, Double_t *par) {
-
-  //Fit parameters:
-  //par[0]=Width (scale) parameter of Landau density
-  //par[1]=Most Probable (MP, location) parameter of Landau density
-  //par[2]=Total area (integral -inf to inf, normalization constant)
-  //par[3]=Width (sigma) of convoluted Gaussian function
-  //
-  //In the Landau distribution (represented by the CERNLIB approximation), 
-  //the maximum is located at x=-0.22278298 with the location parameter=0.
-  //This shift is corrected within this function, so that the actual
-  //maximum is identical to the MP parameter.
-
-  // Numeric constants
-  Double_t invsq2pi = 0.3989422804014;   // (2 pi)^(-1/2)
-  Double_t mpshift  = -0.22278298;       // Landau maximum location
-
-  // Control constants
-  Double_t np = 100.0;      // number of convolution steps
-  Double_t sc =   5.0;      // convolution extends to +-sc Gaussian sigmas
-
-  // Variables
-  Double_t xx;
-  Double_t mpc;
-  Double_t fland;
-  Double_t sum = 0.0;
-  Double_t xlow,xupp;
-  Double_t step;
-  Double_t i;
-
-
-  // MP shift correction
-  mpc = par[1] - mpshift * par[0]; 
-
-  // Range of convolution integral
-  xlow = x[0] - sc * par[3];
-  xupp = x[0] + sc * par[3];
-
-  step = (xupp-xlow) / np;
-
-  // Convolution integral of Landau and Gaussian by sum
-  for(i=1.0; i<=np/2; i++) {
-    xx = xlow + (i-.5) * step;
-    fland = TMath::Landau(xx,mpc,par[0]) / par[0];
-    sum += fland * TMath::Gaus(x[0],xx,par[3]);
-
-    xx = xupp - (i-.5) * step;
-    fland = TMath::Landau(xx,mpc,par[0]) / par[0];
-    sum += fland * TMath::Gaus(x[0],xx,par[3]);
-  }
-
-  return (par[2] * step * sum * invsq2pi / par[3]);
-}
-
-//_______________________________________________________________________
-Double_t AliITSPident::Langaufun2(Double_t *x, Double_t *par){
-  //normalized langaufun
-  return 1/par[4]*Langaufun(x,par);
-}
-//_______________________________________________________________________
-Double_t AliITSPident::Langaufunnorm(Double_t *x, Double_t *par){
-   //Fit parameters:
-  //par[0]=Width (scale) parameter of Landau density
-  //par[1]=Most Probable (MP, location) parameter of Landau density
-  
-  //par[2]=Width (sigma) of convoluted Gaussian function
-  //
-  //In the Landau distribution (represented by the CERNLIB approximation), 
-  //the maximum is located at x=-0.22278298 with the location parameter=0.
-  //This shift is corrected within this function, so that the actual
-  //maximum is identical to the MP parameter.
-
-  // Numeric constants
-  Double_t invsq2pi = 0.3989422804014;   // (2 pi)^(-1/2)
-  Double_t mpshift  = -0.22278298;       // Landau maximum location
-
-  // Control constants
-  Double_t np = 100.0;      // number of convolution steps
-  Double_t sc =   5.0;      // convolution extends to +-sc Gaussian sigmas
-
-  // Variables
-  Double_t xx;
-  Double_t mpc;
-  Double_t fland;
-  Double_t sum = 0.0;
-  Double_t xlow,xupp;
-  Double_t step;
-  Double_t i;
-
-
-  // MP shift correction
-  mpc = par[1] - mpshift * par[0]; 
-
-  // Range of convolution integral
-  xlow = x[0] - sc * par[2];
-  xupp = x[0] + sc * par[2];
-
-  step = (xupp-xlow) / np;
-
-  // Convolution integral of Landau and Gaussian by sum
-  for(i=1.0; i<=np/2; i++) {
-    xx = xlow + (i-.5) * step;
-    fland = TMath::Landau(xx,mpc,par[0]) / par[0];
-    sum += fland * TMath::Gaus(x[0],xx,par[2]);
-
-    xx = xupp - (i-.5) * step;
-    fland = TMath::Landau(xx,mpc,par[0]) / par[0];
-    sum += fland * TMath::Gaus(x[0],xx,par[2]);
+  Double_t rv=1.; 
+  for(Int_t i=0;i<8;i++){
+    Double_t fun=GetCondFunPi(i);
+    if(fun>=0)rv*=fun;
   }
-
-  return (step * sum * invsq2pi / par[2]);
+  return rv;
 }
 //_______________________________________________________________________
-Double_t AliITSPident::Gaus2(Double_t *x, Double_t *par){
-  //normalized gaussian function
-  return 1/(sqrt(2*TMath::Pi())*par[1])*TMath::Gaus(x[0],par[0],par[1]);
-}
-//_______________________________________________________________________
-void AliITSPident::CookFunItsLay(Int_t lay,Int_t opt,Double_t *par,Double_t dedx,Double_t mom,Double_t rangei,Double_t rangef,TString comment){
-  //it gives the response functions
- TF1 funLay(comment,Langaufunnorm,rangei,rangef,3);
- funLay.SetParameters(par);
- Double_t condFun=funLay.Eval(dedx);
-  if(opt==0){
-    fCondFunProLay[lay]=condFun;
-    if(mom<0.4 && dedx<100)fCondFunProLay[lay]=0.00001;
-    if(mom<0.4 &&dedx<50)fCondFunProLay[lay]=0.0000001;
-  }
-  if(opt==1){
-    fCondFunKLay[lay]=condFun; 
-    if(mom<0.25 && dedx<100)fCondFunKLay[lay]=0.00001;
-    if(mom<0.4 &&dedx<30)fCondFunKLay[lay]=0.0000001;   
-  }
-  if(opt==2){
-    fCondFunPiLay[lay]=condFun;
-    if(mom<0.6 &&dedx<20)fCondFunPiLay[lay]=0.001;
-  }
-
-}
-//_______________________________________________________________________
-Float_t AliITSPident::CookCombinedBayes(Double_t condfun[][3],Float_t *prior,Int_t part)const {
+Double_t AliITSPident::CookCombinedBayes(Double_t condfun[][3],Double_t *prior,Int_t part)const {
   //Bayesian combined PID in the ITS
   Int_t test=0; 
-  Float_t bayes;
-  Float_t pprior[4]={0,0,0,0};
+  Double_t bayes;
+  Double_t pprior[4]={0,0,0,0};
   for(Int_t j=0;j<4;j++)pprior[j]=prior[j];
   pprior[2]+=pprior[3];//prior for electrons summed to priors for pions
   for(Int_t i=0;i<8;i++){//layer
     if (condfun[i][0]>0 || condfun[i][1]>0 ||condfun[i][2]>0) test++; 
   }
+
   if(test>0){
-    if ((pprior[0]!=0 || pprior[1]!=0 ||pprior[2]!=0)&&CookSum(condfun,pprior)!=0){
+    Double_t sum=CookSum(condfun,pprior);
+    if ((pprior[0]!=0 || pprior[1]!=0 ||pprior[2]!=0)&&sum!=0.){
 
-      bayes=pprior[part]*CookProd(condfun,part)*1/CookSum(condfun,pprior);
+      bayes=pprior[part]*CookProd(condfun,part)*1/sum;
   
     }
     else bayes=-100;
@@ -397,21 +155,20 @@ Float_t AliITSPident::CookCombinedBayes(Double_t condfun[][3],Float_t *prior,Int
   return bayes;
 }
 //_______________________________________________________________________
-Float_t AliITSPident::CookProd(Double_t condfun[][3],Int_t part)const{
+Double_t AliITSPident::CookProd(Double_t condfun[][3],Int_t part)const{
   //
-  Float_t p=1;
+  Double_t p=1;
   for(Int_t lay=0;lay<8;lay++){
-    if(condfun[lay][part]>=0)p=p*condfun[lay][part];
+    if(condfun[lay][part]>0.) p=p*condfun[lay][part];
   }
-
   return p;
 }
 //_______________________________________________________________________
-Float_t AliITSPident::CookSum(Double_t condfun[][3],Float_t *prior)const{
+Double_t AliITSPident::CookSum(Double_t condfun[][3],Double_t *prior)const{
   //
-  Float_t sum=0;
-  Float_t pprior[4]={0,0,0,0};
-  for(Int_t j=0;j<4;j++)pprior[j]=prior[j];
+  Double_t sum=0.;
+  Double_t pprior[4]={0,0,0,0};
+  for(Int_t j=0;j<4;j++) pprior[j]=prior[j];
   pprior[2]+=pprior[3];//prior for electrons summed to priors for pions
   for(Int_t i=0;i<3;i++){//sum over the particles--electrons excluded
     sum+=pprior[i]*CookProd(condfun,i);
index 7c5efb21774ca651d4c5c633effe4abe40428dd2..ea03f023cb0faedd2f58fbf6d3e37bc581f6b044 100644 (file)
 
 #include <TObject.h>
 class AliESDtrack;
-class AliITSSteerPid;
 class TF1;
-class AliITSPidParItem;
+class AliITSPidParams;
+
 class AliITSPident : public TObject{
 
  public:
   AliITSPident();
-  AliITSPident(Double_t mom,AliITSSteerPid *sp,Float_t *Qlay,Float_t *nlay,Float_t priorip=0.066,Float_t priorik=0.103,Float_t prioripi=0.83,Float_t priorie=0.001);
+  AliITSPident(Double_t mom,AliITSPidParams *pars,Double_t *Qlay,Double_t priorip=0.066,Double_t priorik=0.103,Double_t prioripi=0.83,Double_t priorie=0.001);
   
-  AliITSPident(AliESDtrack *track,AliITSSteerPid *sp,Float_t *Qlay,Float_t *nlay,Float_t priorip=0.066,Float_t priorik=0.103,Float_t prioripi=0.83,Float_t priorie=0.001);
+  AliITSPident(AliESDtrack *track,AliITSPidParams *pars,Double_t priorip=0.066,Double_t priorik=0.103,Double_t prioripi=0.83,Double_t priorie=0.001);
 
   virtual ~AliITSPident();
-  Float_t GetP() const {return fMom;}//local momentum (GeV/c)
   Double_t GetCondFunPro(Int_t lay) const {
     return fCondFunProLay[lay];
   }
@@ -36,42 +35,36 @@ class AliITSPident : public TObject{
     return fCondFunPiLay[lay];
   }
   Double_t GetProdCondFunPi() const;
-  void PrintParameters() const;
-  Float_t GetPBayesp()const {return fPBayesp;}
-  Float_t GetPBayesk()const {return fPBayesk;}
-  Float_t GetPBayespi()const {return fPBayespi;}
-  Float_t GetPPriorip() const {return fPPriorip;}
-  Float_t GetPPriorik() const {return fPPriorik;}
-  Float_t GetPPrioripi() const {return fPPrioripi;}
-  Float_t GetPPriorie() const {return fPPriorie;}
-  void GetNclsPerLayer(Int_t *ncls) const;
-  static Double_t Langaufun(Double_t *x, Double_t *par);
-  static Double_t Langaufun2(Double_t *x, Double_t *par);
-  static Double_t Langaufunnorm(Double_t *x, Double_t *par);
-  static Double_t Gaus2(Double_t *x, Double_t *par);
+
+  Double_t GetPBayesp()const {return fPBayesp;}
+  Double_t GetPBayesk()const {return fPBayesk;}
+  Double_t GetPBayespi()const {return fPBayespi;}
+  Double_t GetPPriorip() const {return fPPriorip;}
+  Double_t GetPPriorik() const {return fPPriorik;}
+  Double_t GetPPrioripi() const {return fPPrioripi;}
+  Double_t GetPPriorie() const {return fPPriorie;}
   
  private:
 
-  void CookFunItsLay(Int_t lay,Int_t opt,Double_t *par,Double_t dedx,Double_t mom,Double_t rangei,Double_t rangef,TString comment);
-  void CookBayes(Double_t *condfun,Float_t *prior);
-  Float_t CookCombinedBayes(Double_t condfun[][3],Float_t *prior,Int_t part)const;
-  Float_t CookProd(Double_t condfun[][3],Int_t part) const;
-  Float_t CookSum(Double_t condfun[][3],Float_t *prior) const;
+  void CalculateResponses(Double_t mom,AliITSPidParams *pars, Double_t *Qlay);
+  Double_t CookCombinedBayes(Double_t condfun[][3],Double_t *prior,Int_t part)const;
+  Double_t CookProd(Double_t condfun[][3],Int_t part) const;
+  Double_t CookSum(Double_t condfun[][3],Double_t *prior) const;
+
   AliITSPident(const AliITSPident &ob); // copy constructor
   AliITSPident& operator=(const AliITSPident & ob); // ass. op.
 
-  Float_t fMom;                   // Particle momentum
   Double_t fCondFunProLay[8];     // one for each silicon layer
   Double_t fCondFunKLay[8];       // cond. prob. function kaons per layer
   Double_t fCondFunPiLay[8];      // cond. prob. function pions per layer
-  Float_t fPBayesp;               // Bayes prob. 
-  Float_t fPBayesk;               // Bayes prob. for kaons
-  Float_t fPBayespi;              // Bayes prob. for pions 
-  Float_t fPPriorip;              // Priori prob. 
-  Float_t fPPriorik;              // Priori prob. for kaons
-  Float_t fPPrioripi;             // Priori prob. for pions
-  Float_t fPPriorie;              // Priori prob. for electrons
-  Int_t fNcls[4];                 // N. of clusters per layer (sdd1,sdd2,ssd1,ssd2) 
-  ClassDef(AliITSPident,3);
+  Double_t fPBayesp;               // Bayes prob. 
+  Double_t fPBayesk;               // Bayes prob. for kaons
+  Double_t fPBayespi;              // Bayes prob. for pions 
+  Double_t fPPriorip;              // Priori prob. 
+  Double_t fPPriorik;              // Priori prob. for kaons
+  Double_t fPPrioripi;             // Priori prob. for pions
+  Double_t fPPriorie;              // Priori prob. for electrons
+
+  ClassDef(AliITSPident,4);
 };
 #endif
diff --git a/ITS/AliITSSteerPid.cxx b/ITS/AliITSSteerPid.cxx
deleted file mode 100644 (file)
index 379a519..0000000
+++ /dev/null
@@ -1,198 +0,0 @@
-/**************************************************************************
- * 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.                  *
- **************************************************************************/
-
-/* $Id$ */
-
-/////////////////////////////////////////////////////////////////////////
-//Steering Class for PID in the ITS                                      //
-//The PID is based on the likelihood of all the four ITS' layers,        //
-//without using the truncated mean for the dE/dx. The response           //
-//functions for each layer are convoluted Landau-Gaussian functions.     // 
-// Origin: Elena Bruna bruna@to.infn.it, Massimo Masera masera@to.infn.it//
-/////////////////////////////////////////////////////////////////////////
-
-#include <TClonesArray.h>
-#include <TMath.h>
-
-#include "AliITSSteerPid.h"
-
-ClassImp(AliITSSteerPid)
-
-  //______________________________________________________________
-AliITSSteerPid::AliITSSteerPid():
-fClonarr2(0),
-fVect2(0),
-fVect2lay1(0),
-fVect2lay2(0),
-fVect2lay3(0),
-fVect2lay4(0),
-fFitTree(0),
-fItem(0),
-fPCenter(0),
-fPWidth(0)
-{
-  // default constructor
- }
-//______________________________________________________________
-AliITSSteerPid::~AliITSSteerPid(){
-  // destructor
-  delete fClonarr2;
-  delete fFitTree;
-}
-
-//______________________________________________________________________
-AliITSSteerPid::AliITSSteerPid(const AliITSSteerPid &ob) :TObject(ob),
-fClonarr2(ob.fClonarr2),
-fVect2(ob.fVect2),
-fVect2lay1(ob.fVect2lay1),
-fVect2lay2(ob.fVect2lay2),
-fVect2lay3(ob.fVect2lay3),
-fVect2lay4(ob.fVect2lay4),
-fFitTree(ob.fFitTree),
-fItem(ob.fItem),
-fPCenter(ob.fPCenter),
-fPWidth(ob.fPWidth) {
-  // Copy constructor
-}
-
-//______________________________________________________________________
-AliITSSteerPid& AliITSSteerPid::operator=(const AliITSSteerPid& ob){
-  // Assignment operator
-  this->~AliITSSteerPid();
-  new(this) AliITSSteerPid(ob);
-  return *this;
-}
-
-//______________________________________________________________
-void AliITSSteerPid::InitLayer(TString fileITS,TString fileFitPar){
-  // it opens the files useful for the PID 
-  fClonarr2=new TFile (fileITS,"r");
-  fVect2=(TClonesArray*)fClonarr2->Get("vectfitits_0");//truncated mean
-  fVect2lay1=(TClonesArray*)fClonarr2->Get("vectfitits_1");//lay 1
-  fVect2lay2=(TClonesArray*)fClonarr2->Get("vectfitits_2");//lay 2
-  fVect2lay3=(TClonesArray*)fClonarr2->Get("vectfitits_3");//lay 3
-  fVect2lay4=(TClonesArray*)fClonarr2->Get("vectfitits_4");//lay 4
-  TFile *fFitPar=new TFile (fileFitPar);
-  fFitTree=(TTree*)fFitPar->Get("tree");
-}
-
-//______________________________________________________________
-AliITSPidParItem* AliITSSteerPid::GetItemLayer(Int_t nolay,Float_t mom){
-    // it gives an AliITSPidParItem object for a given momentum and ITS layer
-  if(nolay==1) return Item(fVect2lay1,mom);
-  if(nolay==2) return Item(fVect2lay2,mom);
-  if(nolay==3) return Item(fVect2lay3,mom);
-  if(nolay==4) return Item(fVect2lay4,mom);
-  if(nolay!=1&&nolay!=2&&nolay!=3&&nolay!=4) {
-    fItem=new AliITSPidParItem();
-    return fItem;
-
-  }
-  return 0;
-}
-
-//______________________________________________________________
-void AliITSSteerPid::GetParFitLayer(Int_t nolay,Float_t mom,Double_t *parp,Double_t *park,Double_t *parpi){
-  //it gives the parameters of the convoluted functions (WL, MP, WG) for 
-  //protons, kaons and pions for a given momentum and ITS layer
-
-  Double_t parfit0pro[3]={0,0,0};
-  Double_t parfit1pro[3]={0,0,0};
-  Double_t parfit3pro[3]={0,0,0};
-  Double_t parfit0kao[3]={0,0,0};
-  Double_t parfit1kao[3]={0,0,0};
-  Double_t parfit3kao[3]={0,0,0};
-  Double_t parfit0pi[3]={0,0,0};
-  Double_t parfit1pi[3]={0,0,0};
-  Double_t parfit3pi[3]={0,0,0};
-  fFitTree->SetBranchAddress("par0pro",parfit0pro);
-  fFitTree->SetBranchAddress("par1pro",parfit1pro);
-  fFitTree->SetBranchAddress("par3pro",parfit3pro);
-
-  fFitTree->SetBranchAddress("par0kao",parfit0kao);
-  fFitTree->SetBranchAddress("par1kao",parfit1kao);
-  fFitTree->SetBranchAddress("par3kao",parfit3kao);
-
-  fFitTree->SetBranchAddress("par0pi",parfit0pi);
-  fFitTree->SetBranchAddress("par1pi",parfit1pi);
-  fFitTree->SetBranchAddress("par3pi",parfit3pi);
-  fFitTree->GetEvent(nolay);
-  GetLangausProPars(mom,parfit0pro,parfit1pro,parfit3pro,parp);
-  GetLangausKaoPars(mom,parfit0kao,parfit1kao,parfit3kao,park);
-  GetLangausPiPars(mom,parfit0pi,parfit1pi,parfit3pi,parpi);
-
-
-}//______________________________________________________________
-void AliITSSteerPid::GetLangausProPars(Float_t mom,Double_t *parfit0,Double_t *parfit1,Double_t *parfit3,Double_t *par){
-  //It finds the parameters of the convoluted Landau-Gaussian response 
-  //function for protons (Width Landau, Most Probable, Width Gaussian)
-  par[0]=parfit0[0]+parfit0[1]/mom;
-  par[1]=parfit1[0]/(mom*mom)+parfit1[1]/(mom*mom)*TMath::Log(mom*mom)+parfit1[2];
-  par[2]=parfit3[0]/(mom*mom)+parfit3[1]/(mom*mom)*TMath::Log(mom*mom)+parfit3[2];
-}
-//______________________________________________________________
-void AliITSSteerPid::GetLangausKaoPars(Float_t mom,Double_t *parfit0,Double_t *parfit1,Double_t *parfit3,Double_t *par){
-  // It finds the parameters of the convoluted Landau-Gaussian response 
-  //function for kaons (Width Landau, Most Probable, Width Gaussian)
-
-  par[0]=parfit0[0]+parfit0[1]/(mom*mom);
-  par[1]=parfit1[0]/(mom*mom)+parfit1[1]/(mom*mom)*TMath::Log(mom*mom)+parfit1[2];
-  par[2]=parfit3[0]/(mom*mom)+parfit3[1]/(mom*mom)*TMath::Log(mom*mom)+parfit3[2];
-}
-
-//______________________________________________________________
-void AliITSSteerPid::GetLangausPiPars(Float_t mom,Double_t *parfit0,Double_t *parfit1,Double_t *parfit3,Double_t *par){
-  //It finds the parameters of the convoluted Landau-Gaussian response 
-  //function for pions (Width Landau, Most Probable, Width Gaussian)
-
-  par[0]=parfit0[0]/(mom*mom)+parfit0[1]/(mom*mom)*TMath::Log(mom*mom)+parfit0[2];
-  par[1]=parfit1[0]/(mom)+parfit1[1]/(mom)*TMath::Log(mom*mom)+parfit1[2];
-  par[2]=parfit3[0]/(mom*mom)+parfit3[1]/(mom*mom)*TMath::Log(mom*mom)+parfit3[2];
-}
-
-
-
-//______________________________________________________________
-AliITSPidParItem* AliITSSteerPid::Item(TClonesArray *Vect,Float_t mom){
-
-  //it gives an AliITSPidParItem object taken from the TClonesArray. 
-  Int_t mybin=-1;
-
-  AliITSPidParItem* punt;
-  
-  for (Int_t a=0;a<50;a++){
-    punt=(AliITSPidParItem*)Vect->At(a);
-    Float_t centerp=punt->GetMomentumCenter(); 
-    Float_t widthp=punt->GetWidthMom();
-    if (mom>(centerp-widthp/2) && mom<=(centerp+widthp/2)) mybin=a; 
-  }
-  if (mybin!=-1) fItem=(AliITSPidParItem*)Vect->At(mybin);
-  else {
-    fPCenter=0;
-    fPWidth=0;
-    for (Int_t ii=0;ii<52;ii++) fBuff[ii]=0;
-    fItem = new AliITSPidParItem(fPCenter,fPWidth,fBuff);
-  }
-  
-  return fItem;
-
-
-
-}
diff --git a/ITS/AliITSSteerPid.h b/ITS/AliITSSteerPid.h
deleted file mode 100644 (file)
index 3539658..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-#ifndef AliITSSTEERPID_H
-#define AliITSSTEERPID_H
-////////////////////////////////////////////////////////////////////////
-//Steering lass for PID in ITS                                          //
-//The PID is based on the likelihood of all the four ITS' layers,       //
-//without using the truncated mean for the dE/dx. The response          //
-//functions for each layer are convoluted Landau-Gaussian functions.    //                  
-//Origin: Elena Bruna bruna@to.infn.it, Massimo Masera masera@to.infn.it//
-////////////////////////////////////////////////////////////////////////
-
-/* $Id$ */
-
-#include <TObject.h>
-#include <Riostream.h>
-#include <TF1.h>
-#include <TTree.h>
-#include <TFile.h>
-#include "AliITSPidParItem.h"
-
-
-class AliITSSteerPid : public TObject{
-
- public:
-  AliITSSteerPid();
-  virtual ~AliITSSteerPid();
-  void InitLayer(TString fileITS="$ALICE_ROOT/ITS/farrfitits.root",TString fileFitPar="$ALICE_ROOT/ITS/ffitparams.root");
-  
-  AliITSPidParItem* GetItemLayer(Int_t nolay,Float_t mom);
-  void GetParFitLayer(Int_t nolay,Float_t mom,Double_t *parp,Double_t *park,Double_t *parpi);
-  static void GetLangausProPars(Float_t mom,Double_t *parfit0,Double_t *parfit1,Double_t *parfit3,Double_t *par);
-  static void GetLangausKaoPars(Float_t mom,Double_t *parfit0,Double_t *parfit1,Double_t *parfit3,Double_t *par);
-  static void GetLangausPiPars(Float_t mom,Double_t *parfit0,Double_t *parfit1,Double_t *parfit3,Double_t *par);
-
- private:
-
-  AliITSPidParItem* Item(TClonesArray *Vect,Float_t mom);
-  AliITSSteerPid(const AliITSSteerPid &ob); // copy constructor
-  AliITSSteerPid& operator=(const AliITSSteerPid & ob); // ass. op.
-
-
-  TFile *fClonarr2;              // file of TClones Array
-  TClonesArray *fVect2;          // TClonesArray fVect
-  TClonesArray *fVect2lay1;     // TClonesArray for layer 1 (SDD1)
-  TClonesArray *fVect2lay2;     // TClonesArray for layer 2 (SDD2)
-  TClonesArray *fVect2lay3;     // TClonesArray for layer 3 (SSD1)
-  TClonesArray *fVect2lay4;     // TClonesArray for layer 4 (SSD2)
-  TTree* fFitTree;               // tree
-  AliITSPidParItem *fItem;       //element of TClonesArray of interest
-  Float_t fPCenter;              //value for center
-  Float_t fPWidth;               //value for width
-  Double_t fBuff[52];            //array for
-  
-  ClassDef(AliITSSteerPid,1);
-
-};
-#endif
index e829631cc336215da35fa292cb3719fda37269a8..754790638f6907240e989696a13be8dc2d902a96 100644 (file)
 #include "AliESDEvent.h"
 #include "AliESDtrack.h"
 #include "AliITSLoader.h"
+#include "AliITSPidParams.h"
 #include "AliITSPident.h"
-#include "AliITSSteerPid.h"
 #include "AliLog.h"
 
 ClassImp(AliITSpidESD2)
 //_________________________________________________________________________
 AliITSpidESD2::AliITSpidESD2():
   AliITSpidESD(),
-  fSp(0)
+  fPidPars(0)
 { 
   //  The main constructor
-  fSp=new AliITSSteerPid();
-  fSp->InitLayer();
+  fPidPars=new AliITSPidParams("default");
 }
 
 
@@ -49,13 +48,13 @@ AliITSpidESD2::AliITSpidESD2():
 AliITSpidESD2::~AliITSpidESD2(){
   //destructor
 
-  if(fSp)delete fSp;
+  if(fPidPars)delete fPidPars;
 }
 
 
 //______________________________________________________________________
 AliITSpidESD2::AliITSpidESD2(const AliITSpidESD2 &ob) :AliITSpidESD(ob),
-fSp(ob.fSp
+fPidPars(ob.fPidPars
 {
   // Copy constructor
 }
@@ -74,27 +73,12 @@ AliITSpidESD2& AliITSpidESD2::operator=(const AliITSpidESD2& ob ){
 void AliITSpidESD2::GetITSpidSingleTrack(AliESDtrack* esdtr, Double_t condprobfun[]){
   // Method to calculate PID probabilities for a single track
   
-  Double_t momits=esdtr->GetP();
-  Double_t qclu[4];
-  esdtr->GetITSdEdxSamples(qclu);
-
-  Float_t qclucorr[8],nlay[8];
-  for(Int_t jj=0;jj<8;jj++){
-    if(jj<4 && qclu[jj]>0){
-      qclucorr[jj]=qclu[jj]; 
-      nlay[jj]=jj+2; // layers numbered from 0 to 5
-    }
-    else{ 
-      qclucorr[jj]=-1;
-      nlay[jj]=0;
-    }
-  }
   
-  Float_t prip=0.33;
-  Float_t prik=0.33;
-  Float_t pripi=0.33;
-  Float_t prie=0.;
-  AliITSPident mypid(momits,fSp,qclucorr,nlay,prip,prik,pripi,prie);
+  Double_t prip=0.33;
+  Double_t prik=0.33;
+  Double_t pripi=0.33;
+  Double_t prie=0.;
+  AliITSPident mypid(esdtr,fPidPars,prip,prik,pripi,prie);
   condprobfun[0]=mypid.GetProdCondFunPi();//el --PID in the ITS does not distinguish among Pi,el,mu
   condprobfun[1]=mypid.GetProdCondFunPi();//mu
   condprobfun[2]=mypid.GetProdCondFunPi();//pi
index d071d14261c88eadbb38857fdad7538fb9edade3..daad65aea4f5d92daf8bb03771e23f2d9c890fb4 100755 (executable)
@@ -17,7 +17,7 @@
 #include "AliITSpidESD.h"
 #include "AliESDtrack.h"
 
-class AliITSSteerPid;
+class AliITSPidParams;
 
 class AliITSpidESD2 : public AliITSpidESD {
 public:
@@ -30,9 +30,9 @@ public:
   virtual Int_t MakePID(AliESDEvent *event);
 
 private:
-  AliITSSteerPid* fSp;       //!pointer to AliITSSteerPid
+  AliITSPidParams* fPidPars;       //!pointer to AliITSSteerPid
 
-  ClassDef(AliITSpidESD2,3)   // ITS PID class
+  ClassDef(AliITSpidESD2,4)   // ITS PID class
 };
 
 #endif
index 841e11ebee1ae32521db3e8d815199c42d8cd3be..9bd4354b9f0a698ff8102d86c53895573d165930 100644 (file)
@@ -63,9 +63,8 @@
 
 // Classes for PID
 #pragma link C++ class  AliITSPid+;
-#pragma link C++ class AliITSPidParItem+;
+#pragma link C++ class AliITSPidParams+;
 #pragma link C++ class AliITSPident+;
-#pragma link C++ class AliITSSteerPid+;
 #pragma link C++ class AliITSpidESD+;
 #pragma link C++ class AliITSpidESD1+;
 #pragma link C++ class AliITSpidESD2+;
index eafbc8b363f2be31ed3e03296df45a22ce23bc6f..6c40d35661963afc052973944032511c45f18753 100644 (file)
@@ -39,8 +39,7 @@ SRCS =        AliITSDetTypeRec.cxx \
                AliITSpidESD2.cxx \
                AliITSdEdxAnalyzer.cxx \
                 AliITSPident.cxx \
-                AliITSSteerPid.cxx \
-                AliITSPidParItem.cxx \
+                AliITSPidParams.cxx \
                AliITSReconstructor.cxx \
                AliITSRecoParam.cxx \
                AliITSBeamTestDig.cxx \