ROOT logo
/* $Id$ */
/**************************************************************************
 * 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.                  *
 **************************************************************************/
//--------------------------------------------------------------------//
//                                                                    //
// AliCFContainer Class                                               //
// Class to accumulate data on an N-dimensional grids, at different   //
// selection stages. To be used as an input to get corrections for    //
// Reconstruction & Trigger efficiency                                // 
//                                                                    //
// -- Author : S.Arcelli                                              //
//--------------------------------------------------------------------//
//
//
#include <AliLog.h>
#include "AliCFGridSparse.h"
#include "AliCFContainer.h"
#include "TAxis.h"
//____________________________________________________________________
ClassImp(AliCFContainer)

//____________________________________________________________________
AliCFContainer::AliCFContainer() : 
  AliCFFrame(),
  fNStep(0),
  fGrid(0x0)
{
  //
  // default constructor
  //
}

//____________________________________________________________________
AliCFContainer::AliCFContainer(const Char_t* name, const Char_t* title, const Int_t nSelSteps, const Int_t nVarIn, const Int_t* nBinIn) :  
  AliCFFrame(name,title),
  fNStep(nSelSteps),
  fGrid(0x0)
{
  //
  // main constructor
  //

  // The grids 
  fGrid = new AliCFGridSparse*[fNStep]; //the grids at the various selection steps
  for (Int_t istep=0; istep<fNStep; istep++) {
    fGrid[istep] = new AliCFGridSparse(Form("%s_SelStep%d",name,istep),Form("step%d",istep),nVarIn,nBinIn);
    fGrid[istep]->SumW2();
  }
  for (Int_t iVar=0; iVar<nVarIn; iVar++) SetVarTitle(iVar,Form("var%d",iVar));
  AliInfo(Form("Grids created for %d steps required  \n =>  Don't forget to set the bin limits !!",fNStep));
}
//____________________________________________________________________
AliCFContainer::AliCFContainer(const AliCFContainer& c) :
  AliCFFrame(c.fName,c.fTitle),
  fNStep(0),
  fGrid(0x0)
{
  //
  // copy constructor
  //
  c.Copy(*this);
}
//____________________________________________________________________
AliCFContainer::~AliCFContainer()
{
  //
  // destructor
  //
  if (fGrid) {
    for ( Int_t istep=0; istep<fNStep; istep++ ) 
      delete fGrid[istep];
  }
  delete [] fGrid;
}
//____________________________________________________________________
AliCFContainer &AliCFContainer::operator=(const AliCFContainer &c)
{
  //
  // assigment operator
  //
  if (this != &c) c.Copy(*this);
  return *this;
} 

//____________________________________________________________________
void AliCFContainer::Copy(TObject& c) const
{
  //
  // copy function
  //
  AliCFFrame::Copy(c);
  AliCFContainer& target = (AliCFContainer &) c;
  target.fNStep = fNStep;
  target.fGrid  = new AliCFGridSparse*[fNStep];
  for (Int_t iStep=0; iStep<fNStep; iStep++) {
    if (fGrid[iStep])  target.fGrid[iStep] = new AliCFGridSparse(*(fGrid[iStep]));
  }
}

//____________________________________________________________________
void AliCFContainer::Fill(const Double_t *var, Int_t istep, Double_t weight)
{
  //
  // Fills the grid at selection step istep for a set of values of the 
  // input variables, with a given weight (by default w=1)
  //
  if(istep >= fNStep || istep < 0){
    AliError("Non-existent selection step, grid was not filled");
    return;
  }
  fGrid[istep]->Fill(var,weight);
}

//____________________________________________________________________
TH1* AliCFContainer::Project(Int_t istep, Int_t ivar1, Int_t ivar2, Int_t ivar3) const
{
  //
  // returns a projection along variables ivar1 (and ivar2 (and ivar3))
  // at selection step istep
  //
  if (istep >= fNStep || istep < 0){
    AliError("Non-existent selection step, return NULL");
    return 0x0;
  }
  return fGrid[istep]->Project(ivar1,ivar2,ivar3);
}

//____________________________________________________________________
AliCFContainer* AliCFContainer::MakeSlice(Int_t nVars, const Int_t* vars, const Double_t* varMin, const Double_t* varMax, Bool_t useBins) const
{
  //
  // Makes a slice along the "nVars" variables defined in the array "vars[nVars]" for all the container steps.
  // The ranges of ALL the container variables must be defined in the array varMin[GetNVar()] and varMax[GetNVar()]
  // The function returns a new container of nVars variables.
  // If useBins=true, varMin and varMax are taken as bin numbers
  //
  Int_t* steps = new Int_t[fNStep];
  for (Int_t iStep=0;iStep<fNStep;iStep++) steps[iStep]=iStep;
  AliCFContainer* out = MakeSlice(fNStep,steps,nVars,vars,varMin,varMax,useBins);
  delete [] steps ;
  return out;
}

//____________________________________________________________________
AliCFContainer* AliCFContainer::MakeSlice(Int_t nSteps, const Int_t* steps, 
					  Int_t nVars, const Int_t* vars, 
					  const Double_t* varMin, const Double_t* varMax, Bool_t useBins) const
{
  //
  // Makes a slice along the "nVars" variables defined in the array "vars[nVars]" for the given "nSteps" defined in "steps[nSteps]".
  // The ranges of ALL the container variables must be defined in the array varMin[GetNVar()] and varMax[GetNVar()]
  // The function returns a new container of nVars variables.
  // If useBins=true, varMin and varMax are taken as bin numbers
  //

  if (nVars < 1 || nVars > GetNVar())   AliError("Bad number of dimensions required for the slice");
  if (nSteps< 1 || nSteps> fNStep)  AliError("Bad number of steps required for the slice");

  AliInfo(Form("Making a slice in %d dimension(s)",nVars));

  // create the output grids
  AliCFGridSparse** grids = new AliCFGridSparse*[nSteps] ;
  for (Int_t iStep=0; iStep<nSteps; iStep++) grids[iStep] = fGrid[steps[iStep]]->MakeSlice(nVars,vars,varMin,varMax,useBins);

  TAxis ** axis = new TAxis*[nVars];
  for (Int_t iVar=0; iVar<nVars; iVar++) axis[iVar] = ((AliCFGridSparse*)grids[0])->GetGrid()->GetAxis(iVar); //same axis for every grid

  //define new binning for new container
  Int_t* bins=new Int_t[nVars];
  for (Int_t iVar=0; iVar<nVars; iVar++) bins[iVar] = axis[iVar]->GetNbins();

  AliCFContainer* out = new AliCFContainer(fName,fTitle,nSteps,nVars,bins);

  //set the bin limits
  for (Int_t iVar=0; iVar<nVars; iVar++) {
    Int_t nBins = bins[iVar];
    Double_t *array = new Double_t[nBins+1];
    for (Int_t iBin=1; iBin<=nBins+1; iBin++) {
      array[iBin-1] = axis[iVar]->GetBinLowEdge(iBin);
    }
    out->SetBinLimits(iVar,array);
    delete [] array;
  }

  //set grid for the given steps
  for (Int_t iStep=0; iStep<nSteps; iStep++) out->SetGrid(iStep,grids[iStep]);

  delete [] bins;
  delete [] axis ;
  delete [] grids;
  return out;
}

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

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

  TIter iter(list);
  TObject* obj;
  
  Int_t count = 0;
  while ((obj = iter())) {
    AliCFContainer* entry = dynamic_cast<AliCFContainer*> (obj);
    if (entry == 0) 
      continue;
    this->Add(entry);
    count++;
  }

  return count+1;
}

//____________________________________________________________________
void AliCFContainer::Add(const AliCFContainer* aContainerToAdd, Double_t c)
{
  //
  //add the content of container aContainerToAdd to the current one
  //
  if ((aContainerToAdd->GetNStep()      != fNStep)          ||
      (aContainerToAdd->GetNVar()       != GetNVar())       ||
      (aContainerToAdd->GetNBinsTotal() != GetNBinsTotal()))
    {
      AliError("Different number of steps/sensitive variables/grid elements: cannot add the containers");
      return;
    }
  for (Int_t istep=0; istep<fNStep; istep++) {
    fGrid[istep]->Add(aContainerToAdd->GetGrid(istep),c);
  }
}
//____________________________________________________________________
Float_t AliCFContainer::GetOverFlows( Int_t ivar, Int_t istep, Bool_t exclusive) const {
  //
  // Get overflows in variable var at selection level istep
  // Set 'exclusive' to true for an exclusive check on variable ivar
  //
  if(istep >= fNStep || istep < 0){
    AliError("Non-existent selection step, return -1");
    return -1.;
  }
  return fGrid[istep]->GetOverFlows(ivar,exclusive);
} 
//____________________________________________________________________
Float_t AliCFContainer::GetUnderFlows( Int_t ivar, Int_t istep, Bool_t exclusive) const {
  //
  // Get underflows in variable var at selection level istep
  // Set 'exclusive' to true for an exclusive check on variable ivar
  //
  if(istep >= fNStep || istep < 0){
    AliError("Non-existent selection step, return -1");
    return -1.;
  }
  return fGrid[istep]->GetUnderFlows(ivar,exclusive);
} 
//____________________________________________________________________
Float_t AliCFContainer::GetEntries(Int_t istep) const {
  //
  // Get total entries in variable var at selection level istep
  //
  if(istep >= fNStep || istep < 0){
    AliError("Non-existent selection step, return -1");
    return -1.;
  }
  return fGrid[istep]->GetEntries();
} 
//_____________________________________________________________________
Double_t AliCFContainer::GetIntegral( Int_t istep) const 
{
  //
  // Get Integral over the grid at selection level istep
  //
  if(istep >= fNStep || istep < 0){
    AliError("Non-existent selection step, return -1");
    return -1.;
  }
  return fGrid[istep]->GetIntegral();
}

//_____________________________________________________________________
void AliCFContainer::SetRangeUser(Int_t ivar, Double_t varMin, Double_t varMax, Bool_t useBins) const
{
  //
  // set axis range for variable ivar
  // put useBins=kTRUE if you want to pass bin numbers instead of values
  //
  if (ivar >= GetNVar() || ivar < 0){
    AliError("Non-existent selection var");
    return ;
  }
  for (Int_t iStep=0; iStep<GetNStep(); iStep++) fGrid[iStep]->SetRangeUser(ivar,varMin,varMax,useBins);
}

//_____________________________________________________________________
void AliCFContainer::SetRangeUser(const Double_t* varMin, const Double_t* varMax, Bool_t useBins) const
{
  //
  // set all axis ranges according to arrays varMin and varMax
  // put useBins=kTRUE if you want to pass bin numbers instead of values
  //
  for (Int_t iStep=0; iStep<GetNStep(); iStep++) fGrid[iStep]->SetRangeUser(varMin,varMax,useBins);
}

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