Added option for different binning of DCAxy axis in THnSparse. Same width for all...
[u/mrichter/AliRoot.git] / ITS / AliITSOnlineSDDBase.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 #include "AliITSOnlineSDDBase.h"
16 #include <TH2F.h>
17 #include <TMath.h>
18
19
20 ///////////////////////////////////////////////////////////////////
21 //                                                               //
22 // Implementation of the class used for SDD baselines            //
23 // and noise analysis                                            //
24 // Origin: F.Prino, Torino, prino@to.infn.it                     //
25 //                                                               //
26 ///////////////////////////////////////////////////////////////////
27
28 /*  $Id$   */
29
30 const Int_t AliITSOnlineSDDBase::fgkMaxCorr=63; // 6 but correction
31
32 ClassImp(AliITSOnlineSDDBase)
33 //______________________________________________________________________
34   AliITSOnlineSDDBase::AliITSOnlineSDDBase():AliITSOnlineSDD(),fNEvents(0),fMinBaseline(0.),fMaxBaseline(0.),fMinRawNoise(0.),fMaxRawNoise(0.),fNSigmaNoise(0.),fGoldenBaseline(0.),fLowThrFact(0.),fHighThrFact(0.)
35 {
36   // default constructor
37   Reset();
38   SetMinBaseline();
39   SetMaxBaseline();
40   SetMinRawNoise();
41   SetMaxRawNoise();
42   SetNSigmaNoise();
43   SetGoldenBaselineValue();
44   SetZeroSuppThresholds();
45 }
46 //______________________________________________________________________
47 AliITSOnlineSDDBase::AliITSOnlineSDDBase(Int_t nddl, Int_t ncarlos, Int_t sid):AliITSOnlineSDD(nddl,ncarlos,sid),fNEvents(0),fMinBaseline(0.),fMaxBaseline(0.),fMinRawNoise(0.),fMaxRawNoise(0.),fNSigmaNoise(0.),fGoldenBaseline(0.),fLowThrFact(0.),fHighThrFact(0.)
48 {
49   // default constructor
50   Reset();
51   SetMinBaseline();
52   SetMaxBaseline();
53   SetMinRawNoise();
54   SetMaxRawNoise();
55   SetNSigmaNoise();
56   SetGoldenBaselineValue();
57   SetZeroSuppThresholds();
58 }
59 //______________________________________________________________________
60 AliITSOnlineSDDBase::~AliITSOnlineSDDBase(){
61   // Destructor
62 }
63 //______________________________________________________________________
64 void AliITSOnlineSDDBase::Reset(){
65   // reset all counters
66   fNEvents=0;
67   for(Int_t i=0;i<fgkNAnodes;i++){
68     fGoodAnode[i]=1;
69     fSumBaseline[i]=0.;
70     fSumRawNoise[i]=0.;
71     fSumCMN[i]=0.;
72   }
73 }
74 //______________________________________________________________________
75 void  AliITSOnlineSDDBase::ValidateAnodes(){
76   // tag good/bad channels
77   for(Int_t ian=0;ian<fgkNAnodes;ian++){
78     fGoodAnode[ian]=1;
79     Float_t basel=GetAnodeBaseline(ian);
80     Float_t rawn=GetAnodeRawNoise(ian);
81     Float_t ratio=0.;
82     if(rawn>0) ratio=basel/rawn;
83     if(basel>fMaxBaseline || basel<fMinBaseline) fGoodAnode[ian]=0;
84     else if(rawn>fMaxRawNoise || rawn<fMinRawNoise) fGoodAnode[ian]=0;
85     else if(rawn>fNSigmaNoise*CalcMeanRawNoise()) fGoodAnode[ian]=0;
86     else if(ratio<3.) fGoodAnode[ian]=0;
87   }
88 }
89
90 //______________________________________________________________________
91 void AliITSOnlineSDDBase::AddEvent(TH2F* hrawd){
92   // analyzes one event and adds its ontribution to the various counters
93
94   fNEvents++;
95   const Int_t kTimeBins=fLastGoodTB+1;
96   Float_t sum[fgkNAnodes];
97   for(Int_t ian=0;ian<fgkNAnodes;ian++){
98     Float_t sumQ=0.;
99     sum[ian]=0.;
100     Int_t cnt=0;
101     for(Int_t itb=fFirstGoodTB;itb<=fLastGoodTB;itb++){
102       Float_t cbin=hrawd->GetBinContent(itb+1,ian+1);
103       sum[ian]+=cbin;
104       sumQ+=cbin*cbin;
105       cnt++;
106     }
107     if(cnt != 0){
108       sum[ian]/=(Float_t)cnt;
109       sumQ/=(Float_t)cnt;
110     }
111     fSumBaseline[ian]+=sum[ian];
112     fSumRawNoise[ian]+=sumQ;
113   }
114   if(fNEvents==1) ValidateAnodes();
115
116   Float_t *cmnEven = new Float_t[kTimeBins];
117   Float_t *cmnOdd  = new Float_t[kTimeBins];
118   for(Int_t itb=fFirstGoodTB;itb<=fLastGoodTB;itb++){
119     Float_t sumEven=0., sumOdd=0.;
120     Int_t countEven=0,countOdd=0;
121     for(Int_t ian=0;ian<fgkNAnodes;ian+=2){
122       if(!fGoodAnode[ian]) continue;
123       sumEven+=hrawd->GetBinContent(itb+1,ian+1)-sum[ian];
124       countEven++;
125     }
126     for(Int_t ian=1;ian<fgkNAnodes;ian+=2){
127       if(!fGoodAnode[ian]) continue;
128       sumOdd+=hrawd->GetBinContent(itb+1,ian+1)-sum[ian];
129       countOdd++;
130     }
131     if(countEven>0) cmnEven[itb]=sumEven/countEven;
132     if(countOdd>0) cmnOdd[itb]=sumOdd/countOdd;
133   }
134   for(Int_t ian=0;ian<fgkNAnodes;ian++){
135     Float_t num=0.,den=0.;
136     if(!fGoodAnode[ian]) continue;
137     for(Int_t itb=fFirstGoodTB;itb<=fLastGoodTB;itb++){
138       Float_t cmnCoef=cmnOdd[itb];
139       if(ian%2==0) cmnCoef=cmnEven[itb];
140       num+=(hrawd->GetBinContent(itb+1,ian+1)-sum[ian])*cmnCoef;
141       den+=cmnCoef*cmnCoef;
142     }
143     if(den!=0) fSumCMN[ian]+=num/den;
144   }
145
146   delete [] cmnEven;
147   delete [] cmnOdd;
148 }
149 //______________________________________________________________________
150 void AliITSOnlineSDDBase::GetMinAndMaxBaseline(Float_t &basMin, Float_t &basMax) const {
151   // fills mininum and maximum baseline values
152   basMin=1008.;
153   basMax=0.;
154   for(Int_t ian=0;ian<fgkNAnodes;ian++){
155     if(!fGoodAnode[ian]) continue;
156     Float_t bas=GetAnodeBaseline(ian);
157     if(bas>0 && bas < basMin) basMin=bas;
158     if(bas>0 && bas > basMax) basMax=bas;
159   }
160 }
161 //______________________________________________________________________
162 Float_t AliITSOnlineSDDBase::GetMinimumBaseline() const {
163   // returns anode with minum baseline value in hybrid
164   Float_t basMin=1008.;
165   for(Int_t ian=0;ian<fgkNAnodes;ian++){
166     if(!fGoodAnode[ian]) continue;
167     Float_t bas=GetAnodeBaseline(ian);
168     if(bas>0 && bas < basMin) basMin=bas;
169   }
170   return basMin;
171 }
172 //______________________________________________________________________
173 Float_t AliITSOnlineSDDBase::CalcMeanRawNoise() const{
174   // compute mean value of raw noise
175   Float_t meanns=0.;
176   Int_t cnt=0;
177   for(Int_t ian=0;ian<fgkNAnodes;ian++){
178     if(!fGoodAnode[ian]) continue;  
179     meanns+=GetAnodeRawNoise(ian);
180     cnt++;
181   }
182   if(cnt>0) meanns/=(Float_t)cnt;
183   return meanns;
184 }
185 //______________________________________________________________________
186 void AliITSOnlineSDDBase::WriteToASCII(){
187   // writes parameters of each channel into an ASCII file 
188   // to be then read in the successive step for common mode noise
189   // correction (AliITSOnlineSDDCMN)
190
191   TString outfilnam;
192   Float_t basMin,basMax;
193   GetMinAndMaxBaseline(basMin,basMax);
194   Float_t finalVal=basMin;
195   if(basMin>fGoldenBaseline && basMax<fGoldenBaseline+fgkMaxCorr) finalVal=fGoldenBaseline;
196   if(basMax<basMin+fgkMaxCorr && basMax>fGoldenBaseline+fgkMaxCorr) finalVal=basMax-fgkMaxCorr;
197
198   Float_t avNoise=CalcMeanRawNoise();
199   Int_t thrL=(Int_t)(finalVal+fLowThrFact*avNoise+0.5);
200   Int_t thrH=(Int_t)(finalVal+fHighThrFact*avNoise+0.5);
201   if(CountGoodAnodes()==0) thrH=255;
202
203   outfilnam.Form("SDDbase_step1_ddl%02dc%02d_sid%d.data",fDDL,fCarlos,fSide);
204   FILE* outf=fopen(outfilnam.Data(),"w");
205   fprintf(outf,"%d\n",thrH);
206   fprintf(outf,"%d\n",thrL);
207   Float_t corrnoise=2.;
208   for(Int_t ian=0;ian<fgkNAnodes;ian++){
209     Float_t bas=GetAnodeBaseline(ian);
210     Int_t corr=(Int_t)(bas-finalVal+0.5);
211     if(corr>fgkMaxCorr) corr=fgkMaxCorr; // only 6 bits in jtag for correction
212     if(corr<0) corr=0; // avoid negative numbers
213     fprintf(outf,"%d %d %11.6f %d %d %11.6f %11.6f %11.6f\n",ian,IsAnodeGood(ian),GetAnodeBaseline(ian),(Int_t)finalVal,corr,GetAnodeRawNoise(ian),GetAnodeCommonMode(ian),corrnoise);
214   }
215   fclose(outf);  
216 }