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: AliTHn.cxx 20164 2007-08-14 15:31:50Z morsch $ */

// Use AliTHn instead of AliCFContainer and your memory consumption will be drastically reduced
// As AliTHn derives from AliCFContainer, you can just replace your current AliCFContainer object by AliTHn
// Once you have the merged output, call FillParent() and you can use AliCFContainer as usual
//
// this storage container is optimized for small memory usage
//   under/over flow bins do not exist
//   sumw2 structure is float only and only create when the weight != 1
// all histogram functionality (projections, axis, ranges, etc) are taken from THnSparse by propagating 
// the information up into the THnSparse structure (in the ananalysis *after* data processing and merging)
//
// the derivation from THnSparse is obviously against many OO rules. correct would be a common baseclass of THnSparse and THn.
// 
// Author: Jan Fiete Grosse-Oetringhaus

#include "AliTHn.h"
#include "TList.h"
#include "TCollection.h"
#include "AliLog.h"
#include "TArrayF.h"
#include "THnSparse.h"
#include "TMath.h"

ClassImp(AliTHn)

AliTHn::AliTHn() : 
  AliCFContainer(),
  fNBins(0),
  fNVars(0),
  fNSteps(0),
  fValues(0),
  fSumw2(0),
  axisCache(0),
  fNbinsCache(0),
  fLastVars(0),
  fLastBins(0)
{
  // Constructor
}

AliTHn::AliTHn(const Char_t* name, const Char_t* title,const Int_t nSelStep, const Int_t nVarIn, const Int_t* nBinIn) : 
  AliCFContainer(name, title, nSelStep, nVarIn, nBinIn),
  fNBins(0),
  fNVars(nVarIn),
  fNSteps(nSelStep),
  fValues(0),
  fSumw2(0),
  axisCache(0),
  fNbinsCache(0),
  fLastVars(0),
  fLastBins(0)
{
  // Constructor

  fNBins = 1;
  for (Int_t i=0; i<fNVars; i++)
    fNBins *= nBinIn[i];
  
  Init();
}

void AliTHn::Init()
{
  // initialize
  
  fValues = new TArrayF*[fNSteps];
  fSumw2 = new TArrayF*[fNSteps];
  
  for (Int_t i=0; i<fNSteps; i++)
  {
    fValues[i] = 0;
    fSumw2[i] = 0;
  }
} 

AliTHn::AliTHn(const AliTHn &c) :
  AliCFContainer(c),
  fNBins(c.fNBins),
  fNVars(c.fNVars),
  fNSteps(c.fNSteps),
  fValues(new TArrayF*[c.fNSteps]),
  fSumw2(new TArrayF*[c.fNSteps]),
  axisCache(0),
  fNbinsCache(0),
  fLastVars(0),
  fLastBins(0)
{
  //
  // AliTHn copy constructor
  //

  memset(fValues,0,fNSteps*sizeof(TArrayF*));
  memset(fSumw2,0,fNSteps*sizeof(TArrayF*));

  for (Int_t i=0; i<fNSteps; i++) {
    if (c.fValues[i]) fValues[i] = new TArrayF(*(c.fValues[i]));
    if (c.fSumw2[i])  fSumw2[i]  = new TArrayF(*(c.fSumw2[i]));
  }

}

AliTHn::~AliTHn()
{
  // Destructor
  
  DeleteContainers();
  
  delete[] fValues;
  delete[] fSumw2;
  delete[] axisCache;
  delete[] fNbinsCache;
  delete[] fLastVars;
  delete[] fLastBins;
}

void AliTHn::DeleteContainers()
{
  // delete data containers
  
  for (Int_t i=0; i<fNSteps; i++)
  {
    if (fValues && fValues[i])
    {
      delete fValues[i];
      fValues[i] = 0;
    }
    
    if (fSumw2 && fSumw2[i])
    {
      delete fSumw2[i];
      fSumw2[i] = 0;
    }
  }
}

//____________________________________________________________________
AliTHn &AliTHn::operator=(const AliTHn &c)
{
  // assigment operator

  if (this != &c) {
    AliCFContainer::operator=(c);
    fNBins=c.fNBins;
    fNVars=c.fNVars;
    if(fNSteps) {
      for(Int_t i=0; i< fNSteps; ++i) {
	delete fValues[i];
	delete fSumw2[i];
      }
      delete [] fValues;
      delete [] fSumw2;
    }
    fNSteps=c.fNSteps;
    if(fNSteps) {
      fValues=new TArrayF*[fNSteps];
      fSumw2=new TArrayF*[fNSteps];
      memset(fValues,0,fNSteps*sizeof(TArrayF*));
      memset(fSumw2,0,fNSteps*sizeof(TArrayF*));

      for (Int_t i=0; i<fNSteps; i++) {
	if (c.fValues[i]) fValues[i] = new TArrayF(*(c.fValues[i]));
	if (c.fSumw2[i])  fSumw2[i]  = new TArrayF(*(c.fSumw2[i]));
      }
    } else {
      fValues = 0;
      fSumw2 = 0;
    }
    delete [] axisCache;
    axisCache = new TAxis*[fNVars];
    memcpy(axisCache, c.axisCache, fNVars*sizeof(TAxis*));
  }
  return *this;
}

//____________________________________________________________________
void AliTHn::Copy(TObject& c) const
{
  // copy function

  AliTHn& target = (AliTHn &) c;
  
  AliCFContainer::Copy(target);
  
  target.fNSteps = fNSteps;
  target.fNBins = fNBins;
  target.fNVars = fNVars;
  
  target.Init();

  for (Int_t i=0; i<fNSteps; i++)
  {
    if (fValues[i])
      target.fValues[i] = new TArrayF(*(fValues[i]));
    else
      target.fValues[i] = 0;
    
    if (fSumw2[i])
      target.fSumw2[i] = new TArrayF(*(fSumw2[i]));
    else
      target.fSumw2[i] = 0;
  }
}

//____________________________________________________________________
Long64_t AliTHn::Merge(TCollection* list)
{
  // Merge a list of AliTHn objects with this (needed for
  // PROOF). 
  // Returns the number of merged objects (including this).

  if (!list)
    return 0;
  
  if (list->IsEmpty())
    return 1;
  
  AliCFContainer::Merge(list);

  TIterator* iter = list->MakeIterator();
  TObject* obj;
  
  Int_t count = 0;
  while ((obj = iter->Next())) {
    
    AliTHn* entry = dynamic_cast<AliTHn*> (obj);
    if (entry == 0) 
      continue;

    for (Int_t i=0; i<fNSteps; i++)
    {
      if (entry->fValues[i])
      {
	if (!fValues[i])
	  fValues[i] = new TArrayF(fNBins);
      
	for (Long64_t l = 0; l<fNBins; l++)
	  fValues[i]->GetArray()[l] += entry->fValues[i]->GetArray()[l];
      }

      if (entry->fSumw2[i])
      {
	if (!fSumw2[i])
	  fSumw2[i] = new TArrayF(fNBins);
      
	for (Long64_t l = 0; l<fNBins; l++)
	  fSumw2[i]->GetArray()[l] += entry->fSumw2[i]->GetArray()[l];
      }
    }
    
    count++;
  }

  return count+1;
}

void AliTHn::Fill(const Double_t *var, Int_t istep, Double_t weight)
{
  // fills an entry

  // fill axis cache
  if (!axisCache)
  {
    axisCache = new TAxis*[fNVars];
    fNbinsCache = new Int_t[fNVars];
    for (Int_t i=0; i<fNVars; i++)
    {
      axisCache[i] = GetAxis(i, 0);
      fNbinsCache[i] = axisCache[i]->GetNbins();
    }
    
    fLastVars = new Double_t[fNVars];
    fLastBins = new Int_t[fNVars];
    
    // initial values to prevent checking for 0 below
    for (Int_t i=0; i<fNVars; i++)
    {
      fLastBins[i] = axisCache[i]->FindBin(var[i]);
      fLastVars[i] = var[i];
    }
  }
  
  // calculate global bin index
  Long64_t bin = 0;
  for (Int_t i=0; i<fNVars; i++)
  {
    bin *= fNbinsCache[i];
    
    Int_t tmpBin = 0;
    if (fLastVars[i] == var[i])
      tmpBin = fLastBins[i];
    else
    {
      tmpBin = axisCache[i]->FindBin(var[i]);
      fLastBins[i] = tmpBin;
      fLastVars[i] = var[i];
    }
    //Printf("%d", tmpBin);

    // under/overflow not supported
    if (tmpBin < 1 || tmpBin > fNbinsCache[i])
      return;
    
    // bins start from 0 here
    bin += tmpBin - 1;
//     Printf("%lld", bin);
  }

  if (!fValues[istep])
  {
    fValues[istep] = new TArrayF(fNBins);
    AliInfo(Form("Created values container for step %d", istep));
  }

  if (weight != 1)
  {
    // initialize with already filled entries (which have been filled with weight == 1), in this case fSumw2 := fValues
    if (!fSumw2[istep])
    {
      fSumw2[istep] = new TArrayF(*fValues[istep]);
      AliInfo(Form("Created sumw2 container for step %d", istep));
    }
  }

  fValues[istep]->GetArray()[bin] += weight;
  if (fSumw2[istep])
    fSumw2[istep]->GetArray()[bin] += weight * weight;
  
//   Printf("%f", fValues[istep][bin]);
  
  // debug
//   AliCFContainer::Fill(var, istep, weight);
}

Long64_t AliTHn::GetGlobalBinIndex(const Int_t* binIdx)
{
  // calculates global bin index
  // binIdx contains TAxis bin indexes
  // here bin count starts at 0 because we do not have over/underflow bins
  
  Long64_t bin = 0;
  for (Int_t i=0; i<fNVars; i++)
  {
    bin *= GetAxis(i, 0)->GetNbins();
    bin += binIdx[i] - 1;
  }

  return bin;
}

void AliTHn::FillContainer(AliCFContainer* cont)
{
  // fills the information stored in the buffer in this class into the container <cont>
  
  for (Int_t i=0; i<fNSteps; i++)
  {
    if (!fValues[i])
      continue;
      
    Float_t* source = fValues[i]->GetArray();
    // if fSumw2 is not stored, the sqrt of the number of bin entries in source is filled below; otherwise we use fSumw2
    Float_t* sourceSumw2 = source;
    if (fSumw2[i])
      sourceSumw2 = fSumw2[i]->GetArray();
    
    THnSparse* target = cont->GetGrid(i)->GetGrid();
    
    Int_t* binIdx = new Int_t[fNVars];
    Int_t* nBins  = new Int_t[fNVars];
    for (Int_t j=0; j<fNVars; j++)
    {
      binIdx[j] = 1;
      nBins[j] = target->GetAxis(j)->GetNbins();
    }
    
    Long64_t count = 0;
    
    while (1)
    {
//       for (Int_t j=0; j<fNVars; j++)
// 	printf("%d ", binIdx[j]);
      
      Long64_t globalBin = GetGlobalBinIndex(binIdx);
//       Printf(" --> %lld", globalBin);
      
      if (source[globalBin] != 0)
      {
	target->SetBinContent(binIdx, source[globalBin]);
	target->SetBinError(binIdx, TMath::Sqrt(sourceSumw2[globalBin]));
	
	count++;
      }
      
      binIdx[fNVars-1]++;
      
      for (Int_t j=fNVars-1; j>0; j--)
      {
	if (binIdx[j] > nBins[j])
	{
	  binIdx[j] = 1;
	  binIdx[j-1]++;
	}
      }
      
      if (binIdx[0] > nBins[0])
	break;
    }
    
    AliInfo(Form("Step %d: copied %lld entries out of %lld bins", i, count, GetGlobalBinIndex(binIdx)));

    delete[] binIdx;
    delete[] nBins;
  }  
}

void AliTHn::FillParent()
{
  // fills the information stored in the buffer in this class into the baseclass containers
  
  FillContainer(this);
}

void AliTHn::ReduceAxis()
{
  // "removes" one axis by summing over the axis and putting the entry to bin 1
  // TODO presently only implemented for the last axis
  
  Int_t axis = fNVars-1;
  
  for (Int_t i=0; i<fNSteps; i++)
  {
    if (!fValues[i])
      continue;
      
    Float_t* source = fValues[i]->GetArray();
    Float_t* sourceSumw2 = 0;
    if (fSumw2[i])
      sourceSumw2 = fSumw2[i]->GetArray();
    
    THnSparse* target = GetGrid(i)->GetGrid();
    
    Int_t* binIdx = new Int_t[fNVars];
    Int_t* nBins  = new Int_t[fNVars];
    for (Int_t j=0; j<fNVars; j++)
    {
      binIdx[j] = 1;
      nBins[j] = target->GetAxis(j)->GetNbins();
    }
    
    Long64_t count = 0;

    while (1)
    {
      // sum over axis <axis>
      Float_t sumValues = 0;
      Float_t sumSumw2 = 0;
      for (Int_t j=1; j<=nBins[axis]; j++)
      {
	binIdx[axis] = j;
	Long64_t globalBin = GetGlobalBinIndex(binIdx);
	sumValues += source[globalBin];
	source[globalBin] = 0;

	if (sourceSumw2)
	{
	  sumSumw2 += sourceSumw2[globalBin];
	  sourceSumw2[globalBin] = 0;
	}
      }
      binIdx[axis] = 1;
	
      Long64_t globalBin = GetGlobalBinIndex(binIdx);
      source[globalBin] = sumValues;
      if (sourceSumw2)
	sourceSumw2[globalBin] = sumSumw2;

      count++;

      // next bin
      binIdx[fNVars-2]++;
      
      for (Int_t j=fNVars-2; j>0; j--)
      {
	if (binIdx[j] > nBins[j])
	{
	  binIdx[j] = 1;
	  binIdx[j-1]++;
	}
      }
      
      if (binIdx[0] > nBins[0])
	break;
    }
    
    AliInfo(Form("Step %d: reduced %lld bins to %lld entries", i, GetGlobalBinIndex(binIdx), count));

    delete[] binIdx;
    delete[] nBins;
  }
}
 AliTHn.cxx:1
 AliTHn.cxx:2
 AliTHn.cxx:3
 AliTHn.cxx:4
 AliTHn.cxx:5
 AliTHn.cxx:6
 AliTHn.cxx:7
 AliTHn.cxx:8
 AliTHn.cxx:9
 AliTHn.cxx:10
 AliTHn.cxx:11
 AliTHn.cxx:12
 AliTHn.cxx:13
 AliTHn.cxx:14
 AliTHn.cxx:15
 AliTHn.cxx:16
 AliTHn.cxx:17
 AliTHn.cxx:18
 AliTHn.cxx:19
 AliTHn.cxx:20
 AliTHn.cxx:21
 AliTHn.cxx:22
 AliTHn.cxx:23
 AliTHn.cxx:24
 AliTHn.cxx:25
 AliTHn.cxx:26
 AliTHn.cxx:27
 AliTHn.cxx:28
 AliTHn.cxx:29
 AliTHn.cxx:30
 AliTHn.cxx:31
 AliTHn.cxx:32
 AliTHn.cxx:33
 AliTHn.cxx:34
 AliTHn.cxx:35
 AliTHn.cxx:36
 AliTHn.cxx:37
 AliTHn.cxx:38
 AliTHn.cxx:39
 AliTHn.cxx:40
 AliTHn.cxx:41
 AliTHn.cxx:42
 AliTHn.cxx:43
 AliTHn.cxx:44
 AliTHn.cxx:45
 AliTHn.cxx:46
 AliTHn.cxx:47
 AliTHn.cxx:48
 AliTHn.cxx:49
 AliTHn.cxx:50
 AliTHn.cxx:51
 AliTHn.cxx:52
 AliTHn.cxx:53
 AliTHn.cxx:54
 AliTHn.cxx:55
 AliTHn.cxx:56
 AliTHn.cxx:57
 AliTHn.cxx:58
 AliTHn.cxx:59
 AliTHn.cxx:60
 AliTHn.cxx:61
 AliTHn.cxx:62
 AliTHn.cxx:63
 AliTHn.cxx:64
 AliTHn.cxx:65
 AliTHn.cxx:66
 AliTHn.cxx:67
 AliTHn.cxx:68
 AliTHn.cxx:69
 AliTHn.cxx:70
 AliTHn.cxx:71
 AliTHn.cxx:72
 AliTHn.cxx:73
 AliTHn.cxx:74
 AliTHn.cxx:75
 AliTHn.cxx:76
 AliTHn.cxx:77
 AliTHn.cxx:78
 AliTHn.cxx:79
 AliTHn.cxx:80
 AliTHn.cxx:81
 AliTHn.cxx:82
 AliTHn.cxx:83
 AliTHn.cxx:84
 AliTHn.cxx:85
 AliTHn.cxx:86
 AliTHn.cxx:87
 AliTHn.cxx:88
 AliTHn.cxx:89
 AliTHn.cxx:90
 AliTHn.cxx:91
 AliTHn.cxx:92
 AliTHn.cxx:93
 AliTHn.cxx:94
 AliTHn.cxx:95
 AliTHn.cxx:96
 AliTHn.cxx:97
 AliTHn.cxx:98
 AliTHn.cxx:99
 AliTHn.cxx:100
 AliTHn.cxx:101
 AliTHn.cxx:102
 AliTHn.cxx:103
 AliTHn.cxx:104
 AliTHn.cxx:105
 AliTHn.cxx:106
 AliTHn.cxx:107
 AliTHn.cxx:108
 AliTHn.cxx:109
 AliTHn.cxx:110
 AliTHn.cxx:111
 AliTHn.cxx:112
 AliTHn.cxx:113
 AliTHn.cxx:114
 AliTHn.cxx:115
 AliTHn.cxx:116
 AliTHn.cxx:117
 AliTHn.cxx:118
 AliTHn.cxx:119
 AliTHn.cxx:120
 AliTHn.cxx:121
 AliTHn.cxx:122
 AliTHn.cxx:123
 AliTHn.cxx:124
 AliTHn.cxx:125
 AliTHn.cxx:126
 AliTHn.cxx:127
 AliTHn.cxx:128
 AliTHn.cxx:129
 AliTHn.cxx:130
 AliTHn.cxx:131
 AliTHn.cxx:132
 AliTHn.cxx:133
 AliTHn.cxx:134
 AliTHn.cxx:135
 AliTHn.cxx:136
 AliTHn.cxx:137
 AliTHn.cxx:138
 AliTHn.cxx:139
 AliTHn.cxx:140
 AliTHn.cxx:141
 AliTHn.cxx:142
 AliTHn.cxx:143
 AliTHn.cxx:144
 AliTHn.cxx:145
 AliTHn.cxx:146
 AliTHn.cxx:147
 AliTHn.cxx:148
 AliTHn.cxx:149
 AliTHn.cxx:150
 AliTHn.cxx:151
 AliTHn.cxx:152
 AliTHn.cxx:153
 AliTHn.cxx:154
 AliTHn.cxx:155
 AliTHn.cxx:156
 AliTHn.cxx:157
 AliTHn.cxx:158
 AliTHn.cxx:159
 AliTHn.cxx:160
 AliTHn.cxx:161
 AliTHn.cxx:162
 AliTHn.cxx:163
 AliTHn.cxx:164
 AliTHn.cxx:165
 AliTHn.cxx:166
 AliTHn.cxx:167
 AliTHn.cxx:168
 AliTHn.cxx:169
 AliTHn.cxx:170
 AliTHn.cxx:171
 AliTHn.cxx:172
 AliTHn.cxx:173
 AliTHn.cxx:174
 AliTHn.cxx:175
 AliTHn.cxx:176
 AliTHn.cxx:177
 AliTHn.cxx:178
 AliTHn.cxx:179
 AliTHn.cxx:180
 AliTHn.cxx:181
 AliTHn.cxx:182
 AliTHn.cxx:183
 AliTHn.cxx:184
 AliTHn.cxx:185
 AliTHn.cxx:186
 AliTHn.cxx:187
 AliTHn.cxx:188
 AliTHn.cxx:189
 AliTHn.cxx:190
 AliTHn.cxx:191
 AliTHn.cxx:192
 AliTHn.cxx:193
 AliTHn.cxx:194
 AliTHn.cxx:195
 AliTHn.cxx:196
 AliTHn.cxx:197
 AliTHn.cxx:198
 AliTHn.cxx:199
 AliTHn.cxx:200
 AliTHn.cxx:201
 AliTHn.cxx:202
 AliTHn.cxx:203
 AliTHn.cxx:204
 AliTHn.cxx:205
 AliTHn.cxx:206
 AliTHn.cxx:207
 AliTHn.cxx:208
 AliTHn.cxx:209
 AliTHn.cxx:210
 AliTHn.cxx:211
 AliTHn.cxx:212
 AliTHn.cxx:213
 AliTHn.cxx:214
 AliTHn.cxx:215
 AliTHn.cxx:216
 AliTHn.cxx:217
 AliTHn.cxx:218
 AliTHn.cxx:219
 AliTHn.cxx:220
 AliTHn.cxx:221
 AliTHn.cxx:222
 AliTHn.cxx:223
 AliTHn.cxx:224
 AliTHn.cxx:225
 AliTHn.cxx:226
 AliTHn.cxx:227
 AliTHn.cxx:228
 AliTHn.cxx:229
 AliTHn.cxx:230
 AliTHn.cxx:231
 AliTHn.cxx:232
 AliTHn.cxx:233
 AliTHn.cxx:234
 AliTHn.cxx:235
 AliTHn.cxx:236
 AliTHn.cxx:237
 AliTHn.cxx:238
 AliTHn.cxx:239
 AliTHn.cxx:240
 AliTHn.cxx:241
 AliTHn.cxx:242
 AliTHn.cxx:243
 AliTHn.cxx:244
 AliTHn.cxx:245
 AliTHn.cxx:246
 AliTHn.cxx:247
 AliTHn.cxx:248
 AliTHn.cxx:249
 AliTHn.cxx:250
 AliTHn.cxx:251
 AliTHn.cxx:252
 AliTHn.cxx:253
 AliTHn.cxx:254
 AliTHn.cxx:255
 AliTHn.cxx:256
 AliTHn.cxx:257
 AliTHn.cxx:258
 AliTHn.cxx:259
 AliTHn.cxx:260
 AliTHn.cxx:261
 AliTHn.cxx:262
 AliTHn.cxx:263
 AliTHn.cxx:264
 AliTHn.cxx:265
 AliTHn.cxx:266
 AliTHn.cxx:267
 AliTHn.cxx:268
 AliTHn.cxx:269
 AliTHn.cxx:270
 AliTHn.cxx:271
 AliTHn.cxx:272
 AliTHn.cxx:273
 AliTHn.cxx:274
 AliTHn.cxx:275
 AliTHn.cxx:276
 AliTHn.cxx:277
 AliTHn.cxx:278
 AliTHn.cxx:279
 AliTHn.cxx:280
 AliTHn.cxx:281
 AliTHn.cxx:282
 AliTHn.cxx:283
 AliTHn.cxx:284
 AliTHn.cxx:285
 AliTHn.cxx:286
 AliTHn.cxx:287
 AliTHn.cxx:288
 AliTHn.cxx:289
 AliTHn.cxx:290
 AliTHn.cxx:291
 AliTHn.cxx:292
 AliTHn.cxx:293
 AliTHn.cxx:294
 AliTHn.cxx:295
 AliTHn.cxx:296
 AliTHn.cxx:297
 AliTHn.cxx:298
 AliTHn.cxx:299
 AliTHn.cxx:300
 AliTHn.cxx:301
 AliTHn.cxx:302
 AliTHn.cxx:303
 AliTHn.cxx:304
 AliTHn.cxx:305
 AliTHn.cxx:306
 AliTHn.cxx:307
 AliTHn.cxx:308
 AliTHn.cxx:309
 AliTHn.cxx:310
 AliTHn.cxx:311
 AliTHn.cxx:312
 AliTHn.cxx:313
 AliTHn.cxx:314
 AliTHn.cxx:315
 AliTHn.cxx:316
 AliTHn.cxx:317
 AliTHn.cxx:318
 AliTHn.cxx:319
 AliTHn.cxx:320
 AliTHn.cxx:321
 AliTHn.cxx:322
 AliTHn.cxx:323
 AliTHn.cxx:324
 AliTHn.cxx:325
 AliTHn.cxx:326
 AliTHn.cxx:327
 AliTHn.cxx:328
 AliTHn.cxx:329
 AliTHn.cxx:330
 AliTHn.cxx:331
 AliTHn.cxx:332
 AliTHn.cxx:333
 AliTHn.cxx:334
 AliTHn.cxx:335
 AliTHn.cxx:336
 AliTHn.cxx:337
 AliTHn.cxx:338
 AliTHn.cxx:339
 AliTHn.cxx:340
 AliTHn.cxx:341
 AliTHn.cxx:342
 AliTHn.cxx:343
 AliTHn.cxx:344
 AliTHn.cxx:345
 AliTHn.cxx:346
 AliTHn.cxx:347
 AliTHn.cxx:348
 AliTHn.cxx:349
 AliTHn.cxx:350
 AliTHn.cxx:351
 AliTHn.cxx:352
 AliTHn.cxx:353
 AliTHn.cxx:354
 AliTHn.cxx:355
 AliTHn.cxx:356
 AliTHn.cxx:357
 AliTHn.cxx:358
 AliTHn.cxx:359
 AliTHn.cxx:360
 AliTHn.cxx:361
 AliTHn.cxx:362
 AliTHn.cxx:363
 AliTHn.cxx:364
 AliTHn.cxx:365
 AliTHn.cxx:366
 AliTHn.cxx:367
 AliTHn.cxx:368
 AliTHn.cxx:369
 AliTHn.cxx:370
 AliTHn.cxx:371
 AliTHn.cxx:372
 AliTHn.cxx:373
 AliTHn.cxx:374
 AliTHn.cxx:375
 AliTHn.cxx:376
 AliTHn.cxx:377
 AliTHn.cxx:378
 AliTHn.cxx:379
 AliTHn.cxx:380
 AliTHn.cxx:381
 AliTHn.cxx:382
 AliTHn.cxx:383
 AliTHn.cxx:384
 AliTHn.cxx:385
 AliTHn.cxx:386
 AliTHn.cxx:387
 AliTHn.cxx:388
 AliTHn.cxx:389
 AliTHn.cxx:390
 AliTHn.cxx:391
 AliTHn.cxx:392
 AliTHn.cxx:393
 AliTHn.cxx:394
 AliTHn.cxx:395
 AliTHn.cxx:396
 AliTHn.cxx:397
 AliTHn.cxx:398
 AliTHn.cxx:399
 AliTHn.cxx:400
 AliTHn.cxx:401
 AliTHn.cxx:402
 AliTHn.cxx:403
 AliTHn.cxx:404
 AliTHn.cxx:405
 AliTHn.cxx:406
 AliTHn.cxx:407
 AliTHn.cxx:408
 AliTHn.cxx:409
 AliTHn.cxx:410
 AliTHn.cxx:411
 AliTHn.cxx:412
 AliTHn.cxx:413
 AliTHn.cxx:414
 AliTHn.cxx:415
 AliTHn.cxx:416
 AliTHn.cxx:417
 AliTHn.cxx:418
 AliTHn.cxx:419
 AliTHn.cxx:420
 AliTHn.cxx:421
 AliTHn.cxx:422
 AliTHn.cxx:423
 AliTHn.cxx:424
 AliTHn.cxx:425
 AliTHn.cxx:426
 AliTHn.cxx:427
 AliTHn.cxx:428
 AliTHn.cxx:429
 AliTHn.cxx:430
 AliTHn.cxx:431
 AliTHn.cxx:432
 AliTHn.cxx:433
 AliTHn.cxx:434
 AliTHn.cxx:435
 AliTHn.cxx:436
 AliTHn.cxx:437
 AliTHn.cxx:438
 AliTHn.cxx:439
 AliTHn.cxx:440
 AliTHn.cxx:441
 AliTHn.cxx:442
 AliTHn.cxx:443
 AliTHn.cxx:444
 AliTHn.cxx:445
 AliTHn.cxx:446
 AliTHn.cxx:447
 AliTHn.cxx:448
 AliTHn.cxx:449
 AliTHn.cxx:450
 AliTHn.cxx:451
 AliTHn.cxx:452
 AliTHn.cxx:453
 AliTHn.cxx:454
 AliTHn.cxx:455
 AliTHn.cxx:456
 AliTHn.cxx:457
 AliTHn.cxx:458
 AliTHn.cxx:459
 AliTHn.cxx:460
 AliTHn.cxx:461
 AliTHn.cxx:462
 AliTHn.cxx:463
 AliTHn.cxx:464
 AliTHn.cxx:465
 AliTHn.cxx:466
 AliTHn.cxx:467
 AliTHn.cxx:468
 AliTHn.cxx:469
 AliTHn.cxx:470
 AliTHn.cxx:471
 AliTHn.cxx:472
 AliTHn.cxx:473
 AliTHn.cxx:474
 AliTHn.cxx:475
 AliTHn.cxx:476
 AliTHn.cxx:477
 AliTHn.cxx:478
 AliTHn.cxx:479
 AliTHn.cxx:480
 AliTHn.cxx:481
 AliTHn.cxx:482
 AliTHn.cxx:483
 AliTHn.cxx:484
 AliTHn.cxx:485
 AliTHn.cxx:486
 AliTHn.cxx:487
 AliTHn.cxx:488
 AliTHn.cxx:489
 AliTHn.cxx:490
 AliTHn.cxx:491
 AliTHn.cxx:492
 AliTHn.cxx:493
 AliTHn.cxx:494
 AliTHn.cxx:495
 AliTHn.cxx:496
 AliTHn.cxx:497
 AliTHn.cxx:498
 AliTHn.cxx:499
 AliTHn.cxx:500
 AliTHn.cxx:501
 AliTHn.cxx:502
 AliTHn.cxx:503
 AliTHn.cxx:504
 AliTHn.cxx:505
 AliTHn.cxx:506
 AliTHn.cxx:507
 AliTHn.cxx:508
 AliTHn.cxx:509
 AliTHn.cxx:510
 AliTHn.cxx:511
 AliTHn.cxx:512
 AliTHn.cxx:513
 AliTHn.cxx:514
 AliTHn.cxx:515