ROOT logo
//====================================================================
#include "AliMCTruthdNdetaTask.h"
#include <TMath.h>
#include <TH2D.h>
#include <TH1D.h>
#include <THStack.h>
#include <TList.h>
#include <TFile.h>
#include <AliAnalysisManager.h>
#include <AliAODEvent.h>
#include <AliAODHandler.h>
#include <AliAODInputHandler.h>
#include "AliForwardUtil.h"
#include "AliAODForwardMult.h"

//____________________________________________________________________
AliMCTruthdNdetaTask::AliMCTruthdNdetaTask()
  : AliBasedNdetaTask(),
    fHasData(true)
{
  //
  // Constructor 
  // 
}

//____________________________________________________________________
AliMCTruthdNdetaTask::AliMCTruthdNdetaTask(const char* /* name */)
  : AliBasedNdetaTask("MCTruth"), 
    fHasData(true)
{
  // 
  // Constructor
  // 
  // Paramters
  //   name    Name of task 
}


//____________________________________________________________________
AliBasedNdetaTask::CentralityBin*
AliMCTruthdNdetaTask::MakeCentralityBin(const char* name, Short_t l, Short_t h) 
  const 
{
  // 
  // Make a new centrality bin
  // 
  // Parameters:
  //    name   Histogram names
  //    l      Lower cut
  //    h      Upper cut
  // 
  // Return:
  //    Newly allocated object (of our type)
  //
  return new AliMCTruthdNdetaTask::CentralityBin(name, l, h);
}

//____________________________________________________________________
TH2D*
AliMCTruthdNdetaTask::GetHistogram(const AliAODEvent& aod, Bool_t mc)
{
  // 
  // Retrieve the histogram 
  // 
  // Parameters:
  //    aod AOD event 
  //    mc  Whether to get the MC histogram or not
  // 
  // Return:
  //    Retrieved histogram or null
  //
  if (!fHasData) return 0;
  if (mc) return 0;

  TH2D* ret = GetPrimary(aod);
  if (!ret) {
    fHasData = false;
    return 0;
  }
  Int_t nY  = ret->GetNbinsY();
  // Need to fill under-/overflow bin with 1's 
  for (Int_t i = 1; i <= ret->GetNbinsX(); i++)  {
    ret->SetBinContent(i, 0,    1);
    ret->SetBinContent(i, nY+1, 1);
  }
  return ret;
}

//________________________________________________________________________
Bool_t
AliMCTruthdNdetaTask::Finalize() 
{
  // 
  // Called at end of event processing.. 
  //
  // This is called once in the master 
  // 
  // Parameters:
  //    option Not used 
  if (!fHasData) {
    AliInfo("The MC truth dN/deta task didn't get any data");
    return false;
  }
  AliBasedNdetaTask::Finalize();

  THStack*       truth = new THStack("dndetaTruth", "dN/d#eta MC Truth");
  CentralityBin* bin   = 0;
  TIter          next(fListOfCentralities);
  while ((bin = static_cast<CentralityBin*>(next()))) {
    if (HasCentrality() && bin->IsAllBin()) continue;

    TList* results = bin->GetResults();
    if (!results) continue; 

    TH1* dndeta      = static_cast<TH1*>(results->FindObject("dndetaTruth"));
    if (dndeta)      truth->Add(dndeta);
  }
  // If available output rebinned stack 
  if (!truth->GetHists() || 
      truth->GetHists()->GetEntries() <= 0) {
    AliWarning("No MC truth histograms found");
    delete truth;
    truth = 0;
  }
  if (truth) fResults->Add(truth);

  return true;
}

//========================================================================
Bool_t
AliMCTruthdNdetaTask::CentralityBin::ProcessEvent(const AliAODForwardMult* 
						  forward, 
						  Int_t triggerMask,
						  Bool_t isZero,
						  Double_t vzMin, 
						  Double_t vzMax, 
						  const TH2D* primary,
						  const TH2D*,
						  Bool_t checkPileup)
{ 
  // Check the centrality class unless this is the 'all' bin 
  if (!primary) return false;

  if (!IsAllBin()) { 
    Double_t centrality = forward->GetCentrality();
    if (centrality < fLow || centrality >= fHigh) return false;
  }

  if (!fSum) CreateSums(primary, 0);
  if (!fSumTruth) { 
    fSumTruth = static_cast<TH2D*>(primary->Clone("truth"));
    fSumTruth->SetDirectory(0);
    fSumTruth->Reset();
    fSums->Add(fSumTruth);
  }

  // translate real trigger mask to MC trigger mask
  Int_t mask = AliAODForwardMult::kB;
  if (triggerMask == AliAODForwardMult::kNSD) {
    mask ^= AliAODForwardMult::kNSD;
    mask =  AliAODForwardMult::kMCNSD;
  }

  // Now use our normal check, but with the new mask, except ignore vertex
  if (forward->CheckEvent(mask, -10000, -10000, 0, 0, 0, 0, checkPileup)) {
    fSumTruth->Add(primary);

    // Store event count in left-most under- underflow bin 
    Int_t cnt = Int_t(fSumTruth->GetBinContent(0,0));
    fSumTruth->SetBinContent(0,0, ++cnt);
  }

  // Now use our normal check with the full trigger mask and vertex
  if (CheckEvent(forward, triggerMask, vzMin, vzMax, checkPileup)) 
    fSum->Add(primary, isZero);
  return true;
}

//________________________________________________________________________
void
AliMCTruthdNdetaTask::CentralityBin::End(TList*      sums, 
					 TList*      results,
					 UShort_t    scheme,
					 Double_t    trigEff,
					 Double_t    trigEff0,
					 Bool_t      rootProj,
					 Bool_t      corrEmpty, 
					 Int_t       triggerMask,
					 Int_t       marker,
					 Int_t       color,
					 TList*      mclist,
					 TList*      truthlist)
{
#if 0
  AliInfo(Form("At end with sums=%p, results=%p, scheme=%d, "
	       "shapeCorr=%p, trigEff=%f, symmetrice=%d, rebin=%d, "
	       "rootProj=%d, corrEmpty=%d, cutEdges=%d, triggerMask=0x%08x, "
	       "marker=%d (%d)", 
	       sums, results, scheme, shapeCorr, trigEff, trigEff0, symmetrice, 
	       rebin, rootProj, corrEmpty, cutEdges, triggerMask, marker,
	       GetMarkerStyle(kStar)));
#endif

  AliBasedNdetaTask::CentralityBin::End(sums, results, scheme, trigEff, 
					trigEff0, rootProj, corrEmpty,
					triggerMask, marker, color, mclist, 
					truthlist);

  fSumTruth     = static_cast<TH2D*>(fSums->FindObject("truth"));
  

  if (fSumTruth) { 
    Int_t n0 = Int_t(fSumTruth->GetBinContent(0,0));
    Int_t n  = (triggerMask == AliAODForwardMult::kNSD ? 
		Int_t(fTriggers->GetBinContent(AliAODForwardMult::kBinMCNSD)) : 
		Int_t(fTriggers->GetBinContent(AliAODForwardMult::kBinAll)));
    DMSG(fDebug,0,"Normalising MC truth to %d (%d additions)", n, n0);
    
    TH1D* dndetaTruth = fSumTruth->ProjectionX("dndetaTruth",1,
					       fSumTruth->GetNbinsY(),"e");
    dndetaTruth->SetDirectory(0);
    dndetaTruth->Scale(1./n, "width");
    
    SetHistogramAttributes(dndetaTruth, GetColor(color)+1, 
			   GetMarkerStyle(kCross), 
			   "Monte-Carlo truth");

    fOutput->Add(dndetaTruth);
  }
  TH1* dndeta          =                       GetResult("");
  if (dndeta)    
    dndeta->SetTitle("Monte-Carlo truth (selected)");
}

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