ROOT logo
/**
 * @file   UnfoldMult.C
 * @author Valentina Zaccolo
 * @date   Tue Mar 05 12:56:56 2013
 * 
 * @brief  Bayesian Method Unfolding Script
 *
 * @ingroup pwglf_forward_scripts
 * @ingroup pwglf_forward_multdist
 */
#include <iostream>
#include <TList.h>
#include <TFile.h>
#include <TObject.h>
#include <TDirectory.h>
#include "TH1D.h"
#include "TH2D.h"
#include <TROOT.h>
#include <TSystem.h>
#include "RooUnfoldBayes.h"
#include "RooUnfoldResponse.h"
#include <TMath.h>
/** 
 * @defgroup pwglf_forward_scripts_unfoldmult UnfoldMult stuff 
 *
 * @ingroup pwglf_forward_multdist
 */
/** 
 * Get an object from a directory 
 * 
 * @param d     Directory 
 * @param name  Name of object 
 * 
 * @return Pointer to object or null if not found 
 *
 * @ingroup pwglf_forward_scripts_unfoldmult
 */
TObject* GetObject(TDirectory* d, const char* name)
{
  TObject* o = d->Get(name);
  if (!o) { 
    Error("GetCollection", "%s not found in %s", name, d->GetName());
    return 0;
  }
  return o;
}
/** 
 * Get an object from a collection
 * 
 * @param d     Collection 
 * @param name  Name of object
 * 
 * @return Pointer to object or null if not found 
 *
 * @ingroup pwglf_forward_scripts_unfoldmult
 */
TObject* GetObject(TCollection* d, const char* name)
{
  TObject* o = d->FindObject(name);
  if (!o) { 
    Error("GetCollection", "%s not found in %s", name, d->GetName());
    d->ls();
    return 0;
  }
  return o;
}
/** 
 * Get a collection from a directory
 * 
 * @param d     Parent directory 
 * @param name  Name of collection
 * 
 * @return Pointer to collection or null 
 *
 * @ingroup pwglf_forward_scripts_unfoldmult
 */
TCollection* GetCollection(TDirectory* d, const char* name)
{
  return static_cast<TCollection*>(GetObject(d, name));
}
/** 
 * Get a collection from a collection
 * 
 * @param d     Parent collection
 * @param name  Name of collection
 * 
 * @return Pointer to collection or null 
 *
 * @ingroup pwglf_forward_scripts_unfoldmult
 */
TCollection* GetCollection(TCollection* d, const char* name)
{
  return static_cast<TCollection*>(GetObject(d, name));
}
/** 
 * Get a 1D-histogram from a directory 
 * 
 * @param d     Parent directory 
 * @param name  Name of histogram 
 * 
 * @return Pointer to histogram or null 
 *
 * @ingroup pwglf_forward_scripts_unfoldmult
 */
TH1* GetH1(TDirectory* d, const char* name)
{
  return static_cast<TH1*>(GetObject(d, name));
}
/** 
 * Get a 1D-histogram from a collection 
 * 
 * @param d     Parent collectoin 
 * @param name  Name of histogram 
 * 
 * @return Pointer to histogram or null 
 *
 * @ingroup pwglf_forward_scripts_unfoldmult
 */
TH1* GetH1(TCollection* d, const char* name)
{
  return static_cast<TH1*>(GetObject(d, name));
}
/** 
 * Get a 2D-histogram from a directory 
 * 
 * @param d     Parent directory 
 * @param name  Name of histogram 
 * 
 * @return Pointer to histogram or null 
 */
TH2* GetH2(TDirectory* d, const char* name)
{
  return static_cast<TH2*>(GetObject(d, name));
}
/** 
 * Get a 2D-histogram from a collection
 * 
 * @param d     Parent collection
 * @param name  Name of histogram 
 * 
 * @return Pointer to histogram or null 
 *
 * @ingroup pwglf_forward_scripts_unfoldmult
 */
TH2* GetH2(TCollection* d, const char* name)
{
  return static_cast<TH2*>(GetObject(d, name));
}
/** 
 * Open a file 
 * 
 * @param filename      File name 
 * @param readNotWrite  If true, open read-only
 * 
 * @return Pointer to file, or null
 *
 * @ingroup pwglf_forward_scripts_unfoldmult
 */
TFile* OpenFile(const char* filename, Bool_t readNotWrite)
{
  TFile* ret = TFile::Open(filename, readNotWrite ? "READ" : "RECREATE");
  if (!ret) { 
    Error("OpenFile", "Failed to open the file \"%s\"", filename);
    return 0;
  }
  return ret;
}
/** 
 * A type definition to make it easier to switch to TDirectory structure 
 *
 * @ingroup pwglf_forward_scripts_unfoldmult
 */
typedef TCollection Dir;

/** 
 * Get histograms for @f$\eta@f$-bin from @a lowLim to @a highLim and
 * process it .
 * 
 * @param lowLim   Lower @f$\eta@f$ limit
 * @param highLim  Upper @f$\eta@f$ limit 
 * @param resp     Directory containing response matrices 
 * @param data     Directory containing data histogram 
 * @param out      Output directory  
 *
 * @ingroup pwglf_forward_scripts_unfoldmult
 */
void GetHistos(Double_t    lowLim, 
	       Double_t    highLim, 
	       Dir*        resp, 
	       Dir*        data, 
	       TDirectory* out);
/** 
 * Do the actual unfolding and corrections 
 * 
 * @param response   Response matrix 
 * @param measured   Measured distribution
 * @param mcHist     MC truth distribution
 * @param esdHist    MC distribution after ESD event selection
 *
 * @ingroup pwglf_forward_scripts_unfoldmult
 */
void ProcessUnfold(TH2* response, TH1* measured, TH1* mcHist, TH1* esdHist); 
/** 
 * Caclulate the trigger bias correction 
 * 
 * @param mcHist     MC truth distribution
 * @param esdHist    MC distribution after ESD event selection
 * 
 * @return  Histogram of trigger bias correction
 *
 * @ingroup pwglf_forward_scripts_unfoldmult
 */
TH1* GetTriggerBias(TH1* mcHist, TH1* esdHist);
/** 
 * Apply the trigger bias correction to the unfolded result
 * 
 * @param unfoldBefore Unfolded measured distribution
 * @param triggerBias  Trigger bias correction 
 * @param mcHist       MC truth distribution
 */
void DoCorrection(TH1* unfoldBefore, TH1* triggerBias, TH1* mcHist);


/** 
 * Main Loop to call eta range
 * 
 * @param respFile File containing response matrices 
 * @param dataFile File containing measured distributions
 * @param outFile  Output file 
 *
 * @ingroup pwglf_forward_scripts_unfoldmult
 */
void UnfoldMult(const char* respFile="forward_response.root", 
		const char* dataFile="forward_multiplicy.root", 
		const char* outFile="unfolded.root") 
{
  TFile* output = OpenFile(outFile,false);
  TFile* resp   = OpenFile(respFile, true);
  TFile* data   = OpenFile(dataFile, true);
  if (!output || !resp || !data) return;

  Dir* topResp  = GetCollection(resp, "ResponseMatricesSums");
  Dir* topData  = GetCollection(data, "MultSums");
  if (!topData || !topResp) return;
  
  Double_t limits[] = {5.1, 3.4, 3.0, 2.4, 2.0, 1.5, 1.0, 0.5, 0. };
  Double_t* limit = limits;

  while ((*limit) > 0.1) {
    if ((*limit) >5.) GetHistos(-3.4,      (*limit), topResp, topData, output);
    else              GetHistos(-(*limit), (*limit), topResp, topData, output);
    limit++; 
    output->cd();
  }
  output->Close();
  resp->Close();
  data->Close();
}

//____________________________________________________________________
void GetHistos(Double_t    lowLim, 
	       Double_t    highLim, 
	       Dir*        topResp, 
	       Dir*        topData,
	       TDirectory* out) 
{
  // Format the name of the bin 
  TString sLow( TString::Format("%+03d",int(10*lowLim)));
  TString sHigh(TString::Format("%+03d",int(10*highLim)));
  sLow .ReplaceAll("+", "plus");
  sLow .ReplaceAll("-", "minus");
  sHigh.ReplaceAll("+", "plus");
  sHigh.ReplaceAll("-", "minus");
  TString     name = TString::Format("%s_%s", sLow.Data(), sHigh.Data());
  TDirectory* dir = out->mkdir(name);
  dir->cd();

  // Get our collections 
  Dir* listResp = GetCollection(topResp, name);
  Dir* listData = GetCollection(topData,name);
  if(!listResp || !listData) return;

  // Get the MC histograms 
  TH2* response = GetH2(listResp, "responseMatrix");
  TH1* mcHist   = GetH1(listResp, "fMCNSD");
  TH1* esdHist  = GetH1(listResp, "fESDNSD");
  if (!response || !mcHist || !esdHist) return;

  // Get the data histogram 
  TH1* measured = GetH1(listData, "mult");
  if(!measured) return; 

  // Now do the unfolding 
  ProcessUnfold(response, measured, mcHist, esdHist);
} 



//____________________________________________________________________
void ProcessUnfold(TH2* response, TH1* measured, TH1* mcHist, TH1* esdHist) 
{
  Int_t nX   = response->GetNbinsX();
  Int_t nY   = response->GetNbinsY();
  TH1* projY = static_cast<TH1*>(response->ProjectionY("projY",1,nX,""));
  TH1* projX = static_cast<TH1*>(response->ProjectionX("projX",1,nY,""));
  projX->SetDirectory(0);
  projY->SetDirectory(0);
  
  TH2* responseTranspose = static_cast<TH2*>(response->Clone("response"));
  for(Int_t i = 1; i <= nX; i++) {
    for(Int_t j = 1; j <= nY; j++) {
      responseTranspose->SetBinContent(j,i, response->GetBinContent(i,j));
      responseTranspose->SetBinError(j,i, response->GetBinError(i,j));
    }
  }
  
  RooUnfoldResponse* responseObject = new RooUnfoldResponse(projY, projX, 
							    responseTranspose, 
							    "", "");
  RooUnfold*         unfold         = new RooUnfoldBayes(responseObject, 
							 measured, 5); 
  TH1*               unfolded       = static_cast<TH1*>(unfold->Hreco());
  TH1*               triggerBias    = GetTriggerBias(mcHist, esdHist);
  DoCorrection(unfolded, TriggerBias, mcHist);

  Double_t scale_unf = 1/unfolded->Integral();
  unfolded->Scale(scale_unf);
  unfolded->Write("Unfolded");

  Double_t scale_raw = 1/measured->Integral();
  measured->Scale(scale_raw);
  measured->Write("Raw");
  triggerBias->Write("TriggerBiasCorr");
}



//____________________________________________________________________
TH1* GetTriggerBias(TH1* mcHist, TH1* esdHist) 
{
  mcHist->Sumw2();
  esdHist->Sumw2();
  
  TH1* corr = new TH1D("corr", "corr", 40, -0.5, 39.5);  
  for (Int_t j=1; j<corr->GetNbinsX(); j++) {
    Double_t errSqr = 0.;
    Double_t cESD   = esdHist->GetBinContent(j);
    Double_t cMS    = mcHist->GetBinContent(j);
    Double_t c      = (cMC  == 0 ? 1 : 
		       cESD == 0 ? 1/cMC : cESD/cMC);
    corr->SetBinContent(j, c);
    corr->SetBinError(j, c*TMath::Sqrt(errSqr));
  }
  return corr;  
}

//____________________________________________________________________
void DoCorrection(TH1* unfoldBefore, TH1* triggerBias, TH1*) 
{
  for (Int_t k=1; k<=35; k++) {
    Double_t tb = triggerBias->GetBinContent(k);
    Double_t ub = unfoldBefore->GetBinContent(k);
    if (tb > 1e-5 && ub > 0) {
      unfoldBefore->SetBinContent(k, ub / tb);
      Double_t eub = UnfoldBefore->GetBinError(k);
      Double_t etb = TriggerBias->GetBinError(k);
      unfoldBefore->SetBinError(k, TMath::Sqrt(TMath::Power(eub/ub)+
					       TMath::Power(etb/tb))*ub/tb); 
    }
  }
}
//
// EOF
//



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