ROOT logo
// ELossTimeTrain.C
#ifndef NO_TRAIN
#ifndef __CINT__
#include <AliAnalysisManager.h>
#include <fstream>
#else
class AliAnalysisManager;
#endif
#include "TrainSetup.C"
#include "ParUtilities.C"

/** 
 * Train to record time of each event 
 * 
 * @ingroup pwglf_forward_eventtime
 */        
class ELossTimeTrain : public TrainSetup
{
public:
  /** 
   * Constructor 
   * 
   * @param name The name 
   */
  ELossTimeTrain(const char* name="eventTime") : TrainSetup(name)
  { 
    fOptions.Add("map", "FILE", "File containg map", "map.root");
    fOptions.Set("type", "ESD");
  }
  /** 
   * Create our tasks 
   */
  void CreateTasks(AliAnalysisManager*)
  {
    if (!fRailway->LoadLibrary("PWGLFforward2")) 
      Fatal("CreateTasks", "Failed to load PWGLFforward2");
    
    if (!ParUtilities::MakeScriptPAR(fRailway->Mode() == Railway::kLocal,
				     "EventTimeTask.C",
				     // Gui because of CDB - sigh!
				     // XMLParser because of CDB 
				     "Gui,XMLParser,"
				     "STEERBase,CDB,ESD,AOD,ANALYSIS,OADB,"
				     "ANALYSISalice",
				     fRailway)) 
      Fatal("","Failed to make support PAR");
    if (!fRailway->LoadLibrary("EventTimeTask")) 
      Fatal("CreateTasks", "Failed to load EventTimeTask");

    if (!ParUtilities::MakeScriptPAR(fRailway->Mode() == Railway::kLocal,
				     "ELossTimeTask.C",
				     "Gui,STEERBase,CDB,ESD,AOD,ANALYSIS,OADB,"
				     "ANALYSISalice,PWGLFforward2,"
				     "EventTimeTask",
				     fRailway)) 
      Fatal("","Failed to make PAR");
    if (!fRailway->LoadLibrary("ELossTimeTask")) 
      Fatal("CreateTasks", "Failed to load ELossTimeTask");

    TString mapfile = fOptions.Get("map");
    gROOT->ProcessLine(Form("ELossTimeTask::Create(\"%s\")", mapfile.Data()));

    fRailway->LoadAux(mapfile.Data(), true);
  }
  /** 
   * Do not create a physics selection
   */
  // void CreatePhysicsSelection(Bool_t, AliAnalysisManager*) {}
  /** 
   * Do not create a centrality selection
   */
  void CreateCentralitySelection(Bool_t) {}
  /** 
   * Do not create an output handler
   */
  AliVEventHandler* CreateOutputHandler(UShort_t) { return 0; }
  /** 
   * The train class name 
   * 
   * @return Train class name
   */
  const char* ClassName() const { return "ELossTimeTrain"; }
  /** 
   * Overloaded to create new dNdeta.C and dndeta.sh in the output 
   * directory
   * 
   * @param asShellScript 
   */
  void SaveSetup(Bool_t asShellScript)
  {
    TrainSetup::SaveSetup(asShellScript);
    
    SaveDraw();
  }
  void SaveDraw()
  {
    std::ofstream o("Draw.C");
    o << "// Written by " << ClassName() << "\n"
      << "void Draw(const char* fileName=\"AnalysisResults.root\")\n"
      << "{\n"
      << "  gSystem->AddIncludePath(\"-DNO_TRAIN -DSUMMARY\");\n"
      << "  const char* fwd = \"$ALICE_ROOT/PWGLF/FORWARD/analysis2\";\n"
      << "  gSystem->AddIncludePath(Form(\"-I%s/scripts\", fwd));\n"
      << "  gROOT->SetMacroPath(Form(\"%s/trains:%s\", fwd,\n"
      << "                           gROOT->GetMacroPath()));\n"
      << "  gROOT->LoadMacro(\"ELossTimeTrain.C+\");\n"
      << "  ELossTimeSummary s;\n"
      << "  s.Run(fileName);\n"
      << "}\n"
      << std::endl;
    o.close();
  }
  void PostShellCode(std::ostream& f)
  {
    f << "  echo \"=== Draw results ...\"\n"
      << "  aliroot -l -b -q ${prefix}Draw.C\\(\\\"AnalysisResults.root\\\"\\)\n"
      << std::endl;
  }
};
#endif
#ifdef SUMMARY
# include <SummaryDrawer.C>
# include <TColor.h>

/**
 * Draw summary of the above train
 * 
 * @ingroup pwglf_forward_eventtime
 */
struct ELossTimeSummary : public SummaryDrawer 
{
  enum EFlags { 
    kEventInspector    = 0x001, 
  };
  /** 
   * Run the class 
   * 
   * @param fname Filename 
   * @param flags Flags
   */
  void Run(const char* fname, UShort_t flags=0x01)
  {
    // --- Open the file -----------------------------------------------
    TString filename(fname);
    TFile* file = TFile::Open(filename.Data(), "READ");
    if (!file) { 
      Error("Run", "Failed to open \"%s\"", filename.Data());
      return;
    }
    fPause         = flags & kPause;
    
    // --- Make our canvas ---------------------------------------------
    TString pdfName(filename);
    pdfName.ReplaceAll(".root", ".pdf");
    CreateCanvas(pdfName, flags & kLandscape);

    // --- Make title page -------------------------------------------
    TCollection* c = GetCollection(file, "elossTimeSums");
    DrawTitlePage(c);

    if (flags & kEventInspector)    DrawEventInspector(c);
    
    TH1* dt = GetH1(c, "dt");
    DrawInPad(fBody, 0, dt, "", kLogy);
    PrintCanvas("#Deltat");

    const char* rings[] = { "FMD1i", "FMD2i", "FMD2o", "FMD3o", "FMD3i", 0 };
    const char** pring   = rings;

    while (*pring) {
      DrawRing(c, *pring, dt);
      pring++;
    }

    CloseCanvas();
  }
  /** 
   * Draw the title page 
   * 
   * @param c Parent collection
   */
  void DrawTitlePage(TCollection* c)
  {
    fBody->cd();

    Double_t y = .7;
    TLatex* ltx = new TLatex(.5, y, "#Deltat vs #Delta/#Delta_{mip}");
    ltx->SetTextSize(0.07);
    ltx->SetTextFont(62);
    ltx->SetTextAlign(22);
    ltx->SetNDC();
    ltx->Draw();

    Double_t save = fParName->GetTextSize();
    fParName->SetTextSize(0.03);
    fParVal->SetTextSize(0.03);
    y = .6;
    
    TCollection* fc = GetCollection(c, "fmdEventInspector");
    UShort_t sys;
    UShort_t sNN;
    ULong_t  runNo;
    GetParameter(fc, "sys",     sys);
    GetParameter(fc, "sNN",     sNN);
    GetParameter(fc, "runNo",   runNo);
    
    DrawParameter(y, "Run #", Form("%lu", runNo));
    TString tS; SysString(sys, tS);      DrawParameter(y, "System", tS);
    TString tE; SNNString(sNN, tE);      DrawParameter(y, "#sqrt{s_{NN}}", tE);

    PrintCanvas("Title page");
    fParName->SetTextSize(save);
    fParVal->SetTextSize(save);
  }
  /** 
   * Draw a single ring
   * 
   * @param c     Parent collection
   * @param ring  Ring name 
   * @param dt    Histogram of delta time 
   */
  void DrawRing(TCollection* c, const char* ring, TH1* dt)
  {
    TCollection* lring = GetCollection(c, ring);
    if (!lring) return;
    
    TH2* h2 = GetH2(lring, "dtVsELoss");
    if (!h2) return;

    THStack* stack = new THStack(ring, ring);
    // stack->SetTitle(ring);

    THStack* ratios = new THStack(Form("Ratios for %s",ring), ring);
    // stack->SetTitle(ring);

    Printf(ring);
    Int_t j = 2;
    TH1* first = 0;
    Double_t lfirst = 0;
    Double_t rmax = 0;
    Double_t max = 3;
    for (Int_t i = 1; i <= h2->GetNbinsY(); i++) { 
      TH1*     h     = h2->ProjectionX(Form("%s_%03d", ring, i), i,i);
      Double_t logDt = h2->GetYaxis()->GetBinCenter(i);

      Int_t    nFill = h->GetEntries();
      if (nFill <= 1000) continue;
      Double_t norm = dt->GetBinContent(i);
      if (norm <= 1e-6) {
	Warning("", "Normalization=%f<1e-6 but got "
		"%d>1000 entries for log10(dt)=%5.3f", norm, nFill, logDt);
	continue;
      }
      if (!first && logDt > TMath::Log10(25.)) {
	lfirst = logDt;
	first = h;
      }
      // Info("", "Normalization is %f", norm);
      h->Sumw2();
      h->Scale(1. / norm);
      h->SetTitle(Form("log_{10}(#Deltat)=%5.3f", logDt));

      Float_t r, g, b;
      TColor::HSV2RGB((j-1)*45, 1, .8, r, g, b);
      Int_t col = TColor::GetColor(r, g, b);
      j++;
      h->SetLineColor(col);
      h->SetLineStyle(j % 3+1);
      h->SetLineWidth(2);
      // h->SetFillColor(col);
      // h->SetFillStyle(3002);
      stack->Add(h);

      if (h == first) continue;
      TH1* rh = static_cast<TH1*>(h->Clone(Form("ratio%s", h->GetName())));
      // rh->SetTitle(Form("log_{10}(#Deltat)=%5.3f", logDt));
      rh->Divide(first);
      for (Int_t k = 1; k <= rh->GetNbinsX(); k++) {
	if (rh->GetXaxis()->GetBinCenter(k) > max) break;
	rmax = TMath::Max(rmax, rh->GetBinContent(k));
      }

      ratios->Add(rh);
    }
    Double_t savX = fParVal->GetX();
    Double_t savY = fParVal->GetY();
    fParVal->SetX(0.12);
    fParVal->SetY(0.12);
    fBody->Divide(1,2,0,0);
    DrawInPad(fBody,1,stack,"nostack hist", kLogy|kLegend);
    stack->GetXaxis()->SetRangeUser(-.1,max);
    stack->GetYaxis()->SetTitle("1/N_{ev} dN/d(#Delta/#Delta_{mip})");

    fParVal->SetX(0.6);
    fParVal->SetY(0.4);
    DrawInPad(fBody,2,ratios,"nostack hist", kLegend);
    ratios->GetXaxis()->SetRangeUser(-.1, max);
    ratios->GetXaxis()->SetTitle("#Delta/#Delta_{mip}");
    ratios->GetYaxis()
      ->SetTitle(Form("X/(1/N_{ev}dN/d(#Delta/#Delta_{mip}))|_{%5.3f}",lfirst));
    Printf("Max: %f (%f)", ratios->GetMaximum(), rmax);
    ratios->SetMaximum(rmax*1.2);


    fParVal->SetX(savX);
    fParVal->SetY(savY);
    PrintCanvas(ring);
  }
};

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