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