12 : m_fwconf( fwireconf ), m_falign( falign ) {
16 for ( ilay = 0; ilay <
LAYERNMAX; ilay++ )
18 for ( icell = 0; icell <
CELLNMAX; icell++ ) { m_wiretable[ilay][icell] = -1; }
21 for (
int i = 0; i < 12; i++ )
41 for ( ilay = 0; ilay <
LAYERNMAX; ilay++ )
43 for ( ipream = 0; ipream < 100; ipream++ ) { m_fan[ilay][ipream] = -999; }
46 cout <<
"INFO: MdcCosGeom created." << endl;
52 for ( i = 0; i <
WIRENMAX; i++ ) {
delete m_pwire[i]; }
53 for ( i = 0; i <
LAYERNMAX; i++ ) {
delete m_player[i]; }
55 cout <<
"INFO: MdcCosGeom has been destructed." << endl;
59 m_rot = rot *
PI / 180.0;
62 cout <<
"ERROR: Intialize wire failed !!!" << endl;
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 };
110 if ( !initAlign() ) {
return false; }
115 if ( !fin.is_open() )
117 cout <<
"ERROR: can not open file " << m_fwconf << endl;
121 for ( ilay = 0; ilay <
LAYERNMAX; ilay++ )
123 fin >> strtmp >> radius >> ncell >> twist >> offset >> length >>
first;
128 if ( fabs( twist ) > 0.1 ) { offset = 0.0; }
130 aglstart = (
PI / ncell ) * first + ( offset *
PI / 180.0 );
131 if ( aglstart < -0.000001 ) { aglstart += 2.0 *
PI / ncell; }
133 if ( twist < -0.1 ) { layertype = 1; }
134 else if ( twist > 0.1 ) { layertype = 2; }
135 else { layertype = 0; }
137 slant = atan(
sin(
PI * twist / ncell ) * radius * 2.0 / length );
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 );
147 if ( ilay <
INNERNMAX ) m_player[ilay]->setFgInner(
true );
148 else m_player[ilay]->setFgInner(
false );
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; }
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;
173 m_player[ilay]->setAlignParId( iPar );
175 for ( icell = 0; icell < ncell; icell++ )
177 m_wiretable[ilay][icell] = iwire;
178 angleforwini = (double)icell * 2.0 *
PI / ncell + aglstart;
181 angleforw = angleforwini + m_alignPar[iEle + m_iRZf];
184 xf = radius *
cos( angleforw );
185 yf = radius *
sin( angleforw );
188 xf += m_alignPar[iEle + m_iTXf];
189 yf += m_alignPar[iEle + m_iTYf];
190 zf += m_alignPar[iEle + m_iTZf];
193 angleback = angleforwini + twist * 2.0 *
PI / ncell;
194 angleback += m_alignPar[iEle + m_iRZb];
197 xb = radius *
cos( angleback );
198 yb = radius *
sin( angleback );
201 xb += m_alignPar[iEle + m_iTXb];
202 yb += m_alignPar[iEle + m_iTYb];
203 zb += m_alignPar[iEle + m_iTZb];
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 );
210 m_pwire[iwire] =
new MdcCosWire;
212 m_pwire[iwire]->setLayerPtr( m_player[ilay] );
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 );
221 iFan = m_fan[ilay][ampid];
223 m_pwire[iwire]->setFanId(
abs( iFan ) );
224 if ( iFan > 0 ) m_pwire[iwire]->setEndId( 1 );
225 else m_pwire[iwire]->setEndId( -1 );
227 m_pwire[iwire]->setWireLabel( wirelabel );
228 m_pwire[iwire]->setWireTag( wiretag );
230 m_pwire[iwire]->setXf( xf );
231 m_pwire[iwire]->setYf( yf );
232 m_pwire[iwire]->setZf( zf );
234 m_pwire[iwire]->setXb( xb );
235 m_pwire[iwire]->setYb( yb );
236 m_pwire[iwire]->setZb( zb );
238 if ( angleforw < 0 ) angleforw += 2.0 *
PI;
239 m_pwire[iwire]->setPhiForward( angleforw );
241 m_pwire[iwire]->setTension( tension[ilay] );
247 cout <<
"INFO: Number of wires: " << iwire << endl;
254bool MdcCosGeom::initAlign() {
255 ifstream falign( m_falign.c_str() );
256 if ( !falign.is_open() )
258 cout <<
"ERROR: can not open alignment data file " << m_falign << endl;
262 cout <<
"INFO: Alignment data file is " << m_falign << endl;
266 getline( falign, str );
268 for ( i = 0; i < 8; i++ )
270 falign >> str >> m_alignPar[i + m_iTXf] >> m_alignPar[i + m_iTYf] >>
271 m_alignPar[i + m_iTZf] >> m_alignPar[i + m_iRXf] >> m_alignPar[i + m_iRYf] >>
272 m_alignPar[i + m_iRZf];
275 m_alignPar[i + m_iRXf] *= 0.001;
276 m_alignPar[i + m_iRYf] *= 0.001;
277 m_alignPar[i + m_iRZf] *= 0.001;
280 for ( i = 0; i < 8; i++ )
282 falign >> str >> m_alignPar[i + m_iTXb] >> m_alignPar[i + m_iTYb] >>
283 m_alignPar[i + m_iTZb] >> m_alignPar[i + m_iRXb] >> m_alignPar[i + m_iRYb] >>
284 m_alignPar[i + m_iRZb];
287 m_alignPar[i + m_iRXb] *= 0.001;
288 m_alignPar[i + m_iRYb] *= 0.001;
289 m_alignPar[i + m_iRZb] *= 0.001;
306 for ( k = 0; k < 2; k++ )
308 for ( i = 0; i < 8; i++ )
312 sprintf( fname,
"pream/east%d.dat", i + 1 );
317 sprintf( fname,
"pream/west%d.dat", i + 1 );
325 m_fan[lay - 1][ipream - 1] = ( i + 1 ) * iEnd;
338 for (
int iwire = 0; iwire < 6796; iwire++ )
340 fout << setw( 4 ) << iwire;
354 cout << fchk <<
" has been created for check." << endl;
359 assert( icell <
getLayer( ilay )->getNcell() );
361 int iwire = m_wiretable[ilay][icell];
363 return m_pwire[iwire];
367 for (
int i = 0; i < 96; i++ ) { alignPar[i] = m_alignPar[i]; }
369 for (
int k = 0; k < 8; k++ )
371 alignPar[k + m_iRXf] *= 1000.0;
372 alignPar[k + m_iRYf] *= 1000.0;
373 alignPar[k + m_iRZf] *= 1000.0;
sprintf(cut, "kal_costheta0_em>-0.93&&kal_costheta0_em<0.93&&kal_pxy0_em>=0.05+%d*0.1&&kal_" "pxy0_em<0.15+%d*0.1&&NGch>=2", j, j)
double sin(const BesAngle a)
double cos(const BesAngle a)
bool initialize(double rot)
void check(std::string fchk) const
MdcCosGeom(std::string fwireconf, std::string fAlign)
const void getAlignPar(double alignPar[]) const
const MdcCosLayer * getLayer(int ilay) const
const MdcCosWire * getWire(int iwire) const