ROOT logo
/* $Id$ */

// ------------------------------------------------------
//
// Class to handle 2d-corrections.
//
// ------------------------------------------------------
//

#include <TH2F.h>
#include <TMath.h>

#include <AliLog.h>

#include "AliCorrectionMatrix2D.h"

//____________________________________________________________________
ClassImp(AliCorrectionMatrix2D)

//____________________________________________________________________
AliCorrectionMatrix2D::AliCorrectionMatrix2D() :
  AliCorrectionMatrix()
{
  // default constructor
}

//____________________________________________________________________
AliCorrectionMatrix2D::AliCorrectionMatrix2D(const AliCorrectionMatrix2D& c)
  : AliCorrectionMatrix(c)
{
  // copy constructor
  ((AliCorrectionMatrix2D &)c).Copy(*this);
}

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

  if (this != &c)
    ((AliCorrectionMatrix2D &) c).Copy(*this);

  return *this;
}

//____________________________________________________________________
AliCorrectionMatrix2D::AliCorrectionMatrix2D(const Char_t* name, const Char_t* title,
				       Int_t nBinX, Float_t Xmin, Float_t Xmax,
				       Int_t nBinY, Float_t Ymin, Float_t Ymax) 
  : AliCorrectionMatrix(name, title)
{
  //
  // constructor
  //

  // do not add this hists to the directory
  Bool_t oldStatus = TH1::AddDirectoryStatus();
  TH1::AddDirectory(kFALSE);

  fhMeas  = new TH2F("measured",   Form("%s measured", GetTitle()),   nBinX, Xmin, Xmax, nBinY, Ymin, Ymax);
  fhGene  = new TH2F("generated",  Form("%s generated", GetTitle()),  nBinX, Xmin, Xmax, nBinY, Ymin, Ymax);
  fhCorr  = new TH2F("correction", Form("%s correction", GetTitle()), nBinX, Xmin, Xmax, nBinY, Ymin, Ymax);

  TH1::AddDirectory(oldStatus);

  fhMeas->Sumw2();
  fhGene->Sumw2();
  fhCorr->Sumw2();
}

//____________________________________________________________________
AliCorrectionMatrix2D::AliCorrectionMatrix2D(const Char_t* name, const Char_t* title,
				       Int_t nBinX, Float_t *X, Int_t nBinY, Float_t *Y) 
  : AliCorrectionMatrix(name, title)
{
  //
  // constructor
  //

  // do not add this hists to the directory
  Bool_t oldStatus = TH1::AddDirectoryStatus();
  TH1::AddDirectory(kFALSE);

	fhMeas  = new TH2F("measured",   Form("%s measured",title),   nBinX, X, nBinY, Y);
  fhGene  = new TH2F("generated",  Form("%s generated",title),  nBinX, X, nBinY, Y);
  fhCorr  = new TH2F("correction", Form("%s correction",title), nBinX, X, nBinY, Y);

  TH1::AddDirectory(oldStatus);

	fhMeas->Sumw2();
  fhGene->Sumw2();
  fhCorr->Sumw2();
}

//____________________________________________________________________
AliCorrectionMatrix2D::~AliCorrectionMatrix2D()
{
  //
  // destructor
  //

  // histograms already deleted in base class
}

TH2* AliCorrectionMatrix2D::GetGeneratedHistogram() const
{
  // return generated histogram casted to correct type
  return dynamic_cast<TH2*> (fhGene);
}

TH2* AliCorrectionMatrix2D::GetMeasuredHistogram() const
{
  // return measured histogram casted to correct type
  return dynamic_cast<TH2*> (fhMeas);
}

//____________________________________________________________________
TH1* AliCorrectionMatrix2D::Get1DCorrectionHistogram(const Char_t* opt, Float_t min, Float_t max, Bool_t binomialErrors)
{
  //
  // integrate the correction over one variable 
  // 

  TH1D* meas1D = 0;
  TH1D* gene1D = 0; 

  if (strcmp(opt,"x")==0) {
    Int_t binMin = fhMeas->GetYaxis()->FindBin(min);
    Int_t binMax = fhGene->GetYaxis()->FindBin(max);

    if (min>=max) {
      meas1D = ((TH2F*)fhMeas)->ProjectionX();
      gene1D = ((TH2F*)fhGene)->ProjectionX();
    }
    else {
      Printf("Getting 1D map. Including y-bins %d to %d", binMin, binMax);

      meas1D = ((TH2F*)fhMeas)->ProjectionX(Form("%s_x_pm", GetName()),binMin,binMax);
      gene1D = ((TH2F*)fhGene)->ProjectionX(Form("%s_x_pg", GetName()),binMin,binMax);
    }
  }
  else if (strcmp(opt,"y")==0) {
    Int_t binMin = fhMeas->GetXaxis()->FindBin(min);
    Int_t binMax = fhMeas->GetXaxis()->FindBin(max);

    if (min>=max) {
      meas1D = ((TH2F*)fhMeas)->ProjectionY();
      gene1D = ((TH2F*)fhGene)->ProjectionY();
    }
    else {
      Printf("Getting 1D map. Including x-bins %d to %d \n", binMin, binMax);

      meas1D = ((TH2F*)fhMeas)->ProjectionY(Form("%s_y_pm", GetName()), binMin, binMax);
      gene1D = ((TH2F*)fhGene)->ProjectionY(Form("%s_y_pg", GetName()), binMin, binMax);
    }
  }
  else {
    Printf("ERROR: Invalid option");
    return 0;
  }

  if (!binomialErrors)
  {
    // set the errors on gene manually, and clear the ones on meas.
    gene1D->Sumw2();
    for (Int_t bin=0; bin <= gene1D->GetNbinsX()+1; bin++)
    {
      gene1D->SetBinError(bin, TMath::Sqrt(gene1D->GetBinContent(bin)));
      meas1D->SetBinError(bin, 0);
    }
  }
  
  gene1D->SetName(Form("corr_1D_%s",fName.Data()));
  gene1D->SetTitle(Form("corr_1D_%s",fName.Data()));
 
  TH1* divided = (TH1*) gene1D->Clone(Form("corr_1D_%s",fName.Data()));
  divided->Reset();
  
  divided->Divide(gene1D, meas1D, 1, 1, (binomialErrors) ? "B" : "");

  Printf("%p %p", gene1D, meas1D);
  
  return (TH1F*)divided;   
}

//____________________________________________________________________
void AliCorrectionMatrix2D::FillMeas(Float_t ax, Float_t ay)
{
  // add value to measured histogram
  ((TH2F*)fhMeas)->Fill(ax, ay);
}

//____________________________________________________________________
void AliCorrectionMatrix2D::FillGene(Float_t ax, Float_t ay)
{
  // add value to generated histogram
  ((TH2F*)fhGene)->Fill(ax, ay);
}

//____________________________________________________________________
Float_t AliCorrectionMatrix2D::GetCorrection(Float_t ax, Float_t ay) const
{
  // returns a value of the correction map
  return fhCorr->GetBinContent(fhCorr->FindBin(ax,ay));
}

//____________________________________________________________________
void AliCorrectionMatrix2D::RemoveEdges(Float_t cut, Int_t nBinsXedge, Int_t nBinsYedge)
{
  // remove edges of correction histogram by removing 
  // - bins with content less than cut
  // - bins next to bins with zero bin content
  
  Int_t nBinsX = fhCorr->GetNbinsX();
  Int_t nBinsY = fhCorr->GetNbinsY();

  // set bin content to zero for bins with content smaller cut
  for (Int_t bx=0; bx<=nBinsX; bx++) {
    for (Int_t by=0; by<=nBinsY; by++) {
      if (fhCorr->GetBinContent(bx,by)>cut) {
	  fhCorr->SetBinContent(bx,by,0);
	  fhCorr->SetBinError(bx,by,0);
      }
    }
  }

  // set bin content to zero for bins next to bins with zero
  TH2F* tmp = (TH2F*)fhCorr->Clone("tmp");
  tmp->Reset();
  
  Bool_t done = kFALSE;
  Int_t nBinsXCount = 0;
  Int_t nBinsYCount = 0;
  while (!done) {    
    if (nBinsXCount<nBinsXedge) 
      for (Int_t bx=0; bx<=nBinsX; bx++) {
	for (Int_t by=0; by<=nBinsY; by++) {
	  if ((fhCorr->GetBinContent(bx+1,by)==0)|| 
	      (fhCorr->GetBinContent(bx-1,by)==0))
	    tmp->SetBinContent(bx,by,1);	
	  
	}
      }
    if (nBinsYCount<nBinsYedge) 
      for (Int_t bx=0; bx<=nBinsX; bx++) {
	for (Int_t by=0; by<=nBinsY; by++) {
	  if ((fhCorr->GetBinContent(bx,by+1)==0)|| 
	      (fhCorr->GetBinContent(bx,by-1)==0))
	    tmp->SetBinContent(bx,by,1);	
	}
      }    
    for (Int_t bx=0; bx<=nBinsX; bx++) {
      for (Int_t by=0; by<=nBinsY; by++) {
	if (tmp->GetBinContent(bx,by)==1) {
	  fhCorr->SetBinContent(bx,by,0);
	  fhCorr->SetBinError(bx,by,0);
	}
      }
    }
    nBinsXCount++;
    nBinsYCount++;
    if ((nBinsXCount>=nBinsXedge)&&(nBinsYCount>=nBinsYedge)) done=kTRUE;
  }
  tmp->Delete();  

}

//____________________________________________________________________
void AliCorrectionMatrix2D::Rebin(Int_t x, Int_t y)
{
	// rebins the histograms, recalculates the correction

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