/*
 Converts data address as specified in LHCb-2003-041
 into the straw numbering scheme used by the OT reconstruction

 The conversion is performed by means of a lookup table,
 indexed by the channel address (quarter, station, otis, otis_channel)
 that is carried by the data itself (see https://edms.cern.ch/document/833984)

 More details on numbering schemes can be found on the OT web page
 http://www.nikhef.nl/pub/experiments/bfys/lhcb/outerTracker/NamingConventions/FE-Channels/
 */
#ifndef _CH_LOOKUP_H
#define _CH_LOOKUP_H	1

inline unsigned int ch_lookup(
	const unsigned int quarter, const unsigned int layer,
	const unsigned int module,
	const unsigned int otis, const unsigned int o_chan
)
{
	const unsigned int	ch_lu[2][2][4][32] =
	{
	// Quarter 0 and 1
		{
		// Layer 0 and 2
			{
			// OTIS 0
	{  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 
	  17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 },
			// OTIS 1
	{ 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 
	  49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64 },
			// OTIS 2
	{128,127,126,125,124,123,122,121,120,119,118,117,116,115,114,113,
         112,111,110,109,108,107,106,105,104,103,102,101,100, 99, 98, 97 }, 
			// OTIS 3
	{ 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 
	  80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65 }
			},
		// Layer 1 and 3
			{
			// OTIS 0
	{128,127,126,125,124,123,122,121,120,119,118,117,116,115,114,113, 
	 112,111,110,109,108,107,106,105,104,103,102,101,100, 99, 98, 97 },
			// OTIS 1
	{ 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 
	  80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65 },
			// OTIS 2
	{  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 
	  17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 },
			// OTIS 3
	{ 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 
	  49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64 }
			}
		},
	// Quarter 2 and 3
		{
		// Layer 0 and 2
			{
			// OTIS 0
	{ 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 
	  48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33 },
			// OTIS 1
	{ 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 
	  16, 15, 14, 13, 12, 11, 10,  9,  8,  7,  6,  5,  4,  3,  2,  1 },
			// OTIS 2
	{ 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 
	  81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96 }, 
			// OTIS 3
	{ 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,112,
	 113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128 },
			},
		// Layer 1 and 3
			{
			// OTIS 0
	{ 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 
	  81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96 }, 
			// OTIS 1
	{ 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,112,
	 113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128 },
			// OTIS 2
	{ 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 
	  48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33 },
			// OTIS 3
	{ 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 
	  16, 15, 14, 13, 12, 11, 10,  9,  8,  7,  6,  5,  4,  3,  2,  1 }
			}
		}
	} ;

	const unsigned int	ch_lu_small[2][2][4][32] =
	{
	// Quarter 0 and 1
		{
		// Layer 0 and 2
			{
			// OTIS 0
	{  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 
	  17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 },
			// OTIS 1
	{999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999, 
	 999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999 },
			// OTIS 2
	{999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999, 
	 999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999 },
			// OTIS 3
	{ 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 
	  48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33 }
			},
		// Layer 1 and 3
			{
			// OTIS 0
	{ 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 
	  48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33 },
			// OTIS 1
	{999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999, 
	 999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999 },
			// OTIS 2
	{999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999, 
	 999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999 },
			// OTIS 3
	{  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 
	  17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }
			}
		},
	// Quarter 2 and 3
		{
		// Layer 0 and 2
			{
			// OTIS 0
	{ 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 
	  16, 15, 14, 13, 12, 11, 10,  9,  8,  7,  6,  5,  4,  3,  2,  1 },
			// OTIS 1
	{999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999, 
	 999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999 },
			// OTIS 2
	{999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999, 
	 999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999 },
			// OTIS 3
	{ 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 
	  49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64 }
			},
		// Layer 1 and 3
			{
			// OTIS 0
	{ 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 
	  49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64 },
			// OTIS 1
	{999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999, 
	 999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999 },
			// OTIS 2
	{999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999, 
	 999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999 },
			// OTIS 3
	{ 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 
	  16, 15, 14, 13, 12, 11, 10,  9,  8,  7,  6,  5,  4,  3,  2,  1 }
			}
		}
	} ;

	int q	= (quarter & 0x3) / 0x2 ;	// top or bottom ??
	int l	= (layer & 0x3) & 0x1 ;	// lower Z or higher Z ??
	int o	= otis & 0x3 ;
	int c	= o_chan & 0x1f ;

	// small modules
	if ( ((quarter & 0x1) == 0) && module == 9 )
		return(ch_lu_small[q][l][o][c]) ;
	else
		return(ch_lu[q][l][o][c]) ;
}

#endif /* ch_lookup.h */

