]>
Commit | Line | Data |
---|---|---|
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 | |
30 | const Int_t AliITSCorrMapSDD::fgkNAnodePtsDefault = 1; | |
31 | const Int_t AliITSCorrMapSDD::fgkNDriftPtsDefault = 72; | |
32 | ||
33 | ClassImp(AliITSCorrMapSDD) | |
34 | //______________________________________________________________________ | |
374200ee | 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.) | |
54af1add | 43 | { |
44 | // default constructor | |
45 | } | |
46 | //______________________________________________________________________ | |
47 | AliITSCorrMapSDD::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 | 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 | ||
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 | //______________________________________________________________________ | |
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 | |
9b7108c2 | 124 | return GetInversionBit() ? fDrLen-xcorr : xcorr-fDrLen; |
374200ee | 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 | |
9b7108c2 | 134 | return GetInversionBit() ? xshifted-fDrLen : fDrLen-xshifted; |
54af1add | 135 | } |
136 | //______________________________________________________________________ | |
137 | TH2F* 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 | 150 | TH1F* 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 | 166 | TH1F* 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 |