ROOT logo
#ifndef __CINT__
#include "AliForwardCorrectionManager.h"
#include "AliFMDCorrELossFit.h"
#include <TAxis.h>
#include <TFile.h>
#include <TList.h>
#include <TError.h>
#include <TH1.h>
#include <TF1.h>
#include <TClonesArray.h>
#else
class TAxis;
class AliFMDCirrELossFit;
class TH1;

#endif

/**
 * Class to make correction object and save to file 
 *
 * Run like					
 *
 * @verbatim 
 * gROOT->Macro("$ALICE_ROOT/PWGLF/FORWARD/analysis2/scripts/LoadLibs.C");
 * gROOT->LoadMacro("$ALICE_ROOT/PWGLF/FORWARD/analysis2/scripts/Compile.C");
 * Compile("$ALICE_ROOT/PWGLF/FORWARD/analysis2/MakeELossFit.C"); 
 * MakeELossFit mef(sys, cms, field, mc, "AnalysisResults.root"); 
 * mef.Run();
 * @endverbatim 
 * where @e sys, the collision system, is one of 
 * - 1: pp
 * - 2: PbPb
 * 
 * @e cms is the center of mass energy per nuclean in GeV (e.g., 2760
 * for first PbPb data), @e field is (signed) L3 magnetic in kG, and 
 * @e mc is wether this correction applies to MC data or not. 
 * 
 * The class generates a file like 
 * @verbatim
 * elossfits<sys>_<cms>GeV_<field>kG_<realmc>.root
 * @endverbatim 
 * in the working directory. This file can be moved to 
 * @verbatim
 * $(ALICE_ROOT)/PWGLF/FORWARD/corrections/ELossFits
 * @endverbatim 
 * and stored in SVN for later use. 
 *
 * @depcrecated 
 * The class AliFMDELossFitter automatically generates the
 * AliFMDCorrELossFit object.
 *
 * @ingroup pwglf_forward_scripts_tests
 */

class MakeELossFit 
{
protected: 
public:
  TList* fFitter;
  TAxis* fAxis;
  TClonesArray fFits;
  UShort_t     fSys;
  UShort_t     fCMS;
  Short_t      fField;
  Bool_t       fMC;

  //__________________________________________________________________
  MakeELossFit(UShort_t    sys, 
	       UShort_t    cms, 
	       Short_t     field, 
	       Bool_t      mc, 
	       const char* filename="forward_eloss.root") 
    : fFitter(0), 
      fAxis(0),
      fFits("AliFMDCorrELossFit::ELossFit"),
      fSys(sys), 
      fCMS(cms), 
      fField(field), 
      fMC(mc)
  {
    TFile* file = TFile::Open(filename, "READ");
    if (!file) { 
      Error("MakeELossFit", "Failed to open file %s", filename);
      return;
    }
    TList* forward = static_cast<TList*>(file->Get("Forward"));
    // static_cast<TList*>(file->Get("PWGLFforwardDnDeta/Forward"));
    if (!forward) { 
      Error("MakeELossFit", "Couldn't get forward list from %s", filename);
      return;
    }

    fFitter = static_cast<TList*>(forward->FindObject("fmdEnergyFitter"));
    if (!fFitter) { 
      Error("MakeELossFit", "Couldn't get fitter folder");
      return;
    }

    fAxis = static_cast<TAxis*>(fFitter->FindObject("etaAxis"));
    if (!fAxis) { 
      Error("MakeELossFit", "Couldn't get eta axis");
      return;
    }
    file->Close();

#if 0
    AliForwardCorrectionManager& mgr = AliForwardCorrectionManager::Instance();
    mgr.Init(sys, cms, field, mc, 0, true);
#endif
  }
  //__________________________________________________________________
  TList* GetRing(UShort_t d, Char_t r) const
  {
    TList* rL = static_cast<TList*>(fFitter->FindObject(Form("FMD%d%c",d,r)));
    if (!rL) { 
      Warning("DrawFits", "List FMD%d%c not found", d, r);
      return 0;
    }
    return rL;
  }
  //__________________________________________________________________
  TList* GetEDists(UShort_t d, Char_t r) const
  {
    TList* rList = GetRing(d, r);
    if (!rList) 
      return 0;
    // rList->ls();

    TList* edists = static_cast<TList*>(rList->FindObject("EDists"));
    if (!edists) { 
      Error("PrintFits", "Couldn't get EDists list for FMD%d%c", d,r);
      return 0; 
    }
    return edists;
  }
  //__________________________________________________________________
  TH1* GetEDist(UShort_t d, Char_t r, UShort_t etabin)
  {
    TList* eList = GetEDists(d, r);
    if (!eList) { 
      Warning("GetEDist", "No list for FMD%d%c", d, r);
      return 0;
    }
    // eList->ls();

    TString cmp(Form("FMD%d%c_etabin%03d", d, r, etabin));

    TIter next(eList);
    TObject* o = 0;
    while ((o = next())) { 
      if (!cmp.CompareTo(o->GetName())) {
	return static_cast<TH1*>(o);
      }
    }
    return 0;
  }
#ifndef __CINT__
  //__________________________________________________________________
  AliFMDCorrELossFit::ELossFit* FindBestFit(TH1* dist) 
  {
    TList* funcs = dist->GetListOfFunctions();
    TIter  next(funcs);
    TF1*   func = 0;
    fFits.Clear();
    Int_t  i = 0;
    Info("FindBestFit", "%s", dist->GetName());
    while ((func = static_cast<TF1*>(next()))) { 
      AliFMDCorrELossFit::ELossFit* fit = 
	new(fFits[i++]) AliFMDCorrELossFit::ELossFit(0,*func);
      fit->CalculateQuality(10, .20, 1e-7);
    }
    fFits.Sort(false);
    // fFits.Print();
    return static_cast<AliFMDCorrELossFit::ELossFit*>(fFits.At(0));
  }
#endif
  //__________________________________________________________________
  Bool_t Run()
  {
    if (!fFitter || !fAxis) { 
      Error("Run", "Missing objects");
      return kFALSE;
    }
    AliFMDCorrELossFit* obj = new AliFMDCorrELossFit;
    obj->SetEtaAxis(*fAxis);

    for (UShort_t d = 1; d <= 3; d++) { 
      Info("Run", "detector is FMD%d", d);
      UShort_t nQ = (d == 1 ? 1 : 2);
      for (UShort_t q = 0; q < nQ; q++) { 
	Char_t r = (q == 0 ? 'I' : 'O');
	Int_t nBin = fAxis->GetNbins();
	Info("Run", " ring is FMD%d%c - %d bins", d, r, nBin);
	
	Bool_t oneSeen = kFALSE;
	for (UShort_t b = 1; b <= nBin; b++) { 
	  TH1* h = GetEDist(d, r, b);
	  if (oneSeen && !h) break;
	  if (!h)            continue;
	  if (!oneSeen)      oneSeen = true;

	  AliFMDCorrELossFit::ELossFit* best = FindBestFit(h);
	  best->Print("");
	  best->fDet  = d; 
	  best->fRing = r;
	  best->fBin  = b;
	  // Double_t eta = fAxis->GetBinCenter(b);
	  Info("Run", "    bin=%3d->%6.4f", b, eta);
	  obj->SetFit(d, r, b, new AliFMDCorrELossFit::ELossFit(*best));
	}
      }
    }
    AliForwardCorrectionManager& mgr = AliForwardCorrectionManager::Instance();
    TString fname(mgr.GetFileName(AliForwardCorrectionManager::kELossFits,
				  fSys, fCMS, fField, fMC));
    TFile* output = TFile::Open(fname.Data(), "RECREATE");
    if (!output) { 
      Warning("Run", "Failed to open output file %s", fname.Data());
      return kFALSE;
    }
    obj->Write(mgr.GetObjectName(AliForwardCorrectionManager::kELossFits));
    output->Write();
    output->Close();
    Info("Run", "File %s created.  It should be copied to %s and stored in SVN",
	 fname.Data(),mgr.GetFileDir(AliForwardCorrectionManager::kELossFits));
    
    return kTRUE;
  }
};
//
// EOF
//
 TestMakeELossFits.C:1
 TestMakeELossFits.C:2
 TestMakeELossFits.C:3
 TestMakeELossFits.C:4
 TestMakeELossFits.C:5
 TestMakeELossFits.C:6
 TestMakeELossFits.C:7
 TestMakeELossFits.C:8
 TestMakeELossFits.C:9
 TestMakeELossFits.C:10
 TestMakeELossFits.C:11
 TestMakeELossFits.C:12
 TestMakeELossFits.C:13
 TestMakeELossFits.C:14
 TestMakeELossFits.C:15
 TestMakeELossFits.C:16
 TestMakeELossFits.C:17
 TestMakeELossFits.C:18
 TestMakeELossFits.C:19
 TestMakeELossFits.C:20
 TestMakeELossFits.C:21
 TestMakeELossFits.C:22
 TestMakeELossFits.C:23
 TestMakeELossFits.C:24
 TestMakeELossFits.C:25
 TestMakeELossFits.C:26
 TestMakeELossFits.C:27
 TestMakeELossFits.C:28
 TestMakeELossFits.C:29
 TestMakeELossFits.C:30
 TestMakeELossFits.C:31
 TestMakeELossFits.C:32
 TestMakeELossFits.C:33
 TestMakeELossFits.C:34
 TestMakeELossFits.C:35
 TestMakeELossFits.C:36
 TestMakeELossFits.C:37
 TestMakeELossFits.C:38
 TestMakeELossFits.C:39
 TestMakeELossFits.C:40
 TestMakeELossFits.C:41
 TestMakeELossFits.C:42
 TestMakeELossFits.C:43
 TestMakeELossFits.C:44
 TestMakeELossFits.C:45
 TestMakeELossFits.C:46
 TestMakeELossFits.C:47
 TestMakeELossFits.C:48
 TestMakeELossFits.C:49
 TestMakeELossFits.C:50
 TestMakeELossFits.C:51
 TestMakeELossFits.C:52
 TestMakeELossFits.C:53
 TestMakeELossFits.C:54
 TestMakeELossFits.C:55
 TestMakeELossFits.C:56
 TestMakeELossFits.C:57
 TestMakeELossFits.C:58
 TestMakeELossFits.C:59
 TestMakeELossFits.C:60
 TestMakeELossFits.C:61
 TestMakeELossFits.C:62
 TestMakeELossFits.C:63
 TestMakeELossFits.C:64
 TestMakeELossFits.C:65
 TestMakeELossFits.C:66
 TestMakeELossFits.C:67
 TestMakeELossFits.C:68
 TestMakeELossFits.C:69
 TestMakeELossFits.C:70
 TestMakeELossFits.C:71
 TestMakeELossFits.C:72
 TestMakeELossFits.C:73
 TestMakeELossFits.C:74
 TestMakeELossFits.C:75
 TestMakeELossFits.C:76
 TestMakeELossFits.C:77
 TestMakeELossFits.C:78
 TestMakeELossFits.C:79
 TestMakeELossFits.C:80
 TestMakeELossFits.C:81
 TestMakeELossFits.C:82
 TestMakeELossFits.C:83
 TestMakeELossFits.C:84
 TestMakeELossFits.C:85
 TestMakeELossFits.C:86
 TestMakeELossFits.C:87
 TestMakeELossFits.C:88
 TestMakeELossFits.C:89
 TestMakeELossFits.C:90
 TestMakeELossFits.C:91
 TestMakeELossFits.C:92
 TestMakeELossFits.C:93
 TestMakeELossFits.C:94
 TestMakeELossFits.C:95
 TestMakeELossFits.C:96
 TestMakeELossFits.C:97
 TestMakeELossFits.C:98
 TestMakeELossFits.C:99
 TestMakeELossFits.C:100
 TestMakeELossFits.C:101
 TestMakeELossFits.C:102
 TestMakeELossFits.C:103
 TestMakeELossFits.C:104
 TestMakeELossFits.C:105
 TestMakeELossFits.C:106
 TestMakeELossFits.C:107
 TestMakeELossFits.C:108
 TestMakeELossFits.C:109
 TestMakeELossFits.C:110
 TestMakeELossFits.C:111
 TestMakeELossFits.C:112
 TestMakeELossFits.C:113
 TestMakeELossFits.C:114
 TestMakeELossFits.C:115
 TestMakeELossFits.C:116
 TestMakeELossFits.C:117
 TestMakeELossFits.C:118
 TestMakeELossFits.C:119
 TestMakeELossFits.C:120
 TestMakeELossFits.C:121
 TestMakeELossFits.C:122
 TestMakeELossFits.C:123
 TestMakeELossFits.C:124
 TestMakeELossFits.C:125
 TestMakeELossFits.C:126
 TestMakeELossFits.C:127
 TestMakeELossFits.C:128
 TestMakeELossFits.C:129
 TestMakeELossFits.C:130
 TestMakeELossFits.C:131
 TestMakeELossFits.C:132
 TestMakeELossFits.C:133
 TestMakeELossFits.C:134
 TestMakeELossFits.C:135
 TestMakeELossFits.C:136
 TestMakeELossFits.C:137
 TestMakeELossFits.C:138
 TestMakeELossFits.C:139
 TestMakeELossFits.C:140
 TestMakeELossFits.C:141
 TestMakeELossFits.C:142
 TestMakeELossFits.C:143
 TestMakeELossFits.C:144
 TestMakeELossFits.C:145
 TestMakeELossFits.C:146
 TestMakeELossFits.C:147
 TestMakeELossFits.C:148
 TestMakeELossFits.C:149
 TestMakeELossFits.C:150
 TestMakeELossFits.C:151
 TestMakeELossFits.C:152
 TestMakeELossFits.C:153
 TestMakeELossFits.C:154
 TestMakeELossFits.C:155
 TestMakeELossFits.C:156
 TestMakeELossFits.C:157
 TestMakeELossFits.C:158
 TestMakeELossFits.C:159
 TestMakeELossFits.C:160
 TestMakeELossFits.C:161
 TestMakeELossFits.C:162
 TestMakeELossFits.C:163
 TestMakeELossFits.C:164
 TestMakeELossFits.C:165
 TestMakeELossFits.C:166
 TestMakeELossFits.C:167
 TestMakeELossFits.C:168
 TestMakeELossFits.C:169
 TestMakeELossFits.C:170
 TestMakeELossFits.C:171
 TestMakeELossFits.C:172
 TestMakeELossFits.C:173
 TestMakeELossFits.C:174
 TestMakeELossFits.C:175
 TestMakeELossFits.C:176
 TestMakeELossFits.C:177
 TestMakeELossFits.C:178
 TestMakeELossFits.C:179
 TestMakeELossFits.C:180
 TestMakeELossFits.C:181
 TestMakeELossFits.C:182
 TestMakeELossFits.C:183
 TestMakeELossFits.C:184
 TestMakeELossFits.C:185
 TestMakeELossFits.C:186
 TestMakeELossFits.C:187
 TestMakeELossFits.C:188
 TestMakeELossFits.C:189
 TestMakeELossFits.C:190
 TestMakeELossFits.C:191
 TestMakeELossFits.C:192
 TestMakeELossFits.C:193
 TestMakeELossFits.C:194
 TestMakeELossFits.C:195
 TestMakeELossFits.C:196
 TestMakeELossFits.C:197
 TestMakeELossFits.C:198
 TestMakeELossFits.C:199
 TestMakeELossFits.C:200
 TestMakeELossFits.C:201
 TestMakeELossFits.C:202
 TestMakeELossFits.C:203
 TestMakeELossFits.C:204
 TestMakeELossFits.C:205
 TestMakeELossFits.C:206
 TestMakeELossFits.C:207
 TestMakeELossFits.C:208
 TestMakeELossFits.C:209
 TestMakeELossFits.C:210
 TestMakeELossFits.C:211
 TestMakeELossFits.C:212
 TestMakeELossFits.C:213
 TestMakeELossFits.C:214
 TestMakeELossFits.C:215
 TestMakeELossFits.C:216
 TestMakeELossFits.C:217
 TestMakeELossFits.C:218
 TestMakeELossFits.C:219
 TestMakeELossFits.C:220
 TestMakeELossFits.C:221
 TestMakeELossFits.C:222
 TestMakeELossFits.C:223
 TestMakeELossFits.C:224
 TestMakeELossFits.C:225
 TestMakeELossFits.C:226
 TestMakeELossFits.C:227
 TestMakeELossFits.C:228
 TestMakeELossFits.C:229
 TestMakeELossFits.C:230
 TestMakeELossFits.C:231
 TestMakeELossFits.C:232
 TestMakeELossFits.C:233