TRD module
[u/mrichter/AliRoot.git] / TRD / TRDbase / AliTRDCalTrkAttach.cxx
CommitLineData
4b44a8e1 1/**************************************************************************
2* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3* *
4* Author: The ALICE Off-line Project. *
5* Contributors are mentioned in the code where appropriate. *
6* *
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**************************************************************************/
15
16//////////////////////////////////////////////////////////////////////////
17// //
18// Container for calibration parameters for AliTRDseedV1::AttachClusters()
19// .... Longer description of content ...
20//
21// For calibration procedure check AliTRDtrackleOflHelper::CalibrateAttach()
22// .... some reference to the calibration procedure .........
23// //
24// Authors: //
25// Alex Bercuci <a.bercuci@gsi.de> //
26// //
27//////////////////////////////////////////////////////////////////////////
28
29#include <TFile.h>
30#include <TROOT.h>
31#include <TMath.h>
3da83347 32#include "TH1.h"
4b44a8e1 33#include "TGraphErrors.h"
34#include "TObjArray.h"
35
36#include "AliLog.h"
37
4b44a8e1 38#include "AliTRDcalibDB.h"
803dc399 39#include "AliTRDgeometry.h"
40#include "AliTRDCalTrkAttach.h"
4b44a8e1 41
42ClassImp(AliTRDCalTrkAttach)
43
44//______________________________________________________________________________
45AliTRDCalTrkAttach::AliTRDCalTrkAttach()
46 :TNamed("AliTRDCalTrkAttach", "Calibration of AliTRDseedV1::AttachClusters")
47 ,fRClikeLimit(0.65)
48 ,fScaleCov(2.)
49 ,fLike(NULL)
50{
51// Default constructor
52
53 fNsgmDy[0] = 5; fNsgmDy[1] = 7;
54 fLikeMinRelDecrease[0] = .2; fLikeMinRelDecrease[1] = .3;
55}
56
57//______________________________________________________________________________
58AliTRDCalTrkAttach::~AliTRDCalTrkAttach()
59{
60// Destructor
61 if(fLike) delete fLike;
62}
63
64
65//______________________________________________________________________________
66Double_t AliTRDCalTrkAttach::CookLikelihood(Bool_t chg, Int_t ly, Float_t pt, Float_t phiTrk, Int_t n, Double_t dyr, Double_t dphi, Double_t sr) const
67{
68// Calculate likelihood for a segment to belong to a tracklet
69// Based on calibrated values
70
71 if(n<4){
72 AliDebug(4, Form("Failed basic cut[s] : n[%d] ...", n));
73 return 0.;
74 }
75 //check likelihood array
803dc399 76 if (!fLike || fLike->GetEntries() != AliTRDgeometry::kNlayer*kNcharge*kNcalib) {
4b44a8e1 77 AliError("No usable AttachClusters calib object.");
78 return 0.;
79 }
803dc399 80 Int_t offset(ly*kNcalib*kNcharge); // offset for layer
4b44a8e1 81 TGraphErrors *g(NULL);
803dc399 82 if(!(g = (TGraphErrors*)fLike->At(offset+Int_t(kResPos)*kNcharge+Int_t(chg)))){
4b44a8e1 83 AliError("Failed retrieving AttachClusters graph.");
84 return 0.;
85 }
86 // Interpolate p_t
87 Int_t npts(g->GetN()), ip(0), jp(-1);
88 Double_t x0, y0, x1, y1, dd(0.), invdx(0.), f[4]={0., 0., 0., 0.};
89 for(Int_t kp(0); kp<npts; kp++){
90 g->GetPoint(kp, x1, y1);
91 if(x1>=pt){jp=kp; break;}
92 }
93 Bool_t boundary(kFALSE);
94 if(jp<0){
95 jp = npts-1;
96 g->GetPoint(jp, x1, y1);
97 ip = npts-1;
98 boundary = kTRUE;
99 }else if(jp==0){
100 ip = 0;
101 boundary = kTRUE;
102 }else{
103 ip = jp-1;
104 g->GetPoint(ip, x0, y0);
105 invdx = 1./(x0-x1);
106 }
107 // process pt dependences
108 // +++ process dy
109 Double_t dym = boundary?y1:((pt*(y0-y1) + (x0*y1-x1*y0))*invdx),
110 sym = 0.5*(g->GetErrorY(ip)+g->GetErrorY(jp));
111 dd = (dyr - dym)/sym; dd*=dd;
112 f[0] = TMath::Exp(-0.5*dd);
113 // +++ process dphi
803dc399 114 if(!(g = (TGraphErrors*)fLike->At(offset+Int_t(kResAng)*kNcharge+Int_t(chg)))){
4b44a8e1 115 AliError("Failed retrieving AttachClusters graph.");
116 return 0.;
117 }
118 g->GetPoint(ip, x0, y0);g->GetPoint(jp, x1, y1);
119 Double_t dpm = boundary?y1:((pt*(y0-y1) + (x0*y1-x1*y0))*invdx),
120 spm = 0.5*(g->GetErrorY(ip)+g->GetErrorY(jp));
121 dd = (dphi - dpm)/spm; dd*=dd;
122 f[1] = TMath::Exp(-0.5*dd);
123 // +++ process no of clusters
803dc399 124 if(!(g = (TGraphErrors*)fLike->At(offset+Int_t(kNclMean)*kNcharge+Int_t(chg)))){
4b44a8e1 125 AliError("Failed retrieving AttachClusters graph.");
126 return 0.;
127 }
128 g->GetPoint(ip, x0, y0);g->GetPoint(jp, x1, y1);
129 Double_t nm = boundary?y1:((pt*(y0-y1) + (x0*y1-x1*y0))*invdx);
130 f[2] = (nm-TMath::Abs(n-nm))/nm;
131
132 // process phi dependences
133 // +++ process <s>/s
803dc399 134 if(!(g = (TGraphErrors*)fLike->At(offset+Int_t(kSigma)*kNcharge+Int_t(chg)))){
4b44a8e1 135 AliError("Failed retrieving AttachClusters graph.");
136 return 0.;
137 }
138 // Interpolate phi [deg]
139 npts=g->GetN(); jp=-1;
140 for(Int_t kp(0); kp<npts; kp++){
141 g->GetPoint(kp, x1, y1);
142 if(x1>=phiTrk){jp=kp; break;}
143 }
144 if(jp<0){
145 jp = npts-1;
146 g->GetPoint(jp, x1, y1);
147 ip = jp;
148 boundary = kTRUE;
149 }else if(jp==0){
150 ip = jp;
151 boundary = kTRUE;
152 }else{
153 ip = jp-1;
154 g->GetPoint(ip, x0, y0);
155 invdx = 1./(x0-x1);
156 boundary = kFALSE;
157 }
158 Double_t sm = boundary?y1:((phiTrk*(y0-y1) + (x0*y1-x1*y0))*invdx),
159 ssm = 0.5*(g->GetErrorY(ip)+g->GetErrorY(jp));
160 dd = (sr - sm)/ssm; dd*=dd;
803dc399 161 f[3] = 1.;//TMath::Exp(-0.5*dd);
4b44a8e1 162
163 // Calculate likelihood
164 Double_t length = f[0]*f[0]+f[1]*f[1]+f[2]*f[2]+f[3]*f[3];
165 length = TMath::Sqrt(length);
166 Double_t cosTht = f[0]+f[1]+f[2]+f[3];
167 cosTht /= (4.*length);
168 AliDebug(2, Form("Like[%5.3f] ThtLike[%6.2f](deg)\n"
169 " F_dy (%+6.2f)=%4.2f\n"
170 " F_phi(%+6.2f)=%4.2f\n"
171 " F_ncl(%+6d)=%4.2f\n"
172 " F_<s>(%+6.2f)=%4.2f",
173 length, TMath::ACos(cosTht)*TMath::RadToDeg(),
174 dyr, f[0], dphi, f[1], n, f[2], sr, f[3]));
175
176 return length;
177}
178
179//______________________________________________________________________________
3da83347 180void AliTRDCalTrkAttach::Help()
181{
182// Display help message
183 printf(
184 "Draw likelihood distribution. Possible options are of the form \"lt\"\n"
185 "where \"l\" is the layer number [0-5] and\n"
186 " \"t\" is the type. This is one of the following\n"
187 " \"y\" - r-phi roads\n"
188 " \"p\" - angular (deflection) roads\n"
189 " \"n\" - number of clusters\n"
190 " \"s\" - cluster spread\n");
191}
192
193//______________________________________________________________________________
194void AliTRDCalTrkAttach::Draw(Option_t* opt)
195{
196// Draw likelihood distribution. Possible options are of the form "lt"
197// where "l" is the layer number [0-5] and
198// "t" is the type. This is one of the following
199// "y" - r-phi roads
200// "p" - angular (deflection) roads
201// "n" - number of clusters
202// "s" - cluster spread
203 if (!fLike || fLike->GetEntries() != AliTRDgeometry::kNlayer*kNcharge*kNcalib) {
204 AliError("No likelihood distributions stored");
205 return;
206 }
207 if(!opt){
208 Help();
209 return;
210 }
211 Int_t ly(-1); Char_t cly[] = {'0','1','2','3','4','5'};
212 for(Int_t ily(0); ily<AliTRDgeometry::kNlayer; ily++){
213 if(opt[0] == cly[ily]){
214 ly = ily; break;
215 }
216 }
217 if(ly<0){
218 Help();
219 return;
220 }
221 Int_t typ(-1); const Char_t ctyp[] = {'y', 'p', 's', 'n'};
222 for(Int_t it(0); it<kNcalib; it++){
223 if(opt[1] == ctyp[it]){
224 typ = it; break;
225 }
226 }
227 if(typ<0){
228 Help();
229 return;
230 }
231 Int_t offset(ly*kNcalib*kNcharge+typ*kNcharge); // offset for layer and type
232 TGraphErrors *g[2]={(TGraphErrors*)fLike->At(offset), (TGraphErrors*)fLike->At(offset+1)};
233 if(!g[0] || !g[1]){
234 AliError(Form("Failed retrieving graphs for Ly[%d] Typ[%c]", ly, ctyp[typ]));
235 return;
236 }
237
238 // draw !!
239 const Char_t *ttyp[] = {"#Deltay [cm]", "#Delta#phi [deg]", "#Delta#sigma/<#sigma>", "n_{cl}^{tracklet}"};
240 g[0]->Draw("apl"); g[0]->SetLineColor(kBlue); g[0]->SetMarkerColor(kBlue);
241 g[1]->Draw("pl"); g[1]->SetLineColor(kRed); g[1]->SetMarkerColor(kRed);
242 TH1 *h=g[0]->GetHistogram();
243 h->GetYaxis()->SetTitle(ttyp[typ]);
244 h->GetYaxis()->SetLabelFont(52);
245 h->GetYaxis()->SetTitleFont(62);
246 h->GetXaxis()->SetTitle("p_{t} [GeV/c]");
247 h->GetXaxis()->SetLabelFont(52);
248 h->GetXaxis()->SetTitleFont(62);
249}
250
251//______________________________________________________________________________
4b44a8e1 252Bool_t AliTRDCalTrkAttach::LoadReferences(const Char_t *file)
253{
254// Load calibration data from file
255
256 if(!file || !TFile::Open(file)){
257 AliError("Parametrization file missing or unreadable.");
258 return kFALSE;
259 }
260 TGraphErrors *g(NULL);
261 Char_t co[kNcalib] = {'y', 'p', 's', 'n'},
262 cs[2] = {'n', 'p'};
263
264 if(fLike) fLike->Clear();
803dc399 265 else fLike = new TObjArray(AliTRDgeometry::kNlayer*kNcharge*kNcalib);
266 for(Int_t ily(0); ily<AliTRDgeometry::kNlayer; ily++){
4b44a8e1 267 for(Int_t icalib(0); icalib<kNcalib; icalib++){
803dc399 268 for(Int_t isgn(0); isgn<kNcharge; isgn++){
4b44a8e1 269 if(!(g = (TGraphErrors*)gFile->Get(Form("%c%c%d", co[icalib], cs[isgn], ily)))) return kFALSE;
803dc399 270 fLike->AddAt(g, kNcharge*(ily*kNcalib+icalib)+isgn);
4b44a8e1 271 }
272 }
273 }
274 return kTRUE;
275}