Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DFDCGeometry.cc
Go to the documentation of this file.
1 // $Id$
2 //
3 // File: DFDCGeometry.h
4 // Created: Wed Nov 29 13:35 EST 2006
5 // Creator: davidl (on Darwin swire-b241.jlab.org 8.7.0 powerpc)
6 //
7 
8 #include "DFDCGeometry.h"
9 
10 #if 0 // Old method for FDC geometry with hard coded positions!!!
11 
12 // Static globals used by all instances of DCDCTrackHit_factory
13 static pthread_mutex_t wire_mutex = PTHREAD_MUTEX_INITIALIZER;
14 static bool wire_table_initialized = false;
15 static DFDCWire fdcwire[FDC_NUM_LAYERS][WIRES_PER_PLANE];
16 
17 //-----------------
18 // DFDCGeometry (Constructor)
19 //-----------------
21 {
22  // We use the mutex and wire_table_initialized flag to
23  // make sure the table is initialized only once.
24  pthread_mutex_lock(&wire_mutex);
25  if(wire_table_initialized){
26  pthread_mutex_unlock(&wire_mutex);
27  return;
28  }
29 
30  float degrees00 = 0.0;
31  float degrees60 = 60.0*M_PI/180.0;
32  for(int layer=1; layer<=FDC_NUM_LAYERS; layer++){
33 
34  float angle=0.0;
35  float z_anode=188.5+85.0;
36  switch(layer){
37  case 1: z_anode+= -76.0-4.5-3.0; angle= degrees00; break;
38  case 2: z_anode+= -76.0-4.5-0.0; angle= +degrees60; break;
39  case 3: z_anode+= -76.0-4.5+3.0; angle= -degrees60; break;
40  case 4: z_anode+= -76.0+4.5-3.0; angle= degrees00; break;
41  case 5: z_anode+= -76.0+4.5-0.0; angle= +degrees60; break;
42  case 6: z_anode+= -76.0+4.5+3.0; angle= -degrees60; break;
43 
44  case 7: z_anode+= -25.33-4.5-3.0; angle= degrees00; break;
45  case 8: z_anode+= -25.33-4.5-0.0; angle= +degrees60; break;
46  case 9: z_anode+= -25.33-4.5+3.0; angle= -degrees60; break;
47  case 10: z_anode+= -25.33+4.5-3.0; angle= degrees00; break;
48  case 11: z_anode+= -25.33+4.5-0.0; angle= +degrees60; break;
49  case 12: z_anode+= -25.33+4.5+3.0; angle= -degrees60; break;
50 
51  case 13: z_anode+= +25.33-4.5-3.0; angle= degrees00; break;
52  case 14: z_anode+= +25.33-4.5-0.0; angle= +degrees60; break;
53  case 15: z_anode+= +25.33-4.5+3.0; angle= -degrees60; break;
54  case 16: z_anode+= +25.33+4.5-3.0; angle= degrees00; break;
55  case 17: z_anode+= +25.33+4.5-0.0; angle= +degrees60; break;
56  case 18: z_anode+= +25.33+4.5+3.0; angle= -degrees60; break;
57 
58  case 19: z_anode+= +76.0-4.5-3.0; angle= degrees00; break;
59  case 20: z_anode+= +76.0-4.5-0.0; angle= +degrees60; break;
60  case 21: z_anode+= +76.0-4.5+3.0; angle= -degrees60; break;
61  case 22: z_anode+= +76.0+4.5-3.0; angle= degrees00; break;
62  case 23: z_anode+= +76.0+4.5-0.0; angle= +degrees60; break;
63  case 24: z_anode+= +76.0+4.5+3.0; angle= -degrees60; break;
64  }
65 
66  // Somewhere between HDDS and here I'm missing a sign. I'm not
67  // sure where it is, but empirically, it must be here for things
68  // to be consistent.
69  angle=-angle;
70 
71  for(int wire=1; wire<=WIRES_PER_PLANE; wire++){
72 
73  DFDCWire *w = &fdcwire[layer-1][wire-1];
74  w->layer = layer;
75  w->wire = wire;
76  w->angle = angle;
77 
78  // find coordinates of center of wire in rotated system
79  float u = U_OF_WIRE_ZERO + WIRE_SPACING*(float)(wire-1);
80 
81  // Rotate coordinates into lab system and set the wire's origin
82  // Note that the FDC measures "angle" such that angle=0
83  // corresponds to the anode wire in the vertical direction
84  // (i.e. at phi=90 degrees).
85  float x = u*sin(angle + M_PI/2.0);
86  float y = u*cos(angle + M_PI/2.0);
87  w->origin.SetXYZ(x,y,z_anode);
88 
89  // Length of wire is set by active radius
90  w->L = 2.0*sqrt(pow(FDC_ACTIVE_RADIUS,2.0) - u*u);
91 
92  // Set directions of wire's coordinate system with "udir"
93  // along wire.
94  w->udir.SetXYZ(sin(angle),cos(angle),0.0);
95 
96  // "s" points in direction from beamline to midpoint of
97  // wire. This happens to be the same direction as "origin"
98  w->sdir = w->origin;
99  w->sdir.SetMag(1.0);
100 
101  w->tdir = w->udir.Cross(w->sdir);
102  w->tdir.SetMag(1.0); // This isn't really needed
103  }
104  }
105 
106  // Flag table as initialized and release the lock so other threads
107  // can continue.
108  wire_table_initialized=true;
109  pthread_mutex_unlock(&wire_mutex);
110 }
111 
112 //-----------------
113 // DFDCGeometry (Constructor)
114 //-----------------
115 const DFDCWire* DFDCGeometry::GetDFDCWire(int layer, int wire)
116 {
117  if(layer<1)return NULL;
118  if(layer>FDC_NUM_LAYERS)return NULL;
119  if(wire<1)return NULL;
120  if(wire>WIRES_PER_PLANE)return NULL;
121 
122  return &fdcwire[layer-1][wire-1];
123 }
124 #endif
125 
Int_t layer
float angle
radians
Definition: DFDCWire.h:19
Double_t x[NCHANNELS]
Definition: st_tw_resols.C:39
#define y
#define WIRES_PER_PLANE
Definition: DFDCGeometry.h:23
int layer
1-24
Definition: DFDCWire.h:16
#define FDC_ACTIVE_RADIUS
Definition: DFDCGeometry.h:14
#define U_OF_WIRE_ZERO
Definition: DFDCGeometry.h:25
double sqrt(double)
double sin(double)
#define FDC_NUM_LAYERS
Definition: DFDCGeometry.h:12
int wire
1-N
Definition: DFDCWire.h:17
union @6::@8 u
#define WIRE_SPACING
Definition: DFDCGeometry.h:24