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