1 //____________________________________________________________________
5 // Script that contains a class to draw eloss from hits, versus ADC
6 // counts from digits, using the AliFMDInputHits class in the util library.
8 // It draws the energy loss versus the p/(mq^2). It can be overlayed
9 // with the Bethe-Bloc curve to show how the simulation behaves
10 // relative to the expected.
12 // Use the script `Compile.C' to compile this class using ACLic.
15 #include <AliFMDHit.h>
16 #include <AliFMDMultStrip.h>
17 #include <AliFMDMultRegion.h>
18 #include <AliFMDDigit.h>
19 #include <AliFMDInput.h>
20 #include <AliFMDEdepMap.h>
21 #include <AliFMDFloatMap.h>
26 #include <TParticle.h>
27 #include <TClonesArray.h>
32 //____________________________________________________________________
33 class DrawHitsRecs : public AliFMDInputHits
36 TH2D* fElossVsMult; // Histogram
37 TH2D* fHitsVsStrip; // Histogram
38 TH2D* fHitsVsRegion; // Histogram
45 //__________________________________________________________________
46 TArrayF MakeLogScale(Int_t n, Double_t min, Double_t max)
49 Float_t dp = n / TMath::Log10(max / min);
50 Float_t pmin = TMath::Log10(min);
52 for (Int_t i = 1; i < n+1; i++) {
53 Float_t p = pmin + i / dp;
54 bins[i] = TMath::Power(10, p);
58 //__________________________________________________________________
59 DrawHitsRecs(Bool_t primary=kFALSE,
60 Int_t n=900, Double_t emin=1e-3, Double_t emax=10,
61 Int_t m=21, Double_t mmin=-0.5, Double_t mmax=20.5)
65 if (fPrimary) AddLoad(kKinematics);
66 TArrayF eloss(MakeLogScale(n, emin, emax));
69 for (Int_t i = 1; i < m+1; i++) mults[i] = mults[i-1] + (mmax-mmin)/m;
70 fElossVsMult = new TH2D("elossVsMult",
71 "#Delta E vs. Multiplicity (single)",
72 eloss.fN-1, eloss.fArray, mults.fN-1, mults.fArray);
73 fElossVsMult->SetXTitle("#Delta E/#Delta x [MeV/cm]");
74 fElossVsMult->SetYTitle("Strip Multiplicity");
79 fHitsVsStrip = new TH2D("hitsVsStrip",
80 "# of Hits vs. Multiplicity (strip)",
81 o, omin, omax, m, mmin, mmax);
82 fHitsVsStrip->SetXTitle("# of Hits");
83 fHitsVsStrip->SetYTitle("Strip Multiplicity");
85 //__________________________________________________________________
86 Bool_t Begin(Int_t ev)
89 return AliFMDInputHits::Begin(ev);
91 //__________________________________________________________________
92 Bool_t ProcessHit(AliFMDHit* hit, TParticle*)
94 // Cache the energy loss
95 if (!hit) return kFALSE;
96 UShort_t det = hit->Detector();
97 Char_t rng = hit->Ring();
98 UShort_t sec = hit->Sector();
99 UShort_t str = hit->Strip();
101 AliWarning(Form("Bad strip number %d in hit", str));
105 TParticle* kine = fStack->Particle(hit->Track());
106 if (!kine) return kTRUE;
107 if (!kine->IsPrimary()) return kTRUE;
110 fMap(det, rng, sec, str).fEdep += hit->Edep();
111 fMap(det, rng, sec, str).fN++;
114 //__________________________________________________________________
115 Bool_t ProcessRecPoint(AliFMDRecPoint* single)
117 if (!single) continue;
118 UShort_t det = single->Detector();
119 Char_t rng = single->Ring();
120 UShort_t sec = single->Sector();
121 UShort_t str = single->Strip();
123 AliWarning(Form("Bad strip number %d in single", str));
126 if (fMap(det, rng, sec, str).fEdep > 0)
127 fElossVsMult->Fill(fMap(det, rng, sec, str).fEdep,
128 single->Particles());
129 if (fMap(det, rng, sec, str).fN > 0)
130 fHitsVsStrip->Fill(fMap(det, rng, sec, str).fN,
131 single->Particles());
134 //__________________________________________________________________
137 gStyle->SetPalette(1);
138 gStyle->SetOptTitle(0);
139 gStyle->SetCanvasColor(0);
140 gStyle->SetCanvasBorderSize(0);
141 gStyle->SetPadColor(0);
142 gStyle->SetPadBorderSize(0);
144 new TCanvas("c1", "Energy loss vs. Strip Multiplicity");
145 fElossVsMult->SetStats(kFALSE);
146 fElossVsMult->Draw("COLZ");
148 new TCanvas("c2", "# of Hits vs. Strip Multiplicity");
149 fHitsVsStrip->SetStats(kFALSE);
150 fHitsVsStrip->Draw("COLZ");
155 ClassDef(DrawHitsRecs,0);
158 //____________________________________________________________________