]>
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 |
d015ecfe | 67 | if (&o == this) return *this; |
a3537838 | 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 | { | |
02a27b50 | 78 | // set value and width for a strip |
a3537838 | 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 | { | |
02a27b50 | 89 | // Get pedestal value for a strip |
a3537838 | 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 | { | |
02a27b50 | 98 | // Get pedestal width for a strip |
c2fc1258 | 99 | return fWidth(det, ring, sec, str); |
a3537838 | 100 | } |
101 | ||
e064ab4a | 102 | //____________________________________________________________________ |
f560b28c | 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) | |
dbac3484 | 110 | : AliFMDMap::ForOne(other), |
111 | fDead(other.fDead), fMax(other.fMax), fCount(other.fCount) | |
f560b28c | 112 | {} |
113 | MakeDead& operator=(const MakeDead& other) | |
114 | { | |
d015ecfe | 115 | if (&other == this) return *this; |
f560b28c | 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 | { | |
09b6c804 | 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) { | |
f560b28c | 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 | //____________________________________________________________________ | |
e064ab4a | 180 | Bool_t |
181 | AliFMDCalibPedestal::ReadFromFile(std::istream& in) | |
182 | { | |
09b6c804 | 183 | // |
184 | // Read information from file and set values | |
185 | // | |
186 | // Parameters: | |
187 | // inFile inputFile | |
188 | // | |
e064ab4a | 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 | } | |
a3537838 | 227 | //____________________________________________________________________ |
228 | // | |
229 | // EOF | |
230 | // |