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 "AliITSOnlineSDDBTP.h"
17 #include <Riostream.h>
21 ///////////////////////////////////////////////////////////////////
23 // Class used for SDD baseline, noise and gain analysis //
24 // Origin: F.Prino, Torino, prino@to.infn.it //
26 ///////////////////////////////////////////////////////////////////
29 ClassImp(AliITSOnlineSDDBTP)
30 //______________________________________________________________________
31 AliITSOnlineSDDBTP::AliITSOnlineSDDBTP():AliITSOnlineSDD(),fNBaseEvents(0),fNTPEvents(0),fMinBaseline(0.),fMaxBaseline(0.),fMinRawNoise(0.),fMaxRawNoise(0.),fNSigmaNoise(0.),fNSigmaGain(0.)
33 // default constructor
42 //______________________________________________________________________
43 AliITSOnlineSDDBTP::AliITSOnlineSDDBTP(Int_t mod, Int_t sid):AliITSOnlineSDD(mod,sid),fNBaseEvents(0),fNTPEvents(0),fMinBaseline(0.),fMaxBaseline(0.),fMinRawNoise(0.),fMaxRawNoise(0.),fNSigmaNoise(0.),fNSigmaGain(0.)
45 // default constructor
54 //______________________________________________________________________
55 AliITSOnlineSDDBTP::~AliITSOnlineSDDBTP(){
58 //______________________________________________________________________
59 void AliITSOnlineSDDBTP::Reset(){
62 for(Int_t i=0;i<fgkNAnodes;i++){
71 //______________________________________________________________________
72 void AliITSOnlineSDDBTP::ValidateAnodes(){
73 for(Int_t ian=0;ian<fgkNAnodes;ian++){
75 if(GetAnodeBaseline(ian)>fMaxBaseline || GetAnodeBaseline(ian)<fMinBaseline) fGoodAnode[ian]=0;
76 if(GetAnodeRawNoise(ian)>fMaxRawNoise || GetAnodeRawNoise(ian)<fMinRawNoise) fGoodAnode[ian]=0;
77 if(GetAnodeRawNoise(ian)>fNSigmaNoise*CalcMeanRawNoise()) fGoodAnode[ian]=0;
82 Float_t lowlim=meang-fNSigmaGain*rmsg;
83 Float_t hilim=meang+fNSigmaGain*rmsg;
84 for(Int_t ian=0;ian<fgkNAnodes;ian++){
85 if(!fGoodAnode[ian]) continue;
86 if(GetChannelGain(ian)<lowlim||GetChannelGain(ian)>hilim) fGoodAnode[ian]=0;
91 //______________________________________________________________________
92 void AliITSOnlineSDDBTP::AddTPEvent(TH2F* hrawd, Float_t xDAC){
94 if(fNBaseEvents==0) return;
96 Float_t tbmax=(Float_t)hrawd->GetNbinsX();
97 for(Int_t ian=0;ian<fgkNAnodes;ian++){
100 if(!fGoodAnode[ian]) continue;
101 for(Int_t itb=0;itb<tbmax;itb++){
102 Float_t cnt=hrawd->GetBinContent(itb+1,ian+1);
108 fSumTPPeak[ian]+=(auxmax-GetAnodeBaseline(ian))/xDAC;
112 //______________________________________________________________________
113 void AliITSOnlineSDDBTP::AddBaseEvent(TH2F* hrawd){
116 Float_t tbmax=(Float_t)hrawd->GetNbinsX();
117 Float_t sum[fgkNAnodes];
118 for(Int_t ian=0;ian<fgkNAnodes;ian++){
121 for(Int_t itb=0;itb<tbmax;itb++){
122 sum[ian]+=hrawd->GetBinContent(itb+1,ian+1);
123 sumQ+=TMath::Power(hrawd->GetBinContent(itb+1,ian+1),2);
127 fSumBaseline[ian]+=sum[ian];
128 fSumRawNoise[ian]+=sumQ;
129 if(fNBaseEvents==1) ValidateAnodes();
133 const Int_t itbmax=int(tbmax);
134 Float_t *cmnEven = new Float_t[itbmax];
135 Float_t *cmnOdd = new Float_t[itbmax];
136 for(Int_t itb=0;itb<tbmax;itb++){
137 Float_t sumEven=0., sumOdd=0.;
138 Int_t countEven=0,countOdd=0;
139 for(Int_t ian=0;ian<fgkNAnodes;ian+=2){
140 if(!fGoodAnode[ian]) continue;
141 sumEven+=hrawd->GetBinContent(itb+1,ian+1)-sum[ian];
144 for(Int_t ian=1;ian<fgkNAnodes;ian+=2){
145 if(!fGoodAnode[ian]) continue;
146 sumOdd+=hrawd->GetBinContent(itb+1,ian+1)-sum[ian];
149 cmnEven[itb]=sumEven/countEven;
150 cmnOdd[itb]=sumOdd/countOdd;
152 for(Int_t ian=0;ian<fgkNAnodes;ian++){
153 Float_t num=0.,den=0.;
154 if(!fGoodAnode[ian]) continue;
155 for(Int_t itb=0;itb<tbmax;itb++){
156 Float_t cmnCoef=cmnOdd[itb];
157 if(ian%2==0) cmnCoef=cmnEven[itb];
158 num+=(hrawd->GetBinContent(itb+1,ian+1)-sum[ian])*cmnCoef;
159 den+=TMath::Power(cmnCoef,2);
161 if(den!=0) fSumCMN[ian]+=num/den;
166 //______________________________________________________________________
167 Float_t AliITSOnlineSDDBTP::CalcMeanRawNoise(){
171 for(Int_t ian=0;ian<fgkNAnodes;ian++){
172 if(!fGoodAnode[ian]) continue;
173 meanns+=GetAnodeRawNoise(ian);
176 if(cnt>0) meanns/=(Float_t)cnt;
179 //______________________________________________________________________
180 void AliITSOnlineSDDBTP::StatGain(Float_t &mean, Float_t &rms){
181 Float_t sum=0.,sumq=0.;
183 for(Int_t ian=0;ian<fgkNAnodes;ian++){
184 if(!fGoodAnode[ian]) continue;
185 sum+=GetChannelGain(ian);
186 sumq+=TMath::Power(GetChannelGain(ian),2);
190 mean=sum/(Float_t)cnt;
191 rms=TMath::Sqrt(sumq/(Float_t)cnt-mean*mean);
198 //______________________________________________________________________
199 void AliITSOnlineSDDBTP::WriteToFXS(){
201 Char_t outfilnam[100];
202 sprintf(outfilnam,"SDDbase_mod%03d_sid%d.data",fModuleId,fSide);
203 FILE* outf=fopen(outfilnam,"w");
204 Float_t corrnoise=2.;
205 for(Int_t ian=0;ian<fgkNAnodes;ian++){
206 fprintf(outf,"%d %d %8.3f %8.3f %8.3f %8.3f %8.3f\n",ian,IsAnodeGood(ian),GetAnodeBaseline(ian),GetAnodeRawNoise(ian),GetAnodeCommonMode(ian),corrnoise,GetChannelGain(ian));