]> git.uio.no Git - u/mrichter/AliRoot.git/blame - TRD/AliTRDgtuParam.cxx
from Ante Bilandzic:
[u/mrichter/AliRoot.git] / TRD / AliTRDgtuParam.cxx
CommitLineData
52c19022 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15
16/* $Id: AliTRDgtuParam.cxx 28397 2008-09-02 09:33:00Z cblume $ */
17
18////////////////////////////////////////////////////////////////////////////
19// //
20// Parameters for GTU simulation //
21// //
22// Author: J. Klein (Jochen.Klein@cern.ch) //
23// //
24////////////////////////////////////////////////////////////////////////////
25
ec5db61b 26#include <limits>
27
637666cd 28#include "TROOT.h"
52c19022 29#include "TMath.h"
30#include "TMatrix.h"
31#include "TDecompLU.h"
32#include "TGraphAsymmErrors.h"
33#include "TCanvas.h"
34
35#include "AliLog.h"
36#include "AliTRDgtuParam.h"
37#include "AliTRDgeometry.h"
38#include "AliTRDpadPlane.h"
39
40ClassImp(AliTRDgtuParam)
41
42AliTRDgtuParam *AliTRDgtuParam::fgInstance = 0;
44eafcf2 43Bool_t AliTRDgtuParam::fgUseGTUconst = kTRUE;
ec5db61b 44Bool_t AliTRDgtuParam::fgUseGTUmerge = kTRUE;
45Bool_t AliTRDgtuParam::fgLimitNoTracklets = kTRUE;
a3461d38 46Int_t AliTRDgtuParam::fgMaxNoTracklets = 62;
52c19022 47
2cf67435 48// ----- matching windows -----
49 Int_t AliTRDgtuParam::fgDeltaY = 19;
50 Int_t AliTRDgtuParam::fgDeltaAlpha = 21;
d2c8b010 51// ----- reference layers -----
52 Int_t AliTRDgtuParam::fgRefLayers[] = { 3, 2, 1 };
2cf67435 53
52c19022 54// ----- Bin widths (granularity) -----
55const Float_t AliTRDgtuParam::fgkBinWidthY = 160e-4;
56const Float_t AliTRDgtuParam::fgkBinWidthdY = 140e-4;
57
58// ----- Bit widths (used for internal representation) -----
59const Int_t AliTRDgtuParam::fgkBitWidthY = 13;
5f006bd7 60const Int_t AliTRDgtuParam::fgkBitWidthdY = 7;
52c19022 61const Int_t AliTRDgtuParam::fgkBitWidthYProj = 10;
5f006bd7 62const Int_t AliTRDgtuParam::fgkBitExcessY = 4;
63const Int_t AliTRDgtuParam::fgkBitExcessAlpha = 10;
64const Int_t AliTRDgtuParam::fgkBitExcessYProj = 2;
52c19022 65
ec5db61b 66// pt higher than the one for smallest possible a != 0
67const Int_t AliTRDgtuParam::fgkPtInfinity = std::numeric_limits<Int_t>::max();
68
69// ----- geometry constants used in GTU -----
44eafcf2 70const Bool_t AliTRDgtuParam::fgZChannelMap[5][16][6][16] = {
71
72{ /* --- Stack 0 --- */
73
74/* . x x . . . . . . . . . . . . . */
75/* x . . . . . . . . . . . . . . . */
76/* X . . . . . . . . . . . . . . . */
77/* x x . . . . . . . . . . . . . . */
78/* x x . . . . . . . . . . . . . . */
79/* x . . . . . . . . . . . . . . . */
80
81{{0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
82 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
83 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
84 {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
85 {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
86 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
87
88/* . . x x . . . . . . . . . . . . */
89/* x x . . . . . . . . . . . . . . */
90/* . X . . . . . . . . . . . . . . */
91/* . x x . . . . . . . . . . . . . */
92/* . x x . . . . . . . . . . . . . */
93/* x x . . . . . . . . . . . . . . */
94
95{{0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
96 {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
97 {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
98 {0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
99 {0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
100 {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
101
102/* . . . x x . . . . . . . . . . . */
103/* . x x . . . . . . . . . . . . . */
104/* . . X . . . . . . . . . . . . . */
105/* . . x x . . . . . . . . . . . . */
106/* . . x x . . . . . . . . . . . . */
107/* . x x . . . . . . . . . . . . . */
108
109{{0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
110 {0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
111 {0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
112 {0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
113 {0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
114 {0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
115
116/* . . . . x x . . . . . . . . . . */
117/* . . x x . . . . . . . . . . . . */
118/* . . . X . . . . . . . . . . . . */
119/* . . . x x . . . . . . . . . . . */
120/* . . . x x . . . . . . . . . . . */
121/* . . x x . . . . . . . . . . . . */
122
123{{0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
124 {0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
125 {0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
126 {0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
127 {0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
128 {0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
129
130/* . . . . . x x . . . . . . . . . */
131/* . . . x x . . . . . . . . . . . */
132/* . . . . X . . . . . . . . . . . */
133/* . . . . x x . . . . . . . . . . */
134/* . . . . x x . . . . . . . . . . */
135/* . . . x x . . . . . . . . . . . */
136
137{{0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
138 {0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
139 {0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
140 {0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
141 {0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
142 {0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
143
144/* . . . . . . x x . . . . . . . . */
145/* . . . . x x . . . . . . . . . . */
146/* . . . . . X . . . . . . . . . . */
147/* . . . . . x x . . . . . . . . . */
148/* . . . . . x x . . . . . . . . . */
149/* . . . . x x . . . . . . . . . . */
150
151{{0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
152 {0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
153 {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
154 {0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
155 {0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
156 {0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
157
158/* . . . . . . . x x . . . . . . . */
159/* . . . . . x x . . . . . . . . . */
160/* . . . . . . X . . . . . . . . . */
161/* . . . . . . x x . . . . . . . . */
162/* . . . . . . x x . . . . . . . . */
163/* . . . . . x x . . . . . . . . . */
164
165{{0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0},
166 {0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
167 {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
168 {0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
169 {0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
170 {0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
171
172/* . . . . . . . . x x . . . . . . */
173/* . . . . . . x x x . . . . . . . */
174/* . . . . . . . X . . . . . . . . */
175/* . . . . . . . x x . . . . . . . */
176/* . . . . . . . x x . . . . . . . */
177/* . . . . . . x x . . . . . . . . */
178
179{{0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0},
180 {0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
181 {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
182 {0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0},
183 {0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0},
184 {0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0}},
185
186/* . . . . . . . . x x x . . . . . */
187/* . . . . . . . x x x . . . . . . */
188/* . . . . . . . . X . . . . . . . */
189/* . . . . . . . x x x . . . . . . */
190/* . . . . . . . x x x . . . . . . */
191/* . . . . . . . x x . . . . . . . */
192
193{{0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0},
194 {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0},
195 {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0},
196 {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0},
197 {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0},
198 {0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0}},
199
200/* . . . . . . . . . x x x . . . . */
201/* . . . . . . . . x x x . . . . . */
202/* . . . . . . . . . X . . . . . . */
203/* . . . . . . . . x x x . . . . . */
204/* . . . . . . . . x x x . . . . . */
205/* . . . . . . . . x x . . . . . . */
206
207{{0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
208 {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0},
209 {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0},
210 {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0},
211 {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0},
212 {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0}},
213
214/* . . . . . . . . . . x x x . . . */
215/* . . . . . . . . . x x x . . . . */
216/* . . . . . . . . . . X . . . . . */
217/* . . . . . . . . . x x x . . . . */
218/* . . . . . . . . . x x x . . . . */
219/* . . . . . . . . . x x . . . . . */
220
221{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
222 {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
223 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
224 {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
225 {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
226 {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0}},
227
228/* . . . . . . . . . . . x x x . . */
229/* . . . . . . . . . . x x x . . . */
230/* . . . . . . . . . . . X . . . . */
231/* . . . . . . . . . . x x x . . . */
232/* . . . . . . . . . . x x x . . . */
233/* . . . . . . . . . . x x . . . . */
234
235{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0},
236 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
237 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0},
238 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
239 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
240 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0}},
241
242/* . . . . . . . . . . . . x x x . */
243/* . . . . . . . . . . . x x x . . */
244/* . . . . . . . . . . . . X . . . */
245/* . . . . . . . . . . . x x x . . */
246/* . . . . . . . . . . . x x x . . */
247/* . . . . . . . . . . . x x . . . */
248
249{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0},
250 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0},
251 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0},
252 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0},
253 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0},
254 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0}},
255
256/* . . . . . . . . . . . . . x x x */
257/* . . . . . . . . . . . . x x x . */
258/* . . . . . . . . . . . . . X . . */
259/* . . . . . . . . . . . . x x x . */
260/* . . . . . . . . . . . . x x x . */
261/* . . . . . . . . . . . . x x . . */
262
263{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1},
264 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0},
265 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
266 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0},
267 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0},
268 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0}},
269
270/* . . . . . . . . . . . . . . x x */
271/* . . . . . . . . . . . . . x x x */
272/* . . . . . . . . . . . . . . X . */
273/* . . . . . . . . . . . . . x x x */
274/* . . . . . . . . . . . . . x x x */
275/* . . . . . . . . . . . . . x x . */
276
277{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
278 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1},
279 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0},
280 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1},
281 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1},
282 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0}},
283
284/* . . . . . . . . . . . . . . . x */
285/* . . . . . . . . . . . . . . x x */
286/* . . . . . . . . . . . . . . . X */
287/* . . . . . . . . . . . . . . x x */
288/* . . . . . . . . . . . . . . x x */
289/* . . . . . . . . . . . . . . x x */
290
291{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
292 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
293 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
294 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
295 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
296 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1}}},
297
298{ /* --- Stack 1 --- */
299
300/* x x x . . . . . . . . . . . . . */
301/* x x . . . . . . . . . . . . . . */
302/* X . . . . . . . . . . . . . . . */
303/* x x . . . . . . . . . . . . . . */
304/* x x . . . . . . . . . . . . . . */
305/* x . . . . . . . . . . . . . . . */
306
307{{1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
308 {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
309 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
310 {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
311 {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
312 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
313
314/* . x x x . . . . . . . . . . . . */
315/* x x x . . . . . . . . . . . . . */
316/* . X . . . . . . . . . . . . . . */
317/* x x x . . . . . . . . . . . . . */
318/* x x x . . . . . . . . . . . . . */
319/* x x . . . . . . . . . . . . . . */
320
321{{0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
322 {1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
323 {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
324 {1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
325 {1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
326 {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
327
328/* . . x x x . . . . . . . . . . . */
329/* . x x x . . . . . . . . . . . . */
330/* . . X . . . . . . . . . . . . . */
331/* . x x x . . . . . . . . . . . . */
332/* . x x x . . . . . . . . . . . . */
333/* . x x . . . . . . . . . . . . . */
334
335{{0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
336 {0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
337 {0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
338 {0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
339 {0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
340 {0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
341
342/* . . . x x x . . . . . . . . . . */
343/* . . x x x . . . . . . . . . . . */
344/* . . . X . . . . . . . . . . . . */
345/* . . x x x . . . . . . . . . . . */
346/* . . x x x . . . . . . . . . . . */
347/* . . x x . . . . . . . . . . . . */
348
349{{0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
350 {0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
351 {0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
352 {0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
353 {0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
354 {0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
355
356/* . . . . x x x . . . . . . . . . */
357/* . . . x x x . . . . . . . . . . */
358/* . . . . X . . . . . . . . . . . */
359/* . . . x x x . . . . . . . . . . */
360/* . . . x x x . . . . . . . . . . */
361/* . . . x x . . . . . . . . . . . */
362
363{{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
364 {0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
365 {0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
366 {0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
367 {0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
368 {0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
369
370/* . . . . . x x x . . . . . . . . */
371/* . . . . x x x . . . . . . . . . */
372/* . . . . . X . . . . . . . . . . */
373/* . . . . x x . . . . . . . . . . */
374/* . . . . x x . . . . . . . . . . */
375/* . . . . x x . . . . . . . . . . */
376
377{{0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
378 {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
379 {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
380 {0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
381 {0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
382 {0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
383
384/* . . . . . . x x x . . . . . . . */
385/* . . . . . . x x . . . . . . . . */
386/* . . . . . . X . . . . . . . . . */
387/* . . . . . x x . . . . . . . . . */
388/* . . . . . x x . . . . . . . . . */
389/* . . . . . x x . . . . . . . . . */
390
391{{0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
392 {0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
393 {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
394 {0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
395 {0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
396 {0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
397
398/* . . . . . . . x x . . . . . . . */
399/* . . . . . . . x x . . . . . . . */
400/* . . . . . . . X . . . . . . . . */
401/* . . . . . . x x . . . . . . . . */
402/* . . . . . . x x . . . . . . . . */
403/* . . . . . . x x . . . . . . . . */
404
405{{0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0},
406 {0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0},
407 {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
408 {0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
409 {0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
410 {0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0}},
411
412/* . . . . . . . . x x . . . . . . */
413/* . . . . . . . . x x . . . . . . */
414/* . . . . . . . . X . . . . . . . */
415/* . . . . . . . x x . . . . . . . */
416/* . . . . . . . x x . . . . . . . */
417/* . . . . . . . x x . . . . . . . */
418
419{{0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0},
420 {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0},
421 {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0},
422 {0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0},
423 {0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0},
424 {0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0}},
425
426/* . . . . . . . . . x x . . . . . */
427/* . . . . . . . . . x x . . . . . */
428/* . . . . . . . . . X . . . . . . */
429/* . . . . . . . . x x . . . . . . */
430/* . . . . . . . . x x . . . . . . */
431/* . . . . . . . . x x . . . . . . */
432
433{{0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0},
434 {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0},
435 {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0},
436 {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0},
437 {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0},
438 {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0}},
439
440/* . . . . . . . . . . x x . . . . */
441/* . . . . . . . . . . x x . . . . */
442/* . . . . . . . . . . X . . . . . */
443/* . . . . . . . . . x x . . . . . */
444/* . . . . . . . . . x x . . . . . */
445/* . . . . . . . . . x x . . . . . */
446
447{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
448 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
449 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
450 {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0},
451 {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0},
452 {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0}},
453
454/* . . . . . . . . . . . x x . . . */
455/* . . . . . . . . . . . x x . . . */
456/* . . . . . . . . . . . X . . . . */
457/* . . . . . . . . . . x x . . . . */
458/* . . . . . . . . . . x x . . . . */
459/* . . . . . . . . . . x x . . . . */
460
461{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0},
462 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0},
463 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0},
464 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
465 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
466 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0}},
467
468/* . . . . . . . . . . . . x x . . */
469/* . . . . . . . . . . . . x x . . */
470/* . . . . . . . . . . . . X . . . */
471/* . . . . . . . . . . . x x . . . */
472/* . . . . . . . . . . . x x . . . */
473/* . . . . . . . . . . . x x . . . */
474
475{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0},
476 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0},
477 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0},
478 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0},
479 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0},
480 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0}},
481
482/* . . . . . . . . . . . . . x x . */
483/* . . . . . . . . . . . . . x x . */
484/* . . . . . . . . . . . . . X . . */
485/* . . . . . . . . . . . . x x . . */
486/* . . . . . . . . . . . . x x . . */
487/* . . . . . . . . . . . . x x . . */
488
489{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0},
490 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0},
491 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
492 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0},
493 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0},
494 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0}},
495
496/* . . . . . . . . . . . . . . x x */
497/* . . . . . . . . . . . . . . x x */
498/* . . . . . . . . . . . . . . X . */
499/* . . . . . . . . . . . . . x x . */
500/* . . . . . . . . . . . . . x x . */
501/* . . . . . . . . . . . . . x x . */
502
503{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
504 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
505 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0},
506 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0},
507 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0},
508 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0}},
509
510/* . . . . . . . . . . . . . . . x */
511/* . . . . . . . . . . . . . . . x */
512/* . . . . . . . . . . . . . . . X */
513/* . . . . . . . . . . . . . . x x */
514/* . . . . . . . . . . . . . . x x */
515/* . . . . . . . . . . . . . . x x */
516
517{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
518 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
519 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
520 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
521 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
522 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1}}},
523
524{ /* --- Stack 2 --- */
525
526/* x x . . . . . . . . . . */
527/* x x . . . . . . . . . . */
528/* X . . . . . . . . . . . */
529/* x . . . . . . . . . . . */
530/* x . . . . . . . . . . . */
531/* x . . . . . . . . . . . */
532
533{{1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
534 {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
535 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
536 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
537 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
538 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
539
540/* . x x . . . . . . . . . */
541/* . x x . . . . . . . . . */
542/* . X . . . . . . . . . . */
543/* x x . . . . . . . . . . */
544/* x x . . . . . . . . . . */
545/* x x . . . . . . . . . . */
546
547{{0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
548 {0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
549 {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
550 {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
551 {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
552 {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
553
554/* . . x x . . . . . . . . */
555/* . . x x . . . . . . . . */
556/* . . X . . . . . . . . . */
557/* . x x . . . . . . . . . */
558/* . x x . . . . . . . . . */
559/* . x x . . . . . . . . . */
560
561{{0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
562 {0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
563 {0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
564 {0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
565 {0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
566 {0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
567
568/* . . . x x . . . . . . . */
569/* . . . x x . . . . . . . */
570/* . . . X . . . . . . . . */
571/* . . x x x . . . . . . . */
572/* . . x x x . . . . . . . */
573/* . . x x x . . . . . . . */
574
575{{0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
576 {0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
577 {0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
578 {0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
579 {0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
580 {0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
581
582/* . . . x x x . . . . . . */
583/* . . . x x x . . . . . . */
584/* . . . . X . . . . . . . */
585/* . . . x x x . . . . . . */
586/* . . . x x x . . . . . . */
587/* . . . x x x . . . . . . */
588
589{{0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
590 {0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
591 {0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
592 {0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
593 {0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
594 {0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
595
596/* . . . . x x x . . . . . */
597/* . . . . x x x . . . . . */
598/* . . . . . X . . . . . . */
599/* . . . . x x x . . . . . */
600/* . . . . x x x . . . . . */
601/* . . . . x x x . . . . . */
602
603{{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
604 {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
605 {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
606 {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
607 {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
608 {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
609
610/* . . . . . x x x . . . . */
611/* . . . . . x x x . . . . */
612/* . . . . . . X . . . . . */
613/* . . . . . x x x . . . . */
614/* . . . . . x x x . . . . */
615/* . . . . . x x x . . . . */
616
617{{0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
618 {0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
619 {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
620 {0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
621 {0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
622 {0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0}},
623
624/* . . . . . . x x x . . . */
625/* . . . . . . x x x . . . */
626/* . . . . . . . X . . . . */
627/* . . . . . . x x x . . . */
628/* . . . . . . x x x . . . */
629/* . . . . . . x x x . . . */
630
631{{0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
632 {0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
633 {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
634 {0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
635 {0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
636 {0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0}},
637
638/* . . . . . . . x x . . . */
639/* . . . . . . . x x . . . */
640/* . . . . . . . . X . . . */
641/* . . . . . . . x x x . . */
642/* . . . . . . . x x x . . */
643/* . . . . . . . x x x . . */
644
645{{0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0},
646 {0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0},
647 {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0},
648 {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0},
649 {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0},
650 {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0}},
651
652/* . . . . . . . . x x . . */
653/* . . . . . . . . x x . . */
654/* . . . . . . . . . X . . */
655/* . . . . . . . . . x x . */
656/* . . . . . . . . . x x . */
657/* . . . . . . . . . x x . */
658
659{{0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0},
660 {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0},
661 {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0},
662 {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0},
663 {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0},
664 {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0}},
665
666/* . . . . . . . . . x x . */
667/* . . . . . . . . . x x . */
668/* . . . . . . . . . . X . */
669/* . . . . . . . . . . x x */
670/* . . . . . . . . . . x x */
671/* . . . . . . . . . . x x */
672
673{{0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0},
674 {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0},
675 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
676 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
677 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
678 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0}},
679
680/* . . . . . . . . . . x x */
681/* . . . . . . . . . . x x */
682/* . . . . . . . . . . . X */
683/* . . . . . . . . . . . x */
684/* . . . . . . . . . . . x */
685/* . . . . . . . . . . . x */
686
687{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
688 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
689 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0},
690 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0},
691 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0},
692 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0}},
693
694/* . . . . . . . . . . . . */
695/* . . . . . . . . . . . . */
696/* . . . . . . . . . . . . */
697/* . . . . . . . . . . . . */
698/* . . . . . . . . . . . . */
699/* . . . . . . . . . . . . */
700
701{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
702 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
703 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
704 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
705 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
706 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
707
708/* . . . . . . . . . . . . */
709/* . . . . . . . . . . . . */
710/* . . . . . . . . . . . . */
711/* . . . . . . . . . . . . */
712/* . . . . . . . . . . . . */
713/* . . . . . . . . . . . . */
714
715{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
716 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
717 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
718 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
719 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
720 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
721
722/* . . . . . . . . . . . . */
723/* . . . . . . . . . . . . */
724/* . . . . . . . . . . . . */
725/* . . . . . . . . . . . . */
726/* . . . . . . . . . . . . */
727/* . . . . . . . . . . . . */
728
729{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
730 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
731 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
732 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
733 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
734 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
735
736/* . . . . . . . . . . . . */
737/* . . . . . . . . . . . . */
738/* . . . . . . . . . . . . */
739/* . . . . . . . . . . . . */
740/* . . . . . . . . . . . . */
741/* . . . . . . . . . . . . */
742
743{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
744 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
745 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
746 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
747 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
748 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}},
749
750{ /* --- Stack 3 --- */
751
752/* x . . . . . . . . . . . . . . . */
753/* x . . . . . . . . . . . . . . . */
754/* X . . . . . . . . . . . . . . . */
755/* x x . . . . . . . . . . . . . . */
756/* x x . . . . . . . . . . . . . . */
757/* x x . . . . . . . . . . . . . . */
758
759{{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
760 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
761 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
762 {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
763 {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
764 {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
765
766/* x x . . . . . . . . . . . . . . */
767/* x x . . . . . . . . . . . . . . */
768/* . X . . . . . . . . . . . . . . */
769/* . x x . . . . . . . . . . . . . */
770/* . x x . . . . . . . . . . . . . */
771/* . x x . . . . . . . . . . . . . */
772
773{{1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
774 {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
775 {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
776 {0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
777 {0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
778 {0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
779
780/* . x x . . . . . . . . . . . . . */
781/* . x x . . . . . . . . . . . . . */
782/* . . X . . . . . . . . . . . . . */
783/* . . x x . . . . . . . . . . . . */
784/* . . x x . . . . . . . . . . . . */
785/* . . x x . . . . . . . . . . . . */
786
787{{0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
788 {0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
789 {0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
790 {0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
791 {0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
792 {0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
793
794/* . . x x . . . . . . . . . . . . */
795/* . . x x . . . . . . . . . . . . */
796/* . . . X . . . . . . . . . . . . */
797/* . . . x x . . . . . . . . . . . */
798/* . . . x x . . . . . . . . . . . */
799/* . . . x x . . . . . . . . . . . */
800
801{{0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
802 {0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
803 {0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
804 {0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
805 {0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
806 {0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
807
808/* . . . x x . . . . . . . . . . . */
809/* . . . x x . . . . . . . . . . . */
810/* . . . . X . . . . . . . . . . . */
811/* . . . . x x . . . . . . . . . . */
812/* . . . . x x . . . . . . . . . . */
813/* . . . . x x . . . . . . . . . . */
814
815{{0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
816 {0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
817 {0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
818 {0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
819 {0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
820 {0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
821
822/* . . . . x x . . . . . . . . . . */
823/* . . . . x x . . . . . . . . . . */
824/* . . . . . X . . . . . . . . . . */
825/* . . . . . x x . . . . . . . . . */
826/* . . . . . x x . . . . . . . . . */
827/* . . . . . x x . . . . . . . . . */
828
829{{0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
830 {0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
831 {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
832 {0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
833 {0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
834 {0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
835
836/* . . . . . x x . . . . . . . . . */
837/* . . . . . x x . . . . . . . . . */
838/* . . . . . . X . . . . . . . . . */
839/* . . . . . . x x . . . . . . . . */
840/* . . . . . . x x . . . . . . . . */
841/* . . . . . . x x . . . . . . . . */
842
843{{0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
844 {0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
845 {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
846 {0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
847 {0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
848 {0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0}},
849
850/* . . . . . . x x . . . . . . . . */
851/* . . . . . . x x . . . . . . . . */
852/* . . . . . . . X . . . . . . . . */
853/* . . . . . . . x x . . . . . . . */
854/* . . . . . . . x x . . . . . . . */
855/* . . . . . . . x x . . . . . . . */
856
857{{0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
858 {0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
859 {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
860 {0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0},
861 {0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0},
862 {0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0}},
863
864/* . . . . . . . x x . . . . . . . */
865/* . . . . . . . x x . . . . . . . */
866/* . . . . . . . . X . . . . . . . */
867/* . . . . . . . . x x . . . . . . */
868/* . . . . . . . . x x . . . . . . */
869/* . . . . . . . . x x . . . . . . */
870
871{{0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0},
872 {0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0},
873 {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0},
874 {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0},
875 {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0},
876 {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0}},
877
878/* . . . . . . . x x x . . . . . . */
879/* . . . . . . . . x x . . . . . . */
880/* . . . . . . . . . X . . . . . . */
881/* . . . . . . . . . x x . . . . . */
882/* . . . . . . . . . x x . . . . . */
883/* . . . . . . . . . x x . . . . . */
884
885{{0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0},
886 {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0},
887 {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0},
888 {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0},
889 {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0},
890 {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0}},
891
892/* . . . . . . . . x x x . . . . . */
893/* . . . . . . . . . x x x . . . . */
894/* . . . . . . . . . . X . . . . . */
895/* . . . . . . . . . . x x . . . . */
896/* . . . . . . . . . . x x . . . . */
897/* . . . . . . . . . . x x . . . . */
898
899{{0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0},
900 {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
901 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
902 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
903 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
904 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0}},
905
906/* . . . . . . . . . x x x . . . . */
907/* . . . . . . . . . . x x x . . . */
908/* . . . . . . . . . . . X . . . . */
909/* . . . . . . . . . . x x x . . . */
910/* . . . . . . . . . . x x x . . . */
911/* . . . . . . . . . . . x x . . . */
912
913{{0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
914 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
915 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0},
916 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
917 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
918 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0}},
919
920/* . . . . . . . . . . x x x . . . */
921/* . . . . . . . . . . . x x x . . */
922/* . . . . . . . . . . . . X . . . */
923/* . . . . . . . . . . . x x x . . */
924/* . . . . . . . . . . . x x x . . */
925/* . . . . . . . . . . . . x x . . */
926
927{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
928 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0},
929 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0},
930 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0},
931 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0},
932 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0}},
933
934/* . . . . . . . . . . . x x x . . */
935/* . . . . . . . . . . . . x x x . */
936/* . . . . . . . . . . . . . X . . */
937/* . . . . . . . . . . . . x x x . */
938/* . . . . . . . . . . . . x x x . */
939/* . . . . . . . . . . . . . x x . */
940
941{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0},
942 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0},
943 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
944 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0},
945 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0},
946 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0}},
947
948/* . . . . . . . . . . . . x x x . */
949/* . . . . . . . . . . . . . x x x */
950/* . . . . . . . . . . . . . . X . */
951/* . . . . . . . . . . . . . x x x */
952/* . . . . . . . . . . . . . x x x */
953/* . . . . . . . . . . . . . . x x */
954
955{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0},
956 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1},
957 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0},
958 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1},
959 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1},
960 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1}},
961
962/* . . . . . . . . . . . . . x x x */
963/* . . . . . . . . . . . . . . x x */
964/* . . . . . . . . . . . . . . . X */
965/* . . . . . . . . . . . . . . x x */
966/* . . . . . . . . . . . . . . x x */
967/* . . . . . . . . . . . . . . . x */
968
969{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1},
970 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
971 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
972 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
973 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
974 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}}},
975
976{ /* --- Stack 4 --- */
977
978/* x . . . . . . . . . . . . . . . */
979/* x x . . . . . . . . . . . . . . */
980/* X . . . . . . . . . . . . . . . */
981/* x x . . . . . . . . . . . . . . */
982/* x x . . . . . . . . . . . . . . */
983/* x x . . . . . . . . . . . . . . */
984
985{{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
986 {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
987 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
988 {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
989 {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
990 {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
991
992/* x x . . . . . . . . . . . . . . */
993/* x x x . . . . . . . . . . . . . */
994/* . X . . . . . . . . . . . . . . */
995/* x x x . . . . . . . . . . . . . */
996/* x x x . . . . . . . . . . . . . */
997/* . x x . . . . . . . . . . . . . */
998
999{{1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
1000 {1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
1001 {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
1002 {1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
1003 {1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
1004 {0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
1005
1006/* x x x . . . . . . . . . . . . . */
1007/* . x x x . . . . . . . . . . . . */
1008/* . . X . . . . . . . . . . . . . */
1009/* . x x x . . . . . . . . . . . . */
1010/* . x x x . . . . . . . . . . . . */
1011/* . . x x . . . . . . . . . . . . */
1012
1013{{1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
1014 {0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
1015 {0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
1016 {0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
1017 {0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
1018 {0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
1019
1020/* . x x x . . . . . . . . . . . . */
1021/* . . x x x . . . . . . . . . . . */
1022/* . . . X . . . . . . . . . . . . */
1023/* . . x x x . . . . . . . . . . . */
1024/* . . x x x . . . . . . . . . . . */
1025/* . . . x x . . . . . . . . . . . */
1026
1027{{0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
1028 {0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
1029 {0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
1030 {0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
1031 {0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
1032 {0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
1033
1034/* . . x x x . . . . . . . . . . . */
1035/* . . . x x x . . . . . . . . . . */
1036/* . . . . X . . . . . . . . . . . */
1037/* . . . x x x . . . . . . . . . . */
1038/* . . . x x x . . . . . . . . . . */
1039/* . . . . x x . . . . . . . . . . */
1040
1041{{0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
1042 {0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
1043 {0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
1044 {0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
1045 {0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
1046 {0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
1047
1048/* . . . x x x . . . . . . . . . . */
1049/* . . . . x x x . . . . . . . . . */
1050/* . . . . . X . . . . . . . . . . */
1051/* . . . . x x x . . . . . . . . . */
1052/* . . . . x x x . . . . . . . . . */
1053/* . . . . . x x . . . . . . . . . */
1054
1055{{0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
1056 {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
1057 {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
1058 {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
1059 {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
1060 {0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
1061
1062/* . . . . x x x . . . . . . . . . */
1063/* . . . . . x x x . . . . . . . . */
1064/* . . . . . . X . . . . . . . . . */
1065/* . . . . . x x x . . . . . . . . */
1066/* . . . . . x x x . . . . . . . . */
1067/* . . . . . . x x . . . . . . . . */
1068
1069{{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
1070 {0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
1071 {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
1072 {0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
1073 {0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
1074 {0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0}},
1075
1076/* . . . . . x x x . . . . . . . . */
1077/* . . . . . . x x x . . . . . . . */
1078/* . . . . . . . X . . . . . . . . */
1079/* . . . . . . x x x . . . . . . . */
1080/* . . . . . . x x x . . . . . . . */
1081/* . . . . . . . x x . . . . . . . */
1082
1083{{0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
1084 {0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
1085 {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
1086 {0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
1087 {0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
1088 {0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0}},
1089
1090/* . . . . . . x x . . . . . . . . */
1091/* . . . . . . . x x x . . . . . . */
1092/* . . . . . . . . X . . . . . . . */
1093/* . . . . . . . x x . . . . . . . */
1094/* . . . . . . . x x . . . . . . . */
1095/* . . . . . . . . x x . . . . . . */
1096
1097{{0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
1098 {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0},
1099 {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0},
1100 {0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0},
1101 {0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0},
1102 {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0}},
1103
1104/* . . . . . . . x x . . . . . . . */
1105/* . . . . . . . . . x x . . . . . */
1106/* . . . . . . . . . X . . . . . . */
1107/* . . . . . . . . x x . . . . . . */
1108/* . . . . . . . . x x . . . . . . */
1109/* . . . . . . . . . x x . . . . . */
1110
1111{{0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0},
1112 {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0},
1113 {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0},
1114 {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0},
1115 {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0},
1116 {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0}},
1117
1118/* . . . . . . . . x x . . . . . . */
1119/* . . . . . . . . . . x x . . . . */
1120/* . . . . . . . . . . X . . . . . */
1121/* . . . . . . . . . x x . . . . . */
1122/* . . . . . . . . . x x . . . . . */
1123/* . . . . . . . . . . x x . . . . */
1124
1125{{0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0},
1126 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
1127 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
1128 {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0},
1129 {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0},
1130 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0}},
1131
1132/* . . . . . . . . . x x . . . . . */
1133/* . . . . . . . . . . . x x . . . */
1134/* . . . . . . . . . . . X . . . . */
1135/* . . . . . . . . . . x x . . . . */
1136/* . . . . . . . . . . x x . . . . */
1137/* . . . . . . . . . . . x x . . . */
1138
1139{{0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0},
1140 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0},
1141 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0},
1142 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
1143 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
1144 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0}},
1145
1146/* . . . . . . . . . . x x . . . . */
1147/* . . . . . . . . . . . . x x . . */
1148/* . . . . . . . . . . . . X . . . */
1149/* . . . . . . . . . . . x x . . . */
1150/* . . . . . . . . . . . x x . . . */
1151/* . . . . . . . . . . . . x x . . */
1152
1153{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
1154 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0},
1155 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0},
1156 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0},
1157 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0},
1158 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0}},
1159
1160/* . . . . . . . . . . . x x . . . */
1161/* . . . . . . . . . . . . . x x . */
1162/* . . . . . . . . . . . . . X . . */
1163/* . . . . . . . . . . . . x x . . */
1164/* . . . . . . . . . . . . x x . . */
1165/* . . . . . . . . . . . . . x x . */
1166
1167{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0},
1168 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0},
1169 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
1170 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0},
1171 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0},
1172 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0}},
1173
1174/* . . . . . . . . . . . . x x . . */
1175/* . . . . . . . . . . . . . . x x */
1176/* . . . . . . . . . . . . . . X . */
1177/* . . . . . . . . . . . . . x x . */
1178/* . . . . . . . . . . . . . x x . */
1179/* . . . . . . . . . . . . . . x x */
1180
1181{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0},
1182 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
1183 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0},
1184 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0},
1185 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0},
1186 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1}},
1187
1188/* . . . . . . . . . . . . . x x . */
1189/* . . . . . . . . . . . . . . . x */
1190/* . . . . . . . . . . . . . . . X */
1191/* . . . . . . . . . . . . . . x x */
1192/* . . . . . . . . . . . . . . x x */
1193/* . . . . . . . . . . . . . . . x */
1194
1195{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0},
1196 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
1197 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
1198 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
1199 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
1200 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}}}
1201
1202};
ec5db61b 1203const Float_t AliTRDgtuParam::fgkRadius[6] = { 300.65, 313.25, 325.85, 338.45, 351.05, 363.65 };
1204const Float_t AliTRDgtuParam::fgkThickness = 3.;
1205const Float_t AliTRDgtuParam::fgkRow0Pos[6][5] = {
1206 {301, 177, 53, -57, -181},
1207 {301, 177, 53, -57, -181},
1208 {315, 184, 53, -57, -188},
1209 {329, 191, 53, -57, -195},
1210 {343, 198, 53, -57, -202},
1211 {347, 200, 53, -57, -204}
1212};
1213const Float_t AliTRDgtuParam::fgkInnerPadLength[] = {7.5, 7.5, 8.0, 8.5, 9.0, 9.0};
1214const Float_t AliTRDgtuParam::fgkOuterPadLength[] = {7.5, 7.5, 7.5, 7.5, 7.5, 8.5};
1215const Float_t AliTRDgtuParam::fgkAcoeff[32][6] = {
1216 {-3440, -3303, 3174, 3057, 0, 0},
1217 {-3481, 0, -171, 0, 3140, 0},
1218 {-2850, -1380, 0, 1277, 2441, 0},
1219 {-3481, 0, -171, 0, 3140, 0},
1220 { 0, -3568, -3431, 3303, 3185, 0},
1221 {-2783, -1378, -136, 1275, 2510, 0},
1222 {-1500, -2857, 1384, 0, 0, 2461},
1223 { 0, -3609, 0, -171, 0, 3268},
1224 {-3685, 0, 3400, -3276, 0, 3049},
1225 { 0, -3609, 0, -171, 0, 3268},
1226 {-1498, -2792, 1382, -132, 0, 2528},
1227 {-1850, -1777, 0, 0, 1585, 1531},
1228 {-3481, 0, -171, 0, 3140, 0},
1229 { 0, -2953, -1431, 0, 1328, 2544},
1230 {-1808, -1776, -89, 0, 1631, 1530},
1231 {-2932, 0, 0, -1314, 2511, 1223},
1232 { 0, -3609, 0, -171, 0, 3268},
1233 {-1849, -1738, 0, -82, 1583, 1574},
1234 { 0, 0, -3696, -3559, 3431, 3313},
1235 {-2863, 0, -140, -1312, 2582, 1221},
1236 { 0, -2886, -1429, -136, 1327, 2613},
1237 {-1806, -1736, -89, -82, 1629, 1572},
1238 { -1, -1, -1, -1, -1, -1},
1239 { -1, -1, -1, -1, -1, -1},
1240 { -1, -1, -1, -1, -1, -1},
1241 { -1, -1, -1, -1, -1, -1},
1242 { -1, -1, -1, -1, -1, -1},
1243 { -1, -1, -1, -1, -1, -1},
1244 { -1, -1, -1, -1, -1, -1},
1245 { -1, -1, -1, -1, -1, -1},
1246 { -1, -1, -1, -1, -1, -1},
1247 { -1, -1, -1, -1, -1, -1}
1248};
1249const Int_t AliTRDgtuParam::fgkMaskID[] = {
1250 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0,
1251 -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, 2, -1, 3, 4, 5,
1252 -1, -1, -1, -1, -1, -1, -1, 6, -1, -1, -1, 7, -1, 8, 9, 10,
1253 -1, -1, -1, 11, -1, 12, 13, 14, -1, 15, 16, 17, 18, 19, 20, 21
1254};
52c19022 1255
1256AliTRDgtuParam::AliTRDgtuParam() :
1257 fVertexSize(20.0),
1258 fCurrTrackletMask(0),
b491d23b 1259 fMagField(0.5),
52c19022 1260 fGeo(0x0)
1261{
1262 // default ctor
1263 fGeo = new AliTRDgeometry();
637666cd 1264 for (Int_t iLayer = 0; iLayer < 6; iLayer++) {
1265 fAki[iLayer] = 0.;
1266 fBki[iLayer] = 0.;
1267 fCki[iLayer] = 0.;
1268 }
1269
5f006bd7 1270 GenerateZChannelMap();
52c19022 1271}
1272
5f006bd7 1273AliTRDgtuParam::~AliTRDgtuParam()
52c19022 1274{
1275 // dtor
1276
1277 delete fGeo;
52c19022 1278}
1279
5f006bd7 1280AliTRDgtuParam* AliTRDgtuParam::Instance()
52c19022 1281{
1282 // get (or create) the single instance
1283
5f006bd7 1284 if (fgInstance == 0)
52c19022 1285 fgInstance = new AliTRDgtuParam();
1286
1287 return fgInstance;
1288}
1289
5f006bd7 1290void AliTRDgtuParam::Terminate()
52c19022 1291{
1292 // destruct the instance
1293
1294 if (fgInstance != 0) {
1295 delete fgInstance;
1296 fgInstance = 0x0;
1297 }
1298}
1299
5f006bd7 1300Bool_t AliTRDgtuParam::IsInZChannel(Int_t stack, Int_t layer, Int_t zchannel, Int_t zpos) const
52c19022 1301{
1302 return (fZSubChannel[stack][zchannel][layer][zpos] != 0);
1303}
1304
1305Int_t AliTRDgtuParam::GetZSubchannel(Int_t stack, Int_t layer, Int_t zchannel, Int_t zpos) const
1306{
1307 return fZSubChannel[stack][zchannel][layer][zpos];
1308}
1309
d2c8b010 1310Int_t AliTRDgtuParam::GetRefLayer(Int_t refLayerIdx)
52c19022 1311{
36dc3337 1312 // returns the reference layer indexed by refLayerIdx
1313
52c19022 1314 if (refLayerIdx >= 0 && refLayerIdx < fgkNRefLayers)
d2c8b010 1315 return fgRefLayers[refLayerIdx];
5f006bd7 1316 else
52c19022 1317 return -1;
1318}
1319
5f006bd7 1320Int_t AliTRDgtuParam::GenerateZChannelMap()
52c19022 1321{
1322 // generate the z-channel map
5f006bd7 1323 // assuming that the tracks come from the vertex
52c19022 1324 // +/- fVertexSize in z-direction
1325
44eafcf2 1326 if (fgUseGTUconst) {
1327 for (Int_t iStack = 0; iStack < fGeo->Nstack(); iStack++) {
1328 for (Int_t iChannel = 0; iChannel < fGeo->GetRowMax(fgkFixLayer, iStack, 0); iChannel++) {
1329 for (Int_t iLayer = 0; iLayer < fGeo->Nlayer(); iLayer++) {
1330 for (Int_t iRow = 0; iRow < fGeo->GetRowMax(iLayer, iStack, 0); iRow++) {
1331 if (fgZChannelMap[iStack][iChannel][iLayer][iRow] != 0) {
1332 fZChannelMap[iStack][iChannel][iLayer][iRow] = 1;
1333 fZSubChannel[iStack][iChannel % fgkNZChannels][iLayer][iRow] = iChannel / fgkNZChannels + 1;
1334 }
1335 }
1336 }
1337 }
1338 }
52c19022 1339
44eafcf2 1340 return kTRUE;
1341 }
1342 else {
1343 Int_t iSec = 0; // sector is irrelevant
1344 Bool_t collision = kFALSE;
52c19022 1345
44eafcf2 1346 for (Int_t iStack = 0; iStack < fGeo->Nstack(); iStack++) {
5f006bd7 1347
44eafcf2 1348 Float_t x[6] = { 0 };
1349 Float_t z[6][16] = {{ 0 }};
1350 Float_t dZ[6][16] = {{ 0 }};
1351
1352 for (Int_t iLayer = 0; iLayer < fGeo->Nlayer(); iLayer++) {
1353 AliTRDpadPlane *pp = fGeo->GetPadPlane(iLayer, iStack);
1354 x[iLayer] = fGeo->GetTime0(iLayer) - fGeo->CdrHght(); // ???
1355 for (Int_t iRow = 0; iRow < fGeo->GetRowMax(iLayer, iStack, iSec); iRow++) {
1356 z[iLayer][iRow] = pp->GetRowPos(iRow); // this is the right (pos. z-direction) border of the pad
1357 dZ[iLayer][iRow] = pp->GetRowSize(iRow); // length of the pad in z-direction
1358 for (Int_t i = 0; i < fgkNZChannels; i++)
52c19022 1359 fZSubChannel[iStack][i][iLayer][iRow] = 0;
44eafcf2 1360 }
52c19022 1361 }
52c19022 1362
44eafcf2 1363 for (Int_t fixRow = 0; fixRow < fGeo->GetRowMax(fgkFixLayer, iStack, iSec); fixRow++) {
5f006bd7 1364
44eafcf2 1365 Double_t fixZmin = z[fgkFixLayer][fixRow] - dZ[fgkFixLayer][fixRow];
1366 Double_t fixZmax = z[fgkFixLayer][fixRow];
1367 Double_t fixX = x[fgkFixLayer] + 1.5; // ??? 1.5 from where?
52c19022 1368
44eafcf2 1369 for (Int_t iLayer = 0; iLayer < fGeo->Nlayer(); iLayer++) {
1370 Double_t leftZ, rightZ;
5f006bd7 1371
44eafcf2 1372 if (iLayer <= fgkFixLayer) {
1373 leftZ = (fixZmin + fVertexSize) * (x[iLayer] + 1.5) / fixX - fVertexSize;
1374 rightZ = (fixZmax - fVertexSize) * (x[iLayer] + 1.5) / fixX + fVertexSize;
1375 }
1376 else {
1377 leftZ = (fixZmin - fVertexSize) * (x[iLayer] + 1.5) / fixX + fVertexSize;
1378 rightZ = (fixZmax + fVertexSize) * (x[iLayer] + 1.5) / fixX - fVertexSize;
1379 }
5f006bd7 1380
44eafcf2 1381 Double_t epsilon = 0.001;
1382 for (Int_t iRow = 0; iRow < fGeo->GetRowMax(iLayer, iStack, iSec); iRow++) {
1383 if ( (z[iLayer][iRow] ) > (leftZ + epsilon) &&
1384 (z[iLayer][iRow] - dZ[iLayer][iRow] ) < (rightZ - epsilon) ) {
1385 fZChannelMap[iStack][fixRow][iLayer][iRow] = 1;
1386 if (fZSubChannel[iStack][fixRow % fgkNZChannels][iLayer][iRow] != 0) {
1387 AliError("Collision in Z-Channel assignment occured! No reliable tracking!!!");
1388 collision = kTRUE;
1389 }
1390 else
1391 fZSubChannel[iStack][fixRow % fgkNZChannels][iLayer][iRow] = fixRow / fgkNZChannels + 1;
52c19022 1392 }
52c19022 1393
44eafcf2 1394 }
52c19022 1395 }
1396 }
1397 }
52c19022 1398
44eafcf2 1399 return ~collision;
1400 }
52c19022 1401}
1402
5f006bd7 1403Bool_t AliTRDgtuParam::DisplayZChannelMap(Int_t zchannel, Int_t subchannel) const
52c19022 1404{
5f006bd7 1405 // display the z-channel map
52c19022 1406
637666cd 1407 if (zchannel >= fgkNZChannels) {
52c19022 1408 AliError("Invalid Z channel!");
1409 return kFALSE;
1410 }
1411
1412 Int_t zchmin = zchannel >= 0 ? zchannel : 0;
1413 Int_t zchmax = zchannel >= 0 ? zchannel + 1 : fgkNZChannels;
1414 Int_t i = 0;
1415 Int_t j = 0;
1416 TCanvas *c = new TCanvas("zchmap", "Z-Chhannel Mapping");
1417 c->cd();
1418 TGraph **graphz = new TGraph*[fgkNZChannels];
5f006bd7 1419 for (Int_t zch = zchmin; zch < zchmax; zch++)
52c19022 1420 graphz[zch] = new TGraph;
1421 TGraphAsymmErrors *graph = new TGraphAsymmErrors();
1422 graph->SetTitle("Z-Channel Map");
1423 graph->SetPoint(i, 0, 0); // vertex
1424 graph->SetPointError(i++, 20, 20, 0, 0);
1425 // graph->SetRange //????
1426 for (Int_t iLayer = 0; iLayer < fGeo->Nlayer(); iLayer++) {
1427 for (Int_t iStack = 0; iStack < fGeo->Nstack(); iStack++) {
1428 AliTRDpadPlane *pp = fGeo->GetPadPlane(iLayer, iStack);
1429 for (Int_t iRow = 0; iRow < fGeo->GetRowMax(iLayer, iStack, 0); iRow++) {
1430 graph->SetPoint(i, pp->GetRowPos(iRow), fGeo->GetTime0(iLayer) - fGeo->CdrHght());
1431 graph->SetPointError(i++, pp->GetRowSize(iRow), 0, 0, 0);
1432 for (Int_t zch = zchmin; zch < zchmax; zch++)
1433 if (fZSubChannel[iStack][zch][iLayer][iRow] != 0)
1434 if (subchannel == 0 || fZSubChannel[iStack][zch][iLayer][iRow] == subchannel)
1435 graphz[zch]->SetPoint(j++, pp->GetRowPos(iRow) - pp->GetRowSize(iRow)/2, fGeo->GetTime0(iLayer) - fGeo->CdrHght());
1436 }
1437 }
1438 }
1439 graph->SetMarkerStyle(kDot);
1440 graph->Draw("AP");
637666cd 1441 gROOT->Add(graph);
52c19022 1442 for (Int_t zch = zchmin; zch < zchmax; zch++) {
1443 graphz[zch]->SetMarkerStyle(kCircle);
1444 graphz[zch]->SetMarkerColor(zch+2);
1445 graphz[zch]->SetMarkerSize(0.3 + zch*0.2);
1446 graphz[zch]->Draw("P");
637666cd 1447 gROOT->Add(graphz[zch]);
52c19022 1448 }
54d34aac 1449 delete [] graphz;
52c19022 1450 return kTRUE;
1451}
1452
5f006bd7 1453Int_t AliTRDgtuParam::GetCiAlpha(Int_t layer) const
52c19022 1454{
1455 // get the constant for the calculation of alpha
1456
44eafcf2 1457 Int_t ci = TMath::Nint(GetChamberThickness() / fGeo->GetTime0(layer) * GetBinWidthY() / GetBinWidthdY() * (1 << (GetBitExcessAlpha() + GetBitExcessY() + 1)) );
36dc3337 1458 return ci;
52c19022 1459}
1460
5f006bd7 1461Int_t AliTRDgtuParam::GetCiYProj(Int_t layer) const
52c19022 1462{
1463 // get the constant for the calculation of y_proj
1464
ec5db61b 1465 Int_t ci = 0;
1466
1467 if (fgUseGTUconst) {
1468 Float_t xmid = (fgkRadius[0] + fgkRadius[5]) / 2.;
1469 ci = TMath::Nint(- (fgkRadius[layer] - xmid) * fgkBinWidthdY / (fgkBinWidthY * fgkThickness) * (1 << GetBitExcessYProj()));
1470 } else {
1471 Float_t xmid = (fGeo->GetTime0(0) + fGeo->GetTime0(fGeo->Nlayer()-1)) / 2.;
1472 ci = TMath::Nint(- (fGeo->GetTime0(layer) - xmid) / GetChamberThickness() * GetBinWidthdY() / GetBinWidthY() * (1 << GetBitExcessYProj()) );
1473 }
1474
36dc3337 1475 return ci;
52c19022 1476}
1477
1478Int_t AliTRDgtuParam::GetYt(Int_t stack, Int_t layer, Int_t zrow) const
1479{
ec5db61b 1480 // return yt for the calculation of y'
1481
1482 Int_t yt = 0;
1483
1484 if (fgUseGTUconst) {
1485 yt = TMath::Nint (- ( (layer % 2 ? 1. : -1.) *
1486 GetZrow(stack, layer, zrow) * TMath::Tan(- 2./180. * TMath::Pi()) / fgkBinWidthY ));
1487 } else {
1488 yt = TMath::Nint (- ( (layer % 2 ? 1. : -1.) *
1489 (GetGeo()->GetPadPlane(layer, stack)->GetRowPos(zrow) - GetGeo()->GetPadPlane(layer, stack)->GetRowSize(zrow) / 2.) *
1490 TMath::Tan(- 2./180. * TMath::Pi()) ) / fgkBinWidthY );
1491 }
1492
1493 return yt;
52c19022 1494}
1495
5f006bd7 1496Bool_t AliTRDgtuParam::GenerateRecoCoefficients(Int_t trackletMask)
52c19022 1497{
5f006bd7 1498 // calculate the coefficients for the straight line fit
36dc3337 1499 // depending on the mask of contributing tracklets
1500
52c19022 1501 fCurrTrackletMask = trackletMask;
1502
1503 TMatrix a(GetNLayers(), 3);
1504 TMatrix b(3, GetNLayers());
1505 TMatrix c(3, 3);
1506
1507 for (Int_t layer = 0; layer < GetNLayers(); layer++) {
1508 if ( (trackletMask & (1 << layer)) == 0) {
1509 a(layer, 0) = 0;
1510 a(layer, 1) = 0;
1511 a(layer, 2) = 0;
5f006bd7 1512 }
52c19022 1513 else {
1514 a(layer, 0) = 1;
1515 a(layer, 1) = fGeo->GetTime0(layer);
1516 a(layer, 2) = (layer % 2 ? 1 : -1) * fGeo->GetTime0(layer);
1517 }
1518 }
1519
1520 b.Transpose(a);
1521 c = b * a;
1522 c.InvertFast();
1523 b = c * b;
1524
1525 for (Int_t layer = 0; layer < GetNLayers(); layer++) {
1526 fAki[layer] = b.GetMatrixArray()[layer];
1527 fBki[layer] = b.GetMatrixArray()[GetNLayers() + layer];
1528 fCki[layer] = b.GetMatrixArray()[2 * GetNLayers() + layer];
1529 }
1530 return kTRUE;
1531}
1532
ec5db61b 1533Int_t AliTRDgtuParam::GetAki(Int_t k, Int_t i)
52c19022 1534{
1535 // get A_ki for the calculation of the tracking parameters
ec5db61b 1536 if (fgUseGTUconst) {
1537 Int_t maskId = fgkMaskID[k];
1538 return fgkAcoeff[maskId][i];
1539 } else {
1540 if (fCurrTrackletMask != k)
1541 GenerateRecoCoefficients(k);
1542 return -(((Int_t) fAki[i]) << 9);
1543 }
52c19022 1544}
1545
5f006bd7 1546Float_t AliTRDgtuParam::GetBki(Int_t k, Int_t i)
52c19022 1547{
1548 // get B_ki for the calculation of the tracking parameters
1549
1550 if (fCurrTrackletMask != k)
1551 GenerateRecoCoefficients(k);
1552
1553 return fBki[i];
1554}
1555
5f006bd7 1556Float_t AliTRDgtuParam::GetCki(Int_t k, Int_t i)
52c19022 1557{
1558 // get B_ki for the calculation of the tracking parameters
1559
1560 if (fCurrTrackletMask != k)
1561 GenerateRecoCoefficients(k);
1562
1563 return fCki[i];
1564}
1565
1566/*
5f006bd7 1567Float_t AliTRDgtuParam::GetD(Int_t k) const
52c19022 1568{
1569 // get the determinant for the calculation of the tracking parameters
1570
1571 TMatrix t(3, 3);
1572 for (Int_t i = 0; i < GetNLayers(); i++) {
1573 if ( !((k >> i) & 0x1) )
1574 continue;
1575 Float_t xi = fGeo->GetTime0(i);
1576 t(0,0) += 1;
1577 t(1,0) += xi;
1578 t(2,0) += TMath::Power(-1, i) * xi;
1579 t(0,1) += xi;
1580 t(1,1) += TMath::Power(xi, 2);
1581 t(2,1) += TMath::Power(-1, i) * TMath::Power(xi, 2);
1582 t(0,2) += TMath::Power(-1, i) * xi;
1583 t(1,2) += TMath::Power(-1, i) * TMath::Power(xi, 2);
1584 t(2,2) += TMath::Power(xi, 2);
1585 }
1586 return t.Determinant();
1587}
1588
5f006bd7 1589Bool_t AliTRDgtuParam::GetFitParams(TVectorD& rhs, Int_t k)
52c19022 1590{
1591 // calculate the fitting parameters
1592 // will be changed!
1593
1594 TMatrix t(3,3);
1595 for (Int_t i = 0; i < GetNLayers(); i++) {
1596 if ( !((k >> i) & 0x1) )
1597 continue;
1598 Float_t xi = fGeo->GetTime0(i);
1599 t(0,0) += 1;
1600 t(1,0) += xi;
1601 t(2,0) += TMath::Power(-1, i) * xi;
1602 t(0,1) += xi;
1603 t(1,1) += TMath::Power(xi, 2);
1604 t(2,1) += TMath::Power(-1, i) * TMath::Power(xi, 2);
1605 t(0,2) -= TMath::Power(-1, i) * xi;
1606 t(1,2) -= TMath::Power(-1, i) * TMath::Power(xi, 2);
1607 t(2,2) -= TMath::Power(xi, 2);
1608 }
1609 TDecompLU lr(t);
1610 lr.Solve(rhs);
1611 return lr.Decompose();
1612}
1613*/
1614
5f006bd7 1615Bool_t AliTRDgtuParam::GetIntersectionPoints(Int_t k, Float_t &x1, Float_t &x2)
52c19022 1616{
1617 // get the x-coord. of the assumed circle/straight line intersection points
1618
1619 Int_t l1 = -1;
1620 Int_t l2 = -1;
1621 Int_t nHits = 0;
1622 for (Int_t layer = 0; layer < GetNLayers(); layer++) {
1623 if ( (k >> layer) & 0x1 ) {
5f006bd7 1624 if (l1 < 0)
52c19022 1625 l1 = layer;
1626 l2 = layer;
1627 nHits++;
1628 }
1629 }
1630
637666cd 1631 if ( (l1 >= 0) && (l2 >= 0) ) {
1632 x1 = fGeo->GetTime0(l1) + 10./6 * (nHits -1);
1633 x2 = fGeo->GetTime0(l2) - 10./6 * (nHits -1);
1634 return kTRUE;
1635 }
1636 else
1637 return kFALSE;
52c19022 1638}
1639
d2c8b010 1640Int_t AliTRDgtuParam::GetPt(Int_t layerMask, Int_t a, Float_t /* b */, Float_t x1, Float_t x2, Float_t magField)
52c19022 1641{
b491d23b 1642 // returns 0.3 * B * 1/a (1/128 GeV/c)
1643 // a : offset, b : slope (not used)
1644
ec5db61b 1645 // protect against division by zero, covers both cases
1646 if ((a >> 2) == 0)
1647 return fgkPtInfinity;
1648
44eafcf2 1649 if (fgUseGTUconst) {
1650 //----- calculation as in the GTU ----
1651 const Int_t maskIdLut[64] = {
1652 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0,
1653 -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, 2, -1, 3, 4, 5,
1654 -1, -1, -1, -1, -1, -1, -1, 6, -1, -1, -1, 7, -1, 8, 9, 10,
1655 -1, -1, -1, 11, -1, 12, 13, 14, -1, 15, 16, 17, 18, 19, 20, 21
1656 };
1657
1658 const Int_t c1Lut[32] = {
1659 -2371, -2474, -2474, -2474, -2563, -2448, -2578, -2578,
1660 -2578, -2670, -2557, -2578, -2578, -2670, -2557, -2578,
1661 -2670, -2557, -2763, -2557, -2644, -2523, -1, -1,
1662 -1, -1, -1, -1, -1, -1, -1, -1
1663 };
1664
1665 Int_t layerMaskId = maskIdLut[layerMask];
1666 Int_t c1 = c1Lut[layerMaskId];
1667 Int_t c1Ext = c1 << 8;
d2c8b010 1668 Int_t ptRawStage4 = c1Ext / (a >> 2);
44eafcf2 1669 Int_t ptRawComb4 = ptRawStage4;
1670 Int_t ptExtComb4 = (ptRawComb4 > 0) ? ptRawComb4 + 33 : ptRawComb4 - 30;
1671
1672 return ((Int_t) ptExtComb4/2);
1673 }
1674 else {
1675 //----- simple calculation -----
1676 Float_t c1 = x1 * x2 / 2. / 10000.; // conversion cm to m
1677 Float_t r = 0;
1678 if ( (a >> 1) != 0)
d2c8b010 1679 r = (0.3 * magField / 2. / (fgkBinWidthY/100.)) * (((Int_t) c1) << 8) / (a >> 1); //??? why shift of a?
44eafcf2 1680
1681 Int_t pt = (Int_t) (2 * r);
1682 if (pt >= 0)
1683 pt += 32;
1684 else
1685 pt -= 29;
1686 pt /= 2;
1687 return pt;
1688 }
52c19022 1689}