]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TRD/AliTRDgtuParam.cxx
Fixes from Marian:
[u/mrichter/AliRoot.git] / TRD / AliTRDgtuParam.cxx
index ed6004156fad46e0ea3f18b0368b4828225ef1ff..7369ee3981650522fe30bae0b4f69e4075ef4eda 100644 (file)
@@ -23,6 +23,9 @@
 //                                                                        //
 ////////////////////////////////////////////////////////////////////////////
 
+#include <limits>
+
+#include "TROOT.h"
 #include "TMath.h"
 #include "TMatrix.h"
 #include "TDecompLU.h"
 
 ClassImp(AliTRDgtuParam)
 
-AliTRDgtuParam *AliTRDgtuParam::fgInstance = 0;
+Bool_t AliTRDgtuParam::fgUseGTUconst = kTRUE;
+Bool_t AliTRDgtuParam::fgUseGTUmerge = kTRUE;
+Bool_t AliTRDgtuParam::fgLimitNoTracklets = kTRUE;
+Int_t  AliTRDgtuParam::fgMaxNoTracklets = 62;
+
+// ----- matching windows -----
+      Int_t     AliTRDgtuParam::fgDeltaY     = 19;
+      Int_t     AliTRDgtuParam::fgDeltaAlpha = 21;
+// ----- reference layers -----
+      Int_t     AliTRDgtuParam::fgRefLayers[] = { 3, 2, 1 };
 
 // ----- Bin widths (granularity) -----
 const Float_t  AliTRDgtuParam::fgkBinWidthY  = 160e-4;
@@ -44,66 +56,1235 @@ const Float_t     AliTRDgtuParam::fgkBinWidthdY = 140e-4;
 
 // ----- Bit widths (used for internal representation) -----
 const Int_t    AliTRDgtuParam::fgkBitWidthY      = 13;
-const Int_t    AliTRDgtuParam::fgkBitWidthdY     = 7; 
+const Int_t    AliTRDgtuParam::fgkBitWidthdY     = 7;
 const Int_t    AliTRDgtuParam::fgkBitWidthYProj  = 10;
-const Int_t    AliTRDgtuParam::fgkBitExcessY     = 4; 
-const Int_t    AliTRDgtuParam::fgkBitExcessAlpha = 10; 
-const Int_t    AliTRDgtuParam::fgkBitExcessYProj = 2; 
+const Int_t    AliTRDgtuParam::fgkBitExcessY     = 4;
+const Int_t    AliTRDgtuParam::fgkBitExcessAlpha = 10;
+const Int_t    AliTRDgtuParam::fgkBitExcessYProj = 2;
 
-// ----- Tracking parameters -----
-/*
-const Int_t AliTRDgtuParam::fgkNZChannels = 3; // No. of z-channels
-const Int_t AliTRDgtuParam::fgkNLinks = 12;    // No. of links
-const Int_t AliTRDgtuParam::fgkFixLayer = 2;   // which layer is fixed for the generation of the z-channel map
-const Int_t AliTRDgtuParam::fgkDeltaY = 39;    // accepted deviation in y_proj, default: 9
-const Int_t AliTRDgtuParam::fgkDeltaAlpha = 31; // accepted deviation in alpha, default: 11
-const Int_t AliTRDgtuParam::fgkNRefLayers = 3;  // no. of reference layers
-*/
+// pt higher than the one for smallest possible a != 0
+const Int_t    AliTRDgtuParam::fgkPtInfinity      = std::numeric_limits<Int_t>::max();
+
+// ----- geometry constants used in GTU -----
+const Bool_t    AliTRDgtuParam::fgZChannelMap[5][16][6][16] = {
+
+{  /* --- Stack 0 --- */
+
+/*  . x x . . . . . . . . . . . . .  */
+/*  x . . . . . . . . . . . . . . .  */
+/*  X . . . . . . . . . . . . . . .  */
+/*  x x . . . . . . . . . . . . . .  */
+/*  x x . . . . . . . . . . . . . .  */
+/*  x . . . . . . . . . . . . . . .  */
+
+{{0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . x x . . . . . . . . . . . .  */
+/*  x x . . . . . . . . . . . . . .  */
+/*  . X . . . . . . . . . . . . . .  */
+/*  . x x . . . . . . . . . . . . .  */
+/*  . x x . . . . . . . . . . . . .  */
+/*  x x . . . . . . . . . . . . . .  */
+
+{{0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . x x . . . . . . . . . . .  */
+/*  . x x . . . . . . . . . . . . .  */
+/*  . . X . . . . . . . . . . . . .  */
+/*  . . x x . . . . . . . . . . . .  */
+/*  . . x x . . . . . . . . . . . .  */
+/*  . x x . . . . . . . . . . . . .  */
+
+{{0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . . x x . . . . . . . . . .  */
+/*  . . x x . . . . . . . . . . . .  */
+/*  . . . X . . . . . . . . . . . .  */
+/*  . . . x x . . . . . . . . . . .  */
+/*  . . . x x . . . . . . . . . . .  */
+/*  . . x x . . . . . . . . . . . .  */
+
+{{0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . . . x x . . . . . . . . .  */
+/*  . . . x x . . . . . . . . . . .  */
+/*  . . . . X . . . . . . . . . . .  */
+/*  . . . . x x . . . . . . . . . .  */
+/*  . . . . x x . . . . . . . . . .  */
+/*  . . . x x . . . . . . . . . . .  */
+
+{{0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . . . . x x . . . . . . . .  */
+/*  . . . . x x . . . . . . . . . .  */
+/*  . . . . . X . . . . . . . . . .  */
+/*  . . . . . x x . . . . . . . . .  */
+/*  . . . . . x x . . . . . . . . .  */
+/*  . . . . x x . . . . . . . . . .  */
+
+{{0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . . . . . x x . . . . . . .  */
+/*  . . . . . x x . . . . . . . . .  */
+/*  . . . . . . X . . . . . . . . .  */
+/*  . . . . . . x x . . . . . . . .  */
+/*  . . . . . . x x . . . . . . . .  */
+/*  . . . . . x x . . . . . . . . .  */
+
+{{0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . . . . . . x x . . . . . .  */
+/*  . . . . . . x x x . . . . . . .  */
+/*  . . . . . . . X . . . . . . . .  */
+/*  . . . . . . . x x . . . . . . .  */
+/*  . . . . . . . x x . . . . . . .  */
+/*  . . . . . . x x . . . . . . . .  */
+
+{{0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . . . . . . x x x . . . . .  */
+/*  . . . . . . . x x x . . . . . .  */
+/*  . . . . . . . . X . . . . . . .  */
+/*  . . . . . . . x x x . . . . . .  */
+/*  . . . . . . . x x x . . . . . .  */
+/*  . . . . . . . x x . . . . . . .  */
+
+{{0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . . . . . . . x x x . . . .  */
+/*  . . . . . . . . x x x . . . . .  */
+/*  . . . . . . . . . X . . . . . .  */
+/*  . . . . . . . . x x x . . . . .  */
+/*  . . . . . . . . x x x . . . . .  */
+/*  . . . . . . . . x x . . . . . .  */
+
+{{0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . . . . . . . . x x x . . .  */
+/*  . . . . . . . . . x x x . . . .  */
+/*  . . . . . . . . . . X . . . . .  */
+/*  . . . . . . . . . x x x . . . .  */
+/*  . . . . . . . . . x x x . . . .  */
+/*  . . . . . . . . . x x . . . . .  */
+
+{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0}},
+
+/*  . . . . . . . . . . . x x x . .  */
+/*  . . . . . . . . . . x x x . . .  */
+/*  . . . . . . . . . . . X . . . .  */
+/*  . . . . . . . . . . x x x . . .  */
+/*  . . . . . . . . . . x x x . . .  */
+/*  . . . . . . . . . . x x . . . .  */
+
+{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0}},
+
+/*  . . . . . . . . . . . . x x x .  */
+/*  . . . . . . . . . . . x x x . .  */
+/*  . . . . . . . . . . . . X . . .  */
+/*  . . . . . . . . . . . x x x . .  */
+/*  . . . . . . . . . . . x x x . .  */
+/*  . . . . . . . . . . . x x . . .  */
+
+{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0}},
+
+/*  . . . . . . . . . . . . . x x x  */
+/*  . . . . . . . . . . . . x x x .  */
+/*  . . . . . . . . . . . . . X . .  */
+/*  . . . . . . . . . . . . x x x .  */
+/*  . . . . . . . . . . . . x x x .  */
+/*  . . . . . . . . . . . . x x . .  */
+
+{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0}},
+
+/*  . . . . . . . . . . . . . . x x  */
+/*  . . . . . . . . . . . . . x x x  */
+/*  . . . . . . . . . . . . . . X .  */
+/*  . . . . . . . . . . . . . x x x  */
+/*  . . . . . . . . . . . . . x x x  */
+/*  . . . . . . . . . . . . . x x .  */
+
+{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0}},
+
+/*  . . . . . . . . . . . . . . . x  */
+/*  . . . . . . . . . . . . . . x x  */
+/*  . . . . . . . . . . . . . . . X  */
+/*  . . . . . . . . . . . . . . x x  */
+/*  . . . . . . . . . . . . . . x x  */
+/*  . . . . . . . . . . . . . . x x  */
+
+{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1}}},
+
+{  /* --- Stack 1 --- */
+
+/*  x x x . . . . . . . . . . . . .  */
+/*  x x . . . . . . . . . . . . . .  */
+/*  X . . . . . . . . . . . . . . .  */
+/*  x x . . . . . . . . . . . . . .  */
+/*  x x . . . . . . . . . . . . . .  */
+/*  x . . . . . . . . . . . . . . .  */
+
+{{1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . x x x . . . . . . . . . . . .  */
+/*  x x x . . . . . . . . . . . . .  */
+/*  . X . . . . . . . . . . . . . .  */
+/*  x x x . . . . . . . . . . . . .  */
+/*  x x x . . . . . . . . . . . . .  */
+/*  x x . . . . . . . . . . . . . .  */
+
+{{0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . x x x . . . . . . . . . . .  */
+/*  . x x x . . . . . . . . . . . .  */
+/*  . . X . . . . . . . . . . . . .  */
+/*  . x x x . . . . . . . . . . . .  */
+/*  . x x x . . . . . . . . . . . .  */
+/*  . x x . . . . . . . . . . . . .  */
+
+{{0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . x x x . . . . . . . . . .  */
+/*  . . x x x . . . . . . . . . . .  */
+/*  . . . X . . . . . . . . . . . .  */
+/*  . . x x x . . . . . . . . . . .  */
+/*  . . x x x . . . . . . . . . . .  */
+/*  . . x x . . . . . . . . . . . .  */
+
+{{0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . . x x x . . . . . . . . .  */
+/*  . . . x x x . . . . . . . . . .  */
+/*  . . . . X . . . . . . . . . . .  */
+/*  . . . x x x . . . . . . . . . .  */
+/*  . . . x x x . . . . . . . . . .  */
+/*  . . . x x . . . . . . . . . . .  */
+
+{{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . . . x x x . . . . . . . .  */
+/*  . . . . x x x . . . . . . . . .  */
+/*  . . . . . X . . . . . . . . . .  */
+/*  . . . . x x . . . . . . . . . .  */
+/*  . . . . x x . . . . . . . . . .  */
+/*  . . . . x x . . . . . . . . . .  */
+
+{{0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . . . . x x x . . . . . . .  */
+/*  . . . . . . x x . . . . . . . .  */
+/*  . . . . . . X . . . . . . . . .  */
+/*  . . . . . x x . . . . . . . . .  */
+/*  . . . . . x x . . . . . . . . .  */
+/*  . . . . . x x . . . . . . . . .  */
+
+{{0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . . . . . x x . . . . . . .  */
+/*  . . . . . . . x x . . . . . . .  */
+/*  . . . . . . . X . . . . . . . .  */
+/*  . . . . . . x x . . . . . . . .  */
+/*  . . . . . . x x . . . . . . . .  */
+/*  . . . . . . x x . . . . . . . .  */
+
+{{0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . . . . . . x x . . . . . .  */
+/*  . . . . . . . . x x . . . . . .  */
+/*  . . . . . . . . X . . . . . . .  */
+/*  . . . . . . . x x . . . . . . .  */
+/*  . . . . . . . x x . . . . . . .  */
+/*  . . . . . . . x x . . . . . . .  */
+
+{{0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . . . . . . . x x . . . . .  */
+/*  . . . . . . . . . x x . . . . .  */
+/*  . . . . . . . . . X . . . . . .  */
+/*  . . . . . . . . x x . . . . . .  */
+/*  . . . . . . . . x x . . . . . .  */
+/*  . . . . . . . . x x . . . . . .  */
+
+{{0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . . . . . . . . x x . . . .  */
+/*  . . . . . . . . . . x x . . . .  */
+/*  . . . . . . . . . . X . . . . .  */
+/*  . . . . . . . . . x x . . . . .  */
+/*  . . . . . . . . . x x . . . . .  */
+/*  . . . . . . . . . x x . . . . .  */
+
+{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0}},
+
+/*  . . . . . . . . . . . x x . . .  */
+/*  . . . . . . . . . . . x x . . .  */
+/*  . . . . . . . . . . . X . . . .  */
+/*  . . . . . . . . . . x x . . . .  */
+/*  . . . . . . . . . . x x . . . .  */
+/*  . . . . . . . . . . x x . . . .  */
+
+{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0}},
+
+/*  . . . . . . . . . . . . x x . .  */
+/*  . . . . . . . . . . . . x x . .  */
+/*  . . . . . . . . . . . . X . . .  */
+/*  . . . . . . . . . . . x x . . .  */
+/*  . . . . . . . . . . . x x . . .  */
+/*  . . . . . . . . . . . x x . . .  */
+
+{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0}},
+
+/*  . . . . . . . . . . . . . x x .  */
+/*  . . . . . . . . . . . . . x x .  */
+/*  . . . . . . . . . . . . . X . .  */
+/*  . . . . . . . . . . . . x x . .  */
+/*  . . . . . . . . . . . . x x . .  */
+/*  . . . . . . . . . . . . x x . .  */
+
+{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0}},
+
+/*  . . . . . . . . . . . . . . x x  */
+/*  . . . . . . . . . . . . . . x x  */
+/*  . . . . . . . . . . . . . . X .  */
+/*  . . . . . . . . . . . . . x x .  */
+/*  . . . . . . . . . . . . . x x .  */
+/*  . . . . . . . . . . . . . x x .  */
+
+{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0}},
+
+/*  . . . . . . . . . . . . . . . x  */
+/*  . . . . . . . . . . . . . . . x  */
+/*  . . . . . . . . . . . . . . . X  */
+/*  . . . . . . . . . . . . . . x x  */
+/*  . . . . . . . . . . . . . . x x  */
+/*  . . . . . . . . . . . . . . x x  */
+
+{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1}}},
+
+{  /* --- Stack 2 --- */
+
+/*  x x . . . . . . . . . .          */
+/*  x x . . . . . . . . . .          */
+/*  X . . . . . . . . . . .          */
+/*  x . . . . . . . . . . .          */
+/*  x . . . . . . . . . . .          */
+/*  x . . . . . . . . . . .          */
+
+{{1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . x x . . . . . . . . .          */
+/*  . x x . . . . . . . . .          */
+/*  . X . . . . . . . . . .          */
+/*  x x . . . . . . . . . .          */
+/*  x x . . . . . . . . . .          */
+/*  x x . . . . . . . . . .          */
+
+{{0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . x x . . . . . . . .          */
+/*  . . x x . . . . . . . .          */
+/*  . . X . . . . . . . . .          */
+/*  . x x . . . . . . . . .          */
+/*  . x x . . . . . . . . .          */
+/*  . x x . . . . . . . . .          */
+
+{{0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . x x . . . . . . .          */
+/*  . . . x x . . . . . . .          */
+/*  . . . X . . . . . . . .          */
+/*  . . x x x . . . . . . .          */
+/*  . . x x x . . . . . . .          */
+/*  . . x x x . . . . . . .          */
+
+{{0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . x x x . . . . . .          */
+/*  . . . x x x . . . . . .          */
+/*  . . . . X . . . . . . .          */
+/*  . . . x x x . . . . . .          */
+/*  . . . x x x . . . . . .          */
+/*  . . . x x x . . . . . .          */
+
+{{0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . . x x x . . . . .          */
+/*  . . . . x x x . . . . .          */
+/*  . . . . . X . . . . . .          */
+/*  . . . . x x x . . . . .          */
+/*  . . . . x x x . . . . .          */
+/*  . . . . x x x . . . . .          */
+
+{{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . . . x x x . . . .          */
+/*  . . . . . x x x . . . .          */
+/*  . . . . . . X . . . . .          */
+/*  . . . . . x x x . . . .          */
+/*  . . . . . x x x . . . .          */
+/*  . . . . . x x x . . . .          */
+
+{{0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . . . . x x x . . .          */
+/*  . . . . . . x x x . . .          */
+/*  . . . . . . . X . . . .          */
+/*  . . . . . . x x x . . .          */
+/*  . . . . . . x x x . . .          */
+/*  . . . . . . x x x . . .          */
+
+{{0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . . . . . x x . . .          */
+/*  . . . . . . . x x . . .          */
+/*  . . . . . . . . X . . .          */
+/*  . . . . . . . x x x . .          */
+/*  . . . . . . . x x x . .          */
+/*  . . . . . . . x x x . .          */
+
+{{0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . . . . . . x x . .          */
+/*  . . . . . . . . x x . .          */
+/*  . . . . . . . . . X . .          */
+/*  . . . . . . . . . x x .          */
+/*  . . . . . . . . . x x .          */
+/*  . . . . . . . . . x x .          */
+
+{{0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0}},
+
+/*  . . . . . . . . . x x .          */
+/*  . . . . . . . . . x x .          */
+/*  . . . . . . . . . . X .          */
+/*  . . . . . . . . . . x x          */
+/*  . . . . . . . . . . x x          */
+/*  . . . . . . . . . . x x          */
+
+{{0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0}},
+
+/*  . . . . . . . . . . x x          */
+/*  . . . . . . . . . . x x          */
+/*  . . . . . . . . . . . X          */
+/*  . . . . . . . . . . . x          */
+/*  . . . . . . . . . . . x          */
+/*  . . . . . . . . . . . x          */
+
+{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0}},
+
+/*  . . . . . . . . . . . .          */
+/*  . . . . . . . . . . . .          */
+/*  . . . . . . . . . . . .          */
+/*  . . . . . . . . . . . .          */
+/*  . . . . . . . . . . . .          */
+/*  . . . . . . . . . . . .          */
+
+{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . . . . . . . . . .          */
+/*  . . . . . . . . . . . .          */
+/*  . . . . . . . . . . . .          */
+/*  . . . . . . . . . . . .          */
+/*  . . . . . . . . . . . .          */
+/*  . . . . . . . . . . . .          */
+
+{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . . . . . . . . . .          */
+/*  . . . . . . . . . . . .          */
+/*  . . . . . . . . . . . .          */
+/*  . . . . . . . . . . . .          */
+/*  . . . . . . . . . . . .          */
+/*  . . . . . . . . . . . .          */
+
+{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . . . . . . . . . .          */
+/*  . . . . . . . . . . . .          */
+/*  . . . . . . . . . . . .          */
+/*  . . . . . . . . . . . .          */
+/*  . . . . . . . . . . . .          */
+/*  . . . . . . . . . . . .          */
+
+{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}},
+
+{  /* --- Stack 3 --- */
+
+/*  x . . . . . . . . . . . . . . .  */
+/*  x . . . . . . . . . . . . . . .  */
+/*  X . . . . . . . . . . . . . . .  */
+/*  x x . . . . . . . . . . . . . .  */
+/*  x x . . . . . . . . . . . . . .  */
+/*  x x . . . . . . . . . . . . . .  */
+
+{{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  x x . . . . . . . . . . . . . .  */
+/*  x x . . . . . . . . . . . . . .  */
+/*  . X . . . . . . . . . . . . . .  */
+/*  . x x . . . . . . . . . . . . .  */
+/*  . x x . . . . . . . . . . . . .  */
+/*  . x x . . . . . . . . . . . . .  */
+
+{{1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . x x . . . . . . . . . . . . .  */
+/*  . x x . . . . . . . . . . . . .  */
+/*  . . X . . . . . . . . . . . . .  */
+/*  . . x x . . . . . . . . . . . .  */
+/*  . . x x . . . . . . . . . . . .  */
+/*  . . x x . . . . . . . . . . . .  */
+
+{{0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . x x . . . . . . . . . . . .  */
+/*  . . x x . . . . . . . . . . . .  */
+/*  . . . X . . . . . . . . . . . .  */
+/*  . . . x x . . . . . . . . . . .  */
+/*  . . . x x . . . . . . . . . . .  */
+/*  . . . x x . . . . . . . . . . .  */
+
+{{0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . x x . . . . . . . . . . .  */
+/*  . . . x x . . . . . . . . . . .  */
+/*  . . . . X . . . . . . . . . . .  */
+/*  . . . . x x . . . . . . . . . .  */
+/*  . . . . x x . . . . . . . . . .  */
+/*  . . . . x x . . . . . . . . . .  */
+
+{{0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . . x x . . . . . . . . . .  */
+/*  . . . . x x . . . . . . . . . .  */
+/*  . . . . . X . . . . . . . . . .  */
+/*  . . . . . x x . . . . . . . . .  */
+/*  . . . . . x x . . . . . . . . .  */
+/*  . . . . . x x . . . . . . . . .  */
+
+{{0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . . . x x . . . . . . . . .  */
+/*  . . . . . x x . . . . . . . . .  */
+/*  . . . . . . X . . . . . . . . .  */
+/*  . . . . . . x x . . . . . . . .  */
+/*  . . . . . . x x . . . . . . . .  */
+/*  . . . . . . x x . . . . . . . .  */
+
+{{0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . . . . x x . . . . . . . .  */
+/*  . . . . . . x x . . . . . . . .  */
+/*  . . . . . . . X . . . . . . . .  */
+/*  . . . . . . . x x . . . . . . .  */
+/*  . . . . . . . x x . . . . . . .  */
+/*  . . . . . . . x x . . . . . . .  */
+
+{{0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . . . . . x x . . . . . . .  */
+/*  . . . . . . . x x . . . . . . .  */
+/*  . . . . . . . . X . . . . . . .  */
+/*  . . . . . . . . x x . . . . . .  */
+/*  . . . . . . . . x x . . . . . .  */
+/*  . . . . . . . . x x . . . . . .  */
+
+{{0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . . . . . x x x . . . . . .  */
+/*  . . . . . . . . x x . . . . . .  */
+/*  . . . . . . . . . X . . . . . .  */
+/*  . . . . . . . . . x x . . . . .  */
+/*  . . . . . . . . . x x . . . . .  */
+/*  . . . . . . . . . x x . . . . .  */
+
+{{0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0}},
+
+/*  . . . . . . . . x x x . . . . .  */
+/*  . . . . . . . . . x x x . . . .  */
+/*  . . . . . . . . . . X . . . . .  */
+/*  . . . . . . . . . . x x . . . .  */
+/*  . . . . . . . . . . x x . . . .  */
+/*  . . . . . . . . . . x x . . . .  */
+
+{{0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0}},
+
+/*  . . . . . . . . . x x x . . . .  */
+/*  . . . . . . . . . . x x x . . .  */
+/*  . . . . . . . . . . . X . . . .  */
+/*  . . . . . . . . . . x x x . . .  */
+/*  . . . . . . . . . . x x x . . .  */
+/*  . . . . . . . . . . . x x . . .  */
+
+{{0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0}},
+
+/*  . . . . . . . . . . x x x . . .  */
+/*  . . . . . . . . . . . x x x . .  */
+/*  . . . . . . . . . . . . X . . .  */
+/*  . . . . . . . . . . . x x x . .  */
+/*  . . . . . . . . . . . x x x . .  */
+/*  . . . . . . . . . . . . x x . .  */
+
+{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0}},
+
+/*  . . . . . . . . . . . x x x . .  */
+/*  . . . . . . . . . . . . x x x .  */
+/*  . . . . . . . . . . . . . X . .  */
+/*  . . . . . . . . . . . . x x x .  */
+/*  . . . . . . . . . . . . x x x .  */
+/*  . . . . . . . . . . . . . x x .  */
+
+{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0}},
+
+/*  . . . . . . . . . . . . x x x .  */
+/*  . . . . . . . . . . . . . x x x  */
+/*  . . . . . . . . . . . . . . X .  */
+/*  . . . . . . . . . . . . . x x x  */
+/*  . . . . . . . . . . . . . x x x  */
+/*  . . . . . . . . . . . . . . x x  */
+
+{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1}},
+
+/*  . . . . . . . . . . . . . x x x  */
+/*  . . . . . . . . . . . . . . x x  */
+/*  . . . . . . . . . . . . . . . X  */
+/*  . . . . . . . . . . . . . . x x  */
+/*  . . . . . . . . . . . . . . x x  */
+/*  . . . . . . . . . . . . . . . x  */
+
+{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}}},
+
+{  /* --- Stack 4 --- */
+
+/*  x . . . . . . . . . . . . . . .  */
+/*  x x . . . . . . . . . . . . . .  */
+/*  X . . . . . . . . . . . . . . .  */
+/*  x x . . . . . . . . . . . . . .  */
+/*  x x . . . . . . . . . . . . . .  */
+/*  x x . . . . . . . . . . . . . .  */
+
+{{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  x x . . . . . . . . . . . . . .  */
+/*  x x x . . . . . . . . . . . . .  */
+/*  . X . . . . . . . . . . . . . .  */
+/*  x x x . . . . . . . . . . . . .  */
+/*  x x x . . . . . . . . . . . . .  */
+/*  . x x . . . . . . . . . . . . .  */
+
+{{1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  x x x . . . . . . . . . . . . .  */
+/*  . x x x . . . . . . . . . . . .  */
+/*  . . X . . . . . . . . . . . . .  */
+/*  . x x x . . . . . . . . . . . .  */
+/*  . x x x . . . . . . . . . . . .  */
+/*  . . x x . . . . . . . . . . . .  */
+
+{{1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . x x x . . . . . . . . . . . .  */
+/*  . . x x x . . . . . . . . . . .  */
+/*  . . . X . . . . . . . . . . . .  */
+/*  . . x x x . . . . . . . . . . .  */
+/*  . . x x x . . . . . . . . . . .  */
+/*  . . . x x . . . . . . . . . . .  */
+
+{{0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . x x x . . . . . . . . . . .  */
+/*  . . . x x x . . . . . . . . . .  */
+/*  . . . . X . . . . . . . . . . .  */
+/*  . . . x x x . . . . . . . . . .  */
+/*  . . . x x x . . . . . . . . . .  */
+/*  . . . . x x . . . . . . . . . .  */
+
+{{0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . x x x . . . . . . . . . .  */
+/*  . . . . x x x . . . . . . . . .  */
+/*  . . . . . X . . . . . . . . . .  */
+/*  . . . . x x x . . . . . . . . .  */
+/*  . . . . x x x . . . . . . . . .  */
+/*  . . . . . x x . . . . . . . . .  */
+
+{{0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . . x x x . . . . . . . . .  */
+/*  . . . . . x x x . . . . . . . .  */
+/*  . . . . . . X . . . . . . . . .  */
+/*  . . . . . x x x . . . . . . . .  */
+/*  . . . . . x x x . . . . . . . .  */
+/*  . . . . . . x x . . . . . . . .  */
+
+{{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . . . x x x . . . . . . . .  */
+/*  . . . . . . x x x . . . . . . .  */
+/*  . . . . . . . X . . . . . . . .  */
+/*  . . . . . . x x x . . . . . . .  */
+/*  . . . . . . x x x . . . . . . .  */
+/*  . . . . . . . x x . . . . . . .  */
+
+{{0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . . . . x x . . . . . . . .  */
+/*  . . . . . . . x x x . . . . . .  */
+/*  . . . . . . . . X . . . . . . .  */
+/*  . . . . . . . x x . . . . . . .  */
+/*  . . . . . . . x x . . . . . . .  */
+/*  . . . . . . . . x x . . . . . .  */
+
+{{0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0}},
+
+/*  . . . . . . . x x . . . . . . .  */
+/*  . . . . . . . . . x x . . . . .  */
+/*  . . . . . . . . . X . . . . . .  */
+/*  . . . . . . . . x x . . . . . .  */
+/*  . . . . . . . . x x . . . . . .  */
+/*  . . . . . . . . . x x . . . . .  */
+
+{{0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0}},
+
+/*  . . . . . . . . x x . . . . . .  */
+/*  . . . . . . . . . . x x . . . .  */
+/*  . . . . . . . . . . X . . . . .  */
+/*  . . . . . . . . . x x . . . . .  */
+/*  . . . . . . . . . x x . . . . .  */
+/*  . . . . . . . . . . x x . . . .  */
+
+{{0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0}},
+
+/*  . . . . . . . . . x x . . . . .  */
+/*  . . . . . . . . . . . x x . . .  */
+/*  . . . . . . . . . . . X . . . .  */
+/*  . . . . . . . . . . x x . . . .  */
+/*  . . . . . . . . . . x x . . . .  */
+/*  . . . . . . . . . . . x x . . .  */
+
+{{0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0}},
+
+/*  . . . . . . . . . . x x . . . .  */
+/*  . . . . . . . . . . . . x x . .  */
+/*  . . . . . . . . . . . . X . . .  */
+/*  . . . . . . . . . . . x x . . .  */
+/*  . . . . . . . . . . . x x . . .  */
+/*  . . . . . . . . . . . . x x . .  */
+
+{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0}},
+
+/*  . . . . . . . . . . . x x . . .  */
+/*  . . . . . . . . . . . . . x x .  */
+/*  . . . . . . . . . . . . . X . .  */
+/*  . . . . . . . . . . . . x x . .  */
+/*  . . . . . . . . . . . . x x . .  */
+/*  . . . . . . . . . . . . . x x .  */
+
+{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0}},
+
+/*  . . . . . . . . . . . . x x . .  */
+/*  . . . . . . . . . . . . . . x x  */
+/*  . . . . . . . . . . . . . . X .  */
+/*  . . . . . . . . . . . . . x x .  */
+/*  . . . . . . . . . . . . . x x .  */
+/*  . . . . . . . . . . . . . . x x  */
+
+{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1}},
+
+/*  . . . . . . . . . . . . . x x .  */
+/*  . . . . . . . . . . . . . . . x  */
+/*  . . . . . . . . . . . . . . . X  */
+/*  . . . . . . . . . . . . . . x x  */
+/*  . . . . . . . . . . . . . . x x  */
+/*  . . . . . . . . . . . . . . . x  */
+
+{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}}}
+
+};
+const Float_t   AliTRDgtuParam::fgkRadius[6] = { 300.65, 313.25, 325.85, 338.45, 351.05, 363.65 };
+const Float_t   AliTRDgtuParam::fgkThickness = 3.;
+const Float_t   AliTRDgtuParam::fgkRow0Pos[6][5] = {
+  {301, 177, 53, -57, -181},
+  {301, 177, 53, -57, -181},
+  {315, 184, 53, -57, -188},
+  {329, 191, 53, -57, -195},
+  {343, 198, 53, -57, -202},
+  {347, 200, 53, -57, -204}
+};
+const Float_t   AliTRDgtuParam::fgkInnerPadLength[] = {7.5, 7.5, 8.0, 8.5, 9.0, 9.0};
+const Float_t   AliTRDgtuParam::fgkOuterPadLength[] = {7.5, 7.5, 7.5, 7.5, 7.5, 8.5};
+const Float_t   AliTRDgtuParam::fgkAcoeff[32][6] = {
+  {-3440, -3303,  3174,  3057,     0,     0},
+  {-3481,     0,  -171,     0,  3140,     0},
+  {-2850, -1380,     0,  1277,  2441,     0},
+  {-3481,     0,  -171,     0,  3140,     0},
+  {    0, -3568, -3431,  3303,  3185,     0},
+  {-2783, -1378,  -136,  1275,  2510,     0},
+  {-1500, -2857,  1384,     0,     0,  2461},
+  {    0, -3609,     0,  -171,     0,  3268},
+  {-3685,     0,  3400, -3276,     0,  3049},
+  {    0, -3609,     0,  -171,     0,  3268},
+  {-1498, -2792,  1382,  -132,     0,  2528},
+  {-1850, -1777,     0,     0,  1585,  1531},
+  {-3481,     0,  -171,     0,  3140,     0},
+  {    0, -2953, -1431,     0,  1328,  2544},
+  {-1808, -1776,   -89,     0,  1631,  1530},
+  {-2932,     0,     0, -1314,  2511,  1223},
+  {    0, -3609,     0,  -171,     0,  3268},
+  {-1849, -1738,     0,   -82,  1583,  1574},
+  {    0,     0, -3696, -3559,  3431,  3313},
+  {-2863,     0,  -140, -1312,  2582,  1221},
+  {    0, -2886, -1429,  -136,  1327,  2613},
+  {-1806, -1736,   -89,   -82,  1629,  1572},
+  {   -1,    -1,    -1,    -1,    -1,    -1},
+  {   -1,    -1,    -1,    -1,    -1,    -1},
+  {   -1,    -1,    -1,    -1,    -1,    -1},
+  {   -1,    -1,    -1,    -1,    -1,    -1},
+  {   -1,    -1,    -1,    -1,    -1,    -1},
+  {   -1,    -1,    -1,    -1,    -1,    -1},
+  {   -1,    -1,    -1,    -1,    -1,    -1},
+  {   -1,    -1,    -1,    -1,    -1,    -1},
+  {   -1,    -1,    -1,    -1,    -1,    -1},
+  {   -1,    -1,    -1,    -1,    -1,    -1}
+};
+const Int_t     AliTRDgtuParam::fgkMaskID[] = {
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  0,
+  -1, -1, -1, -1, -1, -1, -1,  1, -1, -1, -1,  2, -1,  3,  4,  5,
+  -1, -1, -1, -1, -1, -1, -1,  6, -1, -1, -1,  7, -1,  8,  9, 10,
+  -1, -1, -1, 11, -1, 12, 13, 14, -1, 15, 16, 17, 18, 19, 20, 21
+};
 
 AliTRDgtuParam::AliTRDgtuParam() :
   fVertexSize(20.0),
   fCurrTrackletMask(0),
-  fRefLayers(0x0),
+  fMagField(0.5),
   fGeo(0x0)
 {
   // default ctor
   fGeo = new AliTRDgeometry();
-  fRefLayers = new Int_t[fgkNRefLayers];
-  fRefLayers[0] = 3;
-  fRefLayers[1] = 2;
-  fRefLayers[2] = 1;
-  zChannelGen(); 
+  for (Int_t iLayer = 0; iLayer < 6; iLayer++) {
+    fAki[iLayer] = 0.;
+    fBki[iLayer] = 0.;
+    fCki[iLayer] = 0.;
+  }
+
+  GenerateZChannelMap();
 }
 
-AliTRDgtuParam::~AliTRDgtuParam() 
+AliTRDgtuParam::~AliTRDgtuParam()
 {
   // dtor
 
   delete fGeo;
-  delete [] fRefLayers;
 }
 
-AliTRDgtuParam* AliTRDgtuParam::Instance() 
+AliTRDgtuParam* AliTRDgtuParam::Instance()
 {
   // get (or create) the single instance
 
-  if (fgInstance == 0) 
-    fgInstance = new AliTRDgtuParam();
-
-  return fgInstance;
+  static AliTRDgtuParam instance;
+  return &instance;
 }
 
-void AliTRDgtuParam::Terminate() 
-{
-  // destruct the instance
-
-  if (fgInstance != 0) {
-    delete fgInstance;
-    fgInstance = 0x0;
-  }
-}
-
-Bool_t AliTRDgtuParam::IsInZChannel(Int_t stack, Int_t layer, Int_t zchannel, Int_t zpos) const 
+Bool_t AliTRDgtuParam::IsInZChannel(Int_t stack, Int_t layer, Int_t zchannel, Int_t zpos) const
 {
   return (fZSubChannel[stack][zchannel][layer][zpos] != 0);
 }
@@ -113,84 +1294,104 @@ Int_t AliTRDgtuParam::GetZSubchannel(Int_t stack, Int_t layer, Int_t zchannel, I
   return fZSubChannel[stack][zchannel][layer][zpos];
 }
 
-Int_t AliTRDgtuParam::GetRefLayer(Int_t refLayerIdx) const 
+Int_t AliTRDgtuParam::GetRefLayer(Int_t refLayerIdx)
 {
+  // returns the reference layer indexed by refLayerIdx
+
   if (refLayerIdx >= 0 && refLayerIdx < fgkNRefLayers)
-    return fRefLayers[refLayerIdx];
-  else 
+    return fgRefLayers[refLayerIdx];
+  else
     return -1;
 }
 
-Int_t AliTRDgtuParam::zChannelGen() 
+Int_t AliTRDgtuParam::GenerateZChannelMap()
 {
   // generate the z-channel map
-  // assuming that the tracks come from the vertex 
+  // assuming that the tracks come from the vertex
   // +/- fVertexSize in z-direction
 
-  Int_t iSec = 0; // sector is irrelevant
-  Bool_t collision = kFALSE;
-
-  for (Int_t iStack = 0; iStack < fGeo->Nstack(); iStack++) {
-
-    Float_t X[6] = { 0 };
-    Float_t Z[6][16] = {{ 0 }};
-    Float_t dZ[6][16] = {{ 0 }};
-    
-    for (Int_t iLayer = 0; iLayer < fGeo->Nlayer(); iLayer++) {
-      AliTRDpadPlane *pp = fGeo->GetPadPlane(iLayer, iStack);
-      X[iLayer]  = fGeo->GetTime0(iLayer) - fGeo->CdrHght(); // ???
-      for (Int_t iRow = 0; iRow < fGeo->GetRowMax(iLayer, iStack, iSec); iRow++) {
-       Z[iLayer][iRow]  = pp->GetRowPos(iRow); // this is the right (pos. z-direction) border of the pad
-       dZ[iLayer][iRow] = pp->GetRowSize(iRow); // length of the pad in z-direction
-       for (Int_t i = 0; i < fgkNZChannels; i++) 
-           fZSubChannel[iStack][i][iLayer][iRow] = 0;
+  if (fgUseGTUconst) {
+    for (Int_t iStack = 0; iStack < fGeo->Nstack(); iStack++) {
+      for (Int_t iChannel = 0; iChannel < fGeo->GetRowMax(fgkFixLayer, iStack, 0); iChannel++) {
+       for (Int_t iLayer = 0; iLayer < fGeo->Nlayer(); iLayer++) {
+         for (Int_t iRow = 0; iRow < fGeo->GetRowMax(iLayer, iStack, 0); iRow++) {
+           if (fgZChannelMap[iStack][iChannel][iLayer][iRow] != 0) {
+             fZChannelMap[iStack][iChannel][iLayer][iRow] = 1;
+             fZSubChannel[iStack][iChannel % fgkNZChannels][iLayer][iRow] = iChannel / fgkNZChannels + 1;
+           }
+         }
+       }
       }
     }
 
-    for (Int_t fixRow = 0; fixRow < fGeo->GetRowMax(fgkFixLayer, iStack, iSec); fixRow++) {
-       
-      Double_t fixZmin = Z[fgkFixLayer][fixRow] - dZ[fgkFixLayer][fixRow];  
-      Double_t fixZmax = Z[fgkFixLayer][fixRow];
-      Double_t fixX    = X[fgkFixLayer] + 1.5; // ??? 1.5 from where? 
+    return kTRUE;
+  }
+  else {
+    Int_t iSec = 0; // sector is irrelevant
+    Bool_t collision = kFALSE;
+
+    for (Int_t iStack = 0; iStack < fGeo->Nstack(); iStack++) {
+
+      Float_t x[6] = { 0 };
+      Float_t z[6][16] = {{ 0 }};
+      Float_t dZ[6][16] = {{ 0 }};
 
       for (Int_t iLayer = 0; iLayer < fGeo->Nlayer(); iLayer++) {
-       Double_t leftZ, rightZ;
-       
-       if (iLayer <= fgkFixLayer) {
-         leftZ  = (fixZmin + fVertexSize) * (X[iLayer] + 1.5) / fixX - fVertexSize;
-         rightZ = (fixZmax - fVertexSize) * (X[iLayer] + 1.5) / fixX + fVertexSize;
-       }
-       else {
-         leftZ  = (fixZmin - fVertexSize) * (X[iLayer] + 1.5) / fixX + fVertexSize;
-         rightZ = (fixZmax + fVertexSize) * (X[iLayer] + 1.5) / fixX - fVertexSize;
-       }
-       
-       Double_t epsilon = 0.001;
+       AliTRDpadPlane *pp = fGeo->GetPadPlane(iLayer, iStack);
+       x[iLayer]  = fGeo->GetTime0(iLayer) - fGeo->CdrHght(); // ???
        for (Int_t iRow = 0; iRow < fGeo->GetRowMax(iLayer, iStack, iSec); iRow++) {
-         if ( (Z[iLayer][iRow] )                    > (leftZ  + epsilon) && 
-              (Z[iLayer][iRow] - dZ[iLayer][iRow] ) < (rightZ - epsilon) ) {
-           fZChannelMap[iStack][fixRow][iLayer][iRow] = 1;
-           if (fZSubChannel[iStack][fixRow % fgkNZChannels][iLayer][iRow] != 0) {
-             AliError("Collision in Z-Channel assignment occured! No reliable tracking!!!");
-             collision = kTRUE;
-           }
-           else 
-             fZSubChannel[iStack][fixRow % fgkNZChannels][iLayer][iRow] = fixRow / fgkNZChannels + 1;
+         z[iLayer][iRow]  = pp->GetRowPos(iRow); // this is the right (pos. z-direction) border of the pad
+         dZ[iLayer][iRow] = pp->GetRowSize(iRow); // length of the pad in z-direction
+         for (Int_t i = 0; i < fgkNZChannels; i++)
+           fZSubChannel[iStack][i][iLayer][iRow] = 0;
+       }
+      }
+
+      for (Int_t fixRow = 0; fixRow < fGeo->GetRowMax(fgkFixLayer, iStack, iSec); fixRow++) {
+
+       Double_t fixZmin = z[fgkFixLayer][fixRow] - dZ[fgkFixLayer][fixRow];
+       Double_t fixZmax = z[fgkFixLayer][fixRow];
+       Double_t fixX    = x[fgkFixLayer] + 1.5; // ??? 1.5 from where?
+
+       for (Int_t iLayer = 0; iLayer < fGeo->Nlayer(); iLayer++) {
+         Double_t leftZ, rightZ;
+
+         if (iLayer <= fgkFixLayer) {
+           leftZ  = (fixZmin + fVertexSize) * (x[iLayer] + 1.5) / fixX - fVertexSize;
+           rightZ = (fixZmax - fVertexSize) * (x[iLayer] + 1.5) / fixX + fVertexSize;
+         }
+         else {
+           leftZ  = (fixZmin - fVertexSize) * (x[iLayer] + 1.5) / fixX + fVertexSize;
+           rightZ = (fixZmax + fVertexSize) * (x[iLayer] + 1.5) / fixX - fVertexSize;
          }
 
+         Double_t epsilon = 0.001;
+         for (Int_t iRow = 0; iRow < fGeo->GetRowMax(iLayer, iStack, iSec); iRow++) {
+           if ( (z[iLayer][iRow] )                    > (leftZ  + epsilon) &&
+                (z[iLayer][iRow] - dZ[iLayer][iRow] ) < (rightZ - epsilon) ) {
+             fZChannelMap[iStack][fixRow][iLayer][iRow] = 1;
+             if (fZSubChannel[iStack][fixRow % fgkNZChannels][iLayer][iRow] != 0) {
+               AliError("Collision in Z-Channel assignment occured! No reliable tracking!!!");
+               collision = kTRUE;
+             }
+             else
+               fZSubChannel[iStack][fixRow % fgkNZChannels][iLayer][iRow] = fixRow / fgkNZChannels + 1;
+           }
+
+         }
        }
       }
     }
-  }
 
-  return ~collision;
+    return ~collision;
+  }
 }
 
-Bool_t AliTRDgtuParam::DisplayZChannelMap(Int_t zchannel, Int_t subchannel) const 
+Bool_t AliTRDgtuParam::DisplayZChannelMap(Int_t zchannel, Int_t subchannel) const
 {
-  // display the z-channel map 
+  // display the z-channel map
 
-  if (zchannel > fgkNZChannels) {
+  if (zchannel >= fgkNZChannels) {
     AliError("Invalid Z channel!");
     return kFALSE;
   }
@@ -202,7 +1403,7 @@ Bool_t AliTRDgtuParam::DisplayZChannelMap(Int_t zchannel, Int_t subchannel) cons
   TCanvas *c = new TCanvas("zchmap", "Z-Chhannel Mapping");
   c->cd();
   TGraph **graphz = new TGraph*[fgkNZChannels];
-  for (Int_t zch = zchmin; zch < zchmax; zch++) 
+  for (Int_t zch = zchmin; zch < zchmax; zch++)
     graphz[zch] = new TGraph;
   TGraphAsymmErrors *graph = new TGraphAsymmErrors();
   graph->SetTitle("Z-Channel Map");
@@ -224,41 +1425,66 @@ Bool_t AliTRDgtuParam::DisplayZChannelMap(Int_t zchannel, Int_t subchannel) cons
   }
   graph->SetMarkerStyle(kDot);
   graph->Draw("AP");
+  gROOT->Add(graph);
   for (Int_t zch = zchmin; zch < zchmax; zch++) {
     graphz[zch]->SetMarkerStyle(kCircle);
     graphz[zch]->SetMarkerColor(zch+2);
     graphz[zch]->SetMarkerSize(0.3 + zch*0.2);
     graphz[zch]->Draw("P");
+    gROOT->Add(graphz[zch]);
   }
+  delete [] graphz;
   return kTRUE;
 }
 
-Int_t AliTRDgtuParam::GetCiAlpha(Int_t layer) const 
+Int_t AliTRDgtuParam::GetCiAlpha(Int_t layer) const
 {
   // get the constant for the calculation of alpha
 
-  Int_t Ci = (Int_t) (GetChamberThickness() / fGeo->GetTime0(layer) * GetBinWidthY() / GetBinWidthdY() * (1 << (GetBitExcessAlpha() + GetBitExcessY() + 1)) );
-  return Ci;
+  Int_t ci = TMath::Nint(GetChamberThickness() / fGeo->GetTime0(layer) * GetBinWidthY() / GetBinWidthdY() * (1 << (GetBitExcessAlpha() + GetBitExcessY() + 1)) );
+  return ci;
 }
 
-Int_t AliTRDgtuParam::GetCiYProj(Int_t layer) const 
+Int_t AliTRDgtuParam::GetCiYProj(Int_t layer) const
 {
   // get the constant for the calculation of y_proj
 
-  Float_t Xmid = (fGeo->GetTime0(0) + fGeo->GetTime0(fGeo->Nlayer()-1)) / 2.; 
-  Int_t Ci = (Int_t) (- (fGeo->GetTime0(layer) - Xmid) / GetChamberThickness() * GetBinWidthdY() / GetBinWidthY() * (1 << GetBitExcessYProj()) );
-  return Ci;
+  Int_t ci = 0;
+
+  if (fgUseGTUconst) {
+    Float_t xmid = (fgkRadius[0] + fgkRadius[5]) / 2.;
+    ci = TMath::Nint(- (fgkRadius[layer] - xmid) * fgkBinWidthdY / (fgkBinWidthY * fgkThickness) * (1 << GetBitExcessYProj()));
+  } else {
+    Float_t xmid = (fGeo->GetTime0(0) + fGeo->GetTime0(fGeo->Nlayer()-1)) / 2.;
+    ci = TMath::Nint(- (fGeo->GetTime0(layer) - xmid) / GetChamberThickness() * GetBinWidthdY() / GetBinWidthY() * (1 << GetBitExcessYProj()) );
+  }
+
+  return ci;
 }
 
 Int_t AliTRDgtuParam::GetYt(Int_t stack, Int_t layer, Int_t zrow) const
 {
-    return (Int_t) (- ( (layer % 2 ? 1 : -1) * 
-                       (GetGeo()->GetPadPlane(layer, stack)->GetRowPos(zrow) - GetGeo()->GetPadPlane(layer, stack)->GetRowSize(zrow) / 2) * 
-                       TMath::Tan(- 2.0 / 180.0 * TMath::Pi()) ) / 0.016 );
+  // return yt for the calculation of y'
+
+  Int_t yt = 0;
+
+  if (fgUseGTUconst) {
+    yt = TMath::Nint (- ( (layer % 2 ? 1. : -1.) *
+                         GetZrow(stack, layer, zrow) * TMath::Tan(- 2./180. * TMath::Pi()) / fgkBinWidthY ));
+  } else {
+    yt = TMath::Nint (- ( (layer % 2 ? 1. : -1.) *
+                         (GetGeo()->GetPadPlane(layer, stack)->GetRowPos(zrow) - GetGeo()->GetPadPlane(layer, stack)->GetRowSize(zrow) / 2.) *
+                         TMath::Tan(- 2./180. * TMath::Pi()) ) / fgkBinWidthY );
+  }
+
+  return yt;
 }
 
-Bool_t AliTRDgtuParam::GenerateRecoCoefficients(Int_t trackletMask) 
+Bool_t AliTRDgtuParam::GenerateRecoCoefficients(Int_t trackletMask)
 {
+  // calculate the coefficients for the straight line fit
+  // depending on the mask of contributing tracklets
+
   fCurrTrackletMask = trackletMask;
 
   TMatrix a(GetNLayers(), 3);
@@ -270,7 +1496,7 @@ Bool_t AliTRDgtuParam::GenerateRecoCoefficients(Int_t trackletMask)
          a(layer, 0) = 0;
          a(layer, 1) = 0;
          a(layer, 2) = 0;
-      } 
+      }
       else {
          a(layer, 0) = 1;
          a(layer, 1) = fGeo->GetTime0(layer);
@@ -291,16 +1517,20 @@ Bool_t AliTRDgtuParam::GenerateRecoCoefficients(Int_t trackletMask)
   return kTRUE;
 }
 
-Float_t AliTRDgtuParam::GetAki(Int_t k, Int_t i) 
+Int_t AliTRDgtuParam::GetAki(Int_t k, Int_t i)
 {
   // get A_ki for the calculation of the tracking parameters
-  if (fCurrTrackletMask != k)
-    GenerateRecoCoefficients(k);
-
-  return fAki[i];
+  if (fgUseGTUconst) {
+    Int_t maskId = fgkMaskID[k];
+    return fgkAcoeff[maskId][i];
+  } else {
+    if (fCurrTrackletMask != k)
+      GenerateRecoCoefficients(k);
+    return -(((Int_t) fAki[i]) << 9);
+  }
 }
 
-Float_t AliTRDgtuParam::GetBki(Int_t k, Int_t i) 
+Float_t AliTRDgtuParam::GetBki(Int_t k, Int_t i)
 {
   // get B_ki for the calculation of the tracking parameters
 
@@ -310,7 +1540,7 @@ Float_t AliTRDgtuParam::GetBki(Int_t k, Int_t i)
   return fBki[i];
 }
 
-Float_t AliTRDgtuParam::GetCki(Int_t k, Int_t i) 
+Float_t AliTRDgtuParam::GetCki(Int_t k, Int_t i)
 {
   // get B_ki for the calculation of the tracking parameters
 
@@ -321,7 +1551,7 @@ Float_t AliTRDgtuParam::GetCki(Int_t k, Int_t i)
 }
 
 /*
-Float_t AliTRDgtuParam::GetD(Int_t k) const 
+Float_t AliTRDgtuParam::GetD(Int_t k) const
 {
   // get the determinant for the calculation of the tracking parameters
 
@@ -343,7 +1573,7 @@ Float_t AliTRDgtuParam::GetD(Int_t k) const
   return t.Determinant();
 }
 
-Bool_t AliTRDgtuParam::GetFitParams(TVectorD& rhs, Int_t k) 
+Bool_t AliTRDgtuParam::GetFitParams(TVectorD& rhs, Int_t k)
 {
   // calculate the fitting parameters
   // will be changed!
@@ -369,7 +1599,7 @@ Bool_t AliTRDgtuParam::GetFitParams(TVectorD& rhs, Int_t k)
 }
 */
 
-Bool_t AliTRDgtuParam::GetIntersectionPoints(Int_t k, Float_t &x1, Float_t &x2) 
+Bool_t AliTRDgtuParam::GetIntersectionPoints(Int_t k, Float_t &x1, Float_t &x2)
 {
   // get the x-coord. of the assumed circle/straight line intersection points
 
@@ -378,35 +1608,69 @@ Bool_t AliTRDgtuParam::GetIntersectionPoints(Int_t k, Float_t &x1, Float_t &x2)
   Int_t nHits = 0;
   for (Int_t layer = 0; layer < GetNLayers(); layer++) {
     if ( (k >> layer) & 0x1 ) {
-      if (l1 < 0) 
+      if (l1 < 0)
        l1 = layer;
       l2 = layer;
       nHits++;
     }
   }
 
-  x1 = fGeo->GetTime0(l1) + 10./6 * (nHits -1);
-  x2 = fGeo->GetTime0(l2) - 10./6 * (nHits -1);
-
-  return ( (l1 >= 0) && (l2 >= 0) );
+  if ( (l1 >= 0) && (l2 >= 0) ) {
+    x1 = fGeo->GetTime0(l1) + 10./6 * (nHits -1);
+    x2 = fGeo->GetTime0(l2) - 10./6 * (nHits -1);
+    return kTRUE;
+  }
+  else
+    return kFALSE;
 }
 
-Float_t AliTRDgtuParam::GetRadius(Int_t a, Float_t b, Float_t x1, Float_t x2) 
+Int_t AliTRDgtuParam::GetPt(Int_t layerMask, Int_t a, Float_t /* b */, Float_t x1, Float_t x2, Float_t magField)
 {
-  // get the radius for the track
-  Float_t d = (1 + b * b /2 ) * (x2 - x1);
-  Float_t c1 = x1 * x2 / 2;
-//  Float_t c2 = (x1 + x2) / (x1 * x2);
-//  printf("c1: %f\n", c1);
-  Float_t r = 0;
-  if ( (a >> 1) != 0)
-    r = (375. / 10000.) * c1 * 256 / (a >> 1);
-  return r;
-
-  Float_t y1 = a + b*x1;
-  Float_t y2 = a + b*x2;
-  Float_t alpha = TMath::Abs( TMath::ATan(y2/x2) - TMath::ATan(y1/x1) );
-  d = TMath::Sqrt( TMath::Power(x2-x1, 2) + TMath::Power(y2-y1, 2) );
-  r = d / 2. / TMath::Sin(alpha);
-  return r;
+  // returns 0.3 * B * 1/a (1/128 GeV/c)
+  // a : offset, b : slope (not used)
+
+  // protect against division by zero, covers both cases
+  if ((a >> 2) == 0)
+    return fgkPtInfinity;
+
+  if (fgUseGTUconst) {
+    //----- calculation as in the GTU ----
+    const Int_t maskIdLut[64] = {
+      -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  0,
+      -1, -1, -1, -1, -1, -1, -1,  1, -1, -1, -1,  2, -1,  3,  4,  5,
+      -1, -1, -1, -1, -1, -1, -1,  6, -1, -1, -1,  7, -1,  8,  9, 10,
+      -1, -1, -1, 11, -1, 12, 13, 14, -1, 15, 16, 17, 18, 19, 20, 21
+    };
+
+    const Int_t c1Lut[32] = {
+      -2371, -2474, -2474, -2474, -2563, -2448, -2578, -2578,
+      -2578, -2670, -2557, -2578, -2578, -2670, -2557, -2578,
+      -2670, -2557, -2763, -2557, -2644, -2523,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1
+    };
+
+    Int_t layerMaskId = maskIdLut[layerMask];
+    Int_t c1 = c1Lut[layerMaskId];
+    Int_t c1Ext = c1 << 8;
+    Int_t ptRawStage4 = c1Ext / (a >> 2);
+    Int_t ptRawComb4 = ptRawStage4;
+    Int_t ptExtComb4 = (ptRawComb4 > 0) ? ptRawComb4 + 33 : ptRawComb4 - 30;
+
+    return ((Int_t) ptExtComb4/2);
+  }
+  else {
+    //----- simple calculation -----
+    Float_t c1 = x1 * x2 / 2. / 10000.; // conversion cm to m
+    Float_t r = 0;
+    if ( (a >> 1) != 0)
+      r = (0.3 * magField / 2. / (fgkBinWidthY/100.)) * (((Int_t) c1) << 8) / (a >> 1); //??? why shift of a?
+
+    Int_t pt = (Int_t) (2 * r);
+    if (pt >= 0)
+      pt += 32;
+    else
+      pt -= 29;
+    pt /= 2;
+    return pt;
+  }
 }