// //
////////////////////////////////////////////////////////////////////////////
+#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;
// ----- 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);
}
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;
}
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");
}
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);
a(layer, 0) = 0;
a(layer, 1) = 0;
a(layer, 2) = 0;
- }
+ }
else {
a(layer, 0) = 1;
a(layer, 1) = fGeo->GetTime0(layer);
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
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
}
/*
-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
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!
}
*/
-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
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;
+ }
}