StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
StGmtGeom.cxx
1 /* StGmtGeom.cxx
2  *
3  * GMT geometry class declaration.
4  *
5  * \authors K.S. Engle and Richard Witt (witt@usna.edu)
6  * based on StFgtGeom
7  */
8 
9 #include <TMath.h>
10 #include <iostream>
11 #include <algorithm>
12 #include "StGmtGeom.h"
13 #include "StMessMgr.h"
14 
15 double StGmtGeom::mPi = TMath::Pi();
16 double StGmtGeom::mHalfPi = TMath::PiOver2();
17 
18 //________________
19 Int_t StGmtGeom::encodeGeoId(Int_t rdo, Int_t arm, Int_t apv, Int_t channel) {
20 
21  Short_t module = getModuleIdFromElecCoord(rdo, arm, apv);
22  // locally map apv number into [0,1]
23  if ( apv <= 3 ) {
24  apv = apv % 2;
25  }
26  else {
27  apv = (apv - 12) % 2;
28  }
29 
30  if ( module < 0 || module >= kGmtNumModules ) {
31  LOG_DEBUG << "Module " << module << " out of range in StGmtGeom::encodeGeoId." << endm;
32  return kGmtError;
33  }
34  else if ( apv > 1 || apv < 0 ) {
35  LOG_DEBUG << "APV " << apv << " out of range in StGmtGeom::encodeGeoId." << endm;
36  return kGmtError;
37  }
38  else if ( channel < 0 || channel >= kGmtNumStrips ) {
39  LOG_DEBUG << "Channel " << channel << " out of range in StGmtGeom::encodeGeoId." << endm;
40  return kGmtError;
41  }
42  return ( module * kGmtNumLayers + apv ) * kGmtNumStrips + channel; // from 0 to 2047 since channel is from 0-127;
43 }
44 
45 //________________
46 Int_t StGmtGeom::decodeGeoId(Int_t geoId, Short_t &module, Int_t &layer, Short_t &strip) {
47  if ( geoId < 0 || geoId >= kGmtNumGeoIds ) {
48  LOG_DEBUG << "GeoId " << geoId << " out of range in StGmtGeom::decodeGeoId." << endm;
49  module = kGmtError;
50  // layer = kGmtErrorChar;
51  layer = kGmtError;
52  strip = kGmtError;
53 
54  return kGmtError;
55  }
56 
57  strip = geoId % kGmtNumStrips;
58  geoId /= kGmtNumStrips;
59 
60  // layer = ( geoId % kGmtNumLayers ) ? 'P' : 'S';
61  Int_t apv = ( geoId % kGmtNumLayers ) ? 1 : 0;
62  geoId /= kGmtNumLayers;
63 
64  StGmtGeomData stripdata = mStrips[ strip + apv*kGmtNumStrips ];
65  layer = stripdata.isY;
66  module = geoId;
67  return 0;
68 }
69 
70 //________________
71 std::string StGmtGeom::encodeGeoName(Int_t module, Char_t layer, Int_t strip) {
72 
73  Char_t testS='S';
74  Char_t testP='P';
75 
76  if ( module < 0 || module >= kGmtNumModules ) {
77  LOG_DEBUG << "Module " << module << " out of range in StGmtGeom::encodeGeoName." << endm;
78  return kGmtErrorString;
79  }
80  else if (layer != testS && layer != testP) {
81  LOG_DEBUG << "Layer " << layer << " out of range in StGmtGeom::encodeGeoName." << endm;
82  return kGmtErrorString;
83  }
84  else if ( strip < 0 || strip >= kGmtNumStrips ) {
85  LOG_DEBUG << "Strip " << strip << " out of range in StGmtGeom::encodeGeoName." << endm;
86  return kGmtErrorString;
87  }
88 
89  std::stringstream buff;
90  // buff << disc+1 << (Char_t)(quadrant+'A') << layer;
91  buff << module+1 << layer;
92 
93  if ( strip < 10 ) {
94  buff << "00";
95  }
96  else if ( strip < 100 ) {
97  buff << "0";
98  }
99 
100  buff << strip;
101  return buff.str();
102 }
103 
104 //________________
105 Int_t StGmtGeom::decodeGeoName(const std::string &geoName, Short_t &module, Int_t &layer, Short_t &strip) {
106  module = geoName[0] - '1';
107  layer = geoName[2];
108  strip = std::atoi( (geoName.substr(3)).c_str() );
109 
110  // This is unlikely to catch all errors with the geoName, but it should do fairly well.
111  if (module < 0 || module >= kGmtNumModules || (
112  // layer != testS && layer != testP
113  layer < 0 || layer > 1) || strip < 0 || strip > kGmtNumStrips) {
114  LOG_DEBUG << "Malformed geoName " << geoName << " in StGmtGeom::decodeGeoName." << endm;
115  module = kGmtError;
116  layer = kGmtErrorChar;
117  strip = kGmtError;
118  return kGmtError;
119  }
120  return 0;
121 }
122 
123 //________________
124 std::string StGmtGeom::translateGeoIdToGeoName(Int_t geoId) {
125  Short_t module, strip;
126  Int_t layer;
127  if ( geoId < 0 || geoId >= kGmtNumGeoIds ) {
128  LOG_DEBUG << "GeoId " << geoId << " out of range in StGmtGeom::translateGeoIdToGeoName." << endm;
129  return kGmtErrorString;
130  }
131 
132  decodeGeoId(geoId, module, layer, strip);
133  return encodeGeoName(module, layer, strip);
134 }
135 
136 //________________
137 Int_t StGmtGeom::getPhysicalCoordinate(Int_t geoId, Short_t &module, Int_t &layer) {
138  if ( geoId < 0 || geoId >= kGmtNumGeoIds ) {
139  LOG_DEBUG << "GeoId " << geoId << " out of range in StGmtGeom::getPhysicalCoordinate." << endm;
140  module = kGmtError;
141  layer = kGmtErrorChar;
142  return kGmtError;
143  }
144 
145  Short_t strip;
146  decodeGeoId(geoId, module, layer, strip);
147  return 0;
148 }
149 
150 //________________
151 Int_t StGmtGeom::getPhysicalCoordinate(const std::string &geoName, Short_t &module, Int_t &layer) {
152  Short_t strip;
153  if ( decodeGeoName( geoName, module, layer, strip ) < 0 ) {
154  // Error is mostly handled by the decodeGeoName call.
155  module = kGmtError;
156  // layer = kGmtErrorChar;
157  layer = kGmtError;
158  return kGmtError;
159  }
160  return 0;
161 }
162 
163 //________________
164 Short_t StGmtGeom::getModuleIdFromElecCoord(Int_t rdo, Int_t arm, Int_t apv) {
165  Short_t retVal = kGmtError;
166  if ( (rdo - 1) < 0 || (rdo - 1) >= kGmtNumRdos ) {
167  LOG_DEBUG << "RDO " << rdo << " out of range in StGmtGeom::getModuleIdFromElecCoord." << endm;
168  return retVal;
169  }
170  else if ( arm < 0 || arm >= kGmtNumArms ) {
171  LOG_DEBUG << "ARM " << arm << " out of range in StGmtGeom::getModuleIdFromElecCoord." << endm;
172  return retVal;
173  }
174  else if ( apv < 0 || apv > kGmtMaxApvId || (apv > 3 && apv < 12) ) {
175  LOG_DEBUG << "APV " << apv << " out of range in StGmtGeom::getModuleIdFromElecCoord." << endm;
176  return retVal;
177  }
178 
179  if (arm == 0) {
180  if (apv == 0 || apv == 1) {
181  retVal = 0;
182  }
183  else if (apv == 2 || apv == 3) {
184  retVal = 1;
185  }
186  else if (apv == 12 || apv == 13) {
187  retVal = 2;
188  }
189  else if (apv == 14 || apv == 15) {
190  retVal = 3;
191  }
192  else {
193  LOG_DEBUG << "Invalid electronics coordinates in StGmtGeom::getModuleIdFromElecCoord." << endm;
194  }
195  } // if ( arm == 0 )
196  else {
197  if (apv == 0 || apv == 1) {
198  retVal = 4;
199  }
200  else if (apv == 2 || apv == 3) {
201  retVal = 5;
202  }
203  else if (apv == 12 || apv == 13) {
204  retVal = 6;
205  }
206  else if (apv == 14 || apv == 15) {
207  retVal = 7;
208  }
209  else {
210  LOG_DEBUG << "Invalid electronics coordinates in StGmtGeom::getModuleIdFromElecCoord." << endm;
211  }
212  } // else
213  return retVal;
214 }
215 
216 //________________
217 Int_t StGmtGeom::getCoordNumFromElecCoord(Int_t rdo, Int_t arm, Int_t apv, Int_t channel) {
218 
219  if ( (rdo - 1) < 0 || ( (rdo - 1) >= kGmtNumRdos ) ) {
220  LOG_DEBUG << "RDO " << rdo << " out of range in StGmtGeom::getCoordNumFromElecCoord." << endm;
221  return kGmtError;
222  }
223  else if ( arm < 0 || arm >= kGmtNumArms ) {
224  LOG_DEBUG << "ARM " << arm << " out of range in StGmtGeom::getCoordNumFromElecCoord." << endm;
225  return kGmtError;
226  }
227  else if ( apv < 0 || apv > kGmtMaxApvId || (apv > 3 && apv < 12) ) {
228  LOG_DEBUG << "APV " << apv << " out of range in StGmtGeom::getCoordNumFromElecCoord." << endm;
229  return kGmtError;
230  }
231  else if ( channel < 0 || channel >= kGmtNumChannels ) {
232  LOG_DEBUG << "Channel " << channel << " out of range in StGmtGeom::getCoordNumFromElecCoord." << endm;
233  return kGmtError;
234  }
235 
236  StGmtGeomData stripdata = mStrips[ channel + (apv % 2) * kGmtNumStrips ];
237  return stripdata.coordinate;
238 }
239 
240 //________________
241 Double_t StGmtGeom::getPositionFromElecCoord(Int_t rdo, Int_t arm, Int_t apv, Int_t channel) {
242  //Int_t apvi = apv;
243  if ( (rdo - 1) < 0 || (rdo - 1) >= kGmtNumRdos ) {
244  LOG_DEBUG << "RDO " << rdo << " out of range in StGmtGeom::getCoordNumFromElecCoord." << endm;
245  return kGmtError;
246  }
247  else if ( arm < 0 || arm >= kGmtNumArms ) {
248  LOG_DEBUG << "ARM " << arm << " out of range in StGmtGeom::getCoordNumFromElecCoord." << endm;
249  return kGmtError;
250  }
251  else if ( apv < 0 || apv > kGmtMaxApvId || (apv > 3 && apv < 12) ) {
252  LOG_DEBUG << "APV " << apv << " out of range in StGmtGeom::getCoordNumFromElecCoord." << endm;
253  return kGmtError;
254  }
255  else if ( channel < 0 || channel >= kGmtNumChannels ) {
256  LOG_DEBUG << "Channel " << channel << " out of range in StGmtGeom::getCoordNumFromElecCoord." << endm;
257  return kGmtError;
258  }
259 
260  // locally map apv number into [0,1]
261  // if ( apv <= 3 )
262  // {
263  // apv = apv/2;
264  // }
265  // else
266  // {
267  // apv = (apv - 12)/2;
268  // }
269 
270  apv = apv%2;
271  StGmtGeomData stripdata = mStrips[ channel + apv*kGmtNumStrips ];//0-257
272  //LOG_INFO << "rdo=" << rdo << "\tarm="<< arm << "\tapv="<< apvi <<"\tchannel = "<< channel << endm;
273  //LOG_INFO << "apv2= " << apv << "\tstr=" << kGmtNumStrips << "\t[]=" << channel + apv*kGmtNumStrips << "\t===> " <<stripdata.location << endm;
274  return stripdata.location; //0-10, 0-127: 0 to 5.2; 128-256 5.2 to 10
275 }
276 
277 //________________
278 // Calculates coordinates of strip in global coordinate system
279 // Units are in cm and radians, depending on the layer.
280 Int_t StGmtGeom::computeGlobalPhysicalCoordinate(Int_t & layer, Short_t & strip) {
281  switch (layer) {
282 // case ('P') :
283  case (1) :
284 // ordinate =
285 // mStrips[kGmtNumStrips + strip].ordinate + StGmtGeom::phiQuadXaxis(quadrant);
286 // lowerSpan =
287 // mStrips[kGmtNumStrips + strip].lowerSpan;
288 // upperSpan =
289 // mStrips[kGmtNumStrips + strip].upperSpan;
290  break;
291 // case ('S') :
292  case (0) :
293 // ordinate =
294 // mStrips[strip].ordinate;
295 // lowerSpan =
296 // mStrips[strip].lowerSpan + StGmtGeom::phiQuadXaxis(quadrant);
297 // upperSpan =
298 // mStrips[strip].upperSpan + StGmtGeom::phiQuadXaxis(quadrant);
299  break;
300  default:
301  return kGmtError;
302  break;
303  }
304  return 0;
305 }
306 
307 //________________
308 Int_t StGmtGeom::getGlobalPhysicalCoordinate(Int_t geoId, Short_t & module, Int_t & layer) {
309 
310  Short_t strip;
311  decodeGeoId( geoId, module, layer, strip );
312  if ( geoId < 0 || geoId >= kGmtNumGeoIds ){
313  LOG_DEBUG << "GeoId " << geoId << " out of range in StGmtGeom::getPhysicalCoordinate." << endm;
314  module = kGmtError;
315  // layer = kGmtErrorChar;
316  layer = kGmtError;
317  return kGmtError;
318  }
319  return computeGlobalPhysicalCoordinate( layer, strip);
320 }
321 
322 //________________
323 // The ordinate, lowerSpan and upperSpan are all in centimeters or
324 // radians, depending on the layer.
325 Int_t StGmtGeom::getGlobalPhysicalCoordinate(const std::string & geoName, Short_t & module, Int_t & layer) {
326 
327  Short_t strip;
328  if ( decodeGeoName( geoName, module, layer, strip ) < 0 ) {
329  // Error is mostly handled by the decodeGeoName call.
330  module = kGmtError;
331  // layer = kGmtErrorChar;
332  layer = kGmtError;
333  return kGmtError;
334  }
335  return computeGlobalPhysicalCoordinate( layer, strip);
336 }
337 
338 //________________
339 // Please note that the following functions do NOT access the STAR
340 // database to find mapping information. They assume the most
341 // straight-forward mapping scheme and use that.
342 // For those functions that have them, currently rdo can only be 1, arm
343 // can be 0-1, apv can be 0-23 (although 4-11 are not
344 // technically valid) and channel is 0-127.
345 Int_t StGmtGeom::encodeElectronicId(Int_t rdo, Int_t arm, Int_t apv, Int_t channel) {
346  if ( (rdo - 1) < 0 || (rdo - 1) >= kGmtNumRdos ) {
347  LOG_DEBUG << "RDO " << rdo << " out of range in StGmtGeom::encodeElectronicId." << endm;
348  return kGmtError;
349  }
350  else if ( arm < 0 || arm >= kGmtNumArms ) {
351  LOG_DEBUG << "ARM " << arm << " out of range in StGmtGeom::encodeElectronicId." << endm;
352  return kGmtError;
353  }
354  else if ( apv < 0 || apv > kGmtMaxApvId || (apv > 3 && apv < 12) ) {
355  LOG_DEBUG << "APV " << apv << " out of range in StGmtGeom::encodeElectronicId." << endm;
356  return kGmtError;
357  }
358  else if ( channel < 0 || channel >= kGmtNumChannels ) {
359  LOG_DEBUG << "Channel " << channel << " out of range in StGmtGeom::encodeElectronicId." << endm;
360  return kGmtError;
361  }
362  return channel + kGmtNumStrips*(apv + 4*arm);
363 }
364 
365 //________________
366 Int_t StGmtGeom::decodeElectronicId(Int_t elecId, Int_t &rdo, Int_t &arm, Int_t &apv, Int_t &channel) {
367  if (elecId < 0 || elecId >= kGmtNumElecIds) {
368  LOG_DEBUG << "Electronic ID " << elecId << " out of range in StGmtGeom::decodeElectronicId." << endm;
369  rdo = kGmtError;
370  arm = kGmtError;
371  apv = kGmtError;
372  channel = kGmtError;
373  return kGmtError;
374  }
375 
376  channel = elecId % 128;
377  elecId /= 128;
378 
379  apv = elecId % 4;
380  elecId /= 4;
381 
382  arm = elecId;
383  rdo = 1;
384 
385  return 0;
386 }
387 
388 // Whether the reverse map is valid
389 Bool_t StGmtGeom::mReverseNaiveMappingValid = 0;
390 
391 // The reverse map data member
392 Int_t StGmtGeom::mReverseNaiveMapping[ kGmtNumStripsPerModule ];
393 
394 //________________________
395 // Initialize our physical coordinate database here. These are:
396 // APV,Chan,Strip(0) or Pad(1),coordinate #,Location (cm),Signal *,Readout Order
397 // The index corresponds to int(apv/2)+channel (assuming that the apv is in
398 // [0,12). If apv is in [12,24), then the index is int((apv-12)/2)+channel.
399 StGmtGeom::StGmtGeomData StGmtGeom::mStrips[] =
400 {
401  {0,0,0,54,4.28,"S54",0},
402  {0,1,0,37,2.92,"S37",1},
403  {0,2,0,31,2.44,"S31",2},
404  {0,3,0,8,0.6,"S8",3},
405  {0,4,0,51,4.04,"S51",4},
406  {0,5,0,35,2.76,"S35",5},
407  {0,6,0,29,2.28,"S29",6},
408  {0,7,0,21,1.64,"S21",7},
409  {0,8,0,60,4.76,"S60",8},
410  {0,9,0,33,2.6,"S33",9},
411  {0,10,0,27,2.12,"S27",10},
412  {0,11,0,12,0.92,"S12",11},
413  {0,12,0,41,3.24,"S41",12},
414  {0,13,0,55,4.36,"S55",13},
415  {0,14,0,25,1.96,"S25",14},
416  {0,15,0,14,1.08,"S14",15},
417  {0,16,1,999,-999,"NC",16}, // Not connected
418  {0,17,1,39,3.08,"P39",17},
419  {0,18,1,2,0.12,"P2",18},
420  {0,19,1,24,1.88,"P24",19},
421  {0,20,1,54,4.28,"P54",20},
422  {0,21,1,37,2.92,"P37",21},
423  {0,22,1,31,2.44,"P31",22},
424  {0,23,1,23,1.8,"P23",23},
425  {0,24,1,43,3.4,"P43",24},
426  {0,25,1,35,2.76,"P35",25},
427  {0,26,1,29,2.28,"P29",26},
428  {0,27,1,21,1.64,"P21",27},
429  {0,28,1,41,3.24,"P41",28},
430  {0,29,0,46,3.64,"S46",29},
431  {0,30,1,26,2.04,"P26",30},
432  {0,31,1,7,0.52,"P7",31},
433  {0,32,0,52,4.12,"S52",32},
434  {0,33,1,57,4.52,"P57",33},
435  {0,34,0,6,0.44,"S6",34},
436  {0,35,0,7,0.52,"S7",35},
437  {0,36,0,48,3.8,"S48",36},
438  {0,37,0,50,3.96,"S50",37},
439  {0,38,0,3,0.2,"S3",38},
440  {0,39,0,20,1.56,"S20",39},
441  {0,40,0,59,4.68,"S59",40},
442  {0,41,1,999,-999,"NC",41}, // Not connected
443  {0,42,1,1,0.04,"P1",42},
444  {0,43,0,11,0.84,"S11",43},
445  {0,44,0,42,3.32,"S42",44},
446  {0,45,0,56,4.44,"S56",45},
447  {0,46,0,13,1,"S13",46},
448  {0,47,0,16,1.24,"S16",47},
449  {0,48,1,61,4.84,"P61",48},
450  {0,49,1,46,3.64,"P46",49},
451  {0,50,1,33,2.6,"P33",50},
452  {0,51,1,25,1.96,"P25",51},
453  {0,52,1,56,4.44,"P56",52},
454  {0,53,1,50,3.96,"P50",53},
455  {0,54,1,10,0.76,"P10",54},
456  {0,55,1,15,1.16,"P15",55},
457  {0,56,1,47,3.72,"P47",56},
458  {0,57,1,55,4.36,"P55",57},
459  {0,58,1,12,0.92,"P12",58},
460  {0,59,1,9,0.68,"P9",59},
461  {0,60,1,42,3.32,"P42",60},
462  {0,61,0,62,4.92,"S62",61},
463  {0,62,1,27,2.12,"P27",62},
464  {0,63,1,6,0.44,"P6",63},
465  {0,64,0,47,3.72,"S47",64},
466  {0,65,0,49,3.88,"S49",65},
467  {0,66,0,5,0.36,"S5",66},
468  {0,67,0,10,0.76,"S10",67},
469  {0,68,0,45,3.56,"S45",68},
470  {0,69,1,59,4.68,"P59",69},
471  {0,70,0,4,0.28,"S4",70},
472  {0,71,0,9,0.68,"S9",71},
473  {0,72,0,39,3.08,"S39",72},
474  {0,73,0,61,4.84,"S61",73},
475  {0,74,1,4,0.28,"P4",74},
476  {0,75,0,18,1.4,"S18",75},
477  {0,76,0,40,3.16,"S40",76},
478  {0,77,0,57,4.52,"S57",77},
479  {0,78,0,24,1.88,"S24",78},
480  {0,79,0,2,0.12,"S2",79},
481  {0,80,1,62,4.92,"P62",80},
482  {0,81,1,48,3.8,"P48",81},
483  {0,82,1,32,2.52,"P32",82},
484  {0,83,1,22,1.72,"P22",83},
485  {0,84,1,58,4.6,"P58",84},
486  {0,85,1,52,4.12,"P52",85},
487  {0,86,1,30,2.36,"P30",86},
488  {0,87,1,17,1.32,"P17",87},
489  {0,88,1,49,3.88,"P49",88},
490  {0,89,0,44,3.48,"S44",89},
491  {0,90,1,28,2.2,"P28",90},
492  {0,91,1,11,0.84,"P11",91},
493  {0,92,1,53,4.2,"P53",92},
494  {0,93,0,63,5,"S63",93},
495  {0,94,1,18,1.4,"P18",94},
496  {0,95,1,5,0.36,"P5",95},
497  {0,96,1,63,5,"P63",96},
498  {0,97,0,36,2.84,"S36",97},
499  {0,98,0,30,2.36,"S30",98},
500  {0,99,0,22,1.72,"S22",99},
501  {0,100,0,43,3.4,"S43",100},
502  {0,101,0,34,2.68,"S34",101},
503  {0,102,0,28,2.2,"S28",102},
504  {0,103,0,19,1.48,"S19",103},
505  {0,104,0,53,4.2,"S53",104},
506  {0,105,0,58,4.6,"S58",105},
507  {0,106,0,26,2.04,"S26",106},
508  {0,107,0,17,1.32,"S17",107},
509  {0,108,0,38,3,"S38",108},
510  {0,109,0,32,2.52,"S32",109},
511  {0,110,0,23,1.8,"S23",110},
512  {0,111,0,1,0.04,"S1",111},
513  {0,112,1,60,4.76,"P60",112},
514  {0,113,1,40,3.16,"P40",113},
515  {0,114,1,8,0.6,"P8",114},
516  {0,115,1,14,1.08,"P14",115},
517  {0,116,1,45,3.56,"P45",116},
518  {0,117,1,38,3,"P38",117},
519  {0,118,0,15,1.16,"S15",118},
520  {0,119,1,19,1.48,"P19",119},
521  {0,120,1,51,4.04,"P51",120},
522  {0,121,1,36,2.84,"P36",121},
523  {0,122,1,16,1.24,"P16",122},
524  {0,123,1,13,1,"P13",123},
525  {0,124,1,44,3.48,"P44",124},
526  {0,125,1,34,2.68,"P34",125},
527  {0,126,1,20,1.56,"P20",126},
528  {0,127,1,3,0.2,"P3",127},
529  {1,0,0,117,9.32,"S117",128},
530  {1,1,0,100,7.96,"S100",129},
531  {1,2,0,94,7.48,"S94",130},
532  {1,3,0,71,5.64,"S71",131},
533  {1,4,0,114,9.08,"S114",132},
534  {1,5,0,98,7.8,"S98",133},
535  {1,6,0,92,7.32,"S92",134},
536  {1,7,0,84,6.68,"S84",135},
537  {1,8,0,123,9.8,"S123",136},
538  {1,9,0,96,7.64,"S96",137},
539  {1,10,0,90,7.16,"S90",138},
540  {1,11,0,75,5.96,"S75",139},
541  {1,12,0,104,8.28,"S104",140},
542  {1,13,0,118,9.4,"S118",141},
543  {1,14,0,88,7,"S88",142},
544  {1,15,0,77,6.12,"S77",143},
545  {1,16,1,999,-999,"NC",144}, // Not connected
546  {1,17,1,102,8.12,"P102",145},
547  {1,18,1,65,5.16,"P65",146},
548  {1,19,1,87,6.92,"P87",147},
549  {1,20,1,117,9.32,"P117",148},
550  {1,21,1,100,7.96,"P100",149},
551  {1,22,1,94,7.48,"P94",150},
552  {1,23,1,86,6.84,"P86",151},
553  {1,24,1,106,8.44,"P106",152},
554  {1,25,1,98,7.8,"P98",153},
555  {1,26,1,92,7.32,"P92",154},
556  {1,27,1,84,6.68,"P84",155},
557  {1,28,1,104,8.28,"P104",156},
558  {1,29,0,109,8.68,"S109",157},
559  {1,30,1,89,7.08,"P89",158},
560  {1,31,1,70,5.56,"P70",159},
561  {1,32,0,115,9.16,"S115",160},
562  {1,33,1,120,9.56,"P120",161},
563  {1,34,0,69,5.48,"S69",162},
564  {1,35,0,70,5.56,"S70",163},
565  {1,36,0,111,8.84,"S111",164},
566  {1,37,0,113,9,"S113",165},
567  {1,38,0,66,5.24,"S66",166},
568  {1,39,0,83,6.6,"S83",167},
569  {1,40,0,122,9.72,"S122",168},
570  {1,41,1,999,-999,"NC",169}, // Not connected
571  {1,42,1,64,5.08,"P64",170},
572  {1,43,0,74,5.88,"S74",171},
573  {1,44,0,105,8.36,"S105",172},
574  {1,45,0,119,9.48,"S119",173},
575  {1,46,0,76,6.04,"S76",174},
576  {1,47,0,79,6.28,"S79",175},
577  {1,48,1,124,9.88,"P124",176},
578  {1,49,1,109,8.68,"P109",177},
579  {1,50,1,96,7.64,"P96",178},
580  {1,51,1,88,7,"P88",179},
581  {1,52,1,119,9.48,"P119",180},
582  {1,53,1,113,9,"P113",181},
583  {1,54,1,73,5.8,"P73",182},
584  {1,55,1,78,6.2,"P78",183},
585  {1,56,1,110,8.76,"P110",184},
586  {1,57,1,118,9.4,"P118",185},
587  {1,58,1,75,5.96,"P75",186},
588  {1,59,1,72,5.72,"P72",187},
589  {1,60,1,105,8.36,"P105",188},
590  {1,61,0,125,9.96,"S125",189},
591  {1,62,1,90,7.16,"P90",190},
592  {1,63,1,69,5.48,"P69",191},
593  {1,64,0,110,8.76,"S110",192},
594  {1,65,0,112,8.92,"S112",193},
595  {1,66,0,68,5.4,"S68",194},
596  {1,67,0,73,5.8,"S73",195},
597  {1,68,0,108,8.6,"S108",196},
598  {1,69,1,122,9.72,"P122",197},
599  {1,70,0,67,5.32,"S67",198},
600  {1,71,0,72,5.72,"S72",199},
601  {1,72,0,102,8.12,"S102",200},
602  {1,73,0,124,9.88,"S124",201},
603  {1,74,1,67,5.32,"P67",202},
604  {1,75,0,81,6.44,"S81",203},
605  {1,76,0,103,8.2,"S103",204},
606  {1,77,0,120,9.56,"S120",205},
607  {1,78,0,87,6.92,"S87",206},
608  {1,79,0,65,5.16,"S65",207},
609  {1,80,1,125,9.96,"P125",208},
610  {1,81,1,111,8.84,"P111",209},
611  {1,82,1,95,7.56,"P95",210},
612  {1,83,1,85,6.76,"P85",211},
613  {1,84,1,121,9.64,"P121",212},
614  {1,85,1,115,9.16,"P115",213},
615  {1,86,1,93,7.4,"P93",214},
616  {1,87,1,80,6.36,"P80",215},
617  {1,88,1,112,8.92,"P112",216},
618  {1,89,0,107,8.52,"S107",217},
619  {1,90,1,91,7.24,"P91",218},
620  {1,91,1,74,5.88,"P74",219},
621  {1,92,1,116,9.24,"P116",220},
622  {1,93,0,126,10.04,"S126",221},
623  {1,94,1,81,6.44,"P81",222},
624  {1,95,1,68,5.4,"P68",223},
625  {1,96,1,999,-999,"NC",224}, // Not connected
626  {1,97,0,99,7.88,"S99",225},
627  {1,98,0,93,7.4,"S93",226},
628  {1,99,0,85,6.76,"S85",227},
629  {1,100,0,106,8.44,"S106",228},
630  {1,101,0,97,7.72,"S97",229},
631  {1,102,0,91,7.24,"S91",230},
632  {1,103,0,82,6.52,"S82",231},
633  {1,104,0,116,9.24,"S116",232},
634  {1,105,0,121,9.64,"S121",233},
635  {1,106,0,89,7.08,"S89",234},
636  {1,107,0,80,6.36,"S80",235},
637  {1,108,0,101,8.04,"S101",236},
638  {1,109,0,95,7.56,"S95",237},
639  {1,110,0,86,6.84,"S86",238},
640  {1,111,0,64,5.08,"S64",239},
641  {1,112,1,123,9.8,"P123",240},
642  {1,113,1,103,8.2,"P103",241},
643  {1,114,1,71,5.64,"P71",242},
644  {1,115,1,77,6.12,"P77",243},
645  {1,116,1,108,8.6,"P108",244},
646  {1,117,1,101,8.04,"P101",245},
647  {1,118,0,78,6.2,"S78",246},
648  {1,119,1,82,6.52,"P82",247},
649  {1,120,1,114,9.08,"P114",248},
650  {1,121,1,99,7.88,"P99",249},
651  {1,122,1,79,6.28,"P79",250},
652  {1,123,1,76,6.04,"P76",251},
653  {1,124,1,107,8.52,"P107",252},
654  {1,125,1,97,7.72,"P97",253},
655  {1,126,1,83,6.6,"P83",254},
656  {1,127,1,66,5.24,"P66",255}
657 };
658 
659 //________________
660 // This initialized an idealized mapping. The index of the array is the coordinate number (X coordinates are first then Y).
661 // The value in the array is the readout number of the coordinate (i.e. the index into mStrips[] above).
662 Int_t StGmtGeom::mNaiveMapping[] =
663 {
664  111,
665  79,
666  38,
667  70,
668  66,
669  34,
670  35,
671  3,
672  71,
673  67,
674  43,
675  11,
676  46,
677  15,
678  118,
679  47,
680  107,
681  75,
682  103,
683  39,
684  7,
685  99,
686  110,
687  78,
688  14,
689  106,
690  10,
691  102,
692  6,
693  98,
694  2,
695  109,
696  9,
697  101,
698  5,
699  97,
700  1,
701  108,
702  72,
703  76,
704  12,
705  44,
706  100,
707  89,
708  68,
709  29,
710  64,
711  36,
712  65,
713  37,
714  4,
715  32,
716  104,
717  0,
718  13,
719  45,
720  77,
721  105,
722  40,
723  8,
724  73,
725  61,
726  93,
727  239,
728  207,
729  166,
730  198,
731  194,
732  162,
733  163,
734  131,
735  199,
736  195,
737  171,
738  139,
739  174,
740  143,
741  246,
742  175,
743  235,
744  203,
745  231,
746  167,
747  135,
748  227,
749  238,
750  206,
751  142,
752  234,
753  138,
754  230,
755  134,
756  226,
757  130,
758  237,
759  137,
760  229,
761  133,
762  225,
763  129,
764  236,
765  200,
766  204,
767  140,
768  172,
769  228,
770  217,
771  196,
772  157,
773  192,
774  164,
775  193,
776  165,
777  132,
778  160,
779  232,
780  128,
781  141,
782  173,
783  205,
784  233,
785  168,
786  136,
787  201,
788  189,
789  221,
790  42,
791  18,
792  127,
793  74,
794  95,
795  63,
796  31,
797  114,
798  59,
799  54,
800  91,
801  58,
802  123,
803  115,
804  55,
805  122,
806  87,
807  94,
808  119,
809  126,
810  27,
811  83,
812  23,
813  19,
814  51,
815  30,
816  62,
817  90,
818  26,
819  86,
820  22,
821  82,
822  50,
823  125,
824  25,
825  121,
826  21,
827  117,
828  17,
829  113,
830  28,
831  60,
832  24,
833  124,
834  116,
835  49,
836  56,
837  81,
838  88,
839  53,
840  120,
841  85,
842  92,
843  20,
844  57,
845  52,
846  33,
847  84,
848  69,
849  112,
850  48,
851  80,
852  96,
853  170,
854  146,
855  255,
856  202,
857  223,
858  191,
859  159,
860  242,
861  187,
862  182,
863  219,
864  186,
865  251,
866  243,
867  183,
868  250,
869  215,
870  222,
871  247,
872  254,
873  155,
874  211,
875  151,
876  147,
877  179,
878  158,
879  190,
880  218,
881  154,
882  214,
883  150,
884  210,
885  178,
886  253,
887  153,
888  249,
889  149,
890  245,
891  145,
892  241,
893  156,
894  188,
895  152,
896  252,
897  244,
898  177,
899  184,
900  209,
901  216,
902  181,
903  248,
904  213,
905  220,
906  148,
907  185,
908  180,
909  161,
910  212,
911  197,
912  240,
913  176,
914  208,
915  16,
916  41,
917  144,
918  169,
919  224
920 };
921 
922 //________________
923 // Module locations at the corner of the GEM,
924 // per email from W.J. Llope to stargmt-l@lists.bnl.gov
925 // on 2012/10/31
926 Double_t StGmtGeom::getModuleZ(int iModule) {
927  switch (iModule) {
928  case 4:
929  case 0 : return 77.768 * 2.54; // inches => cm
930  case 5:
931  case 1 : return 2.729 * 2.54; // inches => cm
932  case 7:
933  case 3 : return -2.729 * 2.54; // inches => cm
934  case 6:
935  case 2 : return -77.768 * 2.54; // inches => cm
936  default : return -999;
937  }
938 }
939 
940 //________________
941 Double_t StGmtGeom::getModulePhi(int iModule) {
942  double R = 85.606 * 2.54; // inches => cm
943  double deltaphi = 5./R; // crude radian conversion
944  switch (iModule) {
945  case 0:
946  case 1 : return TMath::Pi()*(10./6.)-deltaphi;
947  case 2:
948  case 3 : return TMath::Pi()*(10./6.)+deltaphi;
949  case 4:
950  case 5 : return TMath::Pi()*(1./6.)-deltaphi;
951  case 6:
952  case 7 : return TMath::Pi()*(1./6.)+deltaphi;
953  default : return 0;
954  }
955 }
956