ROOT logo
//____________________________________________________________________
//
// $Id: DrawHits.C 30718 2009-01-22 16:07:40Z cholm $
//
// Script that contains a class to draw hits, using the
// AliFMDInputHits class in the util library. 
//
// It draws the energy loss versus the p/(mq^2).  It can be overlayed
// with the Bethe-Bloc curve to show how the simulation behaves
// relative to the expected. 
//
// Use the script `Compile.C' to compile this class using ACLic. 
//
#include <TH2D.h>
#include <AliFMDHit.h>
#include <AliFMDInput.h>
#include <iostream>
#include <TStyle.h>
#include <TArrayF.h>
#include <TParticle.h>
#include <TCanvas.h>
#include <TGraphErrors.h>
#include <TDatabasePDG.h>
#include <TParticlePDG.h>
#include <TLegend.h>
#include <TArrow.h>
#include <TLatex.h>
#include <TF1.h>
#include <AliStack.h>
#include <AliTrackReference.h>
#include <AliFMDStripIndex.h>
#include <AliFMDGeometry.h>
#include <AliGenEventHeader.h>
#include <AliHeader.h>
#include <THStack.h>

/** @class DrawHits
    @brief Draw hit energy loss
    @code 
    Root> .L Compile.C
    Root> Compile("DrawHits.C")
    Root> DrawHits c
    Root> c.Run();
    @endcode
    @ingroup FMD_script
 */
class DrawTrackRefs : public AliFMDInput
{
private:
  struct Hists 
  {
    TString fPrefix;
    TString fWhere;
    TH2* fAll;
    TH2* fPrimary;
    TH2* fSecondary;
    THStack* fStack;

    //__________________________________________________________________
    Hists(const char* prefix, const char* where)
      : fPrefix(prefix), fWhere(where), 
	fAll(0), fPrimary(0), fSecondary(0), fStack(0)
    {
      fAll       = MakeHist(Form("%sAll", prefix), 
			    Form("All tracks in %s", where));
      fPrimary   = MakeHist(Form("%sPrimary", prefix), 
			    Form("All primaries in %s", where));
      fSecondary = MakeHist(Form("%sSecondary", prefix), 
			    Form("All secondaries in %s", where));
    }
     //__________________________________________________________________
    TH2* MakeHist(const char* name, const char* title) 
    {
      TH2D* ret = new TH2D(name, title, 200, -4, 6, 40, 0, 2*TMath::Pi());
      ret->SetDrawOption("colz");
      return ret;
    }
    //__________________________________________________________________
    void Draw(TVirtualPad* pad, Bool_t stack=false, Option_t* option="colz") 
    {
      if (stack) { 
	pad->cd();
	pad->Divide(1,2, 0, 0);
	pad->cd(1);
	fStack = new THStack(Form("%sDisplay", fPrefix.Data()), 
			     Form("2nd over 1st particles in %s", 
				  fWhere.Data()));
	TH1D* prim = 0;
	TH1D* sec = 0;
	fStack->Add((prim = fPrimary->ProjectionX()));
	fStack->Add((sec  = fSecondary->ProjectionX()));
	prim->SetFillColor(kGray);
	sec->SetFillColor(kRed);
	sec->SetFillStyle(3001);
	fStack->Draw();

	pad->cd(2);
	TH1* ratio = new TH1D(*sec);
	ratio->SetName(Form("%sRatio", fPrefix.Data()));
	ratio->SetTitle(Form("2nd over 1st particles in %s", fWhere.Data()));
	ratio->Divide(prim);
	ratio->SetFillColor(kRed);
	ratio->SetFillStyle(3001);
	ratio->Draw();

	return;
      }
      pad->Divide(1,3,0,0);
      TVirtualPad* p1 = pad->cd(1);
      p1->SetLogz();
      fAll->Draw(option);
      p1 = pad->cd(2);
      p1->SetLogz();
      fPrimary->Draw(option);
      p1 = pad->cd(3);
      p1->SetLogz();
      fSecondary->Draw(option);
      pad->Modified();
      pad->Update();
      pad->cd();
    }
  };
  Hists fTotal;
  Hists fFMD1I;
  Hists fFMD2I;
  Hists fFMD2O;
  Hists fFMD3I;
  Hists fFMD3O;
public:
  //__________________________________________________________________
  DrawTrackRefs() 
    : AliFMDInput("galice.root"), 
      fTotal("total", "ALICE"), 
      fFMD1I("fmd1I", "FMD1i"),
      fFMD2I("fmd2I", "FMD2i"),
      fFMD2O("fmd2O", "FMD2o"),
      fFMD3I("fmd3I", "FMD3i"),
      fFMD3O("fmd3O", "FMD3o")
  { 
    AddLoad(kKinematics);
    AddLoad(kTrackRefs);
    AddLoad(kGeometry);
    AddLoad(kHeader);
  }
  //__________________________________________________________________
  Bool_t ProcessTrackRef(AliTrackReference* trackRef, TParticle* p)
  {
    if (trackRef->DetectorId() != AliTrackReference::kFMD) return kTRUE;

    if (!p->GetPDG() || p->GetPDG()->Charge() == 0) return kTRUE;

    // Double_t eta = p->Eta();
    // Double_t phi = p->Phi();

    UShort_t d   = 0;
    Char_t   r   = '\0';
    UShort_t s   = 0;
    UShort_t t   = 0;
    AliFMDStripIndex::Unpack(trackRef->UserId(),d,r,s,t);
    
    Double_t x, y, z;
    AliFMDGeometry::Instance()->Detector2XYZ(d,r,s,t,x,y,z);

    AliGenEventHeader* genHeader = fHeader->GenEventHeader();
    TArrayF v;
    genHeader->PrimaryVertex(v);
    z -= v.fArray[2];
    
    Double_t eta, phi, theta, rr;
    AliFMDGeometry::XYZ2REtaPhiTheta(x, y, z, rr, eta, phi, theta);
    if (phi < 0)               phi += 2*TMath::Pi();
    if (phi > 2 * TMath::Pi()) phi -= 2*TMath::Pi();

    Hists* hists = 0;
    switch (d) { 
    case 1: hists = &fFMD1I; break;
    case 2: hists = (r == 'I' || r == 'i') ? &fFMD2I : &fFMD2O; break;
    case 3: hists = (r == 'I' || r == 'i') ? &fFMD3I : &fFMD3O; break;
    }
    if (!hists) return kTRUE;

    hists->fAll->Fill(eta, phi);
    
    if (fStack->IsPhysicalPrimary(trackRef->GetTrack())) 
      hists->fPrimary->Fill(eta,phi); 
    else
      hists->fSecondary->Fill(eta, phi);

    return kTRUE;
  }
  //__________________________________________________________________
  Bool_t ProcessParticle(Int_t id, TParticle* p)
  {
    if (!p) return kTRUE;

    if (!p->GetPDG() || p->GetPDG()->Charge() == 0) return kTRUE;
    // std::cout << p->GetPDG()->GetName() << std::endl;

    Double_t eta = p->Eta();
    Double_t phi = p->Phi();

    fTotal.fAll->Fill(eta, phi);
    
    if (fStack->IsPhysicalPrimary(id)) fTotal.fPrimary->Fill(eta,phi); 
    else                               fTotal.fSecondary->Fill(eta, phi);

    return kTRUE;
  }

  //__________________________________________________________________
  Bool_t Finish()
  {
    gStyle->SetPalette(1);
    // gStyle->SetOptTitle(0);
    gStyle->SetTitleBorderSize(1);
    gStyle->SetTitleFillColor(0);
    gStyle->SetCanvasColor(0);
    gStyle->SetCanvasColor(0);
    gStyle->SetCanvasBorderSize(0);
    gStyle->SetPadColor(0);
    gStyle->SetPadBorderSize(0);

    TCanvas* c2d = new TCanvas("c2d", "2D plots", 1200, 700);
    c2d->Divide(6);
    fTotal.Draw(c2d->cd(1));   c2d->cd();
    fFMD1I.Draw(c2d->cd(6));   c2d->cd();
    fFMD2I.Draw(c2d->cd(5));   c2d->cd();
    fFMD2O.Draw(c2d->cd(4));   c2d->cd();
    fFMD3I.Draw(c2d->cd(2));   c2d->cd();
    fFMD3O.Draw(c2d->cd(3));   c2d->cd();

    c2d->Modified();
    c2d->Update();
    c2d->cd();
    c2d->SaveAs("kine_etaphi.png");

    TCanvas* c1d = new TCanvas("c1d", "1D plots", 1200, 700);
    c1d->Divide(6);
    fTotal.Draw(c1d->cd(1), kTRUE);   c1d->cd();
    fFMD1I.Draw(c1d->cd(6), kTRUE);   c1d->cd();
    fFMD2I.Draw(c1d->cd(5), kTRUE);   c1d->cd();
    fFMD2O.Draw(c1d->cd(4), kTRUE);   c1d->cd();
    fFMD3I.Draw(c1d->cd(2), kTRUE);   c1d->cd();
    fFMD3O.Draw(c1d->cd(3), kTRUE);   c1d->cd();

    c1d->Modified();
    c1d->Update();
    c1d->cd();
    c1d->SaveAs("kine_eta.png");


    return kTRUE;
  }
  
  ClassDef(DrawTrackRefs,0);
};

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