1 /**************************************************************************
2 * Copyright(c) 2007-2009, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
16 #include "AliITSOnlineSDDCMN.h"
22 ///////////////////////////////////////////////////////////////////
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 //
28 ///////////////////////////////////////////////////////////////////
31 ClassImp(AliITSOnlineSDDCMN)
32 //______________________________________________________________________
33 AliITSOnlineSDDCMN::AliITSOnlineSDDCMN():AliITSOnlineSDD(),fNEvents(0),fLowThreshold(0),fHighThreshold(0),fMinCorrNoise(0.),fMaxCorrNoise(0.),fNSigmaNoise(0.)
35 // default constructor
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.)
44 // default constructor
50 //______________________________________________________________________
51 AliITSOnlineSDDCMN::~AliITSOnlineSDDCMN(){
54 //______________________________________________________________________
55 void AliITSOnlineSDDCMN::Reset(){
58 for(Int_t i=0;i<fgkNAnodes;i++){
67 //______________________________________________________________________
68 void AliITSOnlineSDDCMN::ReadBaselines(){
69 // assume baselines and good anodes are taken from previous run
71 basfilnam.Form("SDDbase_step1_ddl%02dc%02d_sid%d.data",fDDL,fCarlos,fSide);
72 FILE* basf=fopen(basfilnam.Data(),"r");
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++){
78 fOffsetBaseline[ian]=0;
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);
91 fEqBaseline[ian]=eqbase;
92 fOffsetBaseline[ian]=offbase;
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;
108 //______________________________________________________________________
109 TH2F* AliITSOnlineSDDCMN::GetCleanEvent(TH2F* hrawd) const {
110 // Fills an histogram with counts corrected for common mode noise
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];
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];
126 for(Int_t ian=0;ian<fgkNAnodes;ian++){
127 if(!fGoodAnode[ian]) continue;
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);
137 //______________________________________________________________________
138 void AliITSOnlineSDDCMN::AddEvent(TH2F* hrawd){
139 // analyzes one event and adds its ontribution to the various counters
142 TH2F* hcorrd=GetCleanEvent(hrawd);
144 for(Int_t ian=0;ian<fgkNAnodes;ian++){
145 if(!fGoodAnode[ian]) continue;
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;
153 fSumCorrNoise[ian]+=TMath::Sqrt(sumQ/(Float_t)cnt);
157 //______________________________________________________________________
158 Float_t AliITSOnlineSDDCMN::CalcMeanNoise() const{
159 // compute average noise
163 for(Int_t ian=0;ian<fgkNAnodes;ian++){
164 if(!fGoodAnode[ian]) continue;
165 meanns+=GetAnodeCorrNoise(ian);
168 if(cnt>0) meanns/=(Float_t)cnt;
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)
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));
187 //______________________________________________________________________
188 TH1F* AliITSOnlineSDDCMN::GetBaselineAnodeHisto() const {
189 // produce histogram with baseline vs. anode number
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));
198 //______________________________________________________________________
199 TH1F* AliITSOnlineSDDCMN::GetRawNoiseAnodeHisto() const {
200 // produce histogram with raw noise vs. anode number
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));
209 //______________________________________________________________________
210 TH1F* AliITSOnlineSDDCMN::GetCorrNoiseAnodeHisto() const {
211 // produce histogram with corrected noise vs. anode number
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));
220 //______________________________________________________________________
221 TH1F* AliITSOnlineSDDCMN::GetCMNCoefAnodeHisto() const {
222 // produce histogram with coefficients for common mode noise subtraction
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));
231 //______________________________________________________________________
232 TH1F* AliITSOnlineSDDCMN::GetStatusAnodeHisto() const {
233 // produce histogram with status bit of each anode
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)));
242 //______________________________________________________________________
243 TH1F* AliITSOnlineSDDCMN::GetBaselineHisto() const {
244 // produce histogram with baseline distribution
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));
253 //______________________________________________________________________
254 TH1F* AliITSOnlineSDDCMN::GetRawNoiseHisto() const {
255 // produce histogram with raw noise distribution
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));
264 //______________________________________________________________________
265 TH1F* AliITSOnlineSDDCMN::GetCorrNoiseHisto() const {
266 // produce histogram with corrected noise distribution
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));
275 //______________________________________________________________________
276 Bool_t AliITSOnlineSDDCMN::WriteToROOT(TFile *fil){
277 // writes output into a root file
279 AliWarning("Invalid pointer to ROOT file");
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));