]>
Commit | Line | Data |
---|---|---|
a3537838 | 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 | **************************************************************************/ | |
a3537838 | 15 | /* $Id$ */ |
c2fc1258 | 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 | |
02a27b50 | 20 | @ingroup FMD_base |
c2fc1258 | 21 | */ |
a3537838 | 22 | //____________________________________________________________________ |
23 | // | |
02a27b50 | 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 | |
a3537838 | 29 | // |
30 | #include "AliFMDCalibPedestal.h" // ALIFMDCALIBPEDESTAL_H | |
e064ab4a | 31 | #include <iostream> |
32 | #include <TString.h> | |
33 | #include <AliLog.h> | |
f560b28c | 34 | #include "AliFMDDebug.h" |
35 | #include "AliFMDBoolMap.h" | |
e064ab4a | 36 | |
a3537838 | 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() | |
021f1396 | 45 | : fValue(0), // nDet == 0 mean 51200 entries |
46 | fWidth(0) // nDet == 0 mean 51200 entries | |
a3537838 | 47 | { |
02a27b50 | 48 | // CTOR |
a3537838 | 49 | fValue.Reset(-1.); |
50 | fWidth.Reset(-1.); | |
51 | } | |
52 | ||
53 | //____________________________________________________________________ | |
54 | AliFMDCalibPedestal::AliFMDCalibPedestal(const AliFMDCalibPedestal& o) | |
b5ee4425 | 55 | : TObject(o), |
56 | fValue(o.fValue), | |
57 | fWidth(o.fWidth) | |
02a27b50 | 58 | { |
59 | // Copy Ctor | |
60 | } | |
a3537838 | 61 | |
62 | //____________________________________________________________________ | |
63 | AliFMDCalibPedestal& | |
64 | AliFMDCalibPedestal::operator=(const AliFMDCalibPedestal& o) | |
65 | { | |
02a27b50 | 66 | // Assignment operator |
a3537838 | 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 | { | |
02a27b50 | 77 | // set value and width for a strip |
a3537838 | 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 | { | |
02a27b50 | 88 | // Get pedestal value for a strip |
a3537838 | 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 | { | |
02a27b50 | 97 | // Get pedestal width for a strip |
c2fc1258 | 98 | return fWidth(det, ring, sec, str); |
a3537838 | 99 | } |
100 | ||
e064ab4a | 101 | //____________________________________________________________________ |
f560b28c | 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) | |
dbac3484 | 109 | : AliFMDMap::ForOne(other), |
110 | fDead(other.fDead), fMax(other.fMax), fCount(other.fCount) | |
f560b28c | 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 | { | |
09b6c804 | 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) { | |
f560b28c | 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 | //____________________________________________________________________ | |
e064ab4a | 178 | Bool_t |
179 | AliFMDCalibPedestal::ReadFromFile(std::istream& in) | |
180 | { | |
09b6c804 | 181 | // |
182 | // Read information from file and set values | |
183 | // | |
184 | // Parameters: | |
185 | // inFile inputFile | |
186 | // | |
e064ab4a | 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 | } | |
a3537838 | 225 | //____________________________________________________________________ |
226 | // | |
227 | // EOF | |
228 | // |