]> git.uio.no Git - u/mrichter/AliRoot.git/blame - FMD/AliFMDCalibGain.cxx
Fix
[u/mrichter/AliRoot.git] / FMD / AliFMDCalibGain.cxx
CommitLineData
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 AliFMDCalibGain.cxx
17 @author Christian Holm Christensen <cholm@nbi.dk>
18 @date Sun Mar 26 18:30:02 2006
19 @brief Per strip gain calibration
20*/
a3537838 21//____________________________________________________________________
22//
02a27b50 23// Gain value and width for each strip in the FMD.
24// Foo
25// Bar
26// Baz
27// Gnus
a3537838 28//
29#include "AliFMDCalibGain.h" // ALIFMDCALIBGAIN_H
e064ab4a 30#include <iostream>
31#include <TString.h>
32#include <AliLog.h>
f560b28c 33#include "AliFMDDebug.h"
34
35#include "AliFMDBoolMap.h"
36
e064ab4a 37
a3537838 38//____________________________________________________________________
39ClassImp(AliFMDCalibGain)
40#if 0
41 ; // This is here to keep Emacs for indenting the next line
42#endif
43
44//____________________________________________________________________
45AliFMDCalibGain::AliFMDCalibGain()
021f1396 46 : fValue(0), // nDet == 0 mean 51200 slots
b5ee4425 47 fThreshold(-1.)
a3537838 48{
02a27b50 49 // CTOR
a3537838 50 fValue.Reset(-1.);
51 fThreshold = -1.;
52}
53
54//____________________________________________________________________
55AliFMDCalibGain::AliFMDCalibGain(const AliFMDCalibGain& o)
b5ee4425 56 : TObject(o),
57 fValue(o.fValue),
58 fThreshold(o.fThreshold)
02a27b50 59{
60 // Copy CTOR
61}
a3537838 62
63//____________________________________________________________________
64AliFMDCalibGain&
65AliFMDCalibGain::operator=(const AliFMDCalibGain& o)
66{
02a27b50 67 // Assignment operator
d015ecfe 68 if (&o == this) return *this;
a3537838 69 fValue = o.fValue;
70 fThreshold = o.fThreshold;
71 return (*this);
72}
73
74//____________________________________________________________________
75void
76AliFMDCalibGain::Set(UShort_t det, Char_t ring, UShort_t sec,
77 UShort_t str, Float_t val)
78{
02a27b50 79 // Set the value for a strip
a3537838 80 if (fValue.CheckIndex(det, ring, sec, str) < 0) return;
81 fValue(det, ring, sec, str) = val;
82}
83
84//____________________________________________________________________
85Float_t
86AliFMDCalibGain::Value(UShort_t det, Char_t ring, UShort_t sec,
87 UShort_t str)
88{
02a27b50 89 // Get the value for a strip
a3537838 90 return fValue(det, ring, sec, str);
91}
92
f560b28c 93//____________________________________________________________________
94namespace {
95 struct MakeDead : public AliFMDMap::ForOne
96 {
97 MakeDead(AliFMDBoolMap* dead, Float_t min, Float_t max)
98 : fDead(dead), fMin(min), fMax(max), fCount(0)
99 {}
100 MakeDead(const MakeDead& other)
dbac3484 101 : AliFMDMap::ForOne(other),
102 fDead(other.fDead), fMin(other.fMin), fMax(other.fMax),
f560b28c 103 fCount(other.fCount)
104 {}
105 MakeDead& operator=(const MakeDead& other)
106 {
d015ecfe 107 if (&other == this) return *this;
f560b28c 108 fDead = other.fDead;
109 fMin = other.fMin;
110 fMax = other.fMax;
111 fCount = other.fCount;
112 return *this;
113 }
114 Bool_t operator()(UShort_t d, Char_t r, UShort_t s, UShort_t t, Float_t v)
115 {
116 AliDebugGeneral("AliFMDCalibGain::MakeDeadMap", 100,
117 Form("Checking if gain of FMD%d%c[%2d,%3d]=%f "
118 "is out of range [%f,%f]",
119 d, r, s, t, v, fMin, fMax));
120 if (v > fMax || v < fMin) {
121 fDead->operator()(d,r,s,t) = kTRUE;
122 fCount++;
123 }
124 return kTRUE;
125 }
126 Bool_t operator()(UShort_t, Char_t, UShort_t, UShort_t, Int_t)
127 { return kFALSE; }
128 Bool_t operator()(UShort_t, Char_t, UShort_t, UShort_t, UShort_t)
129 { return kFALSE; }
130 Bool_t operator()(UShort_t, Char_t, UShort_t, UShort_t, Bool_t)
131 { return kFALSE; }
132 AliFMDBoolMap* fDead;
133 Float_t fMin;
134 Float_t fMax;
135 Int_t fCount;
136 };
137}
138
139//____________________________________________________________________
140AliFMDBoolMap*
141AliFMDCalibGain::MakeDeadMap(Float_t min, Float_t max,
142 AliFMDBoolMap* dead) const
143{
144 if (!dead) {
145 dead = new AliFMDBoolMap(0,0,0,0);
146 dead->Reset(kFALSE);
147 }
148 MakeDead dm(dead, min, max);
149 fValue.ForEach(dm);
150 AliFMDDebug(1, ("Found a total of %d dead channels", dm.fCount));
151 return dead;
152}
153
e064ab4a 154//____________________________________________________________________
155Bool_t
156AliFMDCalibGain::ReadFromFile(std::istream& in)
157{
158 //Get header (how long is it ?)
159 TString header;
160 header.ReadLine(in);
161 header.ToLower();
162 if(!header.Contains("gains")) {
163 AliError("File does not contain gains!");
164 return kFALSE;;
165 }
166
167 // Read column headers
168 header.ReadLine(in);
169
170 int lineno = 2;
171 // Read until EOF
172 while(in.peek()!=EOF) {
173 if(in.bad()) {
174 AliError(Form("Bad read at line %d of input", lineno));
175 break;
176 }
177 UShort_t det, sec, strip;
178 Char_t ring;
179
180 Float_t gain,error, chi2ndf;
181 Char_t c[6];
182
183 in >> det >> c[0]
184 >> ring >> c[1]
185 >> sec >> c[2]
186 >> strip >> c[3]
187 >> gain >> c[4]
188 >> error >> c[5]
189 >> chi2ndf;
190 lineno++;
191 Set(det,ring,sec,strip,gain);
192 }
193 return kTRUE;
194}
a3537838 195//____________________________________________________________________
196//
197// EOF
198//