ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
/* $Id$ */
/** @file    AliFMDCalibGain.cxx
    @author  Christian Holm Christensen <cholm@nbi.dk>
    @date    Sun Mar 26 18:30:02 2006
    @brief   Per strip gain calibration 
*/
//____________________________________________________________________
//                                                                          
// Gain value and width for each strip in the FMD. 
// Foo 
// Bar 
// Baz
// Gnus
//
#include "AliFMDCalibGain.h"	// ALIFMDCALIBGAIN_H
#include <iostream>
#include <TString.h>
#include <AliLog.h>
#include "AliFMDDebug.h"

#include "AliFMDBoolMap.h"


//____________________________________________________________________
ClassImp(AliFMDCalibGain)
#if 0
  ; // This is here to keep Emacs for indenting the next line
#endif

//____________________________________________________________________
AliFMDCalibGain::AliFMDCalibGain()
  : fValue(0), // nDet == 0 mean 51200 slots
    fThreshold(-1.)
{
  // CTOR
  fValue.Reset(-1.);
  fThreshold = -1.;
}

//____________________________________________________________________
AliFMDCalibGain::AliFMDCalibGain(const AliFMDCalibGain& o)
  : TObject(o), 
    fValue(o.fValue), 
    fThreshold(o.fThreshold)
{
  // Copy CTOR 
}

//____________________________________________________________________
AliFMDCalibGain&
AliFMDCalibGain::operator=(const AliFMDCalibGain& o)
{
  // Assignment operator 
  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)
{
  // Set the value for a strip 
  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)
{
  // Get the value for a strip 
  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)
{
  //Get header (how long is it ?)
  TString header;
  header.ReadLine(in);
  header.ToLower();
  if(!header.Contains("gains")) {
    AliError("File does not contain gains!");
    return kFALSE;;
  }

  // Read column headers
  header.ReadLine(in);
  
  int lineno  = 2;
  // Read until EOF 
  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;
}
//____________________________________________________________________
//
// EOF
//
 AliFMDCalibGain.cxx:1
 AliFMDCalibGain.cxx:2
 AliFMDCalibGain.cxx:3
 AliFMDCalibGain.cxx:4
 AliFMDCalibGain.cxx:5
 AliFMDCalibGain.cxx:6
 AliFMDCalibGain.cxx:7
 AliFMDCalibGain.cxx:8
 AliFMDCalibGain.cxx:9
 AliFMDCalibGain.cxx:10
 AliFMDCalibGain.cxx:11
 AliFMDCalibGain.cxx:12
 AliFMDCalibGain.cxx:13
 AliFMDCalibGain.cxx:14
 AliFMDCalibGain.cxx:15
 AliFMDCalibGain.cxx:16
 AliFMDCalibGain.cxx:17
 AliFMDCalibGain.cxx:18
 AliFMDCalibGain.cxx:19
 AliFMDCalibGain.cxx:20
 AliFMDCalibGain.cxx:21
 AliFMDCalibGain.cxx:22
 AliFMDCalibGain.cxx:23
 AliFMDCalibGain.cxx:24
 AliFMDCalibGain.cxx:25
 AliFMDCalibGain.cxx:26
 AliFMDCalibGain.cxx:27
 AliFMDCalibGain.cxx:28
 AliFMDCalibGain.cxx:29
 AliFMDCalibGain.cxx:30
 AliFMDCalibGain.cxx:31
 AliFMDCalibGain.cxx:32
 AliFMDCalibGain.cxx:33
 AliFMDCalibGain.cxx:34
 AliFMDCalibGain.cxx:35
 AliFMDCalibGain.cxx:36
 AliFMDCalibGain.cxx:37
 AliFMDCalibGain.cxx:38
 AliFMDCalibGain.cxx:39
 AliFMDCalibGain.cxx:40
 AliFMDCalibGain.cxx:41
 AliFMDCalibGain.cxx:42
 AliFMDCalibGain.cxx:43
 AliFMDCalibGain.cxx:44
 AliFMDCalibGain.cxx:45
 AliFMDCalibGain.cxx:46
 AliFMDCalibGain.cxx:47
 AliFMDCalibGain.cxx:48
 AliFMDCalibGain.cxx:49
 AliFMDCalibGain.cxx:50
 AliFMDCalibGain.cxx:51
 AliFMDCalibGain.cxx:52
 AliFMDCalibGain.cxx:53
 AliFMDCalibGain.cxx:54
 AliFMDCalibGain.cxx:55
 AliFMDCalibGain.cxx:56
 AliFMDCalibGain.cxx:57
 AliFMDCalibGain.cxx:58
 AliFMDCalibGain.cxx:59
 AliFMDCalibGain.cxx:60
 AliFMDCalibGain.cxx:61
 AliFMDCalibGain.cxx:62
 AliFMDCalibGain.cxx:63
 AliFMDCalibGain.cxx:64
 AliFMDCalibGain.cxx:65
 AliFMDCalibGain.cxx:66
 AliFMDCalibGain.cxx:67
 AliFMDCalibGain.cxx:68
 AliFMDCalibGain.cxx:69
 AliFMDCalibGain.cxx:70
 AliFMDCalibGain.cxx:71
 AliFMDCalibGain.cxx:72
 AliFMDCalibGain.cxx:73
 AliFMDCalibGain.cxx:74
 AliFMDCalibGain.cxx:75
 AliFMDCalibGain.cxx:76
 AliFMDCalibGain.cxx:77
 AliFMDCalibGain.cxx:78
 AliFMDCalibGain.cxx:79
 AliFMDCalibGain.cxx:80
 AliFMDCalibGain.cxx:81
 AliFMDCalibGain.cxx:82
 AliFMDCalibGain.cxx:83
 AliFMDCalibGain.cxx:84
 AliFMDCalibGain.cxx:85
 AliFMDCalibGain.cxx:86
 AliFMDCalibGain.cxx:87
 AliFMDCalibGain.cxx:88
 AliFMDCalibGain.cxx:89
 AliFMDCalibGain.cxx:90
 AliFMDCalibGain.cxx:91
 AliFMDCalibGain.cxx:92
 AliFMDCalibGain.cxx:93
 AliFMDCalibGain.cxx:94
 AliFMDCalibGain.cxx:95
 AliFMDCalibGain.cxx:96
 AliFMDCalibGain.cxx:97
 AliFMDCalibGain.cxx:98
 AliFMDCalibGain.cxx:99
 AliFMDCalibGain.cxx:100
 AliFMDCalibGain.cxx:101
 AliFMDCalibGain.cxx:102
 AliFMDCalibGain.cxx:103
 AliFMDCalibGain.cxx:104
 AliFMDCalibGain.cxx:105
 AliFMDCalibGain.cxx:106
 AliFMDCalibGain.cxx:107
 AliFMDCalibGain.cxx:108
 AliFMDCalibGain.cxx:109
 AliFMDCalibGain.cxx:110
 AliFMDCalibGain.cxx:111
 AliFMDCalibGain.cxx:112
 AliFMDCalibGain.cxx:113
 AliFMDCalibGain.cxx:114
 AliFMDCalibGain.cxx:115
 AliFMDCalibGain.cxx:116
 AliFMDCalibGain.cxx:117
 AliFMDCalibGain.cxx:118
 AliFMDCalibGain.cxx:119
 AliFMDCalibGain.cxx:120
 AliFMDCalibGain.cxx:121
 AliFMDCalibGain.cxx:122
 AliFMDCalibGain.cxx:123
 AliFMDCalibGain.cxx:124
 AliFMDCalibGain.cxx:125
 AliFMDCalibGain.cxx:126
 AliFMDCalibGain.cxx:127
 AliFMDCalibGain.cxx:128
 AliFMDCalibGain.cxx:129
 AliFMDCalibGain.cxx:130
 AliFMDCalibGain.cxx:131
 AliFMDCalibGain.cxx:132
 AliFMDCalibGain.cxx:133
 AliFMDCalibGain.cxx:134
 AliFMDCalibGain.cxx:135
 AliFMDCalibGain.cxx:136
 AliFMDCalibGain.cxx:137
 AliFMDCalibGain.cxx:138
 AliFMDCalibGain.cxx:139
 AliFMDCalibGain.cxx:140
 AliFMDCalibGain.cxx:141
 AliFMDCalibGain.cxx:142
 AliFMDCalibGain.cxx:143
 AliFMDCalibGain.cxx:144
 AliFMDCalibGain.cxx:145
 AliFMDCalibGain.cxx:146
 AliFMDCalibGain.cxx:147
 AliFMDCalibGain.cxx:148
 AliFMDCalibGain.cxx:149
 AliFMDCalibGain.cxx:150
 AliFMDCalibGain.cxx:151
 AliFMDCalibGain.cxx:152
 AliFMDCalibGain.cxx:153
 AliFMDCalibGain.cxx:154
 AliFMDCalibGain.cxx:155
 AliFMDCalibGain.cxx:156
 AliFMDCalibGain.cxx:157
 AliFMDCalibGain.cxx:158
 AliFMDCalibGain.cxx:159
 AliFMDCalibGain.cxx:160
 AliFMDCalibGain.cxx:161
 AliFMDCalibGain.cxx:162
 AliFMDCalibGain.cxx:163
 AliFMDCalibGain.cxx:164
 AliFMDCalibGain.cxx:165
 AliFMDCalibGain.cxx:166
 AliFMDCalibGain.cxx:167
 AliFMDCalibGain.cxx:168
 AliFMDCalibGain.cxx:169
 AliFMDCalibGain.cxx:170
 AliFMDCalibGain.cxx:171
 AliFMDCalibGain.cxx:172
 AliFMDCalibGain.cxx:173
 AliFMDCalibGain.cxx:174
 AliFMDCalibGain.cxx:175
 AliFMDCalibGain.cxx:176
 AliFMDCalibGain.cxx:177
 AliFMDCalibGain.cxx:178
 AliFMDCalibGain.cxx:179
 AliFMDCalibGain.cxx:180
 AliFMDCalibGain.cxx:181
 AliFMDCalibGain.cxx:182
 AliFMDCalibGain.cxx:183
 AliFMDCalibGain.cxx:184
 AliFMDCalibGain.cxx:185
 AliFMDCalibGain.cxx:186
 AliFMDCalibGain.cxx:187
 AliFMDCalibGain.cxx:188
 AliFMDCalibGain.cxx:189
 AliFMDCalibGain.cxx:190
 AliFMDCalibGain.cxx:191
 AliFMDCalibGain.cxx:192
 AliFMDCalibGain.cxx:193
 AliFMDCalibGain.cxx:194
 AliFMDCalibGain.cxx:195
 AliFMDCalibGain.cxx:196
 AliFMDCalibGain.cxx:197
 AliFMDCalibGain.cxx:198