Bringing CMakeLists under svn maintenance
[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   if (&o == this) return *this; 
68   fValue = o.fValue;
69   fWidth = o.fWidth;
70   return (*this);
71 }
72
73 //____________________________________________________________________
74 void
75 AliFMDCalibPedestal::Set(UShort_t det, Char_t ring, UShort_t sec, 
76                          UShort_t str, Float_t ped, Float_t pedW)
77 {
78   // set value and width for a strip 
79   if (fValue.CheckIndex(det, ring, sec, str) < 0) return;
80   fValue(det, ring, sec, str) = ped;
81   fWidth(det, ring, sec, str) = pedW;
82 }
83
84 //____________________________________________________________________
85 Float_t
86 AliFMDCalibPedestal::Value(UShort_t det, Char_t ring, UShort_t sec, 
87                            UShort_t str)
88 {
89   // Get pedestal value for a strip 
90   return fValue(det, ring, sec, str);
91 }
92
93 //____________________________________________________________________
94 Float_t
95 AliFMDCalibPedestal::Width(UShort_t det, Char_t ring, UShort_t sec, 
96                            UShort_t str)
97 {
98   // Get pedestal width for a strip 
99   return fWidth(det, ring, sec, str);
100 }
101
102 //____________________________________________________________________
103 namespace {
104   struct MakeDead : public AliFMDMap::ForOne
105   {
106     MakeDead(AliFMDBoolMap* dead, Float_t max) 
107       : fDead(dead), fMax(max), fCount(0)
108     {}
109     MakeDead(const MakeDead& other) 
110       : AliFMDMap::ForOne(other),
111         fDead(other.fDead), fMax(other.fMax), fCount(other.fCount)
112     {}
113     MakeDead& operator=(const MakeDead& other) 
114     { 
115       if (&other == this) return *this; 
116       fDead   = other.fDead;
117       fMax    = other.fMax;
118       fCount  = other.fCount;
119       return *this;
120     }
121     Bool_t operator()(UShort_t d, Char_t r, UShort_t s, UShort_t t, Float_t v)
122     {
123       AliDebugGeneral("AliFMDCalibPedestal::MakeDeadMap", 100, 
124                       Form("Checking if noise of FMD%d%c[%2d,%3d]=%f "
125                               "is larger than %f", d, r, s, t, v, fMax));
126       if (v > fMax) {
127         fDead->operator()(d,r,s,t) = kTRUE;
128         fCount++;
129       }
130       return kTRUE;
131     }
132     Bool_t operator()(UShort_t, Char_t, UShort_t, UShort_t, Int_t) 
133     { return kFALSE; }
134     Bool_t operator()(UShort_t, Char_t, UShort_t, UShort_t, UShort_t)
135     { return kFALSE; }
136     Bool_t operator()(UShort_t, Char_t, UShort_t, UShort_t, Bool_t)
137     { return kFALSE; }
138     AliFMDBoolMap* fDead;
139     Float_t        fMax;
140     Int_t          fCount;
141   };
142 }
143
144 //____________________________________________________________________
145 AliFMDBoolMap*
146 AliFMDCalibPedestal::MakeDeadMap(Float_t maxW, AliFMDBoolMap* dead) const
147 {
148   // 
149   // Make a dead map based on the noise of the channels.  If the noise
150   // of a paraticular channel is larger than @a maxW, then the channel
151   // is marked as dead. 
152   //
153   // If the argument @a dead is non-null, then the map passed is
154   // modified.  That is, channels marked as dead in the map will
155   // remain marked.   Channels that meat the criterion (noise larger
156   // than @a maxW) will in addition be marked as dead. 
157   //
158   // If the argument @a dead is null, then a new map is created and a
159   // pointer to this will be returned. 
160   // 
161   // Parameters:
162   //    maxW Maximum value of noise for a channel before it is
163   // marked as dead. 
164   //    dead If non-null, then modify this map. 
165   // 
166   // Return:
167   //    A pointer to possibly newly allocated dead map. 
168   //
169  if (!dead) { 
170     dead = new AliFMDBoolMap(0,0,0,0);
171     dead->Reset(kFALSE);
172   }
173   MakeDead dm(dead, maxW);
174   fWidth.ForEach(dm);
175   AliFMDDebug(1, ("Found a total of %d dead channels", dm.fCount));
176   return dead;
177 }
178
179 //____________________________________________________________________
180 Bool_t
181 AliFMDCalibPedestal::ReadFromFile(std::istream& in)
182 {
183   //
184   // Read information from file and set values
185   // 
186   // Parameters:
187   //    inFile inputFile
188   //
189   TString header;
190   header.ReadLine(in);
191   header.ToLower();
192   if(!header.Contains("pedestals")) {
193     AliError("File does not contain pedestals!");
194     return kFALSE;
195   }
196     
197   // Read columns line
198   int lineno = 2;
199   header.ReadLine(in);
200     
201   // Loop until EOF
202   while(in.peek()!=EOF) {
203     if(in.bad()) { 
204       AliError(Form("Bad read at line %d in input", lineno));
205       break;
206     }
207     UShort_t det, sec, strip;
208     Char_t ring;
209     Float_t ped, noise, mu, sigma, chi2ndf;
210     Char_t c[8];
211           
212     in >> det      >> c[0] 
213        >> ring     >> c[1]
214        >> sec      >> c[2]
215        >> strip    >> c[3]
216        >> ped      >> c[4]
217        >> noise    >> c[5]
218        >> mu       >> c[6]
219        >> sigma    >> c[7]
220        >> chi2ndf;
221     lineno++;
222       
223     Set(det,ring,sec,strip,ped,noise);
224   }
225   return kTRUE;
226 }
227 //____________________________________________________________________
228 //
229 // EOF
230 //