]> git.uio.no Git - u/mrichter/AliRoot.git/blame - FMD/scripts/TestAcc.C
EMCAL/DCAL Trigger Mapping for Run 2
[u/mrichter/AliRoot.git] / FMD / scripts / TestAcc.C
CommitLineData
5cbf9b21 1#include <TMath.h>
2#include <TGraph.h>
3#include <TMultiGraph.h>
4#include <TMarker.h>
5#include <TLine.h>
6#include <TArc.h>
7#include <TCanvas.h>
8#include <TH2F.h>
9#include <THStack.h>
10
11//_____________________________________________________________________
12void AcceptanceCorrection(Char_t r, UShort_t t, Float_t& oldm, Float_t& newm)
13{
14 // AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
15
16 //AliFMDRing fmdring(ring);
17 //fmdring.Init();
18 // Float_t rad = pars->GetMaxR(r)-pars->GetMinR(r);
19 // Float_t slen = pars->GetStripLength(r,t);
20 // Float_t sblen = pars->GetBaseStripLength(r,t);
21 const Double_t ic1[] = { 4.9895, 15.3560 };
22 const Double_t ic2[] = { 1.8007, 17.2000 };
23 const Double_t oc1[] = { 4.2231, 26.6638 };
24 const Double_t oc2[] = { 1.8357, 27.9500 };
25
26 Double_t minR = (r == 'I' ? 4.5213 : 15.4);
27 Double_t maxR = (r == 'I' ? 17.2 : 28.0);
28 Double_t rad = maxR - minR;
29
30 Int_t nStrips = (r == 'I' ? 512 : 256);
31 Int_t nSec = (r == 'I' ? 20 : 40);
32 Float_t segment = rad / nStrips;
33 Float_t basearc = 2 * TMath::Pi() / (0.5 * nSec);
34 Float_t radius = minR + t * segment;
35 Float_t baselen = 0.5 * basearc * radius;
36
37 const Double_t* c1 = (r == 'I' ? ic1 : oc1);
38 const Double_t* c2 = (r == 'I' ? ic2 : oc2);
39
40 // If the radius of the strip is smaller than the radius corresponding
41 // to the first corner we have a full strip length
42 Float_t cr = TMath::Sqrt(c1[0]*c1[0]+c1[1]*c1[1]);
43 if (radius <= cr) newm = 1;
44 else {
45 // Next, we should find the end-point of the strip - that is,
46 // the coordinates where the line from c1 to c2 intersects a circle
47 // with radius given by the strip.
48 // (See http://mathworld.wolfram.com/Circle-LineIntersection.html)
49 Float_t D = c1[0] * c2[1] - c1[1] * c2[0];
50 Float_t dx = c2[0] - c1[0];
51 Float_t dy = c2[1] - c1[1];
52 Float_t dr = TMath::Sqrt(dx*dx+dy*dy);
53 Float_t det = radius * radius * dr * dr - D*D;
54
55 if (det < 0) newm = 1; // No intersection
56 else if (det == 0) newm = 1; // Exactly tangent
57 else {
58 Float_t x = (+D * dy + dx * TMath::Sqrt(det)) / dr / dr;
59 Float_t y = (-D * dx + dy * TMath::Sqrt(det)) / dr / dr;
60 Float_t th = TMath::ATan2(x, y);
61
62 newm = th / (basearc/2);
63 }
64 }
65
66 Float_t slope = (c1[1] - c2[1]) / (c1[0] - c2[0]);
67 Float_t constant = (c2[1] * c1[0] - c2[0] * c1[1]) / (c1[0]-c2[0]);
68
69 Float_t d = (TMath::Power(TMath::Abs(radius*slope),2) +
70 TMath::Power(radius,2) - TMath::Power(constant,2));
71
72 // If below corners return 1
73 Float_t arclen = baselen;
74 if (d > 0) {
75 Float_t x = ((-TMath::Sqrt(d) - slope * constant) /
76 (1+TMath::Power(slope, 2)));
77 Float_t y = slope*x + constant;
78
79 // If x is larger than corner x or y less than corner y, we have full
80 // length strip
81 if(x < c1[0] && y> c1[1]) {
82 //One sector since theta is by definition half-hybrid
83 Float_t theta = TMath::ATan2(x,y);
84 arclen = radius * theta;
85 }
86 }
87 // Calculate the area of a strip with no cut
88 Float_t basearea1 = 0.5 * baselen * TMath::Power(radius,2);
89 Float_t basearea2 = 0.5 * baselen * TMath::Power((radius-segment),2);
90 Float_t basearea = basearea1 - basearea2;
91
92 // Calculate the area of a strip with cut
93 Float_t area1 = 0.5 * arclen * TMath::Power(radius,2);
94 Float_t area2 = 0.5 * arclen * TMath::Power((radius-segment),2);
95 Float_t area = area1 - area2;
96
97 // Acceptance is ratio
98 oldm = area/basearea;
99}
100
101void DrawSolution(Char_t r, UShort_t dt=16, UShort_t offT=128)
102{
103 TCanvas* c = new TCanvas(Form("c%c", r), r == 'I' ?
104 "Inner" : "Outer", 800, 500);
105
106 const Double_t ic1[] = { 4.9895, 15.3560 };
107 const Double_t ic2[] = { 1.8007, 17.2000 };
108 const Double_t oc1[] = { 4.2231, 26.6638 };
109 const Double_t oc2[] = { 1.8357, 27.9500 };
110
111 const Double_t* c1 = (r == 'I' ? ic1 : oc1);
112 const Double_t* c2 = (r == 'I' ? ic2 : oc2);
113 Double_t minR = (r == 'I' ? 4.5213 : 15.4);
114 Double_t maxR = (r == 'I' ? 17.2 : 28.0);
115 Double_t rad = maxR - minR;
116 Float_t cr = TMath::Sqrt(c1[0]*c1[0]+c1[1]*c1[1]);
117 Double_t theta = (r == 'I' ? 18 : 9);
118 TH2* frame = new TH2F("frame", "Frame", 100, -10, 10, 100, 0, 30);
119 frame->Draw();
120
121 TLine* line = new TLine(c1[0], c1[1], c2[0], c2[1]);
122 line->SetLineColor(kBlue+1);
123 line->Draw();
124
125 UShort_t nT = (r == 'I' ? 512 : 256);
126 for (Int_t t = offT; t < nT; t += dt) {
127 Double_t radius = minR + t * rad / nT;
128
129 TArc* circle = new TArc(0, 0, radius, 90-theta, 90+theta);
130 circle->SetFillColor(0);
131 circle->SetFillStyle(0);
132 circle->Draw();
133
134 // Now find the intersection
135 if (radius <= cr) continue;
136
137 // Next, we should find the end-point of the strip - that is,
138 // the coordinates where the line from c1 to c2 intersects a circle
139 // with radius given by the strip.
140 // (See http://mathworld.wolfram.com/Circle-LineIntersection.html)
141 Float_t D = c1[0] * c2[1] - c1[1] * c2[0];
142 Float_t dx = c2[0] - c1[0];
143 Float_t dy = c2[1] - c1[1];
144 Float_t dr = TMath::Sqrt(dx*dx+dy*dy);
145 Float_t det = radius * radius * dr * dr - D*D;
146
147 if (det < 0) continue;
148 if (det == 0) continue;
149
150
151 Float_t x = (+D * dy - dx * TMath::Sqrt(det)) / dr / dr;
152 Float_t y = (-D * dx - dy * TMath::Sqrt(det)) / dr / dr;
153
154 TMarker* m = new TMarker(x, y, 20);
155 m->SetMarkerColor(kRed+1);
156 m->Draw();
157
158 x = (+D * dy + dx * TMath::Sqrt(det)) / dr / dr;
159 y = (-D * dx + dy * TMath::Sqrt(det)) / dr / dr;
160
161 // Float_t th = TMath::ATan2(x,y);
162 // Printf("theta of strip %3d: %f degrees", 180. / TMath::Pi() * th);
163
164 m = new TMarker(x, y, 20);
165 m->SetMarkerColor(kGreen+1);
166 m->Draw();
167 }
168 c->cd();
169}
170
171
172void TestAcc()
173{
174 TCanvas* c = new TCanvas("c", "C");
175 TGraph* innerOld = new TGraph(512);
176 TGraph* outerOld = new TGraph(256);
177 TGraph* innerNew = new TGraph(512);
178 TGraph* outerNew = new TGraph(256);
179 innerOld->SetName("innerOld");
180 innerOld->SetName("Inner type, old");
181 innerOld->SetMarkerStyle(21);
182 innerOld->SetMarkerColor(kRed+1);
183 outerOld->SetName("outerOld");
184 outerOld->SetName("Outer type, old");
185 outerOld->SetMarkerStyle(21);
186 outerOld->SetMarkerColor(kBlue+1);
187 innerNew->SetName("innerNew");
188 innerNew->SetName("Inner type, new");
189 innerNew->SetMarkerStyle(20);
190 innerNew->SetMarkerColor(kGreen+1);
191 outerNew->SetName("outerNew");
192 outerNew->SetName("Outer type, new");
193 outerNew->SetMarkerStyle(20);
194 outerNew->SetMarkerColor(kMagenta+1);
195
196 TMultiGraph* all = new TMultiGraph("all", "Acceptances");
197 all->Add(innerOld);
198 all->Add(outerOld);
199 all->Add(innerNew);
200 all->Add(outerNew);
201
202 TH2* innerCor = new TH2F("innerCor", "Inner correlation", 100,0,1,100,0,1);
203 TH2* outerCor = new TH2F("outerCor", "Outer correlation", 100,0,1,100,0,1);
204 innerCor->SetMarkerStyle(20);
205 outerCor->SetMarkerStyle(20);
206 innerCor->SetMarkerColor(kRed+1);
207 outerCor->SetMarkerColor(kBlue+1);
208 // innerCor->SetMarkerSize(1.2);
209 // outerCor->SetMarkerSize(1.2);
210 THStack* stack = new THStack("corr", "Correlations");
211 stack->Add(innerCor);
212 stack->Add(outerCor);
213
214 for (Int_t i = 0; i < 512; i++) {
215 Float_t oldAcc, newAcc;
216
217 AcceptanceCorrection('I', i, oldAcc, newAcc);
218 innerOld->SetPoint(i, i, oldAcc);
219 innerNew->SetPoint(i, i, newAcc);
220 // Printf("Inner strip # %3d: old=%8.6f, new=%8.6f", i, oldAcc, newAcc);
221
222 innerCor->Fill(oldAcc, newAcc);
223 if (i >= 256) continue;
224
225 AcceptanceCorrection('O', i, oldAcc, newAcc);
226 outerOld->SetPoint(i, i, oldAcc);
227 outerNew->SetPoint(i, i, newAcc);
228 // Printf("Outer strip # %3d: old=%8.6f, new=%8.6f", i, oldAcc, newAcc);
229 outerCor->Fill(oldAcc, newAcc);
230 }
231
232 all->Draw("ap");
233
234 DrawSolution('I',4,256);
235 DrawSolution('O',4,128);
236
237 TCanvas* c2 = new TCanvas("cc", "cc");
238 stack->Draw("nostack p");
239 TLine* l = new TLine(0,0,1,1);
240 l->SetLineStyle(2);
241 l->Draw();
242
243 c2->cd();
244}