00001
00002
00003
00004
00005
00006
00007
00008 #include<iostream>
00009 #include<fstream>
00010 #include<cmath>
00011
00012 using namespace std;
00013
00014 #include "MucGeoCreateAlg/MucGeoConst.h"
00015 #include "MucGeoCreateAlg/MucStrip.h"
00016
00017
00018 MucStrip::MucStrip( int part, int segment, int layer, int id ) : MucEntity( part, segment, layer, id )
00019 {
00020 MucStrip::Init();
00021
00022
00023 }
00024
00025
00026 MucStrip::MucStrip( const MucStrip& other ) : MucEntity( other )
00027 {
00028 m_Type = other.m_Type;
00029 m_CenterLine = other.m_CenterLine;
00030 m_Head = other.m_Head;
00031 m_Tail = other.m_Tail;
00032 m_Phi = other.m_Phi;
00033
00034
00035 }
00036
00037
00038 MucStrip& MucStrip::operator =( const MucStrip &other )
00039 {
00040 if( this == &other)
00041 return *this;
00042
00043 MucEntity::operator =(other);
00044
00045 m_Type = other.m_Type;
00046 m_CenterLine = other.m_CenterLine;
00047 m_Head = other.m_Head;
00048 m_Tail = other.m_Tail;
00049 m_Phi = other.m_Phi;
00050
00051
00052
00053 return *this;
00054 }
00055
00056
00057 MucStrip::~MucStrip()
00058 {
00059
00060 ;
00061 }
00062
00063
00064 void MucStrip::Init()
00065 {
00066 SetType();
00067 SetW();
00068 SetWu();
00069 SetWd();
00070 SetCenterLine();
00071 SetHead();
00072 SetTail();
00073 SetPhi();
00074
00075 SetThin();
00076 SetH();
00077 SetL();
00078 SetPadNumber();
00079
00080 SetLocOrgInBes();
00081 SetObjRotToMot();
00082
00083 SetEndcapStripInBes();
00084 SetBarrelStripInLoc();
00085
00086 SetObjOrgInBes();
00087 SetObjOrgInLoc();
00088 }
00089
00090
00091
00092 int MucStrip::GetType() { return m_Type; }
00093 double MucStrip::GetCenterLine(){ return m_CenterLine; }
00094 double MucStrip::GetHead() { return m_Head; }
00095 double MucStrip::GetTail() { return m_Tail; }
00096 double MucStrip::GetPhi() { return m_Phi; }
00097 int MucStrip::GetPadNumber() { return m_PadNumber; }
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112 void MucStrip::SetType()
00113 {
00114 if( m_Part == BRID )
00115 {
00116 if( (m_Layer+1)%2 == 1 ) m_Type = ZSTR;
00117 else m_Type = PHISTR;
00118 }
00119 else
00120 {
00121 if( (m_Layer+1)%2 == 1 ) m_Type = XSTR;
00122 else m_Type = YSTR;
00123 }
00124 }
00125
00126
00127
00128 void MucStrip::SetCenterLine()
00129 {
00130
00131
00132
00133 int segFlag = 0;
00134
00135 if( (m_Layer+1)%2 == 1 )
00136 {
00137 if( m_Segment < 2 ) segFlag = 1;
00138 else segFlag = -1;
00139
00140 if( m_ID == 0 ) m_CenterLine = segFlag * (E_GP_DY+E_STRPLN_DA+m_W/2.0);
00141 else if( m_ID != E_STR_NUM-1 )
00142 m_CenterLine = segFlag * ( E_XSTR_OFFSET + m_ID*E_STR_DST );
00143 else
00144 m_CenterLine = segFlag * ( E_XSTR_OFFSET + (E_STR_NUM-2)*E_STR_DST + (E_STR_DST + m_W + STR_GAP)/2);
00145 }
00146 else
00147 {
00148 if( m_Segment%3 == 0 ) segFlag = 1;
00149 else segFlag = -1;
00150
00151 if( m_ID == 0 ) m_CenterLine = segFlag * (E_GP_DX+E_STRPLN_DA+m_W/2.0);
00152 else if(m_ID != E_STR_NUM-1)
00153 m_CenterLine = segFlag * ( E_YSTR_OFFSET + m_ID*E_STR_DST );
00154 else
00155 m_CenterLine = segFlag * ( E_YSTR_OFFSET + (E_STR_NUM-2)*E_STR_DST + (E_STR_DST + m_W + STR_GAP)/2);
00156 }
00157 }
00158
00159
00160 void MucStrip::SetHead()
00161 {
00162 int segFlag = 0;
00163
00164
00165 if( m_ID+1 < HEAD_TURN_STR_NUM[m_Layer][0] )
00166 m_Head = FIRST_TURN_HEAD[m_Layer][0];
00167 else if( m_ID+1 == HEAD_TURN_STR_NUM[m_Layer][0] )
00168 m_Head = FIRST_TURN_HEAD[m_Layer][1];
00169 else if( (m_ID+1 > HEAD_TURN_STR_NUM[m_Layer][0]) && (m_ID+1 < HEAD_TURN_STR_NUM[m_Layer][1]) )
00170 m_Head = FIRST_TURN_HEAD[m_Layer][1] - ( m_ID + 1 - HEAD_TURN_STR_NUM[m_Layer][0] )*E_STR_DST;
00171 else if( m_ID+1 >= HEAD_TURN_STR_NUM[m_Layer][1] )
00172 m_Head = SECOND_TURN_HEAD[m_Layer%2];
00173
00174
00175 if( (m_Layer+1)%2 == 1 )
00176 {
00177 if( m_Segment%3 ==0 ) segFlag = 1;
00178 else segFlag = -1;
00179 }
00180 else
00181 {
00182 if( m_Segment < 2 ) segFlag = 1;
00183 else segFlag = -1;
00184 }
00185
00186 m_Head *= segFlag;
00187 }
00188
00189
00190 void MucStrip::SetTail()
00191 {
00192 int segFlag = 0;
00193
00194 if( (m_Layer+1)%2 == 1 )
00195 {
00196 if( m_Segment%3 ==0 ) segFlag = 1;
00197 else segFlag = -1;
00198
00199 if( m_ID+1 < TAIL_TURN_STR_NUM[0] )
00200 m_Tail = ODD_TURN_POINT_TAIL[(m_Layer==0)?0:1][0];
00201 else if( m_ID+1 == TAIL_TURN_STR_NUM[0] )
00202 m_Tail = ODD_TURN_POINT_TAIL[(m_Layer==0)?0:1][1];
00203 else if( m_ID+1 > TAIL_TURN_STR_NUM[0] )
00204 m_Tail = ODD_TURN_POINT_TAIL[(m_Layer==0)?0:1][1]-( m_ID + 1 - TAIL_TURN_STR_NUM[0] )* E_STR_DST;
00205 if( m_ID == E_STR_NUM - 1 )
00206 m_Tail = ODD_TURN_POINT_TAIL[(m_Layer==0)?0:1][1]-( m_ID -TAIL_TURN_STR_NUM[0] ) * E_STR_DST - ( E_STR_DST + m_W + STR_GAP )/2;
00207 }
00208 else
00209 {
00210 if( m_Segment < 2 ) segFlag = 1;
00211 else segFlag = -1;
00212
00213 if( m_ID+1 < TAIL_TURN_STR_NUM[1] )
00214 m_Tail = EVEN_TURN_POINT_TAIL[0];
00215 if( m_ID+1 == TAIL_TURN_STR_NUM[1] )
00216 m_Tail = EVEN_TURN_POINT_TAIL[1];
00217 if( m_ID+1 > TAIL_TURN_STR_NUM[1] )
00218 m_Tail = EVEN_TURN_POINT_TAIL[1] - ( m_ID + 1 - TAIL_TURN_STR_NUM[1] ) * E_STR_DST;
00219 if( m_ID == E_STR_NUM - 1 )
00220 m_Tail = EVEN_TURN_POINT_TAIL[1]-(m_ID - TAIL_TURN_STR_NUM[1]) * E_STR_DST - ( E_STR_DST + m_W + STR_GAP )/2;
00221 }
00222
00223 m_Tail *= segFlag;
00224 }
00225
00226
00227 void MucStrip::SetPhi()
00228 {
00229 if ( m_Part == BRID )
00230 m_Phi = B_PHI[m_Segment] * (MUC_PI/4.0);
00231 else
00232 m_Phi = 0.;
00233 }
00234
00235
00236 void MucStrip::SetThin()
00237 {
00238 m_Thin = STR_TH;
00239 }
00240
00241
00242 void MucStrip::SetW()
00243 {
00244 if( m_Part == BRID )
00245 {
00246
00247 int maxStrip;
00248 if( (m_Layer+1)%2 == 1 )
00249 maxStrip = B_ZSTR_NUM;
00250 else if( m_Segment != B_TOP )
00251 maxStrip = B_PHISTR_NUM;
00252 else
00253 maxStrip = B_TOPSTR_NUM;
00254
00255
00256 if( (m_Layer+1)%2 == 1 )
00257 {
00258 if( m_ID > 0 && m_ID < (maxStrip-1))
00259 m_W = B_STR_DST[m_Layer] - STR_GAP;
00260 else
00261 m_W = (B_BOX_WT[m_Layer] - 2*B_BOX_DT[SL_DOWN] - (maxStrip-2)*B_STR_DST[m_Layer] - STR_GAP)/2;
00262 }
00263 else
00264 {
00265 if( m_ID >0 && m_ID < (maxStrip-1) )
00266 m_W = B_STR_DST[m_Layer] - STR_GAP;
00267 else
00268 m_W = B_BOX_LT/2 - B_BOX_DZ[SL_DOWN] - B_STR_DST[m_Layer]*(B_PHISTR_NUM-2)/2;
00269
00270 if( (maxStrip == B_TOPSTR_NUM) && (m_ID == (B_PHISTR_NUM - 1)) )
00271 m_W = B_BOX_LT/2 - B_BOX_DZ[SL_DOWN] - B_STR_DST[m_Layer]*(B_PHISTR_NUM-2)/2;
00272 }
00273 }
00274 else
00275 {
00276
00277
00278
00279 if(m_ID ==0 ) m_W = E_FIRST_STR_WT;
00280 else if(m_ID != E_STR_NUM-1) m_W = E_STR_WT;
00281 else
00282 {
00283 if((m_Layer+1)%2!=0)
00284 {
00285 if(m_Layer==0) m_W = 31;
00286 else m_W = 43;
00287 }
00288 else m_W = 53;
00289 }
00290 }
00291 }
00292
00293
00294 void MucStrip::SetWu()
00295 {
00296 m_Wu = m_W;
00297 }
00298
00299
00300 void MucStrip::SetWd()
00301 {
00302 m_Wd = m_W;
00303 }
00304
00305
00306 void MucStrip::SetH()
00307 {
00308 m_H = STR_TH;
00309 }
00310
00311
00312 void MucStrip::SetL()
00313 {
00314 if( m_Part==BRID )
00315 {
00316 int ZCUT_HEAD_NUM = B_ZSTR_NUM/2 - B_ZSTR_CUT_NUM[m_Layer] - 1;
00317 int ZCUT_TAIL_NUM = B_ZSTR_NUM/2 + B_ZSTR_CUT_NUM[m_Layer];
00318
00319
00320 if( m_Segment != B_TOP )
00321 {
00322 if( (m_Layer+1)%2 == 1)
00323 m_L = B_BOX_LT - 2*B_BOX_DZ[SL_DOWN];
00324 else
00325 m_L = B_BOX_WT[m_Layer] - 2*B_BOX_DZ[SL_DOWN];
00326 }
00327 else
00328 {
00329 if((m_Layer+1)%2 == 1)
00330 {
00331 if( m_ID > ZCUT_HEAD_NUM && m_ID < ZCUT_TAIL_NUM )
00332 {
00333 if( m_Layer == 0 )
00334 m_L = B_BOX_LT - 2*B_BOX_DZ[SL_DOWN] - B_ZSTR_CUT[1];
00335 else
00336 m_L = B_BOX_LT - 2*B_BOX_DZ[SL_DOWN] - B_ZSTR_CUT[0];
00337 }
00338 else
00339 m_L = B_BOX_LT - 2*B_BOX_DZ[SL_DOWN];
00340 }
00341 else
00342 {
00343 if( m_ID < B_PHISTR_CUT_NUM )
00344 m_L = B_BOX_WT[m_Layer] - 2*B_BOX_DZ[SL_DOWN];
00345 else
00346 m_L = (B_BOX_WT[m_Layer] - 2*B_BOX_DZ[SL_DOWN] - B_PHISTR_CUT)/2;
00347 }
00348 }
00349 }
00350 else
00351 {
00352 m_L = fabs( m_Head - m_Tail );
00353 }
00354 }
00355
00356
00357 void MucStrip::SetArea()
00358 {
00359 m_Area = m_W*m_L/100;
00360 }
00361
00362
00363 void MucStrip::SetPadNumber()
00364 {
00365 int n = 0;
00366 double fn = 0;
00367
00368 if(m_W == 0)
00369 {
00370 cout<<"Error, strip width = 0!"<<endl;
00371 m_PadNumber = 0;
00372 }
00373 else
00374 {
00375 fn = (m_L/m_W);
00376 n = (int)fn;
00377
00378 if( (fn - n) > 0.3 )
00379 m_PadNumber = n + 1;
00380 else
00381 m_PadNumber = n;
00382 }
00383 }
00384
00385
00386
00387 void MucStrip::SetLocOrgInBes()
00388 {
00389 double x, y, z = 0 ;
00390
00391 if( m_Part == BRID )
00392 {
00393 x = ( B_AS_RMIN[m_Layer] - AS_GAP/2.0 ) * cos( m_Segment * ( MUC_PI/4.0 ) );
00394 y = ( B_AS_RMIN[m_Layer] - AS_GAP/2.0 ) * sin( m_Segment * ( MUC_PI/4.0 ) );
00395 z = 0.;
00396
00397 }
00398 else
00399 {
00400
00401
00402 x = (E_AS_RMAX - E_BOX_DR - E_STRPLN_DB[(m_Layer==0)?0:1] + E_GP_DX + E_STRPLN_DA) / 2.0;
00403 y = (E_AS_RMAX - E_BOX_DR - E_STRPLN_DB[(m_Layer==0)?0:1] + E_GP_DY + E_STRPLN_DA) / 2.0;
00404
00405
00406 if( m_Segment == 0 ) { ; }
00407 else if ( m_Segment == 1 ) { x = -x; }
00408 else if ( m_Segment == 2 ) { x = -x; y = -y; }
00409 else { y = -y; }
00410
00411
00412 for( int i=0; i<m_Layer+1; i++ ) z += E_AS_TH[i];
00413
00414 z += m_Layer * AS_GAP;
00415 z += (E_AS_ZMAX - E_AS_TOTAL_TH) + AS_GAP/2.0;
00416 z *= cos( m_Part*MUC_PI/2.0 );
00417
00418 }
00419
00420 m_LocOrgInBes[0] = x;
00421 m_LocOrgInBes[1] = y;
00422 m_LocOrgInBes[2] = z;
00423
00424
00425 for( int i=0; i<3; i++ ) {
00426 if( fabs(m_LocOrgInBes[i]) < ERR_LIMIT ) m_LocOrgInBes[i] = 0;
00427 }
00428 }
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440 void MucStrip::SetEndcapStripInBes()
00441 {
00442 double x, y, z;
00443
00444
00445 if( (m_Layer+1)%2 == 0 )
00446 x = m_CenterLine;
00447 else
00448 x = ( m_Head + m_Tail )/2;
00449
00450
00451 if( (m_Layer+1)%2 == 0 )
00452 y = ( m_Head + m_Tail )/2;
00453 else
00454 y = m_CenterLine;
00455
00456
00457 z = 0.;
00458 for(int i=0; i<m_Layer+1; i++) z += E_AS_TH[i];
00459
00460 z += m_Layer * AS_GAP;
00461 z = ( (E_AS_ZMAX - E_AS_TOTAL_TH + z) + AS_GAP/2.0 ) * cos( m_Part*MUC_PI/2.0 );
00462
00463 m_ObjOrgInBes[0] = x;
00464 m_ObjOrgInBes[1] = y;
00465 m_ObjOrgInBes[2] = z;
00466
00467
00468 for( int i=0; i<3; i++ ) {
00469 if( fabs(m_ObjOrgInBes[i]) < ERR_LIMIT ) m_ObjOrgInBes[i] = 0.;
00470 }
00471 }
00472
00473
00474 void MucStrip::SetBarrelStripInLoc()
00475 {
00476 int j = m_Layer;
00477 int n = m_ID;
00478
00479 int maxStrip = 0;
00480 double x, y, z = 0;
00481
00482 if( m_Type == ZSTR ) maxStrip = B_ZSTR_NUM;
00483 else if( m_Segment != B_TOP ) maxStrip = B_PHISTR_NUM;
00484 else maxStrip = B_TOPSTR_NUM;
00485
00486 if( m_Segment != B_TOP )
00487 {
00488 if( m_Type == ZSTR )
00489 {
00490
00491 if( n == 0 )
00492 x = ( B_BOX_WT[j] - 2*B_BOX_DT[SL_DOWN] + (maxStrip-2)*B_STR_DST[j] + STR_GAP )/4.0;
00493 else if( n == (maxStrip-1) )
00494 x = ( 2*B_BOX_DT[SL_DOWN] - B_BOX_WT[j] - (maxStrip-2)*B_STR_DST[j] - STR_GAP )/4.0;
00495 else
00496 x =( ((maxStrip-1) - 2*n) * B_STR_DST[j] )/2.0;
00497
00498
00499 y = 0.;
00500
00501
00502 z = 0.;
00503
00504 }
00505 else
00506 {
00507
00508 x = 0.;
00509
00510
00511 y = 0.;
00512
00513
00514 if( n == 0 )
00515 z = -B_BOX_LT/4.0 + B_BOX_DZ[SL_DOWN]/2.0 - B_STR_DST[j]*(B_PHISTR_NUM-2)/4.0;
00516 else if( n == (B_PHISTR_NUM - 1) )
00517 z = B_BOX_LT/4.0 - B_BOX_DZ[SL_DOWN]/2.0 + B_STR_DST[j]*(B_PHISTR_NUM-2)/4.0;
00518 else
00519 z = ( 2*n - B_PHISTR_NUM + 1 ) * B_STR_DST[j] / 2.0;
00520 }
00521
00522 }
00523 else
00524 {
00525 if( m_Type == ZSTR )
00526 {
00527
00528 if( n == 0 )
00529 x = B_BOX_WT[j]/4.0 - B_BOX_DT[SL_DOWN]/2.0 + (maxStrip-2)*B_STR_DST[j]/4.0 + STR_GAP/4.0;
00530 else if( n == (maxStrip-1) )
00531 x = -B_BOX_WT[j]/4.0 + B_BOX_DT[SL_DOWN]/2.0 - (maxStrip-2)*B_STR_DST[j]/4.0 - STR_GAP/4.0;
00532 else
00533 x = ( (maxStrip-1) - 2*n ) * B_STR_DST[j] / 2.0;
00534
00535
00536 y = 0.;
00537
00538
00539 if( (n > (B_ZSTR_NUM/2 - 1 - B_ZSTR_CUT_NUM[j])) && (n < (B_ZSTR_NUM/2 + B_ZSTR_CUT_NUM[j])) )
00540 z = -( (j==0) ? B_ZSTR_CUT[1] : B_ZSTR_CUT[0] )/2;
00541 else
00542 z = 0.;
00543 }
00544 else
00545 {
00546
00547 if( n < B_PHISTR_CUT_NUM )
00548 x = 0.;
00549 else
00550 {
00551 if( n < B_PHISTR_NUM )
00552 x = -B_BOX_WT[j]/4.0 - B_PHISTR_CUT/4.0 + B_BOX_DZ[SL_DOWN]/2.0;
00553 else
00554 x = B_BOX_WT[j]/4.0 + B_PHISTR_CUT/4.0 - B_BOX_DZ[SL_DOWN]/2.0;
00555 }
00556
00557
00558 y = 0.;
00559
00560
00561 if( n < B_PHISTR_NUM )
00562 {
00563 if( n == 0 )
00564 z = -B_BOX_LT/4.0 + B_BOX_DZ[SL_DOWN]/2.0 - B_STR_DST[j]*(B_PHISTR_NUM-2)/4.0;
00565 else if( n == (B_PHISTR_NUM - 1) )
00566 z = B_BOX_LT/4.0 - B_BOX_DZ[SL_DOWN]/2.0 + B_STR_DST[j]*(B_PHISTR_NUM-2)/4.0;
00567 else
00568 z = ( 2*n - B_PHISTR_NUM + 1 ) * B_STR_DST[j] / 2.0;
00569 }
00570 else
00571 {
00572 if( n == (B_TOPSTR_NUM-1) )
00573 z = B_BOX_LT/4.0 - B_BOX_DZ[SL_DOWN]/2.0 + B_STR_DST[j]*(B_PHISTR_NUM-2)/4.0;
00574 else
00575 z = ( 2*n - 3*B_PHISTR_NUM + 2*B_PHISTR_CUT_NUM + 1 ) * B_STR_DST[j]/2.0;
00576 }
00577 }
00578 }
00579
00580 m_ObjOrgInLoc[0] = x;
00581 m_ObjOrgInLoc[1] = y;
00582 m_ObjOrgInLoc[2] = z;
00583
00584
00585 for( int i=0; i<3; i++ ) {
00586 if( fabs(m_ObjOrgInLoc[i]) < ERR_LIMIT )
00587 m_ObjOrgInLoc[i] = 0.;
00588 }
00589 }
00590
00591
00592 void MucStrip::SetObjOrgInBes()
00593 {
00594 if( m_Part == BRID )
00595 {
00596 MucEntity::TransLocToBes( m_ObjOrgInBes, m_ObjOrgInLoc, m_LocOrgInBes, m_Phi );
00597
00598
00599 for( int i=0; i<3; i++ ) {
00600 if( fabs(m_ObjOrgInBes[i]) < ERR_LIMIT ) m_ObjOrgInBes[i] = 0.0;
00601 }
00602 }
00603 }
00604
00605
00606 void MucStrip::SetObjOrgInLoc()
00607 {
00608 if( m_Part != BRID )
00609 {
00610 MucEntity::TransBesToLoc( m_ObjOrgInLoc, m_ObjOrgInBes, m_LocOrgInBes, m_Phi );
00611
00612
00613 for( int i=0; i<3; i++ ) {
00614 if( fabs(m_ObjOrgInLoc[i]) < ERR_LIMIT ) m_ObjOrgInLoc[i] = 0.;
00615 }
00616 }
00617 }
00618
00619
00620
00621