add getter to cut on n cells
[u/mrichter/AliRoot.git] / ITS / AliITSCorrMapSDD.cxx
CommitLineData
54af1add 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"
cfe39822 28#include "AliITSsegmentationSDD.h"
54af1add 29
30const Int_t AliITSCorrMapSDD::fgkNAnodePtsDefault = 1;
31const Int_t AliITSCorrMapSDD::fgkNDriftPtsDefault = 72;
32
33ClassImp(AliITSCorrMapSDD)
34//______________________________________________________________________
374200ee 35AliITSCorrMapSDD::AliITSCorrMapSDD():TNamed("defaultmap",""),
36 fNAnodePts(fgkNAnodePtsDefault),
37 fNDriftPts(fgkNDriftPtsDefault),
38 fXt1(0.),
39 fXt2(0.),
40 fXm1(0.),
41 fXm2(0.),
42 fDrLen(0.)
54af1add 43{
44 // default constructor
45}
46//______________________________________________________________________
47AliITSCorrMapSDD::AliITSCorrMapSDD(Char_t *mapname):
374200ee 48 TNamed(mapname,""),
49 fNAnodePts(fgkNAnodePtsDefault),
50 fNDriftPts(fgkNDriftPtsDefault),
51 fXt1(0.),
52 fXt2(0.),
53 fXm1(0.),
54 fXm2(0.),
55 fDrLen(0.)
54af1add 56{
57 // standard constructor
58}
59//______________________________________________________________________
374200ee 60void 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
54af1add 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;
374200ee 70 fDrLen= seg->Dx()*kMicronTocm-TMath::Abs(x);
65017066 71 if(fDrLen<0) fDrLen=0;
374200ee 72 Int_t bint = TMath::Abs((Int_t)(fDrLen/stept));
54af1add 73 if(bint==fNDriftPts) bint-=1;
374200ee 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//______________________________________________________________________
117Float_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
9b7108c2 124 return GetInversionBit() ? fDrLen-xcorr : xcorr-fDrLen;
374200ee 125}
126//______________________________________________________________________
127Float_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
9b7108c2 134 return GetInversionBit() ? xshifted-fDrLen : fDrLen-xshifted;
54af1add 135}
136//______________________________________________________________________
137TH2F* AliITSCorrMapSDD::GetMapHisto() const{
138 // Returns a TH2F histogram with map of residuals
2c4e6a6a 139 TString hname;
140 hname.Form("h%s",GetName());
141 TH2F* hmap=new TH2F(hname.Data(),"",fNAnodePts,-0.5,255.5,fNDriftPts,0.,35.);
54af1add 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//______________________________________________________________________
6c790b32 150TH1F* AliITSCorrMapSDD::GetMapProfile() const{
151 // Returns a TH1F with the projection of the map along drift coordinate
2c4e6a6a 152 TString hname;
153 hname.Form("p%s",GetName());
154 TH1F* hprof=new TH1F(hname.Data(),"",fNDriftPts,0.,35.);
6c790b32 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//______________________________________________________________________
54af1add 166TH1F* AliITSCorrMapSDD::GetResidualDistr(Float_t dmin, Float_t dmax) const{
167 // Returns a TH1F histogram with distribution of residual
2c4e6a6a 168 TString hname;
169 hname.Form("hd%s",GetName());
170 TH1F* hd=new TH1F(hname.Data(),"",100,dmin,dmax);
54af1add 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}
9b7108c2 178