ROOT logo
//====================================================================
#include "AliForwarddNdetaTask.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"

//____________________________________________________________________
AliForwarddNdetaTask::AliForwarddNdetaTask()
  : AliBasedNdetaTask()
{
  //
  // Constructor 
  // 
  DGUARD(fDebug, 3, "Default CTOR of AliForwarddNdetaTask");
}

//____________________________________________________________________
AliForwarddNdetaTask::AliForwarddNdetaTask(const char* /* name */)
  : AliBasedNdetaTask("Forward")
{
  // 
  // Constructor
  // 
  // Paramters
  //   name    Name of task 
  // SetTitle("FMD");
  DGUARD(fDebug, 3, "Named CTOR of AliForwarddNdetaTask");
}

//____________________________________________________________________
AliForwarddNdetaTask::AliForwarddNdetaTask(const AliForwarddNdetaTask& o)
  : AliBasedNdetaTask(o)
{
  // 
  // Copy constructor
  // 
  DGUARD(fDebug, 3, "Copy CTOR of AliForwarddNdetaTask");
}

//____________________________________________________________________
AliBasedNdetaTask::CentralityBin*
AliForwarddNdetaTask::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)
  //
  DGUARD(fDebug, 3,
	 "Make a centrality bin for AliForwarddNdetaTask: %s [%d,%d]",
	 name, l, h);
  return new AliForwarddNdetaTask::CentralityBin(name, l, h);
}


//____________________________________________________________________
TH2D*
AliForwarddNdetaTask::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
  //
  // We should have a forward object at least 
  AliAODForwardMult* forward = GetForward(aod, mc, !mc);
  if (!forward) return 0;
  return &(forward->GetHistogram());
}
//____________________________________________________________________
void
AliForwarddNdetaTask::CheckEventData(Double_t vtx, 
				     TH2*     data, 
				     TH2*     dataMC)
{
  // Check if this is satellite
  // if (!fSatelliteVertices) return;
  Double_t aVtx = TMath::Abs(vtx);
  if (aVtx < 37.5 || aVtx > 400) return;

  TH2* hists[] = { data, dataMC };

  // In satellite vertices FMD2i is cut away manually at this point
  // for certain vertices. It could be done in the ESDs, but as of
  // this writing not for specific vertices.
  // 
  // cholm comment: It would be difficult to setup the filter in the
  // reconstruction pass, but it could perhaps be done in the AOD
  // filtering.
  // 
  // This is what was done for
  // the Pb-Pb paper (arXiv:1304.0347).
  for (Int_t iX = 0; iX<=data->GetNbinsX(); iX++) {
    // Do all checks up front - as soon as we can - branching is
    // expensive!
    Double_t x    = data->GetXaxis()->GetBinCenter(iX);
    Bool_t   zero = false;
    if (((vtx >  60 && vtx <  90) && x < 3) ||
	((vtx > 330 && vtx < 350) && x > -2.5) ||
	((vtx < 100 || vtx > 305) && TMath::Abs(x) < 4.5) || 
	(vtx < 50                 && TMath::Abs(x) < 4.75))
      zero = true;
    if (!zero) continue;
    
    for (Int_t iH = 0; iH < 2; iH++) {
      if (!hists[iH]) continue;
      // if (iX > hists[iH]->GetNbinsX()+1) continue;
      // Also zero coverage and phi acceptance for this 
      for (Int_t iY = 0; iY<=hists[iH]->GetNbinsY()+1; iY++) {	  
	hists[iH]->SetBinContent(iX, iY, 0);
	hists[iH]->SetBinError(iX, iY, 0);
      }
    }
  }

  if (fCorrEmpty) {
    // Now, since we have some dead areas in FMD2i (sectors 16 and
    // 17), we need to remove the corresponding bins from the
    // histogram. However, it is not obvious which bins (in eta) to
    // remove, so remove everything starting from the most negative to
    // the middle of the histogram.
    // 
    // This hack was first introduced by HHD, but was done at the end of
    // the event processing (CentralityBin::MakeResults).  That is,
    // however, not very practical, as we'd like to normalize to the phi
    // acceptance rather than the eta coverage and then correct for
    // empty bins. Since the only way to really update the phi
    // acceptance stored in the overflow bin is on the event level, we
    // should really do it here.
    const Int_t phiBin1 = 17; // Sector 16
    const Int_t phiBin2 = 18; // Sector 17
    for (Int_t iH = 0; iH < 2; iH++) { 
      if (!hists[iH]) continue;
      
      Int_t midX = hists[iH]->GetNbinsX() / 2;
      // Int_t nY   = hists[iH]->GetNbinsY();
      for (Int_t i = 1; i <= midX; i++) { 
	hists[iH]->SetBinContent(i, phiBin1, 0);
	hists[iH]->SetBinContent(i, phiBin2, 0);
	hists[iH]->SetBinError(i, phiBin1, 0);
	hists[iH]->SetBinError(i, phiBin2, 0);
	
	// Here, we should also modify the overflow bin to reflect the
	// new phi acceptance.  First get the old phi acceptance -
	// then multiply this on the number of bins. This gives us -
	// roughly - the number of sectors we had.  Then take out two
	// from that number, and then calculate the new phi
	// Acceptance. Note, if the sectors where already taken out in
	// the AOD production, we _will_ end up with a wrong number,
	// so we should _not_ do that in the AOD production.  This is
	// tricky and may not work at all.  For now, we should rely on
	// the old way of correcting to the eta coverage and
	// correcting for empty bins.
      }
    }
  }
}
//========================================================================
void
AliForwarddNdetaTask::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 )
{
  DGUARD(fDebug, 1,"In End of %s with corrEmpty=%d, rootProj=%d", 
	 GetName(), corrEmpty, rootProj);
  AliBasedNdetaTask::CentralityBin::End(sums, results, scheme, trigEff, 
					trigEff0, rootProj, corrEmpty,
					triggerMask, marker, color, mclist, 
					truthlist);

  if (!IsAllBin()) return;
  TFile* file = TFile::Open("forward.root", "READ");
  if (!file) return;
  
  TList* forward = static_cast<TList*>(file->Get("ForwardSums"));
  if (!forward) { 
    AliError("List Forward not found in forward.root");
    return;
  }
  TList* rings = static_cast<TList*>(forward->FindObject("ringResults"));
  if (!rings) { 
    AliError("List ringResults not found in forward.root");
    return;
  }
  THStack* res = static_cast<THStack*>(rings->FindObject("all"));
  if (!res) { 
    AliError(Form("Stack all not found in %s", rings->GetName()));
    return;
  }
  if (!fTriggers) { 
    AliError("Triggers histogram not set");
    return;
  }

  Double_t ntotal   = 0;
  Double_t epsilonT = trigEff;
#if 0
  // TEMPORARY FIX
  if (triggerMask == AliAODForwardMult::kNSD) {
    // This is a local change 
    epsilonT = 0.92; 
    AliWarning(Form("Using hard-coded NSD trigger efficiency of %f",epsilonT));
  }
#endif
  AliInfo("Adding per-ring histograms to output");
  TString text;
  Double_t scaler = Normalization(*fTriggers, scheme, epsilonT, ntotal, &text);
  TIter next(res->GetHists());
  TH1*  hist = 0;
  while ((hist = static_cast<TH1*>(next()))) hist->Scale(scaler);
  res->SetName("dndetaRings");
  fOutput->Add(res);
  fOutput->Add(new TNamed("normCalc", text.Data()));
}

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