Fixed Coverity issues
[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   // 
147   // Make a dead map based on the noise of the channels.  If the noise
148   // of a paraticular channel is larger than @a maxW, then the channel
149   // is marked as dead. 
150   //
151   // If the argument @a dead is non-null, then the map passed is
152   // modified.  That is, channels marked as dead in the map will
153   // remain marked.   Channels that meat the criterion (noise larger
154   // than @a maxW) will in addition be marked as dead. 
155   //
156   // If the argument @a dead is null, then a new map is created and a
157   // pointer to this will be returned. 
158   // 
159   // Parameters:
160   //    maxW Maximum value of noise for a channel before it is
161   // marked as dead. 
162   //    dead If non-null, then modify this map. 
163   // 
164   // Return:
165   //    A pointer to possibly newly allocated dead map. 
166   //
167  if (!dead) { 
168     dead = new AliFMDBoolMap(0,0,0,0);
169     dead->Reset(kFALSE);
170   }
171   MakeDead dm(dead, maxW);
172   fWidth.ForEach(dm);
173   AliFMDDebug(1, ("Found a total of %d dead channels", dm.fCount));
174   return dead;
175 }
176
177 //____________________________________________________________________
178 Bool_t
179 AliFMDCalibPedestal::ReadFromFile(std::istream& in)
180 {
181   //
182   // Read information from file and set values
183   // 
184   // Parameters:
185   //    inFile inputFile
186   //
187   TString header;
188   header.ReadLine(in);
189   header.ToLower();
190   if(!header.Contains("pedestals")) {
191     AliError("File does not contain pedestals!");
192     return kFALSE;
193   }
194     
195   // Read columns line
196   int lineno = 2;
197   header.ReadLine(in);
198     
199   // Loop until EOF
200   while(in.peek()!=EOF) {
201     if(in.bad()) { 
202       AliError(Form("Bad read at line %d in input", lineno));
203       break;
204     }
205     UShort_t det, sec, strip;
206     Char_t ring;
207     Float_t ped, noise, mu, sigma, chi2ndf;
208     Char_t c[8];
209           
210     in >> det      >> c[0] 
211        >> ring     >> c[1]
212        >> sec      >> c[2]
213        >> strip    >> c[3]
214        >> ped      >> c[4]
215        >> noise    >> c[5]
216        >> mu       >> c[6]
217        >> sigma    >> c[7]
218        >> chi2ndf;
219     lineno++;
220       
221     Set(det,ring,sec,strip,ped,noise);
222   }
223   return kTRUE;
224 }
225 //____________________________________________________________________
226 //
227 // EOF
228 //