// //
///////////////////////////////////////////////////////////////////
+/* $Id$ */
+
+const Int_t AliITSOnlineSDDBase::fgkMaxCorr=63; // 6 but correction
ClassImp(AliITSOnlineSDDBase)
//______________________________________________________________________
- AliITSOnlineSDDBase::AliITSOnlineSDDBase():AliITSOnlineSDD(),fNEvents(0),fMinBaseline(0.),fMaxBaseline(0.),fMinRawNoise(0.),fMaxRawNoise(0.),fNSigmaNoise(0.)
+ AliITSOnlineSDDBase::AliITSOnlineSDDBase():AliITSOnlineSDD(),fNEvents(0),fMinBaseline(0.),fMaxBaseline(0.),fMinRawNoise(0.),fMaxRawNoise(0.),fNSigmaNoise(0.),fGoldenBaseline(0.),fLowThrFact(0.),fHighThrFact(0.)
{
// default constructor
Reset();
SetMinRawNoise();
SetMaxRawNoise();
SetNSigmaNoise();
+ SetGoldenBaselineValue();
+ SetZeroSuppThresholds();
}
//______________________________________________________________________
- AliITSOnlineSDDBase::AliITSOnlineSDDBase(Int_t mod, Int_t sid):AliITSOnlineSDD(mod,sid),fNEvents(0),fMinBaseline(0.),fMaxBaseline(0.),fMinRawNoise(0.),fMaxRawNoise(0.),fNSigmaNoise(0.)
+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.)
{
// default constructor
Reset();
SetMinRawNoise();
SetMaxRawNoise();
SetNSigmaNoise();
+ SetGoldenBaselineValue();
+ SetZeroSuppThresholds();
}
//______________________________________________________________________
AliITSOnlineSDDBase::~AliITSOnlineSDDBase(){
}
//______________________________________________________________________
void AliITSOnlineSDDBase::Reset(){
- //
+ // reset all counters
fNEvents=0;
for(Int_t i=0;i<fgkNAnodes;i++){
fGoodAnode[i]=1;
}
//______________________________________________________________________
void AliITSOnlineSDDBase::ValidateAnodes(){
- //
+ // tag good/bad channels
for(Int_t ian=0;ian<fgkNAnodes;ian++){
fGoodAnode[ian]=1;
- if(GetAnodeBaseline(ian)>fMaxBaseline || GetAnodeBaseline(ian)<fMinBaseline) fGoodAnode[ian]=0;
- if(GetAnodeRawNoise(ian)>fMaxRawNoise || GetAnodeRawNoise(ian)<fMinRawNoise) fGoodAnode[ian]=0;
- if(GetAnodeRawNoise(ian)>fNSigmaNoise*CalcMeanRawNoise()) fGoodAnode[ian]=0;
+ Float_t basel=GetAnodeBaseline(ian);
+ Float_t rawn=GetAnodeRawNoise(ian);
+ Float_t ratio=0.;
+ if(rawn>0) ratio=basel/rawn;
+ if(basel>fMaxBaseline || basel<fMinBaseline) fGoodAnode[ian]=0;
+ else if(rawn>fMaxRawNoise || rawn<fMinRawNoise) fGoodAnode[ian]=0;
+ else if(rawn>fNSigmaNoise*CalcMeanRawNoise()) fGoodAnode[ian]=0;
+ else if(ratio<3.) fGoodAnode[ian]=0;
}
}
//______________________________________________________________________
void AliITSOnlineSDDBase::AddEvent(TH2F* hrawd){
- //
+ // analyzes one event and adds its ontribution to the various counters
+
fNEvents++;
- Float_t tbmax=(Float_t)hrawd->GetNbinsX();
+ const Int_t kTimeBins=fLastGoodTB+1;
Float_t sum[fgkNAnodes];
for(Int_t ian=0;ian<fgkNAnodes;ian++){
Float_t sumQ=0.;
sum[ian]=0.;
- for(Int_t itb=0;itb<tbmax;itb++){
- sum[ian]+=hrawd->GetBinContent(itb+1,ian+1);
- sumQ+=TMath::Power(hrawd->GetBinContent(itb+1,ian+1),2);
+ Int_t cnt=0;
+ for(Int_t itb=fFirstGoodTB;itb<=fLastGoodTB;itb++){
+ Float_t cbin=hrawd->GetBinContent(itb+1,ian+1);
+ sum[ian]+=cbin;
+ sumQ+=cbin*cbin;
+ cnt++;
+ }
+ if(cnt != 0){
+ sum[ian]/=(Float_t)cnt;
+ sumQ/=(Float_t)cnt;
}
- sum[ian]/=tbmax;
- sumQ/=tbmax;
fSumBaseline[ian]+=sum[ian];
fSumRawNoise[ian]+=sumQ;
- if(fNEvents==1) ValidateAnodes();
}
+ if(fNEvents==1) ValidateAnodes();
-
- const Int_t kTbmax=int(tbmax);
- Float_t *cmnEven = new Float_t[kTbmax];
- Float_t *cmnOdd = new Float_t[kTbmax];
- for(Int_t itb=0;itb<tbmax;itb++){
+ Float_t *cmnEven = new Float_t[kTimeBins];
+ Float_t *cmnOdd = new Float_t[kTimeBins];
+ for(Int_t itb=fFirstGoodTB;itb<=fLastGoodTB;itb++){
Float_t sumEven=0., sumOdd=0.;
Int_t countEven=0,countOdd=0;
for(Int_t ian=0;ian<fgkNAnodes;ian+=2){
sumOdd+=hrawd->GetBinContent(itb+1,ian+1)-sum[ian];
countOdd++;
}
- cmnEven[itb]=sumEven/countEven;
- cmnOdd[itb]=sumOdd/countOdd;
+ if(countEven>0) cmnEven[itb]=sumEven/countEven;
+ if(countOdd>0) cmnOdd[itb]=sumOdd/countOdd;
}
for(Int_t ian=0;ian<fgkNAnodes;ian++){
Float_t num=0.,den=0.;
if(!fGoodAnode[ian]) continue;
- for(Int_t itb=0;itb<tbmax;itb++){
+ for(Int_t itb=fFirstGoodTB;itb<=fLastGoodTB;itb++){
Float_t cmnCoef=cmnOdd[itb];
if(ian%2==0) cmnCoef=cmnEven[itb];
num+=(hrawd->GetBinContent(itb+1,ian+1)-sum[ian])*cmnCoef;
- den+=TMath::Power(cmnCoef,2);
+ den+=cmnCoef*cmnCoef;
}
if(den!=0) fSumCMN[ian]+=num/den;
}
delete [] cmnOdd;
}
//______________________________________________________________________
+void AliITSOnlineSDDBase::GetMinAndMaxBaseline(Float_t &basMin, Float_t &basMax) const {
+ // fills mininum and maximum baseline values
+ basMin=1008.;
+ basMax=0.;
+ for(Int_t ian=0;ian<fgkNAnodes;ian++){
+ if(!fGoodAnode[ian]) continue;
+ Float_t bas=GetAnodeBaseline(ian);
+ if(bas>0 && bas < basMin) basMin=bas;
+ if(bas>0 && bas > basMax) basMax=bas;
+ }
+}
+//______________________________________________________________________
+Float_t AliITSOnlineSDDBase::GetMinimumBaseline() const {
+ // returns anode with minum baseline value in hybrid
+ Float_t basMin=1008.;
+ for(Int_t ian=0;ian<fgkNAnodes;ian++){
+ if(!fGoodAnode[ian]) continue;
+ Float_t bas=GetAnodeBaseline(ian);
+ if(bas>0 && bas < basMin) basMin=bas;
+ }
+ return basMin;
+}
+//______________________________________________________________________
Float_t AliITSOnlineSDDBase::CalcMeanRawNoise() const{
- //
+ // compute mean value of raw noise
Float_t meanns=0.;
Int_t cnt=0;
for(Int_t ian=0;ian<fgkNAnodes;ian++){
}
//______________________________________________________________________
void AliITSOnlineSDDBase::WriteToASCII(){
- //
- Char_t outfilnam[100];
- sprintf(outfilnam,"SDDbase_step1_mod%03d_sid%d.data",fModuleId,fSide);
- FILE* outf=fopen(outfilnam,"w");
+ // writes parameters of each channel into an ASCII file
+ // to be then read in the successive step for common mode noise
+ // correction (AliITSOnlineSDDCMN)
+
+ TString outfilnam;
+ Float_t basMin,basMax;
+ GetMinAndMaxBaseline(basMin,basMax);
+ Float_t finalVal=basMin;
+ if(basMin>fGoldenBaseline && basMax<fGoldenBaseline+fgkMaxCorr) finalVal=fGoldenBaseline;
+ if(basMax<basMin+fgkMaxCorr && basMax>fGoldenBaseline+fgkMaxCorr) finalVal=basMax-fgkMaxCorr;
+
+ Float_t avNoise=CalcMeanRawNoise();
+ Int_t thrL=(Int_t)(finalVal+fLowThrFact*avNoise+0.5);
+ Int_t thrH=(Int_t)(finalVal+fHighThrFact*avNoise+0.5);
+ if(CountGoodAnodes()==0) thrH=255;
+
+ outfilnam.Form("SDDbase_step1_ddl%02dc%02d_sid%d.data",fDDL,fCarlos,fSide);
+ FILE* outf=fopen(outfilnam.Data(),"w");
+ fprintf(outf,"%d\n",thrH);
+ fprintf(outf,"%d\n",thrL);
Float_t corrnoise=2.;
for(Int_t ian=0;ian<fgkNAnodes;ian++){
- fprintf(outf,"%d %d %11.6f %11.6f %11.6f %11.6f\n",ian,IsAnodeGood(ian),GetAnodeBaseline(ian),GetAnodeRawNoise(ian),GetAnodeCommonMode(ian),corrnoise);
+ Float_t bas=GetAnodeBaseline(ian);
+ Int_t corr=(Int_t)(bas-finalVal+0.5);
+ if(corr>fgkMaxCorr) corr=fgkMaxCorr; // only 6 bits in jtag for correction
+ if(corr<0) corr=0; // avoid negative numbers
+ 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);
}
fclose(outf);
}