]> git.uio.no Git - u/mrichter/AliRoot.git/blob - ITS/AliITSOnlineSDDBase.cxx
removed static from variable declaration in AliEMCALGeometry::GetPhiCenterOfSM
[u/mrichter/AliRoot.git] / ITS / AliITSOnlineSDDBase.cxx
1 /**************************************************************************
2  * Copyright(c) 2007-2009, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
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"
16 #include <TH2F.h>
17 #include <TMath.h>
18
19
20 ///////////////////////////////////////////////////////////////////
21 //                                                               //
22 // Implementation of the class used for SDD baselines            //
23 // and noise analysis                                            //
24 // Origin: F.Prino, Torino, prino@to.infn.it                     //
25 //                                                               //
26 ///////////////////////////////////////////////////////////////////
27
28 /*  $Id:$   */
29
30 ClassImp(AliITSOnlineSDDBase)
31 //______________________________________________________________________
32   AliITSOnlineSDDBase::AliITSOnlineSDDBase():AliITSOnlineSDD(),fNEvents(0),fMinBaseline(0.),fMaxBaseline(0.),fMinRawNoise(0.),fMaxRawNoise(0.),fNSigmaNoise(0.)
33 {
34   // default constructor
35   Reset();
36   SetMinBaseline();
37   SetMaxBaseline();
38   SetMinRawNoise();
39   SetMaxRawNoise();
40   SetNSigmaNoise();
41 }
42 //______________________________________________________________________
43   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.)
44 {
45   // default constructor
46   Reset();
47   SetMinBaseline();
48   SetMaxBaseline();
49   SetMinRawNoise();
50   SetMaxRawNoise();
51   SetNSigmaNoise();
52 }
53 //______________________________________________________________________
54 AliITSOnlineSDDBase::~AliITSOnlineSDDBase(){
55   // Destructor
56 }
57 //______________________________________________________________________
58 void AliITSOnlineSDDBase::Reset(){
59   //
60   fNEvents=0;
61   for(Int_t i=0;i<fgkNAnodes;i++){
62     fGoodAnode[i]=1;
63     fSumBaseline[i]=0.;
64     fSumRawNoise[i]=0.;
65     fSumCMN[i]=0.;
66   }
67 }
68 //______________________________________________________________________
69 void  AliITSOnlineSDDBase::ValidateAnodes(){
70   //
71   for(Int_t ian=0;ian<fgkNAnodes;ian++){
72     fGoodAnode[ian]=1;
73     if(GetAnodeBaseline(ian)>fMaxBaseline || GetAnodeBaseline(ian)<fMinBaseline) fGoodAnode[ian]=0;
74     else if(GetAnodeRawNoise(ian)>fMaxRawNoise || GetAnodeRawNoise(ian)<fMinRawNoise) fGoodAnode[ian]=0;
75     else if(GetAnodeRawNoise(ian)>fNSigmaNoise*CalcMeanRawNoise()) fGoodAnode[ian]=0;
76   }
77 }
78
79 //______________________________________________________________________
80 void AliITSOnlineSDDBase::AddEvent(TH2F* hrawd){
81   // 
82   fNEvents++;
83   const Int_t kTimeBins=fLastGoodTB-fFirstGoodTB+1;
84   Float_t sum[fgkNAnodes];
85   for(Int_t ian=0;ian<fgkNAnodes;ian++){
86     Float_t sumQ=0.;
87     sum[ian]=0.;
88     for(Int_t itb=fFirstGoodTB;itb<=fLastGoodTB;itb++){
89       sum[ian]+=hrawd->GetBinContent(itb+1,ian+1);
90       sumQ+=TMath::Power(hrawd->GetBinContent(itb+1,ian+1),2);      
91     }
92     sum[ian]/=(Float_t)kTimeBins;
93     sumQ/=(Float_t)kTimeBins;
94     fSumBaseline[ian]+=sum[ian];
95     fSumRawNoise[ian]+=sumQ;
96   }
97
98   if(fNEvents==1) ValidateAnodes();
99
100   Float_t *cmnEven = new Float_t[kTimeBins];
101   Float_t *cmnOdd  = new Float_t[kTimeBins];
102   for(Int_t itb=fFirstGoodTB;itb<=fLastGoodTB;itb++){
103     Float_t sumEven=0., sumOdd=0.;
104     Int_t countEven=0,countOdd=0;
105     for(Int_t ian=0;ian<fgkNAnodes;ian+=2){
106       if(!fGoodAnode[ian]) continue;
107       sumEven+=hrawd->GetBinContent(itb+1,ian+1)-sum[ian];
108       countEven++;
109     }
110     for(Int_t ian=1;ian<fgkNAnodes;ian+=2){
111       if(!fGoodAnode[ian]) continue;
112       sumOdd+=hrawd->GetBinContent(itb+1,ian+1)-sum[ian];
113       countOdd++;
114     }
115     if(countEven>0) cmnEven[itb]=sumEven/countEven;
116     if(countOdd>0) cmnOdd[itb]=sumOdd/countOdd;
117   }
118   for(Int_t ian=0;ian<fgkNAnodes;ian++){
119     Float_t num=0.,den=0.;
120     if(!fGoodAnode[ian]) continue;
121     for(Int_t itb=fFirstGoodTB;itb<=fLastGoodTB;itb++){
122       Float_t cmnCoef=cmnOdd[itb];
123       if(ian%2==0) cmnCoef=cmnEven[itb];
124       num+=(hrawd->GetBinContent(itb+1,ian+1)-sum[ian])*cmnCoef;
125       den+=TMath::Power(cmnCoef,2);
126     }
127     if(den!=0) fSumCMN[ian]+=num/den;
128   }
129
130   delete [] cmnEven;
131   delete [] cmnOdd;
132 }
133 //______________________________________________________________________
134 Float_t AliITSOnlineSDDBase::GetMinimumBaseline() const {
135   // returns anode with minum baseline value in hybrid
136   Float_t basMin=1008.;
137   for(Int_t ian=0;ian<fgkNAnodes;ian++){
138     if(!fGoodAnode[ian]) continue;
139     Float_t bas=GetAnodeBaseline(ian);
140     if(bas>0 && bas < basMin) basMin=bas;
141   }
142   return basMin;
143 }
144 //______________________________________________________________________
145 Float_t AliITSOnlineSDDBase::CalcMeanRawNoise() const{
146   //
147   Float_t meanns=0.;
148   Int_t cnt=0;
149   for(Int_t ian=0;ian<fgkNAnodes;ian++){
150     if(!fGoodAnode[ian]) continue;  
151     meanns+=GetAnodeRawNoise(ian);
152     cnt++;
153   }
154   if(cnt>0) meanns/=(Float_t)cnt;
155   return meanns;
156 }
157 //______________________________________________________________________
158 void AliITSOnlineSDDBase::WriteToASCII(){
159   //
160   Char_t outfilnam[100];
161   Float_t basMin=GetMinimumBaseline();
162   sprintf(outfilnam,"SDDbase_step1_ddl%02dc%02d_sid%d.data",fDDL,fCarlos,fSide);
163   FILE* outf=fopen(outfilnam,"w");
164   Float_t corrnoise=2.;
165   for(Int_t ian=0;ian<fgkNAnodes;ian++){
166     Float_t bas=GetAnodeBaseline(ian);
167     Int_t corr=(Int_t)(bas-basMin+0.5);
168     if(corr>63) corr=63; // only 6 bits in jtag for correction
169     if(corr<0) corr=0; // avoid negative numbers
170     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);
171   }
172   fclose(outf);  
173 }