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