68 {
69 int iwire = 0;
70 int ilay;
71 int icell;
72 int ampid;
73 int channel;
74 int iFan;
75
76 char wirelabel[100];
77 char wiretag[100];
78
79 int ncell;
81 double radius;
82 double twist;
83 double length;
84 double offset;
85 string strtmp;
86
87 double aglstart;
88 double angleforwini;
89 double angleforw;
90 double angleback;
91
92 int layertype;
93
94 double xf;
95 double yf;
96 double zf;
97 double xb;
98 double yb;
99 double zb;
100
101 double slant;
102
103 double tension[] = { 15, 15, 15, 16, 16, 17, 17, 18, 14, 14, 19, 19, 24, 24, 31,
104 31, 37, 37, 45, 45, 46, 47, 47, 47, 47, 48, 48, 48, 48, 49,
105 49, 49, 49, 50, 50, 50, 51, 51, 51, 52, 52, 52, 52 };
106
107 int iEle;
108 int iPar[12];
109
110 if ( !initAlign() ) { return false; }
111
113
115 if ( !fin.is_open() )
116 {
117 cout << "ERROR: can not open file " << m_fwconf << endl;
118 return false;
119 }
120
121 for ( ilay = 0; ilay <
LAYERNMAX; ilay++ )
122 {
123 fin >> strtmp >> radius >> ncell >> twist >> offset >> length >>
first;
124
125 length -= 4.0;
126 ncell /= 2;
127
128 if ( fabs( twist ) > 0.1 ) { offset = 0.0; }
129
130 aglstart = (
PI / ncell ) * first + ( offset *
PI / 180.0 );
131 if ( aglstart < -0.000001 ) { aglstart += 2.0 *
PI / ncell; }
132
133 if ( twist < -0.1 ) { layertype = 1; }
134 else if ( twist > 0.1 ) { layertype = 2; }
135 else { layertype = 0; }
136
137 slant = atan(
sin(
PI * twist / ncell ) * radius * 2.0 / length );
138
139 m_player[ilay] = new MdcCosLayer;
140 m_player[ilay]->setLayerType( layertype );
141 m_player[ilay]->setNcell( ncell );
142 m_player[ilay]->setLayerRad( radius );
143 m_player[ilay]->setLength( length );
144 m_player[ilay]->setTwistCell( twist );
145 m_player[ilay]->setSlant( slant );
146
147 if ( ilay <
INNERNMAX ) m_player[ilay]->setFgInner(
true );
148 else m_player[ilay]->setFgInner( false );
149
150
151 if ( ilay < 8 ) { iEle = 0; }
152 else if ( ilay < 10 ) { iEle = 1; }
153 else if ( ilay < 12 ) { iEle = 2; }
154 else if ( ilay < 14 ) { iEle = 3; }
155 else if ( ilay < 16 ) { iEle = 4; }
156 else if ( ilay < 18 ) { iEle = 5; }
157 else if ( ilay < 20 ) { iEle = 6; }
158 else { iEle = 7; }
159
160 iPar[0] = iEle + m_iTXf;
161 iPar[1] = iEle + m_iTXb;
162 iPar[2] = iEle + m_iTYf;
163 iPar[3] = iEle + m_iTYb;
164 iPar[4] = iEle + m_iTZf;
165 iPar[5] = iEle + m_iTZb;
166 iPar[6] = iEle + m_iRXf;
167 iPar[7] = iEle + m_iRXb;
168 iPar[8] = iEle + m_iRYf;
169 iPar[9] = iEle + m_iRYb;
170 iPar[10] = iEle + m_iRZf;
171 iPar[11] = iEle + m_iRZb;
172
173 m_player[ilay]->setAlignParId( iPar );
174
175 for ( icell = 0; icell < ncell; icell++ )
176 {
177 m_wiretable[ilay][icell] = iwire;
178 angleforwini = (double)icell * 2.0 *
PI / ncell + aglstart;
179
180
181 angleforw = angleforwini + m_alignPar[iEle + m_iRZf];
182 angleforw += m_rot;
183
184 xf = radius *
cos( angleforw );
185 yf = radius *
sin( angleforw );
186 zf = 0.5 * length;
187
188 xf += m_alignPar[iEle + m_iTXf];
189 yf += m_alignPar[iEle + m_iTYf];
190 zf += m_alignPar[iEle + m_iTZf];
191
192
193 angleback = angleforwini + twist * 2.0 *
PI / ncell;
194 angleback += m_alignPar[iEle + m_iRZb];
195 angleback += m_rot;
196
197 xb = radius *
cos( angleback );
198 yb = radius *
sin( angleback );
199 zb = -0.5 * length;
200
201 xb += m_alignPar[iEle + m_iTXb];
202 yb += m_alignPar[iEle + m_iTYb];
203 zb += m_alignPar[iEle + m_iTZb];
204
205 ampid = icell / 8;
206 channel = icell - 8 * ampid;
207 sprintf( wirelabel,
"%02dS%02d-%d", ilay + 1, ampid + 1, channel + 1 );
208 sprintf( wiretag,
"%02d_%02d_%04d_%02d", ilay, icell, iwire, ampid + 1 );
209
210 m_pwire[iwire] = new MdcCosWire;
211
212 m_pwire[iwire]->setLayerPtr( m_player[ilay] );
213
214 m_pwire[iwire]->setWireId( iwire );
215 m_pwire[iwire]->setLayerId( ilay );
216 m_pwire[iwire]->setCellId( icell );
217 m_pwire[iwire]->setPreAmpId( ampid + 1 );
218 m_pwire[iwire]->setChannel( channel );
219
220
221 iFan = m_fan[ilay][ampid];
222
223 m_pwire[iwire]->setFanId(
abs( iFan ) );
224 if ( iFan > 0 ) m_pwire[iwire]->setEndId( 1 );
225 else m_pwire[iwire]->setEndId( -1 );
226
227 m_pwire[iwire]->setWireLabel( wirelabel );
228 m_pwire[iwire]->setWireTag( wiretag );
229
230 m_pwire[iwire]->setXf( xf );
231 m_pwire[iwire]->setYf( yf );
232 m_pwire[iwire]->setZf( zf );
233
234 m_pwire[iwire]->setXb( xb );
235 m_pwire[iwire]->setYb( yb );
236 m_pwire[iwire]->setZb( zb );
237
238 if ( angleforw < 0 ) angleforw += 2.0 *
PI;
239 m_pwire[iwire]->setPhiForward( angleforw );
240
241 m_pwire[iwire]->setTension( tension[ilay] );
242
243 iwire++;
244 }
245 }
246 fin.close();
247 cout << "INFO: Number of wires: " << iwire << endl;
248 m_nWire = iwire;
250
251 return true;
252}
double sin(const BesAngle a)
double cos(const BesAngle a)