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 **************************************************************************/
15 #include "AliITSOnlineSDDBase.h"
20 ///////////////////////////////////////////////////////////////////
22 // Implementation of the class used for SDD baselines //
23 // and noise analysis //
24 // Origin: F.Prino, Torino, prino@to.infn.it //
26 ///////////////////////////////////////////////////////////////////
30 const Int_t AliITSOnlineSDDBase::fgkMaxCorr=63; // 6 but correction
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.)
36 // default constructor
43 SetGoldenBaselineValue();
44 SetZeroSuppThresholds();
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.)
49 // default constructor
56 SetGoldenBaselineValue();
57 SetZeroSuppThresholds();
59 //______________________________________________________________________
60 AliITSOnlineSDDBase::~AliITSOnlineSDDBase(){
63 //______________________________________________________________________
64 void AliITSOnlineSDDBase::Reset(){
67 for(Int_t i=0;i<fgkNAnodes;i++){
74 //______________________________________________________________________
75 void AliITSOnlineSDDBase::ValidateAnodes(){
77 for(Int_t ian=0;ian<fgkNAnodes;ian++){
79 if(GetAnodeBaseline(ian)>fMaxBaseline || GetAnodeBaseline(ian)<fMinBaseline) fGoodAnode[ian]=0;
80 else if(GetAnodeRawNoise(ian)>fMaxRawNoise || GetAnodeRawNoise(ian)<fMinRawNoise) fGoodAnode[ian]=0;
81 else if(GetAnodeRawNoise(ian)>fNSigmaNoise*CalcMeanRawNoise()) fGoodAnode[ian]=0;
85 //______________________________________________________________________
86 void AliITSOnlineSDDBase::AddEvent(TH2F* hrawd){
89 const Int_t kTimeBins=fLastGoodTB+1;
90 Float_t sum[fgkNAnodes];
91 for(Int_t ian=0;ian<fgkNAnodes;ian++){
95 for(Int_t itb=fFirstGoodTB;itb<=fLastGoodTB;itb++){
96 sum[ian]+=hrawd->GetBinContent(itb+1,ian+1);
97 sumQ+=TMath::Power(hrawd->GetBinContent(itb+1,ian+1),2);
100 sum[ian]/=(Float_t)cnt;
102 fSumBaseline[ian]+=sum[ian];
103 fSumRawNoise[ian]+=sumQ;
106 if(fNEvents==1) ValidateAnodes();
108 Float_t *cmnEven = new Float_t[kTimeBins];
109 Float_t *cmnOdd = new Float_t[kTimeBins];
110 for(Int_t itb=fFirstGoodTB;itb<=fLastGoodTB;itb++){
111 Float_t sumEven=0., sumOdd=0.;
112 Int_t countEven=0,countOdd=0;
113 for(Int_t ian=0;ian<fgkNAnodes;ian+=2){
114 if(!fGoodAnode[ian]) continue;
115 sumEven+=hrawd->GetBinContent(itb+1,ian+1)-sum[ian];
118 for(Int_t ian=1;ian<fgkNAnodes;ian+=2){
119 if(!fGoodAnode[ian]) continue;
120 sumOdd+=hrawd->GetBinContent(itb+1,ian+1)-sum[ian];
123 if(countEven>0) cmnEven[itb]=sumEven/countEven;
124 if(countOdd>0) cmnOdd[itb]=sumOdd/countOdd;
126 for(Int_t ian=0;ian<fgkNAnodes;ian++){
127 Float_t num=0.,den=0.;
128 if(!fGoodAnode[ian]) continue;
129 for(Int_t itb=fFirstGoodTB;itb<=fLastGoodTB;itb++){
130 Float_t cmnCoef=cmnOdd[itb];
131 if(ian%2==0) cmnCoef=cmnEven[itb];
132 num+=(hrawd->GetBinContent(itb+1,ian+1)-sum[ian])*cmnCoef;
133 den+=TMath::Power(cmnCoef,2);
135 if(den!=0) fSumCMN[ian]+=num/den;
141 //______________________________________________________________________
142 void AliITSOnlineSDDBase::GetMinAndMaxBaseline(Float_t &basMin, Float_t &basMax) const {
143 // fills mininum and maximum baseline values
146 for(Int_t ian=0;ian<fgkNAnodes;ian++){
147 if(!fGoodAnode[ian]) continue;
148 Float_t bas=GetAnodeBaseline(ian);
149 if(bas>0 && bas < basMin) basMin=bas;
150 if(bas>0 && bas > basMax) basMax=bas;
153 //______________________________________________________________________
154 Float_t AliITSOnlineSDDBase::GetMinimumBaseline() const {
155 // returns anode with minum baseline value in hybrid
156 Float_t basMin=1008.;
157 for(Int_t ian=0;ian<fgkNAnodes;ian++){
158 if(!fGoodAnode[ian]) continue;
159 Float_t bas=GetAnodeBaseline(ian);
160 if(bas>0 && bas < basMin) basMin=bas;
164 //______________________________________________________________________
165 Float_t AliITSOnlineSDDBase::CalcMeanRawNoise() const{
169 for(Int_t ian=0;ian<fgkNAnodes;ian++){
170 if(!fGoodAnode[ian]) continue;
171 meanns+=GetAnodeRawNoise(ian);
174 if(cnt>0) meanns/=(Float_t)cnt;
177 //______________________________________________________________________
178 void AliITSOnlineSDDBase::WriteToASCII(){
180 Char_t outfilnam[100];
181 Float_t basMin,basMax;
182 GetMinAndMaxBaseline(basMin,basMax);
183 Float_t finalVal=basMin;
184 if(basMin>fGoldenBaseline && basMax<fGoldenBaseline+fgkMaxCorr) finalVal=fGoldenBaseline;
185 if(basMax<basMin+fgkMaxCorr && basMax>fGoldenBaseline+fgkMaxCorr) finalVal=basMax-fgkMaxCorr;
187 Float_t avNoise=CalcMeanRawNoise();
188 Int_t thrL=(Int_t)(finalVal+fLowThrFact*avNoise+0.5);
189 Int_t thrH=(Int_t)(finalVal+fHighThrFact*avNoise+0.5);
190 if(CountGoodAnodes()==0) thrH=255;
192 sprintf(outfilnam,"SDDbase_step1_ddl%02dc%02d_sid%d.data",fDDL,fCarlos,fSide);
193 FILE* outf=fopen(outfilnam,"w");
194 fprintf(outf,"%d\n",thrH);
195 fprintf(outf,"%d\n",thrL);
196 Float_t corrnoise=2.;
197 for(Int_t ian=0;ian<fgkNAnodes;ian++){
198 Float_t bas=GetAnodeBaseline(ian);
199 Int_t corr=(Int_t)(bas-finalVal+0.5);
200 if(corr>fgkMaxCorr) corr=fgkMaxCorr; // only 6 bits in jtag for correction
201 if(corr<0) corr=0; // avoid negative numbers
202 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);