Update for Ds
[u/mrichter/AliRoot.git] / ITS / AliITSOnlineSDDCMN.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 <TFile.h>
16 #include "AliITSOnlineSDDCMN.h"
17 #include "AliLog.h"
18 #include <TH2F.h>
19 #include <TMath.h>
20
21
22 ///////////////////////////////////////////////////////////////////
23 //                                                               //
24 // Implementation of the class used for analysis of SDD noise    //
25 // corrected for common mode                                     //
26 // Origin: F.Prino, Torino, prino@to.infn.it                     //
27 //                                                               //
28 ///////////////////////////////////////////////////////////////////
29
30
31 ClassImp(AliITSOnlineSDDCMN)
32 //______________________________________________________________________
33   AliITSOnlineSDDCMN::AliITSOnlineSDDCMN():AliITSOnlineSDD(),fNEvents(0),fLowThreshold(0),fHighThreshold(0),fMinCorrNoise(0.),fMaxCorrNoise(0.),fNSigmaNoise(0.)
34 {
35   // default constructor
36   Reset();
37   SetMinNoise();
38   SetMaxNoise();
39   SetNSigmaNoise();
40 }
41 //______________________________________________________________________
42   AliITSOnlineSDDCMN::AliITSOnlineSDDCMN(Int_t nddl, Int_t ncarlos, Int_t sid):AliITSOnlineSDD(nddl,ncarlos,sid),fNEvents(0),fLowThreshold(0),fHighThreshold(0),fMinCorrNoise(0.),fMaxCorrNoise(0.),fNSigmaNoise(0.)
43 {
44   // default constructor
45   Reset();
46   SetMinNoise();
47   SetMaxNoise();
48   SetNSigmaNoise();
49 }
50 //______________________________________________________________________
51 AliITSOnlineSDDCMN::~AliITSOnlineSDDCMN(){
52   // Destructor
53 }
54 //______________________________________________________________________
55 void AliITSOnlineSDDCMN::Reset(){
56   // Reset counters
57   fNEvents=0;
58   for(Int_t i=0;i<fgkNAnodes;i++){
59     fGoodAnode[i]=1;
60     fBaseline[i]=0.;
61     fRawNoise[i]=0.;
62     fCMN[i]=0.;
63     fSumCorrNoise[i]=0.;
64   }
65   ReadBaselines();
66 }
67 //______________________________________________________________________
68 void AliITSOnlineSDDCMN::ReadBaselines(){
69   // assume baselines and good anodes are taken from previous run
70   TString basfilnam;
71   basfilnam.Form("SDDbase_step1_ddl%02dc%02d_sid%d.data",fDDL,fCarlos,fSide);
72   FILE* basf=fopen(basfilnam.Data(),"r");
73   if(basf==0){
74     AliWarning(Form("Baseline file not present (ddl %d  carlos %d side %d, Set all baselines to 50\n",fDDL,fCarlos,fSide));
75     for(Int_t ian=0;ian<fgkNAnodes;ian++){ 
76       fBaseline[ian]=50.;
77       fEqBaseline[ian]=50;
78       fOffsetBaseline[ian]=0;
79       fGoodAnode[ian]=1;
80     }
81     return;
82   }
83   fscanf(basf,"%d\n",&fHighThreshold);
84   fscanf(basf,"%d\n",&fLowThreshold);
85   Int_t n,ok,eqbase,offbase;
86   Float_t base,rms,cmn,corrnoi;
87   for(Int_t ian=0;ian<fgkNAnodes;ian++){
88     fscanf(basf,"%d %d %f %d %d %f %f %f\n",&n,&ok,&base,&eqbase,&offbase,&rms,&cmn,&corrnoi);
89     fGoodAnode[ian]=ok;
90     fBaseline[ian]=base;
91     fEqBaseline[ian]=eqbase;
92     fOffsetBaseline[ian]=offbase;
93     fRawNoise[ian]=rms;
94     fCMN[ian]=cmn;
95   }
96   fclose(basf);
97 }
98 //______________________________________________________________________
99 void  AliITSOnlineSDDCMN::ValidateAnodes(){
100   // Tag good/bad anodes
101   for(Int_t ian=0;ian<fgkNAnodes;ian++){
102     if(!fGoodAnode[ian]) continue;
103     if(GetAnodeCorrNoise(ian)>fMaxCorrNoise || GetAnodeCorrNoise(ian)<fMinCorrNoise) fGoodAnode[ian]=0;
104     if(GetAnodeCorrNoise(ian)>fNSigmaNoise*CalcMeanNoise()) fGoodAnode[ian]=0;
105   }
106 }
107
108 //______________________________________________________________________
109 TH2F* AliITSOnlineSDDCMN::GetCleanEvent(TH2F* hrawd) const {
110   // Fills an histogram with counts corrected for common mode noise
111
112   TH2F* hcorrd=new TH2F("hcorrd","",hrawd->GetNbinsX(),hrawd->GetXaxis()->GetXmin(),hrawd->GetXaxis()->GetXmax(),hrawd->GetNbinsY(),hrawd->GetYaxis()->GetXmin(),hrawd->GetYaxis()->GetXmax());
113   for(Int_t itb=fFirstGoodTB;itb<=fLastGoodTB;itb++){
114     Float_t sumEven=0., sumOdd=0.;
115     Int_t countEven=0, countOdd=0;
116     for(Int_t ian=0;ian<fgkNAnodes;ian+=2){
117       if(!fGoodAnode[ian]) continue;
118       sumEven+=hrawd->GetBinContent(itb+1,ian+1)-fBaseline[ian];
119       countEven++;
120     }
121     for(Int_t ian=1;ian<fgkNAnodes;ian+=2){
122       if(!fGoodAnode[ian]) continue;
123       sumOdd+=hrawd->GetBinContent(itb+1,ian+1)-fBaseline[ian];
124       countOdd++;
125     }
126     for(Int_t ian=0;ian<fgkNAnodes;ian++){
127       if(!fGoodAnode[ian]) continue;
128       Float_t meanN;
129       if(ian%2==0) meanN=sumEven/(Float_t)countEven;
130       else meanN=sumOdd/(Float_t)countOdd;
131       Float_t cntCorr=hrawd->GetBinContent(itb+1,ian+1)-fCMN[ian]*meanN;
132       hcorrd->SetBinContent(itb+1,ian+1,cntCorr);
133     }
134   }
135   return hcorrd;
136 }
137 //______________________________________________________________________
138 void AliITSOnlineSDDCMN::AddEvent(TH2F* hrawd){
139   // analyzes one event and adds its ontribution to the various counters
140
141   fNEvents++;
142   TH2F* hcorrd=GetCleanEvent(hrawd);
143
144   for(Int_t ian=0;ian<fgkNAnodes;ian++){
145     if(!fGoodAnode[ian]) continue;
146     Float_t sumQ=0.;
147     Int_t cnt=0;
148     for(Int_t itb=fFirstGoodTB;itb<=fLastGoodTB;itb++){
149       Float_t cntdiff=hcorrd->GetBinContent(itb+1,ian+1)-fBaseline[ian];
150       sumQ+=cntdiff*cntdiff;
151       cnt++;    
152     }
153     fSumCorrNoise[ian]+=TMath::Sqrt(sumQ/(Float_t)cnt);
154   }
155   delete hcorrd;
156 }
157 //______________________________________________________________________
158 Float_t AliITSOnlineSDDCMN::CalcMeanNoise() const{
159   // compute average noise
160
161   Float_t meanns=0.;
162   Int_t cnt=0;
163   for(Int_t ian=0;ian<fgkNAnodes;ian++){
164     if(!fGoodAnode[ian]) continue;  
165     meanns+=GetAnodeCorrNoise(ian);
166     cnt++;
167   }
168   if(cnt>0) meanns/=(Float_t)cnt;
169   return meanns;
170 }
171 //______________________________________________________________________
172 void AliITSOnlineSDDCMN::WriteToASCII(){
173   // writes parameters of each channel into an ASCII file 
174   // to be then read by the PULSER DA (AliITSOnlineSDDTP)
175
176   TString outfilnam;
177   outfilnam.Form("SDDbase_step2_ddl%02dc%02d_sid%d.data",fDDL,fCarlos,fSide);
178   FILE* outf=fopen(outfilnam.Data(),"w");
179   fprintf(outf,"%d\n",fHighThreshold);
180   fprintf(outf,"%d\n",fLowThreshold);
181   for(Int_t ian=0;ian<fgkNAnodes;ian++){
182     fprintf(outf,"%d %d %8.3f %d %d %8.3f %8.3f %8.3f\n",ian,IsAnodeGood(ian),GetAnodeBaseline(ian),GetAnodeEqualizedBaseline(ian),GetAnodeBaselineOffset(ian),GetAnodeRawNoise(ian),GetAnodeCommonMode(ian),GetAnodeCorrNoise(ian));
183   }
184   fclose(outf);  
185 }
186
187 //______________________________________________________________________
188 TH1F* AliITSOnlineSDDCMN::GetBaselineAnodeHisto() const {
189   // produce histogram with baseline vs. anode number
190   TString hisnam;  
191   hisnam.Form("hbase%02dc%02ds%d",fDDL,fCarlos,fSide);
192   TH1F* h=new TH1F(hisnam.Data(),"",256,-0.5,255.5);
193   for(Int_t ian=0;ian<fgkNAnodes;ian++){
194     h->SetBinContent(ian+1,GetAnodeBaseline(ian));
195   }
196   return h;
197 }
198 //______________________________________________________________________
199 TH1F* AliITSOnlineSDDCMN::GetRawNoiseAnodeHisto() const {
200   // produce histogram with raw noise vs. anode number
201   TString hisnam;  
202   hisnam.Form("hnois%02dc%02ds%d",fDDL,fCarlos,fSide);
203   TH1F* h=new TH1F(hisnam.Data(),"",256,-0.5,255.5);
204   for(Int_t ian=0;ian<fgkNAnodes;ian++){
205     h->SetBinContent(ian+1,GetAnodeRawNoise(ian));
206   }
207   return h;
208 }
209 //______________________________________________________________________
210 TH1F* AliITSOnlineSDDCMN::GetCorrNoiseAnodeHisto() const {
211   // produce histogram with corrected noise vs. anode number
212   TString hisnam;  
213   hisnam.Form("hcorn%02dc%02ds%d",fDDL,fCarlos,fSide);
214   TH1F* h=new TH1F(hisnam.Data(),"",256,-0.5,255.5);
215   for(Int_t ian=0;ian<fgkNAnodes;ian++){
216     h->SetBinContent(ian+1,GetAnodeCorrNoise(ian));
217   }
218   return h;
219 }
220 //______________________________________________________________________
221 TH1F* AliITSOnlineSDDCMN::GetCMNCoefAnodeHisto() const {
222   // produce histogram with coefficients for common mode noise subtraction
223   TString hisnam;  
224   hisnam.Form("hcmn%02dc%02ds%d",fDDL,fCarlos,fSide);
225   TH1F* h=new TH1F(hisnam.Data(),"",256,-0.5,255.5);
226   for(Int_t ian=0;ian<fgkNAnodes;ian++){
227     h->SetBinContent(ian+1,GetAnodeCommonMode(ian));
228   }
229   return h;
230 }
231 //______________________________________________________________________
232 TH1F* AliITSOnlineSDDCMN::GetStatusAnodeHisto() const {
233   // produce histogram with status bit of each anode
234   TString hisnam;  
235   hisnam.Form("hgood%02dc%02ds%d",fDDL,fCarlos,fSide);
236   TH1F* h=new TH1F(hisnam.Data(),"",256,-0.5,255.5);
237   for(Int_t ian=0;ian<fgkNAnodes;ian++){
238     h->SetBinContent(ian+1,float(IsAnodeGood(ian)));
239   }
240   return h;
241 }
242 //______________________________________________________________________
243 TH1F* AliITSOnlineSDDCMN::GetBaselineHisto() const {
244   // produce histogram with baseline distribution
245   TString hisnam;  
246   hisnam.Form("hdbd%02dc%02ds%d",fDDL,fCarlos,fSide);
247   TH1F* h=new TH1F(hisnam.Data(),"",100,0.,150.);
248   for(Int_t ian=0;ian<fgkNAnodes;ian++){
249     h->Fill(GetAnodeBaseline(ian));
250   }
251   return h;
252 }
253 //______________________________________________________________________
254 TH1F* AliITSOnlineSDDCMN::GetRawNoiseHisto() const {
255   // produce histogram with raw noise distribution
256   TString hisnam;  
257   hisnam.Form("hdnd%02dc%02ds%d",fDDL,fCarlos,fSide);
258   TH1F* h=new TH1F(hisnam.Data(),"",100,0.,8.);
259   for(Int_t ian=0;ian<fgkNAnodes;ian++){
260     h->Fill(GetAnodeRawNoise(ian));
261   }
262   return h;
263 }
264 //______________________________________________________________________
265 TH1F* AliITSOnlineSDDCMN::GetCorrNoiseHisto() const {
266   // produce histogram with corrected noise distribution
267   TString hisnam;  
268   hisnam.Form("hdcd%02dc%02ds%d",fDDL,fCarlos,fSide);
269   TH1F* h=new TH1F(hisnam.Data(),"",100,0.,8.);
270   for(Int_t ian=0;ian<fgkNAnodes;ian++){
271     h->Fill(GetAnodeCorrNoise(ian));
272   }
273   return h;
274 }
275 //______________________________________________________________________
276 Bool_t AliITSOnlineSDDCMN::WriteToROOT(TFile *fil){
277   // writes output into a root file
278   if(fil==0){ 
279     AliWarning("Invalid pointer to ROOT file");
280     return kFALSE;    
281   }
282   TString hisnam;
283   fil->cd();
284   hisnam.Form("hgood%02dc%02ds%d",fDDL,fCarlos,fSide);
285   TH1F hgood(hisnam.Data(),"",256,-0.5,255.5);
286   hisnam.Form("hbase%02dc%02ds%d",fDDL,fCarlos,fSide);
287   TH1F hbase(hisnam.Data(),"",256,-0.5,255.5);
288   hisnam.Form("hnois%02dc%02ds%d",fDDL,fCarlos,fSide);
289   TH1F hnois(hisnam.Data(),"",256,-0.5,255.5);
290   hisnam.Form("hcmn%02dc%02ds%d",fDDL,fCarlos,fSide);
291   TH1F hcmn(hisnam.Data(),"",256,-0.5,255.5);
292   hisnam.Form("hcorn%02dc%02ds%d",fDDL,fCarlos,fSide);
293   TH1F hcorn(hisnam.Data(),"",256,-0.5,255.5);
294   for(Int_t ian=0;ian<fgkNAnodes;ian++){
295     hgood.SetBinContent(ian+1,float(IsAnodeGood(ian)));
296     hbase.SetBinContent(ian+1,GetAnodeBaseline(ian));
297     hnois.SetBinContent(ian+1,GetAnodeRawNoise(ian));
298     hcmn.SetBinContent(ian+1,GetAnodeCommonMode(ian));
299     hcorn.SetBinContent(ian+1,GetAnodeCorrNoise(ian));
300   }
301   hgood.Write();
302   hbase.Write();
303   hnois.Write();
304   hcmn.Write();
305   hcorn.Write();
306   return kTRUE;
307 }