#include "AliFMDCalibGain.h"
#include <iostream>
#include <TString.h>
#include <AliLog.h>
#include "AliFMDDebug.h"
#include "AliFMDBoolMap.h"
ClassImp(AliFMDCalibGain)
#if 0
;
#endif
AliFMDCalibGain::AliFMDCalibGain()
: fValue(0),
fThreshold(-1.)
{
fValue.Reset(-1.);
fThreshold = -1.;
}
AliFMDCalibGain::AliFMDCalibGain(const AliFMDCalibGain& o)
: TObject(o),
fValue(o.fValue),
fThreshold(o.fThreshold)
{
}
AliFMDCalibGain&
AliFMDCalibGain::operator=(const AliFMDCalibGain& o)
{
if (&o == this) return *this;
fValue = o.fValue;
fThreshold = o.fThreshold;
return (*this);
}
void
AliFMDCalibGain::Set(UShort_t det, Char_t ring, UShort_t sec,
UShort_t str, Float_t val)
{
if (fValue.CheckIndex(det, ring, sec, str) < 0) return;
fValue(det, ring, sec, str) = val;
}
Float_t
AliFMDCalibGain::Value(UShort_t det, Char_t ring, UShort_t sec,
UShort_t str)
{
return fValue(det, ring, sec, str);
}
namespace {
struct MakeDead : public AliFMDMap::ForOne
{
MakeDead(AliFMDBoolMap* dead, Float_t min, Float_t max)
: fDead(dead), fMin(min), fMax(max), fCount(0)
{}
MakeDead(const MakeDead& other)
: AliFMDMap::ForOne(other),
fDead(other.fDead), fMin(other.fMin), fMax(other.fMax),
fCount(other.fCount)
{}
MakeDead& operator=(const MakeDead& other)
{
if (&other == this) return *this;
fDead = other.fDead;
fMin = other.fMin;
fMax = other.fMax;
fCount = other.fCount;
return *this;
}
Bool_t operator()(UShort_t d, Char_t r, UShort_t s, UShort_t t, Float_t v)
{
AliDebugGeneral("AliFMDCalibGain::MakeDeadMap", 100,
Form("Checking if gain of FMD%d%c[%2d,%3d]=%f "
"is out of range [%f,%f]",
d, r, s, t, v, fMin, fMax));
if (v > fMax || v < fMin) {
fDead->operator()(d,r,s,t) = kTRUE;
fCount++;
}
return kTRUE;
}
Bool_t operator()(UShort_t, Char_t, UShort_t, UShort_t, Int_t)
{ return kFALSE; }
Bool_t operator()(UShort_t, Char_t, UShort_t, UShort_t, UShort_t)
{ return kFALSE; }
Bool_t operator()(UShort_t, Char_t, UShort_t, UShort_t, Bool_t)
{ return kFALSE; }
AliFMDBoolMap* fDead;
Float_t fMin;
Float_t fMax;
Int_t fCount;
};
}
AliFMDBoolMap*
AliFMDCalibGain::MakeDeadMap(Float_t min, Float_t max,
AliFMDBoolMap* dead) const
{
if (!dead) {
dead = new AliFMDBoolMap(0,0,0,0);
dead->Reset(kFALSE);
}
MakeDead dm(dead, min, max);
fValue.ForEach(dm);
AliFMDDebug(1, ("Found a total of %d dead channels", dm.fCount));
return dead;
}
Bool_t
AliFMDCalibGain::ReadFromFile(std::istream& in)
{
TString header;
header.ReadLine(in);
header.ToLower();
if(!header.Contains("gains")) {
AliError("File does not contain gains!");
return kFALSE;;
}
header.ReadLine(in);
int lineno = 2;
while(in.peek()!=EOF) {
if(in.bad()) {
AliError(Form("Bad read at line %d of input", lineno));
break;
}
UShort_t det, sec, strip;
Char_t ring;
Float_t gain,error, chi2ndf;
Char_t c[6];
in >> det >> c[0]
>> ring >> c[1]
>> sec >> c[2]
>> strip >> c[3]
>> gain >> c[4]
>> error >> c[5]
>> chi2ndf;
lineno++;
Set(det,ring,sec,strip,gain);
}
return kTRUE;
}