ROOT logo
// 
// Calculate the multiplicity in the forward regions event-by-event 
// 
// Inputs: 
//   - AliESDEvent 
//
// Outputs: 
//   - AliAODForwardMult 
// 
// Histograms 
//   
// Corrections used 
//
#include "AliForwardMultiplicityTask.h"
#include "AliTriggerAnalysis.h"
#include "AliPhysicsSelection.h"
#include "AliLog.h"
#include "AliESDEvent.h"
#include "AliAODHandler.h"
#include "AliMultiplicity.h"
#include "AliInputEventHandler.h"
#include "AliForwardCorrectionManager.h"
#include "AliAnalysisManager.h"
#include <TH1.h>
#include <TH3D.h>
#include <TDirectory.h>
#include <TTree.h>
#include <TROOT.h>
#include <TStopwatch.h>
#include <TProfile.h>
// #define ENABLE_TIMING
#ifndef ENABLE_TIMING
# define MAKE_SW(NAME) do {} while(false)
# define START_SW(NAME) do {} while(false)
# define FILL_SW(NAME,WHICH) do {} while(false)
#else
# define MAKE_SW(NAME) TStopwatch NAME
# define START_SW(NAME) if (fDoTiming) NAME.Start(true)
# define FILL_SW(NAME,WHICH)				\
  if (fDoTiming) fHTiming->Fill(WHICH,NAME.CpuTime())
#endif

//====================================================================
AliForwardMultiplicityTask::AliForwardMultiplicityTask()
  : AliForwardMultiplicityBase(),
    fESDFMD(),
    fEventInspector(),
    fESDFixer(),
    fSharingFilter(),
    fDensityCalculator(),
    fCorrections(),
    fHistCollector(),
    fEventPlaneFinder()
{
  // 
  // Constructor
  //
  DGUARD(fDebug, 3,"Default CTOR of AliForwardMultiplicityTask");
}

//____________________________________________________________________
AliForwardMultiplicityTask::AliForwardMultiplicityTask(const char* name)
  : AliForwardMultiplicityBase(name),
    fESDFMD(),
    fEventInspector("event"),
    fESDFixer("esdFizer"),
    fSharingFilter("sharing"), 
    fDensityCalculator("density"),
    fCorrections("corrections"),
    fHistCollector("collector"),
    fEventPlaneFinder("eventplane")
{
  // 
  // Constructor 
  // 
  // Parameters:
  //    name Name of task 
  //
  DGUARD(fDebug, 3,"named CTOR of AliForwardMultiplicityTask: %s", name);
}


//____________________________________________________________________
void
AliForwardMultiplicityTask::SetDoTiming(Bool_t enable)
{
#ifndef ENABLE_TIMING
  if (enable) 
    AliWarning("Timing of task explicitly disabled in compilation");
#else 
  fDoTiming = enable;
#endif
}
      
//____________________________________________________________________
void
AliForwardMultiplicityTask::PreCorrections(const AliESDEvent* esd)
{
  if (!esd) return; 
  
  AliESDFMD* esdFMD = esd->GetFMDData();  
  if (!esdFMD) return;

  Int_t tgt = GetESDFixer().FindTargetNoiseFactor(*esdFMD, false);
  if (tgt <= 0) {
    // If the target noise factor is 0 or less, disable the noise/gain
    // correction.
    GetESDFixer().SetRecoNoiseFactor(4);
    fNeededCorrections ^= AliForwardCorrectionManager::kNoiseGain;
  }
  else 
    AliWarning("The noise corrector has been enabled!");
}
//____________________________________________________________________
Bool_t
AliForwardMultiplicityTask::PreEvent()
{
  // Clear stuff 
  fHistos.Clear();
  fESDFMD.Clear();
  fAODFMD.Clear();
  fAODEP.Clear();
  return true;
}
//____________________________________________________________________
Bool_t
AliForwardMultiplicityTask::Event(AliESDEvent& esd)
{
  // 
  // Process each event 
  // 
  // Parameters:
  //    option Not used
  //  
  MAKE_SW(total);
  MAKE_SW(individual);
  START_SW(total);
  
  DGUARD(fDebug,1,"Process the input event");

  // Inspect the event
  START_SW(individual);
  Bool_t   lowFlux   = kFALSE;
  UInt_t   triggers  = 0;
  UShort_t ivz       = 0;
  TVector3 ip;
  Double_t cent      = -1;
  UShort_t nClusters = 0;
  UInt_t   found     = fEventInspector.Process(&esd, triggers, lowFlux, 
					       ivz, ip, cent, nClusters);
  FILL_SW(individual,kTimingEventInspector);

  if (found & AliFMDEventInspector::kNoEvent)    { 
    fHStatus->Fill(1);
    return false;
  }
  if (found & AliFMDEventInspector::kNoTriggers) {
    fHStatus->Fill(2);
    return false;
  } 

  // Set trigger bits, and mark this event for storage 
  fAODFMD.SetTriggerBits(triggers);
  fAODFMD.SetSNN(fEventInspector.GetEnergy());
  fAODFMD.SetSystem(fEventInspector.GetCollisionSystem());
  fAODFMD.SetCentrality(cent);
  fAODFMD.SetNClusters(nClusters);
  MarkEventForStore();
 
  // Do not check if SPD data is there - potential bias 
  // if (found & AliFMDEventInspector::kNoSPD) {
  //   fHStatus->Fill(3);
  //   return false;
  // }
  if (found    & AliFMDEventInspector::kNoFMD) {
    fHStatus->Fill(4);
    return false;
  }
  if (found    & AliFMDEventInspector::kNoVertex) {
    fHStatus->Fill(5);
    return false;
  }
  // Also analyse pile-up events - we'll remove them in later steps. 
  if (triggers & AliAODForwardMult::kPileUp) {
    fHStatus->Fill(6);
    return false;
  }
  fAODFMD.SetIpZ(ip.Z());
  if (found & AliFMDEventInspector::kBadVertex) {
    fHStatus->Fill(7);
    return false;
  }

  // We we do not want to use low flux specific code, we disable it here. 
  if (!fEnableLowFlux) lowFlux = false;

  // Get FMD data 
  AliESDFMD* esdFMD = esd.GetFMDData();  

  // Fix up the the ESD 
  GetESDFixer().Fix(*esdFMD, ip.Z());

  // Apply the sharing filter (or hit merging or clustering if you like)
  START_SW(individual);
  if (!fSharingFilter.Filter(*esdFMD, lowFlux, fESDFMD, ip.Z())) { 
    AliWarning("Sharing filter failed!");
    fHStatus->Fill(8);
    return false;
  }
  FILL_SW(individual,kTimingSharingFilter);
  
  // Calculate the inclusive charged particle density 
  START_SW(individual);
  if (!fDensityCalculator.Calculate(fESDFMD, fHistos, lowFlux, cent, ip)) { 
    // if (!fDensityCalculator.Calculate(*esdFMD, fHistos, ivz, lowFlux)) { 
    AliWarning("Density calculator failed!");
    fHStatus->Fill(9);
    return false;
  }
  FILL_SW(individual,kTimingDensityCalculator);

  // Check if we should do the event plane finder
  if (fEventInspector.GetCollisionSystem() == AliFMDEventInspector::kPbPb) {
    START_SW(individual);
    if (!fEventPlaneFinder.FindEventplane(&esd, fAODEP, 
					  &(fAODFMD.GetHistogram()), &fHistos)){
      AliWarning("Eventplane finder failed!");
      fHStatus->Fill(10);
    }
    FILL_SW(individual,kTimingEventPlaneFinder);
  }
  
  // Check how many rings have been marked for skipping 
  Int_t nSkip = 0;
  for (UShort_t d=1; d<=3; d++) { 
    for (UShort_t q=0; q<=(d/2); q++) { 
      TH2D* h = fHistos.Get(d,q == 0 ? 'I' : 'O');
      if (h && h->TestBit(AliForwardUtil::kSkipRing)) nSkip++;
    }
  }
  if (nSkip > 0) {
    // Skip the rest if we have too many outliers 
    fHStatus->Fill(11);
    return false;
  }
  
  // Do the secondary and other corrections. 
  START_SW(individual);
  if (!fCorrections.Correct(fHistos, ivz)) { 
    AliWarning("Corrections failed");
    fHStatus->Fill(12);
    return false;
  }
  FILL_SW(individual,kTimingCorrections);

  // Check if we should add to internal caches 
  Bool_t add = (fAODFMD.IsTriggerBits(fAddMask) && nSkip < 1);

  // Collect our `super' histogram 
  START_SW(individual);
  if (!fHistCollector.Collect(fHistos, 
			      fRingSums, 
			      ivz, 
			      fAODFMD.GetHistogram(),
			      fAODFMD.GetCentrality(),
			      false, 
			      add)) {
    AliWarning("Histogram collector failed");
    fHStatus->Fill(13);
    return false;
  }
  FILL_SW(individual,kTimingHistCollector);

  if (!add) {
    fHStatus->Fill(14);
  }
  else {
    // Collect rough Min. Bias result
    fHData->Add(&(fAODFMD.GetHistogram()));
    fHStatus->Fill(15);
  }
  FILL_SW(total,kTimingTotal);
  
  return true;
}


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