ROOT logo
/**************************************************************************
 * Copyright(c) 2007-2009, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
#include "AliITSOnlineSDDBase.h"
#include <TH2F.h>
#include <TMath.h>


///////////////////////////////////////////////////////////////////
//                                                               //
// Implementation of the class used for SDD baselines            //
// and noise analysis                                            //
// Origin: F.Prino, Torino, prino@to.infn.it                     //
//                                                               //
///////////////////////////////////////////////////////////////////

/*  $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.),fGoldenBaseline(0.),fLowThrFact(0.),fHighThrFact(0.)
{
  // default constructor
  Reset();
  SetMinBaseline();
  SetMaxBaseline();
  SetMinRawNoise();
  SetMaxRawNoise();
  SetNSigmaNoise();
  SetGoldenBaselineValue();
  SetZeroSuppThresholds();
}
//______________________________________________________________________
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();
  SetMinBaseline();
  SetMaxBaseline();
  SetMinRawNoise();
  SetMaxRawNoise();
  SetNSigmaNoise();
  SetGoldenBaselineValue();
  SetZeroSuppThresholds();
}
//______________________________________________________________________
AliITSOnlineSDDBase::~AliITSOnlineSDDBase(){
  // Destructor
}
//______________________________________________________________________
void AliITSOnlineSDDBase::Reset(){
  // reset all counters
  fNEvents=0;
  for(Int_t i=0;i<fgkNAnodes;i++){
    fGoodAnode[i]=1;
    fSumBaseline[i]=0.;
    fSumRawNoise[i]=0.;
    fSumCMN[i]=0.;
  }
}
//______________________________________________________________________
void  AliITSOnlineSDDBase::ValidateAnodes(){
  // tag good/bad channels
  for(Int_t ian=0;ian<fgkNAnodes;ian++){
    fGoodAnode[ian]=1;
    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++;
  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.;
    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;
    }
    fSumBaseline[ian]+=sum[ian];
    fSumRawNoise[ian]+=sumQ;
  }
  if(fNEvents==1) ValidateAnodes();

  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){
      if(!fGoodAnode[ian]) continue;
      sumEven+=hrawd->GetBinContent(itb+1,ian+1)-sum[ian];
      countEven++;
    }
    for(Int_t ian=1;ian<fgkNAnodes;ian+=2){
      if(!fGoodAnode[ian]) continue;
      sumOdd+=hrawd->GetBinContent(itb+1,ian+1)-sum[ian];
      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=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+=cmnCoef*cmnCoef;
    }
    if(den!=0) fSumCMN[ian]+=num/den;
  }

  delete [] cmnEven;
  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++){
    if(!fGoodAnode[ian]) continue;  
    meanns+=GetAnodeRawNoise(ian);
    cnt++;
  }
  if(cnt>0) meanns/=(Float_t)cnt;
  return meanns;
}
//______________________________________________________________________
void AliITSOnlineSDDBase::WriteToASCII(){
  // 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++){
    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);  
}
 AliITSOnlineSDDBase.cxx:1
 AliITSOnlineSDDBase.cxx:2
 AliITSOnlineSDDBase.cxx:3
 AliITSOnlineSDDBase.cxx:4
 AliITSOnlineSDDBase.cxx:5
 AliITSOnlineSDDBase.cxx:6
 AliITSOnlineSDDBase.cxx:7
 AliITSOnlineSDDBase.cxx:8
 AliITSOnlineSDDBase.cxx:9
 AliITSOnlineSDDBase.cxx:10
 AliITSOnlineSDDBase.cxx:11
 AliITSOnlineSDDBase.cxx:12
 AliITSOnlineSDDBase.cxx:13
 AliITSOnlineSDDBase.cxx:14
 AliITSOnlineSDDBase.cxx:15
 AliITSOnlineSDDBase.cxx:16
 AliITSOnlineSDDBase.cxx:17
 AliITSOnlineSDDBase.cxx:18
 AliITSOnlineSDDBase.cxx:19
 AliITSOnlineSDDBase.cxx:20
 AliITSOnlineSDDBase.cxx:21
 AliITSOnlineSDDBase.cxx:22
 AliITSOnlineSDDBase.cxx:23
 AliITSOnlineSDDBase.cxx:24
 AliITSOnlineSDDBase.cxx:25
 AliITSOnlineSDDBase.cxx:26
 AliITSOnlineSDDBase.cxx:27
 AliITSOnlineSDDBase.cxx:28
 AliITSOnlineSDDBase.cxx:29
 AliITSOnlineSDDBase.cxx:30
 AliITSOnlineSDDBase.cxx:31
 AliITSOnlineSDDBase.cxx:32
 AliITSOnlineSDDBase.cxx:33
 AliITSOnlineSDDBase.cxx:34
 AliITSOnlineSDDBase.cxx:35
 AliITSOnlineSDDBase.cxx:36
 AliITSOnlineSDDBase.cxx:37
 AliITSOnlineSDDBase.cxx:38
 AliITSOnlineSDDBase.cxx:39
 AliITSOnlineSDDBase.cxx:40
 AliITSOnlineSDDBase.cxx:41
 AliITSOnlineSDDBase.cxx:42
 AliITSOnlineSDDBase.cxx:43
 AliITSOnlineSDDBase.cxx:44
 AliITSOnlineSDDBase.cxx:45
 AliITSOnlineSDDBase.cxx:46
 AliITSOnlineSDDBase.cxx:47
 AliITSOnlineSDDBase.cxx:48
 AliITSOnlineSDDBase.cxx:49
 AliITSOnlineSDDBase.cxx:50
 AliITSOnlineSDDBase.cxx:51
 AliITSOnlineSDDBase.cxx:52
 AliITSOnlineSDDBase.cxx:53
 AliITSOnlineSDDBase.cxx:54
 AliITSOnlineSDDBase.cxx:55
 AliITSOnlineSDDBase.cxx:56
 AliITSOnlineSDDBase.cxx:57
 AliITSOnlineSDDBase.cxx:58
 AliITSOnlineSDDBase.cxx:59
 AliITSOnlineSDDBase.cxx:60
 AliITSOnlineSDDBase.cxx:61
 AliITSOnlineSDDBase.cxx:62
 AliITSOnlineSDDBase.cxx:63
 AliITSOnlineSDDBase.cxx:64
 AliITSOnlineSDDBase.cxx:65
 AliITSOnlineSDDBase.cxx:66
 AliITSOnlineSDDBase.cxx:67
 AliITSOnlineSDDBase.cxx:68
 AliITSOnlineSDDBase.cxx:69
 AliITSOnlineSDDBase.cxx:70
 AliITSOnlineSDDBase.cxx:71
 AliITSOnlineSDDBase.cxx:72
 AliITSOnlineSDDBase.cxx:73
 AliITSOnlineSDDBase.cxx:74
 AliITSOnlineSDDBase.cxx:75
 AliITSOnlineSDDBase.cxx:76
 AliITSOnlineSDDBase.cxx:77
 AliITSOnlineSDDBase.cxx:78
 AliITSOnlineSDDBase.cxx:79
 AliITSOnlineSDDBase.cxx:80
 AliITSOnlineSDDBase.cxx:81
 AliITSOnlineSDDBase.cxx:82
 AliITSOnlineSDDBase.cxx:83
 AliITSOnlineSDDBase.cxx:84
 AliITSOnlineSDDBase.cxx:85
 AliITSOnlineSDDBase.cxx:86
 AliITSOnlineSDDBase.cxx:87
 AliITSOnlineSDDBase.cxx:88
 AliITSOnlineSDDBase.cxx:89
 AliITSOnlineSDDBase.cxx:90
 AliITSOnlineSDDBase.cxx:91
 AliITSOnlineSDDBase.cxx:92
 AliITSOnlineSDDBase.cxx:93
 AliITSOnlineSDDBase.cxx:94
 AliITSOnlineSDDBase.cxx:95
 AliITSOnlineSDDBase.cxx:96
 AliITSOnlineSDDBase.cxx:97
 AliITSOnlineSDDBase.cxx:98
 AliITSOnlineSDDBase.cxx:99
 AliITSOnlineSDDBase.cxx:100
 AliITSOnlineSDDBase.cxx:101
 AliITSOnlineSDDBase.cxx:102
 AliITSOnlineSDDBase.cxx:103
 AliITSOnlineSDDBase.cxx:104
 AliITSOnlineSDDBase.cxx:105
 AliITSOnlineSDDBase.cxx:106
 AliITSOnlineSDDBase.cxx:107
 AliITSOnlineSDDBase.cxx:108
 AliITSOnlineSDDBase.cxx:109
 AliITSOnlineSDDBase.cxx:110
 AliITSOnlineSDDBase.cxx:111
 AliITSOnlineSDDBase.cxx:112
 AliITSOnlineSDDBase.cxx:113
 AliITSOnlineSDDBase.cxx:114
 AliITSOnlineSDDBase.cxx:115
 AliITSOnlineSDDBase.cxx:116
 AliITSOnlineSDDBase.cxx:117
 AliITSOnlineSDDBase.cxx:118
 AliITSOnlineSDDBase.cxx:119
 AliITSOnlineSDDBase.cxx:120
 AliITSOnlineSDDBase.cxx:121
 AliITSOnlineSDDBase.cxx:122
 AliITSOnlineSDDBase.cxx:123
 AliITSOnlineSDDBase.cxx:124
 AliITSOnlineSDDBase.cxx:125
 AliITSOnlineSDDBase.cxx:126
 AliITSOnlineSDDBase.cxx:127
 AliITSOnlineSDDBase.cxx:128
 AliITSOnlineSDDBase.cxx:129
 AliITSOnlineSDDBase.cxx:130
 AliITSOnlineSDDBase.cxx:131
 AliITSOnlineSDDBase.cxx:132
 AliITSOnlineSDDBase.cxx:133
 AliITSOnlineSDDBase.cxx:134
 AliITSOnlineSDDBase.cxx:135
 AliITSOnlineSDDBase.cxx:136
 AliITSOnlineSDDBase.cxx:137
 AliITSOnlineSDDBase.cxx:138
 AliITSOnlineSDDBase.cxx:139
 AliITSOnlineSDDBase.cxx:140
 AliITSOnlineSDDBase.cxx:141
 AliITSOnlineSDDBase.cxx:142
 AliITSOnlineSDDBase.cxx:143
 AliITSOnlineSDDBase.cxx:144
 AliITSOnlineSDDBase.cxx:145
 AliITSOnlineSDDBase.cxx:146
 AliITSOnlineSDDBase.cxx:147
 AliITSOnlineSDDBase.cxx:148
 AliITSOnlineSDDBase.cxx:149
 AliITSOnlineSDDBase.cxx:150
 AliITSOnlineSDDBase.cxx:151
 AliITSOnlineSDDBase.cxx:152
 AliITSOnlineSDDBase.cxx:153
 AliITSOnlineSDDBase.cxx:154
 AliITSOnlineSDDBase.cxx:155
 AliITSOnlineSDDBase.cxx:156
 AliITSOnlineSDDBase.cxx:157
 AliITSOnlineSDDBase.cxx:158
 AliITSOnlineSDDBase.cxx:159
 AliITSOnlineSDDBase.cxx:160
 AliITSOnlineSDDBase.cxx:161
 AliITSOnlineSDDBase.cxx:162
 AliITSOnlineSDDBase.cxx:163
 AliITSOnlineSDDBase.cxx:164
 AliITSOnlineSDDBase.cxx:165
 AliITSOnlineSDDBase.cxx:166
 AliITSOnlineSDDBase.cxx:167
 AliITSOnlineSDDBase.cxx:168
 AliITSOnlineSDDBase.cxx:169
 AliITSOnlineSDDBase.cxx:170
 AliITSOnlineSDDBase.cxx:171
 AliITSOnlineSDDBase.cxx:172
 AliITSOnlineSDDBase.cxx:173
 AliITSOnlineSDDBase.cxx:174
 AliITSOnlineSDDBase.cxx:175
 AliITSOnlineSDDBase.cxx:176
 AliITSOnlineSDDBase.cxx:177
 AliITSOnlineSDDBase.cxx:178
 AliITSOnlineSDDBase.cxx:179
 AliITSOnlineSDDBase.cxx:180
 AliITSOnlineSDDBase.cxx:181
 AliITSOnlineSDDBase.cxx:182
 AliITSOnlineSDDBase.cxx:183
 AliITSOnlineSDDBase.cxx:184
 AliITSOnlineSDDBase.cxx:185
 AliITSOnlineSDDBase.cxx:186
 AliITSOnlineSDDBase.cxx:187
 AliITSOnlineSDDBase.cxx:188
 AliITSOnlineSDDBase.cxx:189
 AliITSOnlineSDDBase.cxx:190
 AliITSOnlineSDDBase.cxx:191
 AliITSOnlineSDDBase.cxx:192
 AliITSOnlineSDDBase.cxx:193
 AliITSOnlineSDDBase.cxx:194
 AliITSOnlineSDDBase.cxx:195
 AliITSOnlineSDDBase.cxx:196
 AliITSOnlineSDDBase.cxx:197
 AliITSOnlineSDDBase.cxx:198
 AliITSOnlineSDDBase.cxx:199
 AliITSOnlineSDDBase.cxx:200
 AliITSOnlineSDDBase.cxx:201
 AliITSOnlineSDDBase.cxx:202
 AliITSOnlineSDDBase.cxx:203
 AliITSOnlineSDDBase.cxx:204
 AliITSOnlineSDDBase.cxx:205
 AliITSOnlineSDDBase.cxx:206
 AliITSOnlineSDDBase.cxx:207
 AliITSOnlineSDDBase.cxx:208
 AliITSOnlineSDDBase.cxx:209
 AliITSOnlineSDDBase.cxx:210
 AliITSOnlineSDDBase.cxx:211
 AliITSOnlineSDDBase.cxx:212
 AliITSOnlineSDDBase.cxx:213
 AliITSOnlineSDDBase.cxx:214
 AliITSOnlineSDDBase.cxx:215
 AliITSOnlineSDDBase.cxx:216