ROOT logo
/**
 * @file   DrawSteps.C
 * @author Christian Holm Christensen <cholm@nbi.dk>
 * @date   Thu Nov 17 11:34:01 2011
 * 
 * @brief  
 * 
 * 
 * @defgroup pwglf_forward_scripts_qa Quality Assurance scripts
 * 
 * Quality assurance scripts and functions 
 * 
 * @ingroup pwglf_forward_scripts
 */
/** 
 * Get a stack 
 * 
 * @param forward   Input list
 * @param sub       Sub-list
 * @param name      Name of stack
 * 
 * @return A stack or null
 * 
 * @ingroup pwglf_forward_scripts_qa
 */
THStack*
GetStack(const TList& forward,  const char* sub, const char* name)
{
  TList* lsub = &forward;

  if (sub && sub[0] != '\0') 
    lsub = static_cast<TList*>(forward.FindObject(sub));

  if (!lsub) { 
    Warning("GetStack", "Sub list %s not found in %s", sub, forward.GetName());
    return 0;
  }
  THStack* ret = static_cast<THStack*>(lsub->FindObject(name));
  if (!ret) 
    Warning("GetStack" "Stack %s not found in %s", name, sub);
  return ret;
}

/** 
 * Rebin a histogram
 * 
 * @param h      Histogram
 * @param rebin  Rebinning factor
 * 
 * @return Histogram
 * 
 * @ingroup pwglf_forward_scripts_qa
 */
TH1* 
Rebin(TH1* h, Int_t rebin)
{
  if (rebin <= 1) return h;
  h->Rebin(rebin);
  h->Scale(1. / rebin);
  return h;
}

/** 
 * Ratio of two histograms 
 * 
 * @param h1 numerator
 * @param h2 denominator
 * 
 * @return Ratio
 * 
 * @ingroup pwglf_forward_scripts_qa
 */
TH1*
Ratio(const TH1* h1, const TH1* h2)
{
  if (!h1) return;
  if (!h2) return;
  
  TH1* copy = static_cast<TH1*>(h2->Clone("tmp"));
  copy->SetName(Form("%s_%s", h2->GetName(), h1->GetName()));
  copy->SetTitle(Form("%s/%s", h2->GetTitle(), h1->GetTitle()));
  copy->SetDirectory(0);
  copy->Divide(h1);

  return copy;
}

/** 
 * Ratio all histograms in stacks 
 * 
 * @param r  Result
 * @param h1 Numerators
 * @param h2 Denominators 
 * 
 * @return Number of histograms 
  * 
 * @ingroup pwglf_forward_scripts_qa
*/
Int_t 
Ratio(THStack* r, const THStack* h1, const THStack* h2)
{
  if (!h1) return 0;
  if (!h2) return 0;

  int n1 = h1->GetHists()->GetEntries();
  int n2 = h2->GetHists()->GetEntries();
  int nH = 0;
  for (int i = 0; i < n1 && i < n2; i++) { 
    TH1* hh1 = static_cast<TH1*>(h1->GetHists()->At(i));
    TH1* hh2 = static_cast<TH1*>(h2->GetHists()->At(i));
    TH1* h   = Ratio(hh1, hh2);
    if (!h) continue;
    nH++;
    r->Add(h);
  }
  return nH;
}

/** 
 * Add a histogram to the all stack
 * 
 * @param all         Stack
 * @param h           Histogram
 * @param singleStep  Showing individual steps?
 * 
 * @ingroup pwglf_forward_scripts_qa
*/
void
AddToAll(THStack* all, const TH1* h, Bool_t singleStep)
{
  TH1* copy = static_cast<TH1*>(h->Clone(Form("%s_copy", h->GetName())));
  copy->SetDirectory(0);
  if (singleStep) { 
    copy->SetMarkerColor(kGray);
    copy->SetLineColor(kGray);
  }
  all->Add(copy);
}

/** 
 * Dim an entry
 * 
 * @param thisId  This step
 * @param step    Current step
 * @param e       Entry in legend 
 * 
 * @ingroup pwglf_forward_scripts_qa
 */
void
DimEntry(Int_t thisId, Int_t step, TLegendEntry* e)
{
  
  Int_t col = (thisId == step || step <= 0) ? kBlack : kGray;
  e->SetMarkerColor(col);
  e->SetLineColor(col);
  e->SetTextColor(col);
}

/** 
 * Draw a step
 * 
 * @param deltas   From energy loss
 * @param nchs     After 2nd correction
 * @param prims    Primaries
 * @param dndeta   Result 
 * @param step     Step number 
 * 
 * @ingroup pwglf_forward_scripts_qa
 */
void
DrawStep(THStack* deltas, THStack* nchs, THStack* prims, 
	 TH1*     dndeta, Int_t step)
{
  THStack* all = new THStack("all", "Analysis steps");
  if (step > 0) all->SetTitle(Form("Step %d", step));

  if (deltas) {
    deltas->SetTitle("#sum_{} #Delta/#Delta_{mip}");
    TIter next(deltas->GetHists());
    TH1* h = 0;
    while ((h = static_cast<TH1*>(next()))) { 
      h->SetMarkerStyle(25);
      // Info("DrawStep", "Adding %s", h->GetName());
      AddToAll(all, h, step>0);
    }
  }
  if (nchs) {
    nchs->SetTitle("#sum_{} N_{ch,incl}");
    TIter next(nchs->GetHists());
    TH1* h = 0;
    while ((h = static_cast<TH1*>(next()))) { 
      h->SetMarkerStyle(21);
      // Info("DrawStep", "Adding %s", h->GetName());
      AddToAll(all, h, step>0);
    }
  }
  if (prims) {
    prims->SetTitle("#sum_{} N_{ch,primary}");
    TIter next(prims->GetHists());
    TH1* h = 0;
    while ((h = static_cast<TH1*>(next()))) { 
      h->SetMarkerStyle(22);
      // Info("DrawStep", "Adding %s", h->GetName());
      AddToAll(all, h, step>0);
    }
  }
  if (dndeta) {
    dndeta->SetTitle("1/N dN_{ch}/d#eta");
    dndeta->SetMarkerStyle(20);
    dndeta->SetMarkerColor(kBlack);
    // Info("DrawStep", "Adding %s", dndeta->GetName());
    AddToAll(all, dndeta, step>0);
  }

  all->Draw("nostack");
  all->GetHistogram()->SetXTitle("#eta");
  all->GetHistogram()->SetYTitle("signal");
  all->GetHistogram()->GetXaxis()->SetLabelFont(132);
  all->GetHistogram()->GetXaxis()->SetTitleFont(132);
  all->GetHistogram()->GetYaxis()->SetLabelFont(132);
  all->GetHistogram()->GetYaxis()->SetTitleFont(132);
  c->SetGridx();

  TLegend* l = new TLegend(.33, .2, .53, .9);
  TLegendEntry* e = 0;
  l->SetFillColor(0);
  l->SetFillStyle(0);
  l->SetBorderSize(0);
  l->SetNColumns(1);
  l->SetTextFont(132);
  Int_t i = 0;
  if (deltas) { 
    TIter next(deltas->GetHists());		
    TH1*  h = 0;
    while ((h = static_cast<TH1*>(next()))) {
      e = l->AddEntry(Form("dummy%02d", i++),h->GetTitle(),"pl");
      e->SetMarkerStyle(20);
      e->SetMarkerColor(h->GetMarkerColor());
    }
    e = l->AddEntry(Form("dummy%02d", i++), deltas->GetTitle(),"pl");
    TH1* h = static_cast<TH1*>(deltas->GetHists()->At(0));
    e->SetMarkerStyle(h->GetMarkerStyle());
    DimEntry(1, step, e);
  }
  if (nchs) { 
    e = l->AddEntry(Form("dummy%02d",i++),nchs->GetTitle(),"pl");
    TH1* h = static_cast<TH1*>(nchs->GetHists()->At(0));
    e->SetMarkerStyle(h->GetMarkerStyle());
    DimEntry(2, step, e);
  }
  if (prims) { 
    e = l->AddEntry(Form("dummy%02d", i++), prims->GetTitle(),"pl");
    TH1* h = static_cast<TH1*>(prims->GetHists()->At(0));
    e->SetMarkerStyle(h->GetMarkerStyle());
    DimEntry(3, step, e);
  }
  if (dndeta) { 
    e = l->AddEntry(Form("dummy%02d", i++), dndeta->GetTitle(),"pl");
    e->SetMarkerStyle(dndeta->GetMarkerStyle());
    DimEntry(4, step, e);
  }
  l->Draw();

  TString what;
  if (step > 0) {
    switch (step) { 
    case 1: 
      deltas->Draw("same nostack"); 
      what = "After merging";
      break;
    case 2: 
      nchs->Draw("same nostack"); 
      what = "After particle counting";
      break;
    case 3: 
      prims->Draw("same nostack"); 
      what = "After corrections";
      break;
    case 4: 
      dndeta->Draw("same"); 
      what = "After normalisation";
      break;
    default: 
      Error("DrawSteps", "Unknown step: %d (must be in 1-4)");
      break;
    }
  }
  TLatex* ltx = new TLatex(.95, .85, what);
  ltx->SetNDC();
  ltx->SetTextSize(.07);
  ltx->SetTextAlign(33);
  ltx->SetTextFont(132);
  ltx->Draw();
}

/** 
 * Draw steps
 * 
 * @param filename Input file 
 * @param single   Whether to show individial steps 
 * 
 * @ingroup pwglf_forward_scripts_qa
 */
void DrawSteps(const char* filename="forward.root", Bool_t single=true)
{
  gStyle->SetPalette(1);
  gStyle->SetOptFit(0);
  gStyle->SetOptStat(0);

  TFile* file = TFile::Open(filename, "READ");
  if (!file) { 
    Error("DrawMCResult", "failed to open %s", filename);
    return;
  }
  const char* fname2 = "forward_dndeta.root";
  TFile* file2 = TFile::Open(fname2, "READ");
  if (!file2) { 
    Error("DrawSteps", "File %s not found", fname2);
  }

  TList* forward = static_cast<TList*>(file->Get("Forward"));
  if (!forward) { 
    Error("DrawMCResult", "List Forward not found in %s", filename);
    return;
  }
  TList* forwardRes = (file2 ? 
		       static_cast<TList*>(file2->Get("ForwardResults")) :
		       0);
  TList* forwardAll = (forwardRes ? 
		       static_cast<TList*>(forwardRes->FindObject("all")) :
		       0);
		       
  
  // THStack* res    = GetStack(*forward, "ringResults", "all");
  // THStack* mcRes  = GetStack(*forward, "mcRingResults", "all");
  THStack* deltas = GetStack(*forward, "fmdSharingFilter", "sums");
  THStack* nchs   = GetStack(*forward, "fmdDensityCalculator", "sums");
  THStack* prims  = GetStack(*forward, "fmdCorrector", "sums");
  TH1*     dndeta = (forwardAll ? 
		     static_cast<TH1*>(forwardAll->FindObject("dndetaForward")):
		     0);

  Info("DrawSteps", "Got steps deltas=%p, nchs=%p, prims=%p, dndeta=%p",
       deltas, nchs, prims, dndeta);


  gStyle->SetTitleBorderSize(0);
  gStyle->SetTitleFillColor(0);
  gStyle->SetTitleStyle(0);
  gStyle->SetTitleX(.7);
  gStyle->SetTitleY(.95);
  gStyle->SetTitleH(.1);
  gStyle->SetTitleW(.25);
  gStyle->SetOptTitle(1);
  // gStyle->SetTitleColor(kBlack);


  
  if (!single) { 
    TCanvas* c = new TCanvas("c", "C", 900, 700);
    c->SetFillColor(0);
    c->SetBorderSize(0);
    c->SetTopMargin(0.05);
    c->SetRightMargin(0.05);

    DrawStep(deltas, nchs, prims, dndeta, 0);
    c->SaveAs("steps_all.png");
    return;
  }
  Int_t nSteps = 0;
  if (deltas) nSteps++;
  if (nchs)   nSteps++;
  if (prims)  nSteps++;
  if (dndeta) nSteps++;

  Int_t w = (nSteps >= 4 ? 1100 :  700);
  Int_t h = (nSteps >= 4 ? 800  : 1100);

  TCanvas* c = new TCanvas("c", "C", w, h);
  c->SetFillColor(0);
  c->SetBorderSize(0);
  c->SetTopMargin(0.05);
  c->SetRightMargin(0.05);

  if (nSteps >= 4) 
    c->Divide(2,(nSteps+1)/2,0,0);
  else 
    c->Divide(1,nSteps,0,0);
  
  for (Int_t i=1; i<=nSteps; i++) { 
    TVirtualPad* p = c->cd(i);
    p->SetFillColor(0);
    p->SetFillStyle(0);
    p->SetBorderSize(0);
    p->SetGridx();
    p->SetGridy();

    DrawStep(deltas, nchs, prims, dndeta, i);
  }
  c->SaveAs("steps_comic.png");
}
//
// EOF
//

    
 DrawSteps.C:1
 DrawSteps.C:2
 DrawSteps.C:3
 DrawSteps.C:4
 DrawSteps.C:5
 DrawSteps.C:6
 DrawSteps.C:7
 DrawSteps.C:8
 DrawSteps.C:9
 DrawSteps.C:10
 DrawSteps.C:11
 DrawSteps.C:12
 DrawSteps.C:13
 DrawSteps.C:14
 DrawSteps.C:15
 DrawSteps.C:16
 DrawSteps.C:17
 DrawSteps.C:18
 DrawSteps.C:19
 DrawSteps.C:20
 DrawSteps.C:21
 DrawSteps.C:22
 DrawSteps.C:23
 DrawSteps.C:24
 DrawSteps.C:25
 DrawSteps.C:26
 DrawSteps.C:27
 DrawSteps.C:28
 DrawSteps.C:29
 DrawSteps.C:30
 DrawSteps.C:31
 DrawSteps.C:32
 DrawSteps.C:33
 DrawSteps.C:34
 DrawSteps.C:35
 DrawSteps.C:36
 DrawSteps.C:37
 DrawSteps.C:38
 DrawSteps.C:39
 DrawSteps.C:40
 DrawSteps.C:41
 DrawSteps.C:42
 DrawSteps.C:43
 DrawSteps.C:44
 DrawSteps.C:45
 DrawSteps.C:46
 DrawSteps.C:47
 DrawSteps.C:48
 DrawSteps.C:49
 DrawSteps.C:50
 DrawSteps.C:51
 DrawSteps.C:52
 DrawSteps.C:53
 DrawSteps.C:54
 DrawSteps.C:55
 DrawSteps.C:56
 DrawSteps.C:57
 DrawSteps.C:58
 DrawSteps.C:59
 DrawSteps.C:60
 DrawSteps.C:61
 DrawSteps.C:62
 DrawSteps.C:63
 DrawSteps.C:64
 DrawSteps.C:65
 DrawSteps.C:66
 DrawSteps.C:67
 DrawSteps.C:68
 DrawSteps.C:69
 DrawSteps.C:70
 DrawSteps.C:71
 DrawSteps.C:72
 DrawSteps.C:73
 DrawSteps.C:74
 DrawSteps.C:75
 DrawSteps.C:76
 DrawSteps.C:77
 DrawSteps.C:78
 DrawSteps.C:79
 DrawSteps.C:80
 DrawSteps.C:81
 DrawSteps.C:82
 DrawSteps.C:83
 DrawSteps.C:84
 DrawSteps.C:85
 DrawSteps.C:86
 DrawSteps.C:87
 DrawSteps.C:88
 DrawSteps.C:89
 DrawSteps.C:90
 DrawSteps.C:91
 DrawSteps.C:92
 DrawSteps.C:93
 DrawSteps.C:94
 DrawSteps.C:95
 DrawSteps.C:96
 DrawSteps.C:97
 DrawSteps.C:98
 DrawSteps.C:99
 DrawSteps.C:100
 DrawSteps.C:101
 DrawSteps.C:102
 DrawSteps.C:103
 DrawSteps.C:104
 DrawSteps.C:105
 DrawSteps.C:106
 DrawSteps.C:107
 DrawSteps.C:108
 DrawSteps.C:109
 DrawSteps.C:110
 DrawSteps.C:111
 DrawSteps.C:112
 DrawSteps.C:113
 DrawSteps.C:114
 DrawSteps.C:115
 DrawSteps.C:116
 DrawSteps.C:117
 DrawSteps.C:118
 DrawSteps.C:119
 DrawSteps.C:120
 DrawSteps.C:121
 DrawSteps.C:122
 DrawSteps.C:123
 DrawSteps.C:124
 DrawSteps.C:125
 DrawSteps.C:126
 DrawSteps.C:127
 DrawSteps.C:128
 DrawSteps.C:129
 DrawSteps.C:130
 DrawSteps.C:131
 DrawSteps.C:132
 DrawSteps.C:133
 DrawSteps.C:134
 DrawSteps.C:135
 DrawSteps.C:136
 DrawSteps.C:137
 DrawSteps.C:138
 DrawSteps.C:139
 DrawSteps.C:140
 DrawSteps.C:141
 DrawSteps.C:142
 DrawSteps.C:143
 DrawSteps.C:144
 DrawSteps.C:145
 DrawSteps.C:146
 DrawSteps.C:147
 DrawSteps.C:148
 DrawSteps.C:149
 DrawSteps.C:150
 DrawSteps.C:151
 DrawSteps.C:152
 DrawSteps.C:153
 DrawSteps.C:154
 DrawSteps.C:155
 DrawSteps.C:156
 DrawSteps.C:157
 DrawSteps.C:158
 DrawSteps.C:159
 DrawSteps.C:160
 DrawSteps.C:161
 DrawSteps.C:162
 DrawSteps.C:163
 DrawSteps.C:164
 DrawSteps.C:165
 DrawSteps.C:166
 DrawSteps.C:167
 DrawSteps.C:168
 DrawSteps.C:169
 DrawSteps.C:170
 DrawSteps.C:171
 DrawSteps.C:172
 DrawSteps.C:173
 DrawSteps.C:174
 DrawSteps.C:175
 DrawSteps.C:176
 DrawSteps.C:177
 DrawSteps.C:178
 DrawSteps.C:179
 DrawSteps.C:180
 DrawSteps.C:181
 DrawSteps.C:182
 DrawSteps.C:183
 DrawSteps.C:184
 DrawSteps.C:185
 DrawSteps.C:186
 DrawSteps.C:187
 DrawSteps.C:188
 DrawSteps.C:189
 DrawSteps.C:190
 DrawSteps.C:191
 DrawSteps.C:192
 DrawSteps.C:193
 DrawSteps.C:194
 DrawSteps.C:195
 DrawSteps.C:196
 DrawSteps.C:197
 DrawSteps.C:198
 DrawSteps.C:199
 DrawSteps.C:200
 DrawSteps.C:201
 DrawSteps.C:202
 DrawSteps.C:203
 DrawSteps.C:204
 DrawSteps.C:205
 DrawSteps.C:206
 DrawSteps.C:207
 DrawSteps.C:208
 DrawSteps.C:209
 DrawSteps.C:210
 DrawSteps.C:211
 DrawSteps.C:212
 DrawSteps.C:213
 DrawSteps.C:214
 DrawSteps.C:215
 DrawSteps.C:216
 DrawSteps.C:217
 DrawSteps.C:218
 DrawSteps.C:219
 DrawSteps.C:220
 DrawSteps.C:221
 DrawSteps.C:222
 DrawSteps.C:223
 DrawSteps.C:224
 DrawSteps.C:225
 DrawSteps.C:226
 DrawSteps.C:227
 DrawSteps.C:228
 DrawSteps.C:229
 DrawSteps.C:230
 DrawSteps.C:231
 DrawSteps.C:232
 DrawSteps.C:233
 DrawSteps.C:234
 DrawSteps.C:235
 DrawSteps.C:236
 DrawSteps.C:237
 DrawSteps.C:238
 DrawSteps.C:239
 DrawSteps.C:240
 DrawSteps.C:241
 DrawSteps.C:242
 DrawSteps.C:243
 DrawSteps.C:244
 DrawSteps.C:245
 DrawSteps.C:246
 DrawSteps.C:247
 DrawSteps.C:248
 DrawSteps.C:249
 DrawSteps.C:250
 DrawSteps.C:251
 DrawSteps.C:252
 DrawSteps.C:253
 DrawSteps.C:254
 DrawSteps.C:255
 DrawSteps.C:256
 DrawSteps.C:257
 DrawSteps.C:258
 DrawSteps.C:259
 DrawSteps.C:260
 DrawSteps.C:261
 DrawSteps.C:262
 DrawSteps.C:263
 DrawSteps.C:264
 DrawSteps.C:265
 DrawSteps.C:266
 DrawSteps.C:267
 DrawSteps.C:268
 DrawSteps.C:269
 DrawSteps.C:270
 DrawSteps.C:271
 DrawSteps.C:272
 DrawSteps.C:273
 DrawSteps.C:274
 DrawSteps.C:275
 DrawSteps.C:276
 DrawSteps.C:277
 DrawSteps.C:278
 DrawSteps.C:279
 DrawSteps.C:280
 DrawSteps.C:281
 DrawSteps.C:282
 DrawSteps.C:283
 DrawSteps.C:284
 DrawSteps.C:285
 DrawSteps.C:286
 DrawSteps.C:287
 DrawSteps.C:288
 DrawSteps.C:289
 DrawSteps.C:290
 DrawSteps.C:291
 DrawSteps.C:292
 DrawSteps.C:293
 DrawSteps.C:294
 DrawSteps.C:295
 DrawSteps.C:296
 DrawSteps.C:297
 DrawSteps.C:298
 DrawSteps.C:299
 DrawSteps.C:300
 DrawSteps.C:301
 DrawSteps.C:302
 DrawSteps.C:303
 DrawSteps.C:304
 DrawSteps.C:305
 DrawSteps.C:306
 DrawSteps.C:307
 DrawSteps.C:308
 DrawSteps.C:309
 DrawSteps.C:310
 DrawSteps.C:311
 DrawSteps.C:312
 DrawSteps.C:313
 DrawSteps.C:314
 DrawSteps.C:315
 DrawSteps.C:316
 DrawSteps.C:317
 DrawSteps.C:318
 DrawSteps.C:319
 DrawSteps.C:320
 DrawSteps.C:321
 DrawSteps.C:322
 DrawSteps.C:323
 DrawSteps.C:324
 DrawSteps.C:325
 DrawSteps.C:326
 DrawSteps.C:327
 DrawSteps.C:328
 DrawSteps.C:329
 DrawSteps.C:330
 DrawSteps.C:331
 DrawSteps.C:332
 DrawSteps.C:333
 DrawSteps.C:334
 DrawSteps.C:335
 DrawSteps.C:336
 DrawSteps.C:337
 DrawSteps.C:338
 DrawSteps.C:339
 DrawSteps.C:340
 DrawSteps.C:341
 DrawSteps.C:342
 DrawSteps.C:343
 DrawSteps.C:344
 DrawSteps.C:345
 DrawSteps.C:346
 DrawSteps.C:347
 DrawSteps.C:348
 DrawSteps.C:349
 DrawSteps.C:350
 DrawSteps.C:351
 DrawSteps.C:352
 DrawSteps.C:353
 DrawSteps.C:354
 DrawSteps.C:355
 DrawSteps.C:356
 DrawSteps.C:357
 DrawSteps.C:358
 DrawSteps.C:359
 DrawSteps.C:360
 DrawSteps.C:361
 DrawSteps.C:362
 DrawSteps.C:363
 DrawSteps.C:364
 DrawSteps.C:365
 DrawSteps.C:366
 DrawSteps.C:367
 DrawSteps.C:368
 DrawSteps.C:369
 DrawSteps.C:370
 DrawSteps.C:371
 DrawSteps.C:372
 DrawSteps.C:373
 DrawSteps.C:374
 DrawSteps.C:375
 DrawSteps.C:376
 DrawSteps.C:377
 DrawSteps.C:378
 DrawSteps.C:379
 DrawSteps.C:380
 DrawSteps.C:381
 DrawSteps.C:382
 DrawSteps.C:383
 DrawSteps.C:384
 DrawSteps.C:385
 DrawSteps.C:386
 DrawSteps.C:387
 DrawSteps.C:388
 DrawSteps.C:389
 DrawSteps.C:390
 DrawSteps.C:391
 DrawSteps.C:392
 DrawSteps.C:393
 DrawSteps.C:394
 DrawSteps.C:395
 DrawSteps.C:396
 DrawSteps.C:397
 DrawSteps.C:398
 DrawSteps.C:399
 DrawSteps.C:400
 DrawSteps.C:401
 DrawSteps.C:402
 DrawSteps.C:403
 DrawSteps.C:404
 DrawSteps.C:405
 DrawSteps.C:406
 DrawSteps.C:407