1 /**************************************************************************
2 * Copyright(c) 2001-2002, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 Revision 1.2 2002/10/14 14:57:43 hristov
19 Merging the VirtualMC branch to the main development branch (HEAD)
21 Revision 1.1.6.1 2002/06/10 15:26:12 hristov
24 Revision 1.1 2002/05/08 18:19:50 kowal2
25 New class by Andrea Dainese. It deals with the parameters used by
26 AliTPCtrackerParam (efficiences, pulls etc)
30 ////////////////////////////////////////////////////////////////////////
31 // Class used by TPC tracking parameterization to handle to tracking
32 // parameters (efficiencies, etc...) on a kinematic grid [pt,eta].
33 // User has to provide the grid steps and the values of the parameter
34 // in the points of the grid. The function GetValueAt(pt,eta) returns
35 // the result of a linear interpolation at the point [pt,eta].
37 // Origin: Andrea Dainese, Padova - e-mail: andrea.dainese@pd.infn.it
38 ////////////////////////////////////////////////////////////////////////
40 #include <Riostream.h>
43 #include "AliTPCkineGrid.h"
45 ClassImp(AliTPCkineGrid)
47 //------------------------------------------------------------------------
48 AliTPCkineGrid::AliTPCkineGrid() {
49 //------------------------------------------------------------------------
50 // Default constructor
51 //------------------------------------------------------------------------
58 //------------------------------------------------------------------------
59 AliTPCkineGrid::AliTPCkineGrid(Int_t npt,Int_t neta,
60 Double_t* pt,Double_t* eta) {
61 //------------------------------------------------------------------------
62 // Standard constructor
63 //------------------------------------------------------------------------
67 fPt = new TArrayD(fNpt);
68 fEta = new TArrayD(fNeta);
70 for(Int_t i=0; i<npt; i++) (*fPt)[i] = pt[i];
71 for(Int_t i=0; i<neta; i++) (*fEta)[i] = eta[i];
73 fParams = new TMatrixD(fNpt,fNeta);
75 //-------------------------------------------------------------------------
76 AliTPCkineGrid::AliTPCkineGrid(const AliTPCkineGrid& grid) {
77 //-------------------------------------------------------------------------
79 //-------------------------------------------------------------------------
82 fPt = new TArrayD(fNpt);
83 for(Int_t i=0; i<fNpt; i++) (*fPt)[i] = grid.fPt->At(i);
84 fEta = new TArrayD(fNeta);
85 for(Int_t i=0; i<fNeta; i++) (*fEta)[i] = grid.fEta->At(i);
87 fParams = new TMatrixD(fNpt,fNeta);
88 for(Int_t i=0; i<fNpt; i++) {
89 for(Int_t j=0; j<fNeta; j++) (*fParams)(i,j)=(*grid.fParams)(i,j);
92 //--------------------------------------------------------------------------
93 AliTPCkineGrid::~AliTPCkineGrid() {
94 //--------------------------------------------------------------------------
96 //--------------------------------------------------------------------------
101 //--------------------------------------------------------------------------
102 void AliTPCkineGrid::GetArrayEta(Double_t* eta) const {
103 //--------------------------------------------------------------------------
104 // This functions returns an array with the eta points
105 //--------------------------------------------------------------------------
106 for(Int_t i=0;i<fNeta;i++) eta[i] = fEta->At(i);
109 //--------------------------------------------------------------------------
110 void AliTPCkineGrid::GetArrayPt(Double_t* pt) const {
111 //--------------------------------------------------------------------------
112 // This functions returns an array with the pt points
113 //--------------------------------------------------------------------------
114 for(Int_t i=0;i<fNpt;i++) pt[i] = fPt->At(i);
117 //--------------------------------------------------------------------------
118 Int_t AliTPCkineGrid::GetBin(Double_t pt,Double_t eta) const {
119 //--------------------------------------------------------------------------
120 // This functions tells in which bin of the grid a certain point falls
121 //--------------------------------------------------------------------------
123 Int_t etaBin=0,ptBin=0,bin=0;
124 eta = TMath::Abs(eta);
126 /* this is how bins are numbered
139 if(eta < fEta->At(0)) {
141 } else if(eta > fEta->At(fNeta-1)) {
144 for(Int_t i=0; i<fNeta; i++) {
145 if(eta < fEta->At(i)) {
151 if(pt < fPt->At(0)) {
153 } else if(pt > fPt->At(fNpt-1)) {
156 for(Int_t i=0; i<fNpt; i++) {
157 if(pt < fPt->At(i)) {
164 bin = ptBin*(fNeta+1) + etaBin;
168 //--------------------------------------------------------------------------
169 Double_t AliTPCkineGrid::GetParam(Int_t i) const {
170 //--------------------------------------------------------------------------
171 // This functions allows to get parameters using only one index
172 //--------------------------------------------------------------------------
173 Int_t ipt = (Int_t)i/fNeta;
174 Int_t ieta = i-ipt*fNeta;
175 return GetParam(ipt,ieta);
177 //--------------------------------------------------------------------------
178 Double_t AliTPCkineGrid::GetValueAt(Double_t pt,Double_t eta) const {
179 //--------------------------------------------------------------------------
180 // This functions makes a linear interpolation at the point [pt,eta]
181 //--------------------------------------------------------------------------
183 // determine the points to be used in the interpolation:
186 eta = TMath::Abs(eta);
187 Int_t etaLow=0,etaUp=0;
188 if(eta < fEta->At(0)) {
191 } else if(eta >= fEta->At(fNeta-1)) {
195 for(Int_t i=0; i<fNeta; i++) {
196 if(eta < fEta->At(i)) {
205 Int_t ptLow=0,ptUp=0;
206 if(pt < fPt->At(0)) {
209 } else if(pt >= fPt->At(fNpt-1)) {
213 for(Int_t i=0; i<fNpt; i++) {
214 if(pt < fPt->At(i)) {
222 //cerr<<" Pt = ("<<ptLow<<","<<ptUp<<") Eta = ("<<etaLow<<","<<etaUp<<")\n";
224 Double_t intValue=0,intValueEtaLow=0,intValueEtaUp=0;
225 // interpolate, at etaLow, between ptLow and ptUp
226 intValueEtaLow = (*fParams)(ptLow,etaLow)+
227 ((*fParams)(ptUp,etaLow)-(*fParams)(ptLow,etaLow))/
228 (fPt->At(ptUp)-fPt->At(ptLow))*(pt-fPt->At(ptLow));
229 // interpolate, at etaUp, between ptLow and ptUp
230 intValueEtaUp = (*fParams)(ptLow,etaUp)+
231 ((*fParams)(ptUp,etaUp)-(*fParams)(ptLow,etaUp))/
232 (fPt->At(ptUp)-fPt->At(ptLow))*(pt-fPt->At(ptLow));
233 // interpolate, at pt, between etaLow and etaUp
234 intValue = intValueEtaLow+
235 (intValueEtaUp-intValueEtaLow)/
236 (fEta->At(etaUp)-fEta->At(etaLow))*(eta-fEta->At(etaLow));
238 if(intValue<0.) intValue=0.;
241 //--------------------------------------------------------------------------
242 void AliTPCkineGrid::SetParam(Int_t i,Double_t par) {
243 //--------------------------------------------------------------------------
244 // This functions allows to set parameters using only one index
245 //--------------------------------------------------------------------------
246 Int_t ipt = (Int_t)i/fNeta;
247 Int_t ieta = i-ipt*fNeta;
248 SetParam(ipt,ieta,par);