Added option for different binning of DCAxy axis in THnSparse. Same width for all...
[u/mrichter/AliRoot.git] / ITS / AliITSCorrMapSDD.cxx
1 /**************************************************************************
2  * Copyright(c) 2007-2009, 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 /* $Id$ */
17
18 ///////////////////////////////////////////////////////////////////
19 //                                                               //
20 // Implementation of the base class for SDD map corrections      //
21 // Origin: F.Prino, Torino, prino@to.infn.it                     //
22 //                                                               //
23 ///////////////////////////////////////////////////////////////////
24
25 #include "TH1F.h"
26 #include "TH2F.h"
27 #include "AliITSCorrMapSDD.h"
28 #include "AliITSsegmentationSDD.h"
29
30 const Int_t AliITSCorrMapSDD::fgkNAnodePtsDefault = 1;
31 const Int_t AliITSCorrMapSDD::fgkNDriftPtsDefault = 72;
32
33 ClassImp(AliITSCorrMapSDD)
34 //______________________________________________________________________
35 AliITSCorrMapSDD::AliITSCorrMapSDD():TNamed("defaultmap",""),
36   fNAnodePts(fgkNAnodePtsDefault),
37   fNDriftPts(fgkNDriftPtsDefault),
38   fXt1(0.),
39   fXt2(0.),
40   fXm1(0.),
41   fXm2(0.),
42   fDrLen(0.)
43 {
44   // default constructor  
45 }
46 //______________________________________________________________________
47 AliITSCorrMapSDD::AliITSCorrMapSDD(Char_t *mapname):
48   TNamed(mapname,""),
49   fNAnodePts(fgkNAnodePtsDefault),
50   fNDriftPts(fgkNDriftPtsDefault),
51   fXt1(0.),
52   fXt2(0.),
53   fXm1(0.),
54   fXm2(0.),
55   fDrLen(0.)
56 {
57   // standard constructor
58 }
59 //______________________________________________________________________
60 void AliITSCorrMapSDD::ComputeGridPoints(Float_t z, Float_t x, AliITSsegmentationSDD *seg, Bool_t isReco){
61   // extracts points from the discrete grid with the correction map
62
63   const Double_t kMicronTocm = 1.0e-4; 
64   Int_t nAnodes=seg->Npz();
65   Int_t nAnodesHybrid=seg->NpzHalf();
66   Int_t bina =(Int_t) seg->GetAnodeFromLocal(x,z);
67   if(bina>nAnodes)  AliError("Wrong anode anumber!");
68   if(bina>=nAnodesHybrid) bina-=nAnodesHybrid;
69   Float_t stept = seg->Dx()*kMicronTocm/(Float_t)fNDriftPts;
70   fDrLen= seg->Dx()*kMicronTocm-TMath::Abs(x);
71   if(fDrLen<0) fDrLen=0;
72   Int_t bint = TMath::Abs((Int_t)(fDrLen/stept));
73   if(bint==fNDriftPts) bint-=1;
74   if(bint>=fNDriftPts){
75     AliError("Wrong bin number along drift direction!");
76     bint=fNDriftPts-1;
77   }
78   fXt1=stept*bint;
79   fXm1=fXt1-GetCellContent(bina,bint)*kMicronTocm;
80   if((bint+1)<fNDriftPts){
81     fXt2=stept*(bint+1);
82     fXm2=fXt2-GetCellContent(bina,bint+1)*kMicronTocm;
83   }else{
84     fXt2=stept*(bint-1);
85     fXm2=fXt2-GetCellContent(bina,bint-1)*kMicronTocm;
86   }
87   if(isReco){
88     if(fXm1<fDrLen && fXm2>fDrLen) return;
89     if(bint==0 || bint==(fNDriftPts-1)) return;
90     if(fXm1>fDrLen){
91       for(Int_t itry=1; itry<=10; itry++){
92         Float_t xmtest=(bint-itry)*stept-GetCellContent(bina,bint-itry)*kMicronTocm;
93         if(xmtest<fDrLen){
94           fXt1=stept*(bint-itry);
95           fXt2=fXt1+stept;
96           fXm1=fXt1-GetCellContent(bina,bint-itry)*kMicronTocm;
97           fXm2=fXt2-GetCellContent(bina,bint+1-itry)*kMicronTocm;
98           return;
99         }
100       }
101     }
102     if(fXm2<fDrLen){
103       for(Int_t itry=1; itry<=10; itry++){
104         Float_t xmtest=(bint+1+itry)*stept-GetCellContent(bina,bint+1+itry)*kMicronTocm;
105         if(xmtest>fDrLen){
106           fXt1=stept*(bint+itry);
107           fXt2=fXt1+stept;
108           fXm1=fXt1-GetCellContent(bina,bint+itry)*kMicronTocm;
109           fXm2=fXt2-GetCellContent(bina,bint+1+itry)*kMicronTocm;
110           return;
111         }
112       }
113     }
114   }
115 }
116 //______________________________________________________________________
117 Float_t AliITSCorrMapSDD::GetCorrection(Float_t z, Float_t x, AliITSsegmentationSDD *seg){
118   // returns correction in cm starting from local coordinates on the module
119   ComputeGridPoints(z,x,seg,kTRUE);
120   Float_t m=(fXt2-fXt1)/(fXm2-fXm1);
121   Float_t q=fXt1-m*fXm1;
122   Float_t xcorr=m*fDrLen+q;
123   // fDrLen is the measured drift distance, xcorr is the corresponding true
124   return GetInversionBit() ? fDrLen-xcorr : xcorr-fDrLen; 
125 }
126 //______________________________________________________________________
127 Float_t AliITSCorrMapSDD::GetShiftForSimulation(Float_t z, Float_t x, AliITSsegmentationSDD *seg){
128   // returns shift to be appiled in digitizarion (in cm) starting from local coordinates on the module
129   ComputeGridPoints(z,x,seg,kFALSE);
130   Float_t m=(fXm2-fXm1)/(fXt2-fXt1);
131   Float_t q=fXm1-m*fXt1;
132   Float_t xshifted=m*fDrLen+q;
133   // fDrLen is the true drift distance, xshifted is the one with map shift
134   return GetInversionBit() ? xshifted-fDrLen : fDrLen-xshifted;
135 }
136 //______________________________________________________________________
137 TH2F* AliITSCorrMapSDD::GetMapHisto() const{
138   // Returns a TH2F histogram with map of residuals
139   TString hname;
140   hname.Form("h%s",GetName());
141   TH2F* hmap=new TH2F(hname.Data(),"",fNAnodePts,-0.5,255.5,fNDriftPts,0.,35.);
142   for(Int_t iAn=0;iAn<fNAnodePts; iAn++){
143     for(Int_t iDr=0;iDr<fNDriftPts; iDr++){
144       hmap->SetBinContent(iAn+1,iDr+1,GetCellContent(iAn,iDr));
145     }
146   }
147   return hmap;
148 }
149 //______________________________________________________________________
150 TH1F* AliITSCorrMapSDD::GetMapProfile() const{
151   // Returns a TH1F with the projection of the map along drift coordinate
152   TString hname;
153   hname.Form("p%s",GetName());
154   TH1F* hprof=new TH1F(hname.Data(),"",fNDriftPts,0.,35.);
155   for(Int_t iDr=0;iDr<fNDriftPts; iDr++){
156     Float_t meanval=0.;
157     for(Int_t iAn=0;iAn<fNAnodePts; iAn++){
158       meanval+=GetCellContent(iAn,iDr);
159     }
160     hprof->SetBinContent(iDr+1,meanval/fNAnodePts);
161   }
162   return hprof;
163   
164 }
165 //______________________________________________________________________
166 TH1F* AliITSCorrMapSDD::GetResidualDistr(Float_t dmin, Float_t dmax) const{
167   // Returns a TH1F histogram with distribution of residual
168   TString hname;
169   hname.Form("hd%s",GetName());
170   TH1F* hd=new TH1F(hname.Data(),"",100,dmin,dmax);
171   for(Int_t iAn=0;iAn<fNAnodePts; iAn++){
172     for(Int_t iDr=0;iDr<fNDriftPts; iDr++){
173       hd->Fill(GetCellContent(iAn,iDr));
174     }
175   }
176   return hd;
177 }
178