#include <MdcCosGeom.h>
Public Member Functions | |
void | check (std::string fchk) const |
void | check (std::string fchk) const |
const void | getAlignPar (double alignPar[]) const |
const void | getAlignPar (double alignPar[]) const |
const MdcCosLayer * | getLayer (int ilay) const |
const MdcCosLayer * | getLayer (int ilay) const |
const int | getLayerSize () const |
const int | getLayerSize () const |
const MdcCosWire * | getWire (int ilay, int icell) const |
const MdcCosWire * | getWire (int iwire) const |
const MdcCosWire * | getWire (int ilay, int icell) const |
const MdcCosWire * | getWire (int iwire) const |
const int | getWireSize () const |
const int | getWireSize () const |
bool | initialize (double rot) |
bool | initialize (double rot) |
bool | initPream () |
bool | initPream () |
bool | initWire () |
bool | initWire () |
MdcCosGeom (std::string fwireconf, std::string fAlign) | |
MdcCosGeom (std::string fwireconf, std::string fAlign) | |
bool | setTension () |
bool | setTension () |
~MdcCosGeom () | |
~MdcCosGeom () | |
Private Member Functions | |
bool | initAlign () |
bool | initAlign () |
Private Attributes | |
double | m_alignPar [96] |
std::string | m_falign |
int | m_fan [LAYERNMAX][100] |
std::string | m_fwconf |
int | m_iRXb |
int | m_iRXf |
int | m_iRYb |
int | m_iRYf |
int | m_iRZb |
int | m_iRZf |
int | m_iTXb |
int | m_iTXf |
int | m_iTYb |
int | m_iTYf |
int | m_iTZb |
int | m_iTZf |
int | m_nLayer |
int | m_nWire |
MdcCosLayer * | m_player [LAYERNMAX] |
MdcCosLayer * | m_player [LAYERNMAX] |
MdcCosWire * | m_pwire [WIRENMAX] |
MdcCosWire * | m_pwire [WIRENMAX] |
double | m_rot |
int | m_wiretable [LAYERNMAX][CELLNMAX] |
|
00010 : 00011 m_fwconf(fwireconf), m_falign(falign) 00012 { 00013 // constructor 00014 int ilay; 00015 int icell; 00016 for(ilay=0; ilay<LAYERNMAX; ilay++){ 00017 for(icell=0; icell<CELLNMAX; icell++){ 00018 m_wiretable[ilay][icell] = -1; 00019 } 00020 } 00021 00022 for(int i=0; i<12; i++){ 00023 m_iTXf = 0; 00024 m_iTXb = 8; 00025 m_iTYf = 16; 00026 m_iTYb = 24; 00027 m_iTZf = 32; 00028 m_iTZb = 40; 00029 00030 m_iRXf = 48; 00031 m_iRXb = 56; 00032 m_iRYf = 64; 00033 m_iRYb = 72; 00034 m_iRZf = 80; 00035 m_iRZb = 88; 00036 } 00037 00038 m_rot = 0.0; 00039 00040 int ipream; 00041 for(ilay=0; ilay<LAYERNMAX; ilay++){ 00042 for(ipream=0; ipream<100; ipream++){ 00043 m_fan[ilay][ipream] = -999; 00044 } 00045 } 00046 00047 cout << "INFO: MdcCosGeom created." << endl; 00048 }
|
|
00050 { 00051 // destructor 00052 int i; 00053 for(i=0; i<WIRENMAX; i++){ 00054 delete m_pwire[i]; 00055 } 00056 for(i=0; i<LAYERNMAX; i++){ 00057 delete m_player[i]; 00058 } 00059 00060 cout << "INFO: MdcCosGeom has been destructed." << endl; 00061 }
|
|
|
|
|
|
|
|
00357 { 00358 ofstream fout( fchk.c_str() ); 00359 for(int iwire=0; iwire<6796; iwire++){ 00360 fout << setw(4) << iwire; 00361 fout << setw(6) << getWire(iwire) -> getWireId(); 00362 fout << setw(4) << getWire(iwire) -> getLayerId(); 00363 fout << setw(5) << getWire(iwire) -> getCellId(); 00364 fout << setw(15) << getWire(iwire) -> getXb(); 00365 fout << setw(15) << getWire(iwire) -> getYb(); 00366 fout << setw(7) << getWire(iwire) -> getZb(); 00367 fout << setw(15) << getWire(iwire) -> getXf(); 00368 fout << setw(15) << getWire(iwire) -> getYf(); 00369 fout << setw(7) << getWire(iwire) -> getZf(); 00370 fout << endl; 00371 } 00372 fout.close(); 00373 00374 cout << fchk << " has been created for check." << endl; 00375 }
|
|
|
|
00386 { 00387 for(int i=0; i<96; i++){ 00388 alignPar[i] = m_alignPar[i]; 00389 } 00390 00391 for(int k=0; k<8; k++){ 00392 alignPar[k+m_iRXf] *= 1000.0; 00393 alignPar[k+m_iRYf] *= 1000.0; 00394 alignPar[k+m_iRZf] *= 1000.0; 00395 } 00396 }
|
|
00036 { return m_player[ilay]; }
|
|
00036 { return m_player[ilay]; }
|
|
00030 { return m_nLayer; }
|
|
00030 { return m_nLayer; }
|
|
|
|
00033 { return m_pwire[iwire]; }
|
|
00377 { 00378 assert( ilay < LAYERNMAX ); 00379 assert( icell < getLayer(ilay)->getNcell() ); 00380 00381 int iwire = m_wiretable[ilay][icell]; 00382 00383 return m_pwire[iwire]; 00384 }
|
|
00033 { return m_pwire[iwire]; }
|
|
00031 { return m_nWire; }
|
|
00031 { return m_nWire; }
|
|
|
|
00281 { 00282 ifstream falign( m_falign.c_str() ); 00283 if( ! falign.is_open() ){ 00284 cout << "ERROR: can not open alignment data file " 00285 << m_falign << endl; 00286 return false; 00287 } 00288 00289 cout << "INFO: Alignment data file is " << m_falign << endl; 00290 00291 int i; 00292 string str; 00293 getline(falign, str); 00294 00295 for(i=0; i<8; i++){ 00296 falign >> str >> m_alignPar[i+m_iTXf] >> m_alignPar[i+m_iTYf] 00297 >> m_alignPar[i+m_iTZf] >> m_alignPar[i+m_iRXf] 00298 >> m_alignPar[i+m_iRYf] >> m_alignPar[i+m_iRZf]; 00299 00300 // mrad -> rad 00301 m_alignPar[i+m_iRXf] *= 0.001; 00302 m_alignPar[i+m_iRYf] *= 0.001; 00303 m_alignPar[i+m_iRZf] *= 0.001; 00304 } 00305 00306 for(i=0; i<8; i++){ 00307 falign >> str >> m_alignPar[i+m_iTXb] >> m_alignPar[i+m_iTYb] 00308 >> m_alignPar[i+m_iTZb] >> m_alignPar[i+m_iRXb] 00309 >> m_alignPar[i+m_iRYb] >> m_alignPar[i+m_iRZb]; 00310 00311 // mrad -> rad 00312 m_alignPar[i+m_iRXb] *= 0.001; 00313 m_alignPar[i+m_iRYb] *= 0.001; 00314 m_alignPar[i+m_iRZb] *= 0.001; 00315 } 00316 00317 falign.close(); 00318 00319 return true; 00320 }
|
|
|
|
00063 { 00064 m_rot = rot * PI / 180.0; 00065 if( ! initWire() ){ 00066 cout << "ERROR: Intialize wire failed !!!" << endl; 00067 return false; 00068 } 00069 return true; 00070 }
|
|
|
|
00322 { 00323 int i; 00324 int k; 00325 int iEnd; 00326 char fname[100]; 00327 00328 int lay; 00329 int ipream; 00330 00331 for(k=0; k<2; k++){ 00332 for(i=0; i<8; i++){ 00333 if(0 == k){ 00334 sprintf(fname, "pream/east%d.dat", i+1); 00335 iEnd = 1; 00336 } else{ 00337 sprintf(fname, "pream/west%d.dat", i+1); 00338 iEnd = -1; 00339 } 00340 00341 ifstream fin(fname); 00342 while(fin >> lay){ 00343 fin >> ipream; 00344 m_fan[lay-1][ipream-1] = (i+1) * iEnd; 00345 } 00346 fin.close(); 00347 fin.clear(); 00348 } 00349 } 00350 return true; 00351 }
|
|
|
|
00072 { 00073 int iwire = 0; 00074 int ilay; 00075 int icell; 00076 int ampid; 00077 int channel; 00078 int iFan; 00079 00080 char wirelabel[100]; 00081 char wiretag[100]; 00082 00083 int ncell; 00084 int first; 00085 double radius; 00086 double twist; 00087 double length; 00088 double offset; 00089 string strtmp; 00090 00091 double aglstart; 00092 double angleforwini; 00093 double angleforw; 00094 double angleback; 00095 00096 int layertype; 00097 00098 double xf; 00099 double yf; 00100 double zf; 00101 double xb; 00102 double yb; 00103 double zb; 00104 00105 double slant; 00106 00107 double tension[] = {15, 15, 15, 16, 16, 17, 17, 18, 14, 14, 00108 19, 19, 24, 24, 31, 31, 37, 37, 45, 45, 00109 46, 47, 47, 47, 47, 48, 48, 48, 48, 49, 00110 49, 49, 49, 50, 50, 50, 51, 51, 51, 52, 00111 52, 52, 52}; 00112 00113 int iEle; // index of the element for alignment 00114 int iPar[12]; // index of alignment paramter 00115 00116 if( ! initAlign() ){ 00117 return false; 00118 } 00119 00120 if( ! initPream() ){ 00121 return false; 00122 } 00123 00124 ifstream fin( m_fwconf.c_str() ); 00125 if( ! fin.is_open() ){ 00126 cout << "ERROR: can not open file " << m_fwconf << endl; 00127 return false; 00128 } 00129 00130 for(ilay=0; ilay<LAYERNMAX; ilay++){ 00131 fin >> strtmp >> radius >> ncell >> twist 00132 >> offset >> length >> first; 00133 00134 length -= 4.0; // wulh test on 2007-05-08 00135 ncell /= 2; 00136 00137 if( fabs(twist) > 0.1 ){ 00138 offset = 0.0; 00139 } 00140 00141 aglstart = (PI / ncell) * first + (offset * PI / 180.0); 00142 if( aglstart < -0.000001 ){ 00143 aglstart += 2.0 * PI / ncell; 00144 } 00145 00146 if( twist < -0.1 ){ 00147 layertype = 1; 00148 } else if( twist > 0.1 ){ 00149 layertype = 2; 00150 } else{ 00151 layertype = 0; 00152 } 00153 00154 slant = atan( sin(PI * twist / ncell) 00155 * radius * 2.0 / length ); 00156 00157 m_player[ilay] = new MdcCosLayer; 00158 m_player[ilay] -> setLayerType( layertype ); 00159 m_player[ilay] -> setNcell( ncell ); 00160 m_player[ilay] -> setLayerRad( radius ); 00161 m_player[ilay] -> setLength( length ); 00162 m_player[ilay] -> setTwistCell( twist ); 00163 m_player[ilay] -> setSlant( slant ); 00164 00165 if( ilay < INNERNMAX ) m_player[ilay] -> setFgInner( true ); 00166 else m_player[ilay] -> setFgInner( false ); 00167 00168 // set the index of the element for alignment 00169 if( ilay < 8 ){ 00170 iEle = 0; 00171 } else if( ilay < 10 ){ 00172 iEle = 1; 00173 } else if( ilay < 12 ){ 00174 iEle = 2; 00175 } else if( ilay < 14 ){ 00176 iEle = 3; 00177 } else if( ilay < 16 ){ 00178 iEle = 4; 00179 } else if( ilay < 18 ){ 00180 iEle = 5; 00181 } else if( ilay < 20 ){ 00182 iEle = 6; 00183 } else{ 00184 iEle = 7; 00185 } 00186 00187 iPar[0] = iEle + m_iTXf; // TXf 00188 iPar[1] = iEle + m_iTXb; // TXb 00189 iPar[2] = iEle + m_iTYf; // TYf 00190 iPar[3] = iEle + m_iTYb; // TYb 00191 iPar[4] = iEle + m_iTZf; // TZf 00192 iPar[5] = iEle + m_iTZb; // TZb 00193 iPar[6] = iEle + m_iRXf; // RXf 00194 iPar[7] = iEle + m_iRXb; // RXb 00195 iPar[8] = iEle + m_iRYf; // RYf 00196 iPar[9] = iEle + m_iRYb; // RTb 00197 iPar[10] = iEle + m_iRZf; // RZf 00198 iPar[11] = iEle + m_iRZb; // RZb 00199 00200 m_player[ilay] -> setAlignParId(iPar); 00201 00202 for(icell=0; icell<ncell; icell++){ 00203 m_wiretable[ilay][icell] = iwire; 00204 angleforwini = (double)icell * 2.0 * PI / ncell + aglstart; 00205 00206 // forward endpoint 00207 angleforw = angleforwini + m_alignPar[iEle+m_iRZf]; 00208 angleforw += m_rot; 00209 00210 xf = radius * cos( angleforw ); 00211 yf = radius * sin( angleforw ); 00212 zf = 0.5 * length; 00213 00214 xf += m_alignPar[iEle+m_iTXf]; 00215 yf += m_alignPar[iEle+m_iTYf]; 00216 zf += m_alignPar[iEle+m_iTZf]; 00217 00218 // backward endpoint 00219 angleback = angleforwini + twist * 2.0 * PI / ncell; 00220 angleback += m_alignPar[iEle+m_iRZb]; 00221 angleback += m_rot; 00222 00223 xb = radius * cos( angleback ); 00224 yb = radius * sin( angleback ); 00225 zb = -0.5 * length; 00226 00227 xb += m_alignPar[iEle+m_iTXb]; 00228 yb += m_alignPar[iEle+m_iTYb]; 00229 zb += m_alignPar[iEle+m_iTZb]; 00230 00231 ampid = icell / 8; 00232 channel = icell - 8 * ampid; 00233 sprintf(wirelabel, "%02dS%02d-%d", ilay+1, ampid+1, channel+1); 00234 sprintf(wiretag, "%02d_%02d_%04d_%02d", 00235 ilay, icell, iwire, ampid+1); 00236 00237 m_pwire[iwire] = new MdcCosWire; 00238 00239 m_pwire[iwire] -> setLayerPtr(m_player[ilay]); 00240 00241 m_pwire[iwire] -> setWireId( iwire ); 00242 m_pwire[iwire] -> setLayerId( ilay ); 00243 m_pwire[iwire] -> setCellId( icell ); 00244 m_pwire[iwire] -> setPreAmpId( ampid+1 ); 00245 m_pwire[iwire] -> setChannel( channel ); 00246 00247 // set fanID 00248 iFan = m_fan[ilay][ampid]; 00249 // m_pwire[iwire] -> setFanId( abs(iFan) - 1 ); 00250 m_pwire[iwire] -> setFanId( abs(iFan) ); // begin from 1 00251 if(iFan > 0) m_pwire[iwire] -> setEndId( 1 ); 00252 else m_pwire[iwire] -> setEndId( -1 ); 00253 00254 m_pwire[iwire] -> setWireLabel( wirelabel ); 00255 m_pwire[iwire] -> setWireTag( wiretag ); 00256 00257 m_pwire[iwire] -> setXf( xf ); 00258 m_pwire[iwire] -> setYf( yf ); 00259 m_pwire[iwire] -> setZf( zf ); 00260 00261 m_pwire[iwire] -> setXb( xb ); 00262 m_pwire[iwire] -> setYb( yb ); 00263 m_pwire[iwire] -> setZb( zb ); 00264 00265 if( angleforw < 0 ) angleforw += 2.0 * PI; 00266 m_pwire[iwire] -> setPhiForward( angleforw ); 00267 00268 m_pwire[iwire] -> setTension( tension[ilay] ); 00269 00270 iwire++; 00271 } 00272 } 00273 fin.close(); 00274 cout << "INFO: Number of wires: " << iwire << endl; 00275 m_nWire = iwire; 00276 m_nLayer = LAYERNMAX; 00277 00278 return true; 00279 }
|
|
|
|
00353 { 00354 return true; 00355 }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|