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