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$

#include "AliMUONCalibParamNF.h"

#include "AliLog.h"

#include "Riostream.h"
#include "TMath.h"
#include "TString.h"

#include <limits.h>

//-----------------------------------------------------------------------------
/// \class AliMUONCalibParamNF
///
/// Handle the case of N floating point parameters per channel.
///
/// \author Laurent Aphecetche
//-----------------------------------------------------------------------------

using std::cout;
using std::endl;
/// \cond CLASSIMP
ClassImp(AliMUONCalibParamNF)
/// \endcond

//_____________________________________________________________________________
AliMUONCalibParamNF::AliMUONCalibParamNF() 
: AliMUONVCalibParam(),
  fDimension(0),
  fSize(0),
  fN(0),
  fValues(0x0)
{
/// Default constructor.
}

//_____________________________________________________________________________
AliMUONCalibParamNF::AliMUONCalibParamNF(Int_t dimension, Int_t theSize, 
                                         Int_t id0, Int_t id1,
                                         Float_t fillWithValue) 
: AliMUONVCalibParam(id0,id1),
  fDimension(dimension),
  fSize(theSize),
  fN(fSize*fDimension),
  fValues(0x0)
{
/// Normal constructor, where theSize specifies the number of channels handled
/// by this object, and fillWithValue the default value assigned to each
/// channel.

  if ( fN > 0 )
  {
    fValues = new Float_t[fN];
    for ( Int_t i = 0; i < fN; ++i )
    {
      fValues[i] = fillWithValue;
    }
  }
}


//_____________________________________________________________________________
AliMUONCalibParamNF::AliMUONCalibParamNF(const AliMUONCalibParamNF& other) 
: AliMUONVCalibParam(),
fDimension(0),
fSize(0),
fN(0),
fValues(0x0)
{
/// Copy constructor.

  other.CopyTo(*this);
}

//_____________________________________________________________________________
AliMUONCalibParamNF&
AliMUONCalibParamNF::operator=(const AliMUONCalibParamNF& other) 
{
/// Assignment operator

  other.CopyTo(*this);
  return *this;
}

//_____________________________________________________________________________
AliMUONCalibParamNF::~AliMUONCalibParamNF()
{
/// Destructor

  delete[] fValues;
}

//_____________________________________________________________________________
void
AliMUONCalibParamNF::CopyTo(AliMUONCalibParamNF& destination) const
{
/// Copy *this to destination

  TObject::Copy(destination);
  
  delete[] destination.fValues;
  destination.fN = fN;
  destination.fSize = fSize;
  destination.fDimension = fDimension;
  
  if ( fN > 0 )
  {
    destination.fValues = new Float_t[fN];
    for ( Int_t i = 0; i < fN; ++i )
    {
      destination.fValues[i] = fValues[i];
    }
  }
}

//_____________________________________________________________________________
Int_t
AliMUONCalibParamNF::Index(Int_t i, Int_t j) const
{
/// Compute the 1D index of the internal storage from the pair (i,j)
/// Returns -1 if the (i,j) pair is invalid

  if ( i >= 0 && i < Size() && j >= 0 && j < Dimension() )
  {
    return IndexFast(i,j);
  }
  return -1;
}

//_____________________________________________________________________________
Int_t
AliMUONCalibParamNF::IndexFast(Int_t i, Int_t j) const
{
  /// Compute the 1D index of the internal storage from the pair (i,j)
  
  return i + Size()*j;
}

//_____________________________________________________________________________
void
AliMUONCalibParamNF::Print(Option_t* opt) const
{
/// Output this object to stdout.
/// If opt=="full", then all channels are printed, 
/// if opt=="mean#", only the mean and sigma value are printed for j-th dimension
/// otherwise only the general characteristics are printed.

  TString sopt(opt);
  sopt.ToUpper();
  cout << Form("AliMUONCalibParamNF Id=(%d,%d) Size=%d Dimension=%d",ID0(),
               ID1(),Size(),Dimension()) << endl;
  if ( sopt.Contains("FULL") )
  {
    for ( Int_t i = 0; i < Size(); ++i )
    {
      cout << Form("CH %3d",i);
      for ( Int_t j = 0; j < Dimension(); ++j )
      {
        cout << Form(" %e",ValueAsFloat(i,j));
      }
      cout << endl;
    }
  }  
  if ( sopt.Contains("MEAN") )
  {
    Int_t j(0);
    sscanf(sopt.Data(),"MEAN%d",&j);
    
    Float_t mean(0);
    Float_t v2(0);
    
    Int_t n = Size();
    
    for ( Int_t i = 0; i < Size(); ++i )
    {
      Float_t v = ValueAsFloat(i,j);
      mean += v;
      v2 += v*v;
    }
    mean /= n;
    float sigma = 0;
    if ( n > 1 ) sigma = TMath::Sqrt( (v2-n*mean*mean)/(n-1) );
    cout << Form(" Mean(j=%d)=%e Sigma(j=%d)=%e",j,mean,j,sigma) << endl;
  }
  
}

//_____________________________________________________________________________
void
AliMUONCalibParamNF::SetValueAsFloat(Int_t i, Int_t j, Float_t value)
{
/// Set one value as a float, after checking that the indices are correct.

  Int_t ix = Index(i,j);
  
  if ( ix < 0 )
  {
    AliError(Form("Invalid (i,j)=(%d,%d) max allowed is (%d,%d)",
                  i,j,Size()-1,Dimension()-1));
  }
  else
  {
    fValues[ix]=value;
  }
}

//_____________________________________________________________________________
void
AliMUONCalibParamNF::SetValueAsFloatFast(Int_t i, Int_t j, Float_t value)
{
  /// Set one value as a float, w/o checking that the indices are correct.
  
  fValues[IndexFast(i,j)] = value;
}

//_____________________________________________________________________________
void
AliMUONCalibParamNF::SetValueAsInt(Int_t i, Int_t j, Int_t value)
{
/// Set one value as an int.

  SetValueAsFloat(i,j,static_cast<Float_t>(value));
}

//_____________________________________________________________________________
void
AliMUONCalibParamNF::SetValueAsIntFast(Int_t i, Int_t j, Int_t value)
{
  /// Set one value as an int.
  
  SetValueAsFloatFast(i,j,static_cast<Float_t>(value));
}

//_____________________________________________________________________________
Float_t
AliMUONCalibParamNF::ValueAsFloat(Int_t i, Int_t j) const
{
/// Return the value as a float (which it is), after checking indices.

  Int_t ix = Index(i,j);
  
  if ( ix < 0 )
  {
    AliError(Form("Invalid (i,j)=(%d,%d) max allowed is (%d,%d)",
                  i,j,Size()-1,Dimension()-1));
    return 0.0;
  }
  else
  {
    return fValues[ix];
  }
}

//_____________________________________________________________________________
Float_t
AliMUONCalibParamNF::ValueAsFloatFast(Int_t i, Int_t j) const
{
  /// Return the value as a float (which it is), after checking indices.
  
  return fValues[IndexFast(i,j)];
}

//_____________________________________________________________________________
Int_t
AliMUONCalibParamNF::ValueAsInt(Int_t i, Int_t j) const
{
/// Return the value as an int, by rounding the internal float value.

  Float_t v = ValueAsFloat(i,j);
  
  if ( v >= Float_t(INT_MAX) ) {
    AliErrorStream() 
      << "Cannot convert value " << v << " to Int_t." << endl;
    return 0;
  }  
  
  return TMath::Nint(v);
}

//_____________________________________________________________________________
Int_t
AliMUONCalibParamNF::ValueAsIntFast(Int_t i, Int_t j) const
{
  /// Return the value as an int, by rounding the internal float value.
  
  Float_t v = ValueAsFloatFast(i,j);
  return TMath::Nint(v);
}
 AliMUONCalibParamNF.cxx:1
 AliMUONCalibParamNF.cxx:2
 AliMUONCalibParamNF.cxx:3
 AliMUONCalibParamNF.cxx:4
 AliMUONCalibParamNF.cxx:5
 AliMUONCalibParamNF.cxx:6
 AliMUONCalibParamNF.cxx:7
 AliMUONCalibParamNF.cxx:8
 AliMUONCalibParamNF.cxx:9
 AliMUONCalibParamNF.cxx:10
 AliMUONCalibParamNF.cxx:11
 AliMUONCalibParamNF.cxx:12
 AliMUONCalibParamNF.cxx:13
 AliMUONCalibParamNF.cxx:14
 AliMUONCalibParamNF.cxx:15
 AliMUONCalibParamNF.cxx:16
 AliMUONCalibParamNF.cxx:17
 AliMUONCalibParamNF.cxx:18
 AliMUONCalibParamNF.cxx:19
 AliMUONCalibParamNF.cxx:20
 AliMUONCalibParamNF.cxx:21
 AliMUONCalibParamNF.cxx:22
 AliMUONCalibParamNF.cxx:23
 AliMUONCalibParamNF.cxx:24
 AliMUONCalibParamNF.cxx:25
 AliMUONCalibParamNF.cxx:26
 AliMUONCalibParamNF.cxx:27
 AliMUONCalibParamNF.cxx:28
 AliMUONCalibParamNF.cxx:29
 AliMUONCalibParamNF.cxx:30
 AliMUONCalibParamNF.cxx:31
 AliMUONCalibParamNF.cxx:32
 AliMUONCalibParamNF.cxx:33
 AliMUONCalibParamNF.cxx:34
 AliMUONCalibParamNF.cxx:35
 AliMUONCalibParamNF.cxx:36
 AliMUONCalibParamNF.cxx:37
 AliMUONCalibParamNF.cxx:38
 AliMUONCalibParamNF.cxx:39
 AliMUONCalibParamNF.cxx:40
 AliMUONCalibParamNF.cxx:41
 AliMUONCalibParamNF.cxx:42
 AliMUONCalibParamNF.cxx:43
 AliMUONCalibParamNF.cxx:44
 AliMUONCalibParamNF.cxx:45
 AliMUONCalibParamNF.cxx:46
 AliMUONCalibParamNF.cxx:47
 AliMUONCalibParamNF.cxx:48
 AliMUONCalibParamNF.cxx:49
 AliMUONCalibParamNF.cxx:50
 AliMUONCalibParamNF.cxx:51
 AliMUONCalibParamNF.cxx:52
 AliMUONCalibParamNF.cxx:53
 AliMUONCalibParamNF.cxx:54
 AliMUONCalibParamNF.cxx:55
 AliMUONCalibParamNF.cxx:56
 AliMUONCalibParamNF.cxx:57
 AliMUONCalibParamNF.cxx:58
 AliMUONCalibParamNF.cxx:59
 AliMUONCalibParamNF.cxx:60
 AliMUONCalibParamNF.cxx:61
 AliMUONCalibParamNF.cxx:62
 AliMUONCalibParamNF.cxx:63
 AliMUONCalibParamNF.cxx:64
 AliMUONCalibParamNF.cxx:65
 AliMUONCalibParamNF.cxx:66
 AliMUONCalibParamNF.cxx:67
 AliMUONCalibParamNF.cxx:68
 AliMUONCalibParamNF.cxx:69
 AliMUONCalibParamNF.cxx:70
 AliMUONCalibParamNF.cxx:71
 AliMUONCalibParamNF.cxx:72
 AliMUONCalibParamNF.cxx:73
 AliMUONCalibParamNF.cxx:74
 AliMUONCalibParamNF.cxx:75
 AliMUONCalibParamNF.cxx:76
 AliMUONCalibParamNF.cxx:77
 AliMUONCalibParamNF.cxx:78
 AliMUONCalibParamNF.cxx:79
 AliMUONCalibParamNF.cxx:80
 AliMUONCalibParamNF.cxx:81
 AliMUONCalibParamNF.cxx:82
 AliMUONCalibParamNF.cxx:83
 AliMUONCalibParamNF.cxx:84
 AliMUONCalibParamNF.cxx:85
 AliMUONCalibParamNF.cxx:86
 AliMUONCalibParamNF.cxx:87
 AliMUONCalibParamNF.cxx:88
 AliMUONCalibParamNF.cxx:89
 AliMUONCalibParamNF.cxx:90
 AliMUONCalibParamNF.cxx:91
 AliMUONCalibParamNF.cxx:92
 AliMUONCalibParamNF.cxx:93
 AliMUONCalibParamNF.cxx:94
 AliMUONCalibParamNF.cxx:95
 AliMUONCalibParamNF.cxx:96
 AliMUONCalibParamNF.cxx:97
 AliMUONCalibParamNF.cxx:98
 AliMUONCalibParamNF.cxx:99
 AliMUONCalibParamNF.cxx:100
 AliMUONCalibParamNF.cxx:101
 AliMUONCalibParamNF.cxx:102
 AliMUONCalibParamNF.cxx:103
 AliMUONCalibParamNF.cxx:104
 AliMUONCalibParamNF.cxx:105
 AliMUONCalibParamNF.cxx:106
 AliMUONCalibParamNF.cxx:107
 AliMUONCalibParamNF.cxx:108
 AliMUONCalibParamNF.cxx:109
 AliMUONCalibParamNF.cxx:110
 AliMUONCalibParamNF.cxx:111
 AliMUONCalibParamNF.cxx:112
 AliMUONCalibParamNF.cxx:113
 AliMUONCalibParamNF.cxx:114
 AliMUONCalibParamNF.cxx:115
 AliMUONCalibParamNF.cxx:116
 AliMUONCalibParamNF.cxx:117
 AliMUONCalibParamNF.cxx:118
 AliMUONCalibParamNF.cxx:119
 AliMUONCalibParamNF.cxx:120
 AliMUONCalibParamNF.cxx:121
 AliMUONCalibParamNF.cxx:122
 AliMUONCalibParamNF.cxx:123
 AliMUONCalibParamNF.cxx:124
 AliMUONCalibParamNF.cxx:125
 AliMUONCalibParamNF.cxx:126
 AliMUONCalibParamNF.cxx:127
 AliMUONCalibParamNF.cxx:128
 AliMUONCalibParamNF.cxx:129
 AliMUONCalibParamNF.cxx:130
 AliMUONCalibParamNF.cxx:131
 AliMUONCalibParamNF.cxx:132
 AliMUONCalibParamNF.cxx:133
 AliMUONCalibParamNF.cxx:134
 AliMUONCalibParamNF.cxx:135
 AliMUONCalibParamNF.cxx:136
 AliMUONCalibParamNF.cxx:137
 AliMUONCalibParamNF.cxx:138
 AliMUONCalibParamNF.cxx:139
 AliMUONCalibParamNF.cxx:140
 AliMUONCalibParamNF.cxx:141
 AliMUONCalibParamNF.cxx:142
 AliMUONCalibParamNF.cxx:143
 AliMUONCalibParamNF.cxx:144
 AliMUONCalibParamNF.cxx:145
 AliMUONCalibParamNF.cxx:146
 AliMUONCalibParamNF.cxx:147
 AliMUONCalibParamNF.cxx:148
 AliMUONCalibParamNF.cxx:149
 AliMUONCalibParamNF.cxx:150
 AliMUONCalibParamNF.cxx:151
 AliMUONCalibParamNF.cxx:152
 AliMUONCalibParamNF.cxx:153
 AliMUONCalibParamNF.cxx:154
 AliMUONCalibParamNF.cxx:155
 AliMUONCalibParamNF.cxx:156
 AliMUONCalibParamNF.cxx:157
 AliMUONCalibParamNF.cxx:158
 AliMUONCalibParamNF.cxx:159
 AliMUONCalibParamNF.cxx:160
 AliMUONCalibParamNF.cxx:161
 AliMUONCalibParamNF.cxx:162
 AliMUONCalibParamNF.cxx:163
 AliMUONCalibParamNF.cxx:164
 AliMUONCalibParamNF.cxx:165
 AliMUONCalibParamNF.cxx:166
 AliMUONCalibParamNF.cxx:167
 AliMUONCalibParamNF.cxx:168
 AliMUONCalibParamNF.cxx:169
 AliMUONCalibParamNF.cxx:170
 AliMUONCalibParamNF.cxx:171
 AliMUONCalibParamNF.cxx:172
 AliMUONCalibParamNF.cxx:173
 AliMUONCalibParamNF.cxx:174
 AliMUONCalibParamNF.cxx:175
 AliMUONCalibParamNF.cxx:176
 AliMUONCalibParamNF.cxx:177
 AliMUONCalibParamNF.cxx:178
 AliMUONCalibParamNF.cxx:179
 AliMUONCalibParamNF.cxx:180
 AliMUONCalibParamNF.cxx:181
 AliMUONCalibParamNF.cxx:182
 AliMUONCalibParamNF.cxx:183
 AliMUONCalibParamNF.cxx:184
 AliMUONCalibParamNF.cxx:185
 AliMUONCalibParamNF.cxx:186
 AliMUONCalibParamNF.cxx:187
 AliMUONCalibParamNF.cxx:188
 AliMUONCalibParamNF.cxx:189
 AliMUONCalibParamNF.cxx:190
 AliMUONCalibParamNF.cxx:191
 AliMUONCalibParamNF.cxx:192
 AliMUONCalibParamNF.cxx:193
 AliMUONCalibParamNF.cxx:194
 AliMUONCalibParamNF.cxx:195
 AliMUONCalibParamNF.cxx:196
 AliMUONCalibParamNF.cxx:197
 AliMUONCalibParamNF.cxx:198
 AliMUONCalibParamNF.cxx:199
 AliMUONCalibParamNF.cxx:200
 AliMUONCalibParamNF.cxx:201
 AliMUONCalibParamNF.cxx:202
 AliMUONCalibParamNF.cxx:203
 AliMUONCalibParamNF.cxx:204
 AliMUONCalibParamNF.cxx:205
 AliMUONCalibParamNF.cxx:206
 AliMUONCalibParamNF.cxx:207
 AliMUONCalibParamNF.cxx:208
 AliMUONCalibParamNF.cxx:209
 AliMUONCalibParamNF.cxx:210
 AliMUONCalibParamNF.cxx:211
 AliMUONCalibParamNF.cxx:212
 AliMUONCalibParamNF.cxx:213
 AliMUONCalibParamNF.cxx:214
 AliMUONCalibParamNF.cxx:215
 AliMUONCalibParamNF.cxx:216
 AliMUONCalibParamNF.cxx:217
 AliMUONCalibParamNF.cxx:218
 AliMUONCalibParamNF.cxx:219
 AliMUONCalibParamNF.cxx:220
 AliMUONCalibParamNF.cxx:221
 AliMUONCalibParamNF.cxx:222
 AliMUONCalibParamNF.cxx:223
 AliMUONCalibParamNF.cxx:224
 AliMUONCalibParamNF.cxx:225
 AliMUONCalibParamNF.cxx:226
 AliMUONCalibParamNF.cxx:227
 AliMUONCalibParamNF.cxx:228
 AliMUONCalibParamNF.cxx:229
 AliMUONCalibParamNF.cxx:230
 AliMUONCalibParamNF.cxx:231
 AliMUONCalibParamNF.cxx:232
 AliMUONCalibParamNF.cxx:233
 AliMUONCalibParamNF.cxx:234
 AliMUONCalibParamNF.cxx:235
 AliMUONCalibParamNF.cxx:236
 AliMUONCalibParamNF.cxx:237
 AliMUONCalibParamNF.cxx:238
 AliMUONCalibParamNF.cxx:239
 AliMUONCalibParamNF.cxx:240
 AliMUONCalibParamNF.cxx:241
 AliMUONCalibParamNF.cxx:242
 AliMUONCalibParamNF.cxx:243
 AliMUONCalibParamNF.cxx:244
 AliMUONCalibParamNF.cxx:245
 AliMUONCalibParamNF.cxx:246
 AliMUONCalibParamNF.cxx:247
 AliMUONCalibParamNF.cxx:248
 AliMUONCalibParamNF.cxx:249
 AliMUONCalibParamNF.cxx:250
 AliMUONCalibParamNF.cxx:251
 AliMUONCalibParamNF.cxx:252
 AliMUONCalibParamNF.cxx:253
 AliMUONCalibParamNF.cxx:254
 AliMUONCalibParamNF.cxx:255
 AliMUONCalibParamNF.cxx:256
 AliMUONCalibParamNF.cxx:257
 AliMUONCalibParamNF.cxx:258
 AliMUONCalibParamNF.cxx:259
 AliMUONCalibParamNF.cxx:260
 AliMUONCalibParamNF.cxx:261
 AliMUONCalibParamNF.cxx:262
 AliMUONCalibParamNF.cxx:263
 AliMUONCalibParamNF.cxx:264
 AliMUONCalibParamNF.cxx:265
 AliMUONCalibParamNF.cxx:266
 AliMUONCalibParamNF.cxx:267
 AliMUONCalibParamNF.cxx:268
 AliMUONCalibParamNF.cxx:269
 AliMUONCalibParamNF.cxx:270
 AliMUONCalibParamNF.cxx:271
 AliMUONCalibParamNF.cxx:272
 AliMUONCalibParamNF.cxx:273
 AliMUONCalibParamNF.cxx:274
 AliMUONCalibParamNF.cxx:275
 AliMUONCalibParamNF.cxx:276
 AliMUONCalibParamNF.cxx:277
 AliMUONCalibParamNF.cxx:278
 AliMUONCalibParamNF.cxx:279
 AliMUONCalibParamNF.cxx:280
 AliMUONCalibParamNF.cxx:281
 AliMUONCalibParamNF.cxx:282
 AliMUONCalibParamNF.cxx:283
 AliMUONCalibParamNF.cxx:284
 AliMUONCalibParamNF.cxx:285
 AliMUONCalibParamNF.cxx:286
 AliMUONCalibParamNF.cxx:287
 AliMUONCalibParamNF.cxx:288
 AliMUONCalibParamNF.cxx:289
 AliMUONCalibParamNF.cxx:290
 AliMUONCalibParamNF.cxx:291
 AliMUONCalibParamNF.cxx:292
 AliMUONCalibParamNF.cxx:293
 AliMUONCalibParamNF.cxx:294
 AliMUONCalibParamNF.cxx:295
 AliMUONCalibParamNF.cxx:296
 AliMUONCalibParamNF.cxx:297
 AliMUONCalibParamNF.cxx:298
 AliMUONCalibParamNF.cxx:299
 AliMUONCalibParamNF.cxx:300
 AliMUONCalibParamNF.cxx:301
 AliMUONCalibParamNF.cxx:302
 AliMUONCalibParamNF.cxx:303
 AliMUONCalibParamNF.cxx:304