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 "AliMUONCalibParamND.h"

#include "AliLog.h"

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

//-----------------------------------------------------------------------------
/// \class AliMUONCalibParamND
///
/// Handle the case of N floating point (double precision) parameters per channel.
///
/// \author Laurent Aphecetche
//-----------------------------------------------------------------------------

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

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

//_____________________________________________________________________________
AliMUONCalibParamND::AliMUONCalibParamND(Int_t dimension, Int_t theSize, 
                                         Int_t id0, Int_t id1,
                                         Double_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 Double_t[fN];
    for ( Int_t i = 0; i < fN; ++i )
    {
      fValues[i] = fillWithValue;
    }
  }
}


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

  other.CopyTo(*this);
}

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

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

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

  delete[] fValues;
}

//_____________________________________________________________________________
void
AliMUONCalibParamND::CopyTo(AliMUONCalibParamND& 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 Double_t[fN];
    for ( Int_t i = 0; i < fN; ++i )
    {
      destination.fValues[i] = fValues[i];
    }
  }
}

//_____________________________________________________________________________
Int_t
AliMUONCalibParamND::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
AliMUONCalibParamND::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
AliMUONCalibParamND::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("AliMUONCalibParamND 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(" %g",ValueAsDouble(i,j));
      }
      cout << endl;
    }
  }  
  if ( sopt.Contains("MEAN") )
  {
    Int_t j(0);
    sscanf(sopt.Data(),"MEAN%d",&j);
    
    Double_t mean(0);
    Double_t v2(0);
    
    Int_t n = Size();
    
    for ( Int_t i = 0; i < Size(); ++i )
    {
      Float_t v = ValueAsDouble(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)=%g Sigma(j=%d)=%g",j,mean,j,sigma) << endl;
  }
  
}

//_____________________________________________________________________________
void
AliMUONCalibParamND::SetValueAsDouble(Int_t i, Int_t j, Double_t value)
{
  /// Set one value as a double, 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
AliMUONCalibParamND::SetValueAsDoubleFast(Int_t i, Int_t j, Double_t value)
{
  /// Set one value as a double, w/o checking that the indices are correct.
  
  fValues[IndexFast(i,j)] = value;
}

//_____________________________________________________________________________
void
AliMUONCalibParamND::SetValueAsFloat(Int_t i, Int_t j, Float_t value)
{
  /// Set one value as a float, after checking that the indices are correct.
  SetValueAsDouble(i,j,static_cast<Double_t>(value));
}

//_____________________________________________________________________________
void
AliMUONCalibParamND::SetValueAsFloatFast(Int_t i, Int_t j, Float_t value)
{
  /// Set one value as a float, after checking that the indices are correct.
  SetValueAsDoubleFast(i,j,static_cast<Double_t>(value));
}

//_____________________________________________________________________________
void
AliMUONCalibParamND::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
AliMUONCalibParamND::SetValueAsIntFast(Int_t i, Int_t j, Int_t value)
{
  /// Set one value as an int.
  
  SetValueAsFloatFast(i,j,static_cast<Float_t>(value));
}

//_____________________________________________________________________________
Double_t
AliMUONCalibParamND::ValueAsDouble(Int_t i, Int_t j) const
{
  /// Return the value as a double (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];
  }
}

//_____________________________________________________________________________
Double_t
AliMUONCalibParamND::ValueAsDoubleFast(Int_t i, Int_t j) const
{
  /// Return the value as a double (which it is), w/o checking indices.
  
  return fValues[IndexFast(i,j)];
}

//_____________________________________________________________________________
Float_t
AliMUONCalibParamND::ValueAsFloat(Int_t i, Int_t j) const
{
/// Return the value as a float 
  return static_cast<Float_t>(ValueAsDouble(i,j));
}

//_____________________________________________________________________________
Float_t
AliMUONCalibParamND::ValueAsFloatFast(Int_t i, Int_t j) const
{
  /// Return the value as a float 
  return static_cast<Float_t>(ValueAsDoubleFast(i,j));
}

//_____________________________________________________________________________
Int_t
AliMUONCalibParamND::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);
  return TMath::Nint(v);
}

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