ROOT logo
// 
// Histogram and fit the energy loss distributions for the FMD
// 
// Inputs: 
//   - AliESDEvent 
//
// Outputs: 
//   - None
// 
// Histograms:
//   
// Corrections used:
//   - None
// 
// 
//
#include "AliFMDEnergyFitterTask.h"
#include "AliLog.h"
#include "AliESDEvent.h"
#include "AliESDFMD.h"
#include "AliMCEvent.h"
#include "AliAODForwardMult.h"
#include "AliAnalysisManager.h"
#include "AliForwardCorrectionManager.h"
#include <TH1.h>
#include <TDirectory.h>
#include <TTree.h>
#include <TFile.h>
#include <TROOT.h>
#include <iostream>

//====================================================================
AliFMDEnergyFitterTask::AliFMDEnergyFitterTask()
  : AliBaseESDTask(),
    fEventInspector(),				
    fESDFixer(),
    fEnergyFitter(),
    fOnlyMB(false)
{
  // 
  // Constructor
  //
  DGUARD(fDebug, 3,"Default CTOR of AliFMDEnergyFitterTask");
  fCloneList = true;
}

//____________________________________________________________________
AliFMDEnergyFitterTask::AliFMDEnergyFitterTask(const char* name)
  : AliBaseESDTask(name, "AliFMDEnergyFitterTask", 
		   &(AliForwardCorrectionManager::Instance())), 
    fEventInspector("event"),
    fESDFixer("esdFizer"),
    fEnergyFitter("energy"),
    fOnlyMB(false)
{
  // 
  // Constructor 
  // 
  // Parameters:
  //    name Name of task 
  //
  DGUARD(fDebug, 3,"Named CTOR of AliFMDEnergyFitterTask: %s", name);
  fCloneList = true;
}


//____________________________________________________________________
void
AliFMDEnergyFitterTask::SetDebug(Int_t dbg)
{
  // 
  // Set the debug level 
  // 
  // Parameters:
  //    dbg Debug level
  //
  AliBaseESDTask::SetDebug(dbg);
  fEnergyFitter.SetDebug(dbg);
}
//____________________________________________________________________
TAxis*
AliFMDEnergyFitterTask::DefaultEtaAxis() const
{
  static TAxis* a = new TAxis(0, 0, 0);
  return a;
}
//____________________________________________________________________
TAxis*
AliFMDEnergyFitterTask::DefaultVertexAxis() const
{
  static TAxis* a = new TAxis(10, -10, 10);
  return a;
}

//____________________________________________________________________
Bool_t
AliFMDEnergyFitterTask::Setup()
{
  fEnergyFitter.Init();
  return true;
}

//____________________________________________________________________
Bool_t
AliFMDEnergyFitterTask::Book()
{
  // 
  // Create output objects 
  // 
  //
  DGUARD(fDebug,1,"Create output objects of AliFMDEnergyFitterTask");

  // We don't need any corrections for this task 
  fNeededCorrections = 0; 
  fExtraCorrections  = 0;
  if (fESDFixer.IsUseNoiseCorrection()) 
    fNeededCorrections = AliForwardCorrectionManager::kNoiseGain;

  fESDFixer    .CreateOutputObjects(fList);
  fEnergyFitter.CreateOutputObjects(fList);

  fList->Add(AliForwardUtil::MakeParameter("onlyMB", fOnlyMB));
  return true;
}
//____________________________________________________________________
void
AliFMDEnergyFitterTask::PreCorrections(const AliESDEvent* esd)
{
  if (!esd) return; 
  
  AliESDFMD* esdFMD = esd->GetFMDData();  
  if (!esdFMD) return;

  // TODO: We should always disable this on MC!
  Int_t tgt = fESDFixer.FindTargetNoiseFactor(*esdFMD, false);
  if (tgt <= 0) {
    // If the target noise factor is 0 or less, disable the noise/gain
    // correction.
    fESDFixer.SetRecoNoiseFactor(4);
    fNeededCorrections ^= AliForwardCorrectionManager::kNoiseGain;
  }
  else 
    AliWarning("The noise corrector has been enabled!");
}

//____________________________________________________________________
Bool_t
AliFMDEnergyFitterTask::PreData(const TAxis& /*vertex*/, const TAxis& eta)
{
  // 
  // Initialise the sub objects and stuff.  Called on first event 
  // 
  //
  DGUARD(fDebug,1,"Initialize subs of AliFMDEnergyFitterTask");

  fEnergyFitter.SetupForData(eta);

  Print();
  return true;
}

//____________________________________________________________________
Bool_t
AliFMDEnergyFitterTask::Event(AliESDEvent& esd)
{
  // 
  // Process each event 
  // 
  // Parameters:
  //    option Not used
  //  

  // static Int_t cnt = 0;
  // cnt++;
  // Get the input data 
  DGUARD(fDebug,3,"Analyse event of AliFMDEnergyFitterTask");
  // --- Read in the data --------------------------------------------
  LoadBranches();

  Bool_t   lowFlux   = kFALSE;
  UInt_t   triggers  = 0;
  UShort_t ivz       = 0;
  TVector3 ip;
  Double_t cent      = 0;
  UShort_t nClusters = 0;
  UInt_t   found     = fEventInspector.Process(&esd, triggers, lowFlux, 
					       ivz, ip, cent, nClusters);
  if (found & AliFMDEventInspector::kNoEvent)    return false;
  if (found & AliFMDEventInspector::kNoTriggers) return false;
  if (found & AliFMDEventInspector::kNoSPD)      return false;
  if (found & AliFMDEventInspector::kNoFMD)      return false;
  if (found & AliFMDEventInspector::kNoVertex)   return false;
  if (found & AliFMDEventInspector::kBadVertex)  return false;

  // do not process pile-up, A, C, and E events 
  if (triggers & AliAODForwardMult::kPileUp)     return false;
  if (triggers & AliAODForwardMult::kA)          return false;
  if (triggers & AliAODForwardMult::kC)          return false;
  if (triggers & AliAODForwardMult::kE)          return false;
  
  // We want only the events found by off-line 
  if (!(triggers & AliAODForwardMult::kOffline)) return false;

  // Perhaps we should also insist on MB only 
  if (fOnlyMB && (!(triggers & AliAODForwardMult::kInel))) return false;

  //  if(cent > 0) {
  //  if( cent < 40 || cent >50 ) return;
  //  else std::cout<<"selecting event with cent "<<cent<<std::endl;
  // }
  
  // Get FMD data 
  AliESDFMD* esdFMD = esd.GetFMDData();

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

  // Do the energy stuff 
  if (!fEnergyFitter.Accumulate(*esdFMD, cent, 
				triggers & AliAODForwardMult::kEmpty)){
    AliWarning("Energy fitter failed");
    return false;
  }

  return true;
}

//____________________________________________________________________
Bool_t
AliFMDEnergyFitterTask::Finalize()
{
  // 
  // End of job
  // 
  // Parameters:
  //    option Not used 
  //
  DGUARD(fDebug,1,"Processing merged output of AliFMDEnergyFitterTask");

  AliInfo("Fitting energy loss spectra");
  fEnergyFitter.Fit(fResults);

  return true;
}

#define PFB(N,FLAG)				\
  do {									\
    AliForwardUtil::PrintName(N);					\
    std::cout << std::boolalpha << (FLAG) << std::noboolalpha << std::endl; \
  } while(false)
//____________________________________________________________________
void
AliFMDEnergyFitterTask::Print(Option_t* option) const
{
  // 
  // Print information 
  // 
  // Parameters:
  //    option Not used
  //
  AliBaseESDTask::Print(option);
  gROOT->IncreaseDirLevel();
  PFB("Only MB", fOnlyMB);
  fESDFixer    .Print(option);
  fEnergyFitter.Print(option);
  gROOT->DecreaseDirLevel();
}

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