1 /**************************************************************************
2 * Copyright(c) 1998-1999, 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 ////////////////////////////////////////////////////////////////////////////
20 // AliTRDCalibraVdriftLinearFit //
22 // Does the Vdrift an ExB calibration by applying a linear fit //
25 // R. Bailhache (R.Bailhache@gsi.de) //
27 ////////////////////////////////////////////////////////////////////////////
30 #include <TObjArray.h>
35 #include <TLinearFitter.h>
37 #include <TTreeStream.h>
40 #include "AliTRDCalibraVdriftLinearFit.h"
42 ClassImp(AliTRDCalibraVdriftLinearFit) /*FOLD00*/
44 //_____________________________________________________________________
45 AliTRDCalibraVdriftLinearFit::AliTRDCalibraVdriftLinearFit() : /*FOLD00*/
48 fLinearFitterHistoArray(540),
49 fLinearFitterPArray(540),
50 fLinearFitterEArray(540)
53 // default constructor
56 //_____________________________________________________________________
57 AliTRDCalibraVdriftLinearFit::AliTRDCalibraVdriftLinearFit(const AliTRDCalibraVdriftLinearFit &ped) : /*FOLD00*/
59 fVersion(ped.fVersion),
60 fLinearFitterHistoArray(540),
61 fLinearFitterPArray(540),
62 fLinearFitterEArray(540)
67 for (Int_t idet = 0; idet < 540; idet++){
68 const TVectorD *vectorE = (TVectorD*)ped.fLinearFitterEArray.UncheckedAt(idet);
69 const TVectorD *vectorP = (TVectorD*)ped.fLinearFitterPArray.UncheckedAt(idet);
70 const TH2F *hped = (TH2F*)ped.fLinearFitterHistoArray.UncheckedAt(idet);
72 if ( vectorE != 0x0 ) fLinearFitterEArray.AddAt(new TVectorD(*vectorE), idet);
73 if ( vectorP != 0x0 ) fLinearFitterPArray.AddAt(new TVectorD(*vectorP), idet);
75 TH2F *hNew = new TH2F(*hped);
76 hNew->SetDirectory(0);
77 fLinearFitterHistoArray.AddAt(hNew,idet);
82 //_____________________________________________________________________
83 AliTRDCalibraVdriftLinearFit::AliTRDCalibraVdriftLinearFit(const TObjArray &obja) : /*FOLD00*/
86 fLinearFitterHistoArray(540),
87 fLinearFitterPArray(540),
88 fLinearFitterEArray(540)
91 // constructor from a TObjArray
93 for (Int_t idet = 0; idet < 540; idet++){
94 const TH2F *hped = (TH2F*)obja.UncheckedAt(idet);
96 TH2F *hNew = new TH2F(*hped);
97 hNew->SetDirectory(0);
98 fLinearFitterHistoArray.AddAt(hNew,idet);
102 //_____________________________________________________________________
103 AliTRDCalibraVdriftLinearFit& AliTRDCalibraVdriftLinearFit::operator = (const AliTRDCalibraVdriftLinearFit &source)
106 // assignment operator
108 if (&source == this) return *this;
109 new (this) AliTRDCalibraVdriftLinearFit(source);
113 //_____________________________________________________________________
114 AliTRDCalibraVdriftLinearFit::~AliTRDCalibraVdriftLinearFit() /*FOLD00*/
119 fLinearFitterHistoArray.Delete();
120 fLinearFitterPArray.Delete();
121 fLinearFitterEArray.Delete();
124 //_____________________________________________________________________
125 void AliTRDCalibraVdriftLinearFit::Add(AliTRDCalibraVdriftLinearFit *ped)
133 for (Int_t idet = 0; idet < 540; idet++){
134 const TH2F *hped = (TH2F*)ped->GetLinearFitterHisto(idet);
135 //printf("idet %d\n",idet);
138 TH2F *hped1 = GetLinearFitterHisto(idet,kTRUE);
140 hped1->SetDirectory(0);
147 //______________________________________________________________________________________
148 TH2F* AliTRDCalibraVdriftLinearFit::GetLinearFitterHisto(Int_t detector, Bool_t force)
151 // return pointer to TH2F histo
152 // if force is true create a new histo if it doesn't exist allready
154 if ( !force || fLinearFitterHistoArray.UncheckedAt(detector) )
155 return (TH2F*)fLinearFitterHistoArray.UncheckedAt(detector);
157 // if we are forced and TLinearFitter doesn't yes exist create it
160 TString name("LFDV");
165 TH2F *lfdv = new TH2F((const Char_t *)name,(const Char_t *) name
168 lfdv->SetXTitle("tan(phi_{track})");
169 lfdv->SetYTitle("dy/dt");
170 lfdv->SetZTitle("Number of clusters");
172 lfdv->SetDirectory(0);
174 fLinearFitterHistoArray.AddAt(lfdv,detector);
177 //______________________________________________________________________________________
178 Bool_t AliTRDCalibraVdriftLinearFit::GetParam(Int_t detector, TVectorD *param)
181 // return param for this detector
183 if ( fLinearFitterPArray.UncheckedAt(detector) ){
184 const TVectorD *vectorP = (TVectorD*)fLinearFitterPArray.UncheckedAt(detector);
185 if(!param) param = new TVectorD(2);
186 for(Int_t k = 0; k < 2; k++){
187 (*param)[k] = (*vectorP)[k];
194 //______________________________________________________________________________________
195 Bool_t AliTRDCalibraVdriftLinearFit::GetError(Int_t detector, TVectorD *error)
198 // return error for this detector
200 if ( fLinearFitterEArray.UncheckedAt(detector) ){
201 const TVectorD *vectorE = (TVectorD*)fLinearFitterEArray.UncheckedAt(detector);
202 if(!error) error = new TVectorD(3);
203 for(Int_t k = 0; k < 3; k++){
204 (*error)[k] = (*vectorE)[k];
211 //______________________________________________________________________________________
212 void AliTRDCalibraVdriftLinearFit::Update(Int_t detector, Float_t tnp, Float_t pars1)
215 // Fill the 2D histos for debugging
218 ((TH2F *) GetLinearFitterHisto(detector,kTRUE))->Fill(tnp,pars1);
221 //____________Functions fit Online CH2d________________________________________
222 void AliTRDCalibraVdriftLinearFit::FillPEArray()
225 // Fill fLinearFitterPArray and fLinearFitterEArray from inside
229 Int_t *arrayI = new Int_t[540];
230 for(Int_t k = 0; k< 540; k++){
235 for(Int_t cb = 0; cb < 540; cb++){
236 const TH2F *linearfitterhisto = (TH2F*)fLinearFitterHistoArray.UncheckedAt(cb);
237 //printf("Processing the detector cb %d we find %d\n",cb, (Bool_t) linearfitterhisto);
239 if ( linearfitterhisto != 0 ){
241 // Fill a linearfitter
242 TAxis *xaxis = linearfitterhisto->GetXaxis();
243 TAxis *yaxis = linearfitterhisto->GetYaxis();
244 TLinearFitter linearfitter = TLinearFitter(2,"pol1");
246 for(Int_t ibinx = 0; ibinx < linearfitterhisto->GetNbinsX(); ibinx++){
247 for(Int_t ibiny = 0; ibiny < linearfitterhisto->GetNbinsY(); ibiny++){
248 if(linearfitterhisto->GetBinContent(ibinx+1,ibiny+1)>0){
249 Double_t x = xaxis->GetBinCenter(ibinx+1);
250 Double_t y = yaxis->GetBinCenter(ibiny+1);
251 for(Int_t k = 0; k < (Int_t)linearfitterhisto->GetBinContent(ibinx+1,ibiny+1); k++){
252 linearfitter.AddPoint(&x,y);
259 //printf("Find %d entries for the detector %d\n",arrayI[cb],cb);
261 // Eval the linear fitter
263 TVectorD *par = new TVectorD(2);
264 TVectorD pare = TVectorD(2);
265 TVectorD *parE = new TVectorD(3);
267 linearfitter.GetParameters(*par);
268 linearfitter.GetErrors(pare);
269 Float_t ppointError = TMath::Sqrt(TMath::Abs(linearfitter.GetChisquare())/arrayI[cb]);
270 (*parE)[0] = pare[0]*ppointError;
271 (*parE)[1] = pare[1]*ppointError;
272 (*parE)[2] = (Double_t) arrayI[cb];
273 fLinearFitterPArray.AddAt(par,cb);
274 fLinearFitterEArray.AddAt(parE,cb);