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 ///////////////////////////////////////////////////////////////////
29 ClassImp(AliITSOnlineSDDBase)
30 //______________________________________________________________________
31 AliITSOnlineSDDBase::AliITSOnlineSDDBase():AliITSOnlineSDD(),fNEvents(0),fMinBaseline(0.),fMaxBaseline(0.),fMinRawNoise(0.),fMaxRawNoise(0.),fNSigmaNoise(0.)
33 // default constructor
41 //______________________________________________________________________
42 AliITSOnlineSDDBase::AliITSOnlineSDDBase(Int_t mod, Int_t sid):AliITSOnlineSDD(mod,sid),fNEvents(0),fMinBaseline(0.),fMaxBaseline(0.),fMinRawNoise(0.),fMaxRawNoise(0.),fNSigmaNoise(0.)
44 // default constructor
52 //______________________________________________________________________
53 AliITSOnlineSDDBase::~AliITSOnlineSDDBase(){
56 //______________________________________________________________________
57 void AliITSOnlineSDDBase::Reset(){
60 for(Int_t i=0;i<fgkNAnodes;i++){
67 //______________________________________________________________________
68 void AliITSOnlineSDDBase::ValidateAnodes(){
70 for(Int_t ian=0;ian<fgkNAnodes;ian++){
72 if(GetAnodeBaseline(ian)>fMaxBaseline || GetAnodeBaseline(ian)<fMinBaseline) fGoodAnode[ian]=0;
73 else if(GetAnodeRawNoise(ian)>fMaxRawNoise || GetAnodeRawNoise(ian)<fMinRawNoise) fGoodAnode[ian]=0;
74 else if(GetAnodeRawNoise(ian)>fNSigmaNoise*CalcMeanRawNoise()) fGoodAnode[ian]=0;
78 //______________________________________________________________________
79 void AliITSOnlineSDDBase::AddEvent(TH2F* hrawd){
82 const Int_t kTimeBins=fLastGoodTB-fFirstGoodTB+1;
83 Float_t sum[fgkNAnodes];
84 for(Int_t ian=0;ian<fgkNAnodes;ian++){
87 for(Int_t itb=fFirstGoodTB;itb<=fLastGoodTB;itb++){
88 sum[ian]+=hrawd->GetBinContent(itb+1,ian+1);
89 sumQ+=TMath::Power(hrawd->GetBinContent(itb+1,ian+1),2);
91 sum[ian]/=(Float_t)kTimeBins;
92 sumQ/=(Float_t)kTimeBins;
93 fSumBaseline[ian]+=sum[ian];
94 fSumRawNoise[ian]+=sumQ;
97 if(fNEvents==1) ValidateAnodes();
99 Float_t *cmnEven = new Float_t[kTimeBins];
100 Float_t *cmnOdd = new Float_t[kTimeBins];
101 for(Int_t itb=fFirstGoodTB;itb<=fLastGoodTB;itb++){
102 Float_t sumEven=0., sumOdd=0.;
103 Int_t countEven=0,countOdd=0;
104 for(Int_t ian=0;ian<fgkNAnodes;ian+=2){
105 if(!fGoodAnode[ian]) continue;
106 sumEven+=hrawd->GetBinContent(itb+1,ian+1)-sum[ian];
109 for(Int_t ian=1;ian<fgkNAnodes;ian+=2){
110 if(!fGoodAnode[ian]) continue;
111 sumOdd+=hrawd->GetBinContent(itb+1,ian+1)-sum[ian];
114 if(countEven>0) cmnEven[itb]=sumEven/countEven;
115 if(countOdd>0) cmnOdd[itb]=sumOdd/countOdd;
117 for(Int_t ian=0;ian<fgkNAnodes;ian++){
118 Float_t num=0.,den=0.;
119 if(!fGoodAnode[ian]) continue;
120 for(Int_t itb=fFirstGoodTB;itb<=fLastGoodTB;itb++){
121 Float_t cmnCoef=cmnOdd[itb];
122 if(ian%2==0) cmnCoef=cmnEven[itb];
123 num+=(hrawd->GetBinContent(itb+1,ian+1)-sum[ian])*cmnCoef;
124 den+=TMath::Power(cmnCoef,2);
126 if(den!=0) fSumCMN[ian]+=num/den;
132 //______________________________________________________________________
133 Float_t AliITSOnlineSDDBase::GetMinimumBaseline() const {
134 Float_t basMin=1008.;
135 for(Int_t ian=0;ian<fgkNAnodes;ian++){
136 Float_t bas=GetAnodeBaseline(ian);
137 if(bas>0 && bas < basMin) basMin=bas;
141 //______________________________________________________________________
142 Float_t AliITSOnlineSDDBase::CalcMeanRawNoise() const{
146 for(Int_t ian=0;ian<fgkNAnodes;ian++){
147 if(!fGoodAnode[ian]) continue;
148 meanns+=GetAnodeRawNoise(ian);
151 if(cnt>0) meanns/=(Float_t)cnt;
154 //______________________________________________________________________
155 void AliITSOnlineSDDBase::WriteToASCII(){
157 Char_t outfilnam[100];
158 Float_t basMin=GetMinimumBaseline();
159 sprintf(outfilnam,"SDDbase_step1_mod%03d_sid%d.data",fModuleId,fSide);
160 FILE* outf=fopen(outfilnam,"w");
161 Float_t corrnoise=2.;
162 for(Int_t ian=0;ian<fgkNAnodes;ian++){
163 Float_t bas=GetAnodeBaseline(ian);
164 Int_t corr=(Int_t)(bas-basMin+0.5);
165 if(corr>63) corr=63; // only 6 bits in jtag for correction
166 fprintf(outf,"%d %d %11.6f %d %d %11.6f %11.6f %11.6f\n",ian,IsAnodeGood(ian),GetAnodeBaseline(ian),(Int_t)basMin,corr,GetAnodeRawNoise(ian),GetAnodeCommonMode(ian),corrnoise);