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    AliFMDCalibPedestal.cxx
    @author  Christian Holm Christensen <cholm@nbi.dk>
    @date    Sun Mar 26 18:30:36 2006
    @brief   Per strip pedestal calibration 
    @ingroup FMD_base
*/
//____________________________________________________________________
//                                                                          
// This class stores a pedestal and pedestal width for each strip in
// the FMD detectors. 
// The values are stored as floats, since they may be results from a
// fit. 
// Need to make algorithm that makes this data
//
#include "AliFMDCalibPedestal.h"	// ALIFMDCALIBPEDESTAL_H
#include <iostream>
#include <TString.h>
#include <AliLog.h>
#include "AliFMDDebug.h"
#include "AliFMDBoolMap.h"

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

//____________________________________________________________________
AliFMDCalibPedestal::AliFMDCalibPedestal()
  : fValue(0), // nDet == 0 mean 51200 entries 
    fWidth(0)  // nDet == 0 mean 51200 entries
{
  // CTOR 
  fValue.Reset(-1.);
  fWidth.Reset(-1.);
}

//____________________________________________________________________
AliFMDCalibPedestal::AliFMDCalibPedestal(const AliFMDCalibPedestal& o)
  : TObject(o), 
    fValue(o.fValue), 
    fWidth(o.fWidth)
{
  // Copy Ctor 
}

//____________________________________________________________________
AliFMDCalibPedestal&
AliFMDCalibPedestal::operator=(const AliFMDCalibPedestal& o)
{
  // Assignment operator 
  if (&o == this) return *this; 
  fValue = o.fValue;
  fWidth = o.fWidth;
  return (*this);
}

//____________________________________________________________________
void
AliFMDCalibPedestal::Set(UShort_t det, Char_t ring, UShort_t sec, 
			 UShort_t str, Float_t ped, Float_t pedW)
{
  // set value and width for a strip 
  if (fValue.CheckIndex(det, ring, sec, str) < 0) return;
  fValue(det, ring, sec, str) = ped;
  fWidth(det, ring, sec, str) = pedW;
}

//____________________________________________________________________
Float_t
AliFMDCalibPedestal::Value(UShort_t det, Char_t ring, UShort_t sec, 
			   UShort_t str)
{
  // Get pedestal value for a strip 
  return fValue(det, ring, sec, str);
}

//____________________________________________________________________
Float_t
AliFMDCalibPedestal::Width(UShort_t det, Char_t ring, UShort_t sec, 
			   UShort_t str)
{
  // Get pedestal width for a strip 
  return fWidth(det, ring, sec, str);
}

//____________________________________________________________________
namespace {
  struct MakeDead : public AliFMDMap::ForOne
  {
    MakeDead(AliFMDBoolMap* dead, Float_t max) 
      : fDead(dead), fMax(max), fCount(0)
    {}
    MakeDead(const MakeDead& other) 
      : AliFMDMap::ForOne(other),
        fDead(other.fDead), fMax(other.fMax), fCount(other.fCount)
    {}
    MakeDead& operator=(const MakeDead& other) 
    { 
      if (&other == this) return *this; 
      fDead   = other.fDead;
      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("AliFMDCalibPedestal::MakeDeadMap", 100, 
		      Form("Checking if noise of FMD%d%c[%2d,%3d]=%f "
			      "is larger than %f", d, r, s, t, v, fMax));
      if (v > fMax) {
	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        fMax;
    Int_t          fCount;
  };
}

//____________________________________________________________________
AliFMDBoolMap*
AliFMDCalibPedestal::MakeDeadMap(Float_t maxW, AliFMDBoolMap* dead) const
{
  // 
  // Make a dead map based on the noise of the channels.  If the noise
  // of a paraticular channel is larger than @a maxW, then the channel
  // is marked as dead. 
  //
  // If the argument @a dead is non-null, then the map passed is
  // modified.  That is, channels marked as dead in the map will
  // remain marked.   Channels that meat the criterion (noise larger
  // than @a maxW) will in addition be marked as dead. 
  //
  // If the argument @a dead is null, then a new map is created and a
  // pointer to this will be returned. 
  // 
  // Parameters:
  //    maxW Maximum value of noise for a channel before it is
  // marked as dead. 
  //    dead If non-null, then modify this map. 
  // 
  // Return:
  //    A pointer to possibly newly allocated dead map. 
  //
 if (!dead) { 
    dead = new AliFMDBoolMap(0,0,0,0);
    dead->Reset(kFALSE);
  }
  MakeDead dm(dead, maxW);
  fWidth.ForEach(dm);
  AliFMDDebug(1, ("Found a total of %d dead channels", dm.fCount));
  return dead;
}

//____________________________________________________________________
Bool_t
AliFMDCalibPedestal::ReadFromFile(std::istream& in)
{
  //
  // Read information from file and set values
  // 
  // Parameters:
  //    inFile inputFile
  //
  TString header;
  header.ReadLine(in);
  header.ToLower();
  if(!header.Contains("pedestals")) {
    AliError("File does not contain pedestals!");
    return kFALSE;
  }
    
  // Read columns line
  int lineno = 2;
  header.ReadLine(in);
    
  // Loop until EOF
  while(in.peek()!=EOF) {
    if(in.bad()) { 
      AliError(Form("Bad read at line %d in input", lineno));
      break;
    }
    UShort_t det, sec, strip;
    Char_t ring;
    Float_t ped, noise, mu, sigma, chi2ndf;
    Char_t c[8];
	  
    in >> det      >> c[0] 
       >> ring     >> c[1]
       >> sec      >> c[2]
       >> strip    >> c[3]
       >> ped      >> c[4]
       >> noise    >> c[5]
       >> mu       >> c[6]
       >> sigma    >> c[7]
       >> chi2ndf;
    lineno++;
      
    Set(det,ring,sec,strip,ped,noise);
  }
  return kTRUE;
}
//____________________________________________________________________
//
// EOF
//
 AliFMDCalibPedestal.cxx:1
 AliFMDCalibPedestal.cxx:2
 AliFMDCalibPedestal.cxx:3
 AliFMDCalibPedestal.cxx:4
 AliFMDCalibPedestal.cxx:5
 AliFMDCalibPedestal.cxx:6
 AliFMDCalibPedestal.cxx:7
 AliFMDCalibPedestal.cxx:8
 AliFMDCalibPedestal.cxx:9
 AliFMDCalibPedestal.cxx:10
 AliFMDCalibPedestal.cxx:11
 AliFMDCalibPedestal.cxx:12
 AliFMDCalibPedestal.cxx:13
 AliFMDCalibPedestal.cxx:14
 AliFMDCalibPedestal.cxx:15
 AliFMDCalibPedestal.cxx:16
 AliFMDCalibPedestal.cxx:17
 AliFMDCalibPedestal.cxx:18
 AliFMDCalibPedestal.cxx:19
 AliFMDCalibPedestal.cxx:20
 AliFMDCalibPedestal.cxx:21
 AliFMDCalibPedestal.cxx:22
 AliFMDCalibPedestal.cxx:23
 AliFMDCalibPedestal.cxx:24
 AliFMDCalibPedestal.cxx:25
 AliFMDCalibPedestal.cxx:26
 AliFMDCalibPedestal.cxx:27
 AliFMDCalibPedestal.cxx:28
 AliFMDCalibPedestal.cxx:29
 AliFMDCalibPedestal.cxx:30
 AliFMDCalibPedestal.cxx:31
 AliFMDCalibPedestal.cxx:32
 AliFMDCalibPedestal.cxx:33
 AliFMDCalibPedestal.cxx:34
 AliFMDCalibPedestal.cxx:35
 AliFMDCalibPedestal.cxx:36
 AliFMDCalibPedestal.cxx:37
 AliFMDCalibPedestal.cxx:38
 AliFMDCalibPedestal.cxx:39
 AliFMDCalibPedestal.cxx:40
 AliFMDCalibPedestal.cxx:41
 AliFMDCalibPedestal.cxx:42
 AliFMDCalibPedestal.cxx:43
 AliFMDCalibPedestal.cxx:44
 AliFMDCalibPedestal.cxx:45
 AliFMDCalibPedestal.cxx:46
 AliFMDCalibPedestal.cxx:47
 AliFMDCalibPedestal.cxx:48
 AliFMDCalibPedestal.cxx:49
 AliFMDCalibPedestal.cxx:50
 AliFMDCalibPedestal.cxx:51
 AliFMDCalibPedestal.cxx:52
 AliFMDCalibPedestal.cxx:53
 AliFMDCalibPedestal.cxx:54
 AliFMDCalibPedestal.cxx:55
 AliFMDCalibPedestal.cxx:56
 AliFMDCalibPedestal.cxx:57
 AliFMDCalibPedestal.cxx:58
 AliFMDCalibPedestal.cxx:59
 AliFMDCalibPedestal.cxx:60
 AliFMDCalibPedestal.cxx:61
 AliFMDCalibPedestal.cxx:62
 AliFMDCalibPedestal.cxx:63
 AliFMDCalibPedestal.cxx:64
 AliFMDCalibPedestal.cxx:65
 AliFMDCalibPedestal.cxx:66
 AliFMDCalibPedestal.cxx:67
 AliFMDCalibPedestal.cxx:68
 AliFMDCalibPedestal.cxx:69
 AliFMDCalibPedestal.cxx:70
 AliFMDCalibPedestal.cxx:71
 AliFMDCalibPedestal.cxx:72
 AliFMDCalibPedestal.cxx:73
 AliFMDCalibPedestal.cxx:74
 AliFMDCalibPedestal.cxx:75
 AliFMDCalibPedestal.cxx:76
 AliFMDCalibPedestal.cxx:77
 AliFMDCalibPedestal.cxx:78
 AliFMDCalibPedestal.cxx:79
 AliFMDCalibPedestal.cxx:80
 AliFMDCalibPedestal.cxx:81
 AliFMDCalibPedestal.cxx:82
 AliFMDCalibPedestal.cxx:83
 AliFMDCalibPedestal.cxx:84
 AliFMDCalibPedestal.cxx:85
 AliFMDCalibPedestal.cxx:86
 AliFMDCalibPedestal.cxx:87
 AliFMDCalibPedestal.cxx:88
 AliFMDCalibPedestal.cxx:89
 AliFMDCalibPedestal.cxx:90
 AliFMDCalibPedestal.cxx:91
 AliFMDCalibPedestal.cxx:92
 AliFMDCalibPedestal.cxx:93
 AliFMDCalibPedestal.cxx:94
 AliFMDCalibPedestal.cxx:95
 AliFMDCalibPedestal.cxx:96
 AliFMDCalibPedestal.cxx:97
 AliFMDCalibPedestal.cxx:98
 AliFMDCalibPedestal.cxx:99
 AliFMDCalibPedestal.cxx:100
 AliFMDCalibPedestal.cxx:101
 AliFMDCalibPedestal.cxx:102
 AliFMDCalibPedestal.cxx:103
 AliFMDCalibPedestal.cxx:104
 AliFMDCalibPedestal.cxx:105
 AliFMDCalibPedestal.cxx:106
 AliFMDCalibPedestal.cxx:107
 AliFMDCalibPedestal.cxx:108
 AliFMDCalibPedestal.cxx:109
 AliFMDCalibPedestal.cxx:110
 AliFMDCalibPedestal.cxx:111
 AliFMDCalibPedestal.cxx:112
 AliFMDCalibPedestal.cxx:113
 AliFMDCalibPedestal.cxx:114
 AliFMDCalibPedestal.cxx:115
 AliFMDCalibPedestal.cxx:116
 AliFMDCalibPedestal.cxx:117
 AliFMDCalibPedestal.cxx:118
 AliFMDCalibPedestal.cxx:119
 AliFMDCalibPedestal.cxx:120
 AliFMDCalibPedestal.cxx:121
 AliFMDCalibPedestal.cxx:122
 AliFMDCalibPedestal.cxx:123
 AliFMDCalibPedestal.cxx:124
 AliFMDCalibPedestal.cxx:125
 AliFMDCalibPedestal.cxx:126
 AliFMDCalibPedestal.cxx:127
 AliFMDCalibPedestal.cxx:128
 AliFMDCalibPedestal.cxx:129
 AliFMDCalibPedestal.cxx:130
 AliFMDCalibPedestal.cxx:131
 AliFMDCalibPedestal.cxx:132
 AliFMDCalibPedestal.cxx:133
 AliFMDCalibPedestal.cxx:134
 AliFMDCalibPedestal.cxx:135
 AliFMDCalibPedestal.cxx:136
 AliFMDCalibPedestal.cxx:137
 AliFMDCalibPedestal.cxx:138
 AliFMDCalibPedestal.cxx:139
 AliFMDCalibPedestal.cxx:140
 AliFMDCalibPedestal.cxx:141
 AliFMDCalibPedestal.cxx:142
 AliFMDCalibPedestal.cxx:143
 AliFMDCalibPedestal.cxx:144
 AliFMDCalibPedestal.cxx:145
 AliFMDCalibPedestal.cxx:146
 AliFMDCalibPedestal.cxx:147
 AliFMDCalibPedestal.cxx:148
 AliFMDCalibPedestal.cxx:149
 AliFMDCalibPedestal.cxx:150
 AliFMDCalibPedestal.cxx:151
 AliFMDCalibPedestal.cxx:152
 AliFMDCalibPedestal.cxx:153
 AliFMDCalibPedestal.cxx:154
 AliFMDCalibPedestal.cxx:155
 AliFMDCalibPedestal.cxx:156
 AliFMDCalibPedestal.cxx:157
 AliFMDCalibPedestal.cxx:158
 AliFMDCalibPedestal.cxx:159
 AliFMDCalibPedestal.cxx:160
 AliFMDCalibPedestal.cxx:161
 AliFMDCalibPedestal.cxx:162
 AliFMDCalibPedestal.cxx:163
 AliFMDCalibPedestal.cxx:164
 AliFMDCalibPedestal.cxx:165
 AliFMDCalibPedestal.cxx:166
 AliFMDCalibPedestal.cxx:167
 AliFMDCalibPedestal.cxx:168
 AliFMDCalibPedestal.cxx:169
 AliFMDCalibPedestal.cxx:170
 AliFMDCalibPedestal.cxx:171
 AliFMDCalibPedestal.cxx:172
 AliFMDCalibPedestal.cxx:173
 AliFMDCalibPedestal.cxx:174
 AliFMDCalibPedestal.cxx:175
 AliFMDCalibPedestal.cxx:176
 AliFMDCalibPedestal.cxx:177
 AliFMDCalibPedestal.cxx:178
 AliFMDCalibPedestal.cxx:179
 AliFMDCalibPedestal.cxx:180
 AliFMDCalibPedestal.cxx:181
 AliFMDCalibPedestal.cxx:182
 AliFMDCalibPedestal.cxx:183
 AliFMDCalibPedestal.cxx:184
 AliFMDCalibPedestal.cxx:185
 AliFMDCalibPedestal.cxx:186
 AliFMDCalibPedestal.cxx:187
 AliFMDCalibPedestal.cxx:188
 AliFMDCalibPedestal.cxx:189
 AliFMDCalibPedestal.cxx:190
 AliFMDCalibPedestal.cxx:191
 AliFMDCalibPedestal.cxx:192
 AliFMDCalibPedestal.cxx:193
 AliFMDCalibPedestal.cxx:194
 AliFMDCalibPedestal.cxx:195
 AliFMDCalibPedestal.cxx:196
 AliFMDCalibPedestal.cxx:197
 AliFMDCalibPedestal.cxx:198
 AliFMDCalibPedestal.cxx:199
 AliFMDCalibPedestal.cxx:200
 AliFMDCalibPedestal.cxx:201
 AliFMDCalibPedestal.cxx:202
 AliFMDCalibPedestal.cxx:203
 AliFMDCalibPedestal.cxx:204
 AliFMDCalibPedestal.cxx:205
 AliFMDCalibPedestal.cxx:206
 AliFMDCalibPedestal.cxx:207
 AliFMDCalibPedestal.cxx:208
 AliFMDCalibPedestal.cxx:209
 AliFMDCalibPedestal.cxx:210
 AliFMDCalibPedestal.cxx:211
 AliFMDCalibPedestal.cxx:212
 AliFMDCalibPedestal.cxx:213
 AliFMDCalibPedestal.cxx:214
 AliFMDCalibPedestal.cxx:215
 AliFMDCalibPedestal.cxx:216
 AliFMDCalibPedestal.cxx:217
 AliFMDCalibPedestal.cxx:218
 AliFMDCalibPedestal.cxx:219
 AliFMDCalibPedestal.cxx:220
 AliFMDCalibPedestal.cxx:221
 AliFMDCalibPedestal.cxx:222
 AliFMDCalibPedestal.cxx:223
 AliFMDCalibPedestal.cxx:224
 AliFMDCalibPedestal.cxx:225
 AliFMDCalibPedestal.cxx:226
 AliFMDCalibPedestal.cxx:227
 AliFMDCalibPedestal.cxx:228
 AliFMDCalibPedestal.cxx:229
 AliFMDCalibPedestal.cxx:230