]> git.uio.no Git - u/mrichter/AliRoot.git/blob - FMD/AliFMDCalibPedestal.cxx
Fixed a DA disabling bug
[u/mrichter/AliRoot.git] / FMD / AliFMDCalibPedestal.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, 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 /* $Id$ */
16 /** @file    AliFMDCalibPedestal.cxx
17     @author  Christian Holm Christensen <cholm@nbi.dk>
18     @date    Sun Mar 26 18:30:36 2006
19     @brief   Per strip pedestal calibration 
20     @ingroup FMD_base
21 */
22 //____________________________________________________________________
23 //                                                                          
24 // This class stores a pedestal and pedestal width for each strip in
25 // the FMD detectors. 
26 // The values are stored as floats, since they may be results from a
27 // fit. 
28 // Need to make algorithm that makes this data
29 //
30 #include "AliFMDCalibPedestal.h"        // ALIFMDCALIBPEDESTAL_H
31 #include <iostream>
32 #include <TString.h>
33 #include <AliLog.h>
34 #include "AliFMDDebug.h"
35 #include "AliFMDBoolMap.h"
36
37 //____________________________________________________________________
38 ClassImp(AliFMDCalibPedestal)
39 #if 0
40   ; // This is here to keep Emacs for indenting the next line
41 #endif
42
43 //____________________________________________________________________
44 AliFMDCalibPedestal::AliFMDCalibPedestal()
45   : fValue(0), // nDet == 0 mean 51200 entries 
46     fWidth(0)  // nDet == 0 mean 51200 entries
47 {
48   // CTOR 
49   fValue.Reset(-1.);
50   fWidth.Reset(-1.);
51 }
52
53 //____________________________________________________________________
54 AliFMDCalibPedestal::AliFMDCalibPedestal(const AliFMDCalibPedestal& o)
55   : TObject(o), 
56     fValue(o.fValue), 
57     fWidth(o.fWidth)
58 {
59   // Copy Ctor 
60 }
61
62 //____________________________________________________________________
63 AliFMDCalibPedestal&
64 AliFMDCalibPedestal::operator=(const AliFMDCalibPedestal& o)
65 {
66   // Assignment operator 
67   fValue = o.fValue;
68   fWidth = o.fWidth;
69   return (*this);
70 }
71
72 //____________________________________________________________________
73 void
74 AliFMDCalibPedestal::Set(UShort_t det, Char_t ring, UShort_t sec, 
75                          UShort_t str, Float_t ped, Float_t pedW)
76 {
77   // set value and width for a strip 
78   if (fValue.CheckIndex(det, ring, sec, str) < 0) return;
79   fValue(det, ring, sec, str) = ped;
80   fWidth(det, ring, sec, str) = pedW;
81 }
82
83 //____________________________________________________________________
84 Float_t
85 AliFMDCalibPedestal::Value(UShort_t det, Char_t ring, UShort_t sec, 
86                            UShort_t str)
87 {
88   // Get pedestal value for a strip 
89   return fValue(det, ring, sec, str);
90 }
91
92 //____________________________________________________________________
93 Float_t
94 AliFMDCalibPedestal::Width(UShort_t det, Char_t ring, UShort_t sec, 
95                            UShort_t str)
96 {
97   // Get pedestal width for a strip 
98   return fWidth(det, ring, sec, str);
99 }
100
101 //____________________________________________________________________
102 namespace {
103   struct MakeDead : public AliFMDMap::ForOne
104   {
105     MakeDead(AliFMDBoolMap* dead, Float_t max) 
106       : fDead(dead), fMax(max), fCount(0)
107     {}
108     MakeDead(const MakeDead& other) 
109       : AliFMDMap::ForOne(other),
110         fDead(other.fDead), fMax(other.fMax), fCount(other.fCount)
111     {}
112     MakeDead& operator=(const MakeDead& other) 
113     { 
114       fDead   = other.fDead;
115       fMax    = other.fMax;
116       fCount  = other.fCount;
117       return *this;
118     }
119     Bool_t operator()(UShort_t d, Char_t r, UShort_t s, UShort_t t, Float_t v)
120     {
121       AliDebugGeneral("AliFMDCalibPedestal::MakeDeadMap", 100, 
122                       Form("Checking if noise of FMD%d%c[%2d,%3d]=%f "
123                               "is larger than %f", d, r, s, t, v, fMax));
124       if (v > fMax) {
125         fDead->operator()(d,r,s,t) = kTRUE;
126         fCount++;
127       }
128       return kTRUE;
129     }
130     Bool_t operator()(UShort_t, Char_t, UShort_t, UShort_t, Int_t) 
131     { return kFALSE; }
132     Bool_t operator()(UShort_t, Char_t, UShort_t, UShort_t, UShort_t)
133     { return kFALSE; }
134     Bool_t operator()(UShort_t, Char_t, UShort_t, UShort_t, Bool_t)
135     { return kFALSE; }
136     AliFMDBoolMap* fDead;
137     Float_t        fMax;
138     Int_t          fCount;
139   };
140 }
141
142 //____________________________________________________________________
143 AliFMDBoolMap*
144 AliFMDCalibPedestal::MakeDeadMap(Float_t maxW, AliFMDBoolMap* dead) const
145 {
146   if (!dead) { 
147     dead = new AliFMDBoolMap(0,0,0,0);
148     dead->Reset(kFALSE);
149   }
150   MakeDead dm(dead, maxW);
151   fWidth.ForEach(dm);
152   AliFMDDebug(1, ("Found a total of %d dead channels", dm.fCount));
153   return dead;
154 }
155
156 //____________________________________________________________________
157 Bool_t
158 AliFMDCalibPedestal::ReadFromFile(std::istream& in)
159 {
160   // Get header (how long is it ?)
161   TString header;
162   header.ReadLine(in);
163   header.ToLower();
164   if(!header.Contains("pedestals")) {
165     AliError("File does not contain pedestals!");
166     return kFALSE;
167   }
168     
169   // Read columns line
170   int lineno = 2;
171   header.ReadLine(in);
172     
173   // Loop until EOF
174   while(in.peek()!=EOF) {
175     if(in.bad()) { 
176       AliError(Form("Bad read at line %d in input", lineno));
177       break;
178     }
179     UShort_t det, sec, strip;
180     Char_t ring;
181     Float_t ped, noise, mu, sigma, chi2ndf;
182     Char_t c[8];
183           
184     in >> det      >> c[0] 
185        >> ring     >> c[1]
186        >> sec      >> c[2]
187        >> strip    >> c[3]
188        >> ped      >> c[4]
189        >> noise    >> c[5]
190        >> mu       >> c[6]
191        >> sigma    >> c[7]
192        >> chi2ndf;
193     lineno++;
194       
195     Set(det,ring,sec,strip,ped,noise);
196   }
197   return kTRUE;
198 }
199 //____________________________________________________________________
200 //
201 // EOF
202 //