00001 //------------------------------------------------------------------------------| 00002 // [File ]: MucStripCal.cxx | 00003 // [Brief ]: Class MucStripCal for MUC calibration | 00004 // [Author]: Xie Yuguang, <ygxie@mail.ihep.ac.cn> | 00005 // [Date ]: Apil 6, 2005 | 00006 //------------------------------------------------------------------------------| 00007 00008 #include<iostream> 00009 #include<fstream> 00010 #include<cmath> 00011 00012 using namespace std; 00013 00014 #include "MucCalibAlg/MucStructConst.h" 00015 #include "MucCalibAlg/MucStripCal.h" 00016 00017 // Constructor 00018 MucStripCal::MucStripCal( int part, int segment, int layer, int id ) : MucEntityCal( part, segment, layer, id ) 00019 { 00020 MucStripCal::Init(); 00021 00022 // m_MucPadChain = NULL; 00023 } 00024 00025 // Copy constructor 00026 MucStripCal::MucStripCal( const MucStripCal& other ) : MucEntityCal( 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 // m_MucPadChain = other.m_MucPadChain; 00035 } 00036 00037 // Operator = 00038 MucStripCal& MucStripCal::operator =( const MucStripCal &other ) 00039 { 00040 if( this == &other) return *this; 00041 00042 MucEntityCal::operator = (other); 00043 00044 m_Type = other.m_Type; 00045 m_CenterLine = other.m_CenterLine; 00046 m_Head = other.m_Head; 00047 m_Tail = other.m_Tail; 00048 m_Phi = other.m_Phi; 00049 00050 // m_MucPadChain = other.m_MucPadChain; 00051 00052 return *this; 00053 } 00054 00055 // Destructor 00056 MucStripCal::~MucStripCal() 00057 { 00058 // delete m_MucPadChain; 00059 ; 00060 } 00061 00062 // Initialize 00063 void MucStripCal::Init() 00064 { 00065 SetType(); 00066 SetW(); 00067 SetWu(); 00068 SetWd(); 00069 SetCenterLine(); // use strip width 00070 SetHead(); 00071 SetTail(); 00072 SetPhi(); 00073 00074 SetThin(); 00075 SetH(); 00076 SetL(); 00077 SetArea(); 00078 SetPadNumber(); 00079 } 00080 00081 // ---------------------------------Get methods ------------------------ 00082 00083 int MucStripCal::GetType() { return m_Type; } 00084 double MucStripCal::GetCenterLine() { return m_CenterLine; } 00085 double MucStripCal::GetHead() { return m_Head; } 00086 double MucStripCal::GetTail() { return m_Tail; } 00087 double MucStripCal::GetPhi() { return m_Phi; } 00088 int MucStripCal::GetPadNumber() { return m_PadNumber; } 00089 00090 /* 00091 MucPadChain* MucStripCal::GetPadChain( ) 00092 { 00093 if( m_MucPadChain != NULL ) 00094 return m_MucPadChain; 00095 else 00096 return ( m_MucPadChain = new MucPadChain( m_Part, m_Segment, m_Layer, m_PadNumber ) ); 00097 } 00098 */ 00099 00100 //-----------------------------------Set methods------------------------- 00101 // Set strip type(readout direction) 00102 void MucStripCal::SetType() 00103 { 00104 if( m_Part == BRID ) { 00105 if( (m_Layer+1)%2 == 1 ) m_Type = ZSTR; 00106 else m_Type = PHISTR; 00107 } 00108 else { 00109 if( (m_Layer+1)%2 == 1 ) m_Type = XSTR; 00110 else m_Type = YSTR; 00111 } 00112 } 00113 00114 // Set x or y of endcap strip certerline in BES coordinate system 00115 void MucStripCal::SetCenterLine() 00116 { 00117 // Base on strips width and structure correlations 00118 // Endcap only 00119 00120 int segFlag = 0; 00121 00122 if( (m_Layer+1)%2 == 1 ) // 1,3,5,7 00123 { 00124 if( m_Segment < 2 ) segFlag = 1; 00125 else segFlag = -1; 00126 00127 if( m_ID != E_STR_NUM-1 ) // NO.1~62 00128 m_CenterLine = segFlag * ( E_XSTR_OFFSET + m_ID*E_STR_DST ); 00129 else // NO.63 end strip 00130 m_CenterLine = segFlag * ( E_XSTR_OFFSET + (E_STR_NUM-2)*E_STR_DST + (E_STR_DST + m_W + STR_GAP)/2); 00131 } 00132 else // 2,4,6,8 00133 { 00134 if( m_Segment%3 == 0 ) segFlag = 1; 00135 else segFlag = -1; 00136 00137 if(m_ID != E_STR_NUM-1) // NO.1~62 00138 m_CenterLine = segFlag * ( E_YSTR_OFFSET + m_ID*E_STR_DST ); 00139 else // NO.63 end strip 00140 m_CenterLine = segFlag * ( E_YSTR_OFFSET + (E_STR_NUM-2)*E_STR_DST + (E_STR_DST + m_W + STR_GAP)/2); 00141 } 00142 } 00143 00144 // Set x and y of the head of endcap strip in BES coordinate system 00145 void MucStripCal::SetHead() 00146 { 00147 int segFlag = 0; 00148 00149 // base on strips width and correlations 00150 if( m_ID+1 < TURN_STR_ID[m_Layer][0] ) 00151 m_Head = FIRST_TURN_HEAD[m_Layer][0]; 00152 00153 if( m_ID+1 == TURN_STR_ID[m_Layer][0] ) 00154 m_Head = FIRST_TURN_HEAD[m_Layer][1]; 00155 00156 if( (m_ID+1 > TURN_STR_ID[m_Layer][0]) && (m_ID+1 <= TURN_STR_ID[m_Layer][1]) ) 00157 m_Head = FIRST_TURN_HEAD[m_Layer][1] - ( m_ID + 1 - TURN_STR_ID[m_Layer][0] )*E_STR_DST; 00158 00159 if( m_ID+1 > TURN_STR_ID[m_Layer][1] ) 00160 m_Head = SECOND_TURN_HEAD[m_Layer%2]; 00161 00162 if( (m_Layer+1)%2 == 1 ) // 1,3,5,7 00163 { 00164 if( m_Segment%3 ==0 ) segFlag = 1; 00165 else segFlag = -1; 00166 } 00167 else // 2,4,6,8 00168 { 00169 if( m_Segment < 2 ) segFlag = 1; 00170 else segFlag = -1; 00171 } 00172 00173 m_Head *= segFlag; 00174 } 00175 00176 // Set x and y of the tail of endcap strip in BES coordinate system 00177 void MucStripCal::SetTail() 00178 { 00179 int segFlag = 0; 00180 00181 if( (m_Layer+1)%2 == 1 ) // 1,3,5,7 00182 { 00183 if( m_Segment%3 ==0 ) segFlag = 1; 00184 else segFlag = -1; 00185 00186 if( m_ID+1 < TURN_POINT_NUM ) 00187 m_Tail = ODD_TURN_POINT_TAIL[(m_Layer==0)?0:1][0]; 00188 if( m_ID+1 == TURN_POINT_NUM ) 00189 m_Tail = ODD_TURN_POINT_TAIL[(m_Layer==0)?0:1][1]; 00190 if( m_ID+1 > TURN_POINT_NUM ) 00191 m_Tail = ODD_TURN_POINT_TAIL[(m_Layer==0)?0:1][1]-( m_ID + 1 - TURN_POINT_NUM )* E_STR_DST; 00192 if( m_ID == E_STR_NUM - 1 ) 00193 m_Tail = ODD_TURN_POINT_TAIL[(m_Layer==0)?0:1][1]-( m_ID -TURN_POINT_NUM )*E_STR_DST - ( E_STR_DST + m_W + STR_GAP )/2; 00194 } 00195 else // 2,4,6,8 00196 { 00197 if( m_Segment < 2 ) segFlag = 1; 00198 else segFlag = -1; 00199 00200 if( m_ID+1 < TURN_POINT_NUM ) 00201 m_Tail = EVEN_TURN_POINT_TAIL[0]; 00202 if( m_ID+1 == TURN_POINT_NUM ) 00203 m_Tail = EVEN_TURN_POINT_TAIL[1]; 00204 if( m_ID+1 > TURN_POINT_NUM ) 00205 m_Tail = EVEN_TURN_POINT_TAIL[1] - ( m_ID + 1 - TURN_POINT_NUM ) * E_STR_DST; 00206 if( m_ID == E_STR_NUM - 1 ) 00207 m_Tail = EVEN_TURN_POINT_TAIL[1]-(m_ID - TURN_POINT_NUM)*E_STR_DST - ( E_STR_DST + m_W + STR_GAP )/2; 00208 } 00209 00210 m_Tail *= segFlag; 00211 } 00212 00213 // Set inclination angle of local coordinate x axis and global coordinate x axis 00214 void MucStripCal::SetPhi() 00215 { 00216 if ( m_Part == BRID ) // barrel 00217 m_Phi = B_PHI[m_Segment] * (PI/4.0); 00218 else // endcap , all phi is zer 00219 m_Phi = 0.; 00220 } 00221 00222 // set strip thickness 00223 void MucStripCal::SetThin() 00224 { 00225 m_Thin = STR_TH; 00226 } 00227 00228 // Set strip width 00229 void MucStripCal::SetW() 00230 { 00231 if( m_Part == BRID ) 00232 { 00233 // Set maximum strip 00234 int maxStrip; 00235 if( (m_Layer+1)%2 == 1 ) 00236 maxStrip = B_ZSTR_NUM; // odd layer 00237 else if( m_Segment != B_TOP ) 00238 maxStrip = B_PHISTR_NUM; // even layer not top segment 00239 else 00240 maxStrip = B_TOPSTR_NUM; // even layer top segment 00241 00242 00243 if( (m_Layer+1)%2 == 1 ) // odd layer, z 00244 { 00245 if( m_ID > 0 && m_ID < (maxStrip-1)) // not marginal strip 00246 m_W = B_STR_DST[m_Layer] - STR_GAP; 00247 else // marginal strip 00248 m_W = (B_BOX_WT[m_Layer] - 2*B_BOX_DT[SL_DOWN] - (maxStrip-2)*B_STR_DST[m_Layer] - STR_GAP)/2; 00249 } 00250 else // even layer, phi 00251 { 00252 if( m_ID >0 && m_ID < (maxStrip-1) ) // not marginal strip 00253 m_W = B_STR_DST[m_Layer] - STR_GAP; 00254 else // marginal strip 00255 m_W = B_BOX_LT/2 - B_BOX_DZ[SL_DOWN] - B_STR_DST[m_Layer]*(B_PHISTR_NUM-2)/2; 00256 00257 if( (maxStrip == B_TOPSTR_NUM) && (m_ID == (B_PHISTR_NUM - 1)) ) // special marginal strip 00258 m_W = B_BOX_LT/2 - B_BOX_DZ[SL_DOWN] - B_STR_DST[m_Layer]*(B_PHISTR_NUM-2)/2; 00259 } 00260 } 00261 else 00262 { 00263 // Strip0~62: 33; 00264 // Strip63: L0: 34; L2/4/6: 43; L1/3/5/7: 53 00265 if(m_ID != E_STR_NUM-1) m_W = E_STR_WT; // NO.1~62 00266 else // NO.63, end strip 00267 { 00268 if((m_Layer+1)%2!=0) // 0,2,4,6 00269 { 00270 if(m_Layer==0) m_W = 34; 00271 else m_W = 43; 00272 } 00273 else m_W = 53; // 1,3,5,7 00274 } 00275 } 00276 } 00277 00278 // Set strip Wu, no use 00279 void MucStripCal::SetWu() 00280 { 00281 m_Wu = m_W; 00282 } 00283 00284 // Set strip Wd, no use 00285 void MucStripCal::SetWd() 00286 { 00287 m_Wd = m_W; 00288 } 00289 00290 // Set strip height 00291 void MucStripCal::SetH() 00292 { 00293 m_H = STR_TH; 00294 } 00295 00296 // Set strip length 00297 void MucStripCal::SetL() 00298 { 00299 if( m_Part==BRID ) // barrel 00300 { 00301 int ZCUT_HEAD_NUM = B_ZSTR_NUM/2 - B_ZSTR_CUT_NUM[m_Layer] - 1; 00302 int ZCUT_TAIL_NUM = B_ZSTR_NUM/2 + B_ZSTR_CUT_NUM[m_Layer]; 00303 00304 if( m_Segment != B_TOP ) // not top segment 00305 { 00306 if( (m_Layer+1)%2 == 1) // odd layer, Z 00307 m_L = B_BOX_LT - 2*B_BOX_DZ[SL_DOWN]; 00308 else // even layer, phi 00309 m_L = B_BOX_WT[m_Layer] - 2*B_BOX_DZ[SL_DOWN]; 00310 } 00311 else // top segment 00312 { 00313 if((m_Layer+1)%2 == 1) // odd layer, z 00314 { 00315 if( m_ID > ZCUT_HEAD_NUM && m_ID < ZCUT_TAIL_NUM ) // be cut 00316 { 00317 if( m_Layer == 0 ) 00318 m_L = B_BOX_LT - 2*B_BOX_DZ[SL_DOWN] - B_ZSTR_CUT[1]; 00319 else 00320 m_L = B_BOX_LT - 2*B_BOX_DZ[SL_DOWN] - B_ZSTR_CUT[0]; 00321 } 00322 else // no cut 00323 m_L = B_BOX_LT - 2*B_BOX_DZ[SL_DOWN]; 00324 } 00325 else // even layer, phi 00326 { 00327 if( m_ID < B_PHISTR_CUT_NUM ) // no cut 00328 m_L = B_BOX_WT[m_Layer] - 2*B_BOX_DZ[SL_DOWN]; 00329 else // be cut 00330 m_L = (B_BOX_WT[m_Layer] - 2*B_BOX_DZ[SL_DOWN] - B_PHISTR_CUT)/2; 00331 } 00332 } 00333 } 00334 else // endcap 00335 { 00336 m_L = fabs( m_Head - m_Tail ); 00337 } 00338 } 00339 00340 // Set area(cm^2) 00341 void MucStripCal::SetArea() 00342 { 00343 m_Area = m_W*m_L/100; 00344 } 00345 00346 // Set Pad number of strip 00347 void MucStripCal::SetPadNumber() 00348 { 00349 int n = 0; 00350 double fn = 0; 00351 00352 if(m_W == 0) { 00353 cout<<"Error, strip width = 0!"<<endl; 00354 m_PadNumber = 0; 00355 } 00356 else 00357 { 00358 fn = (m_L/m_W); 00359 n = (int)fn; 00360 00361 if( (fn - n) > 0.3 ) 00362 m_PadNumber = n + 1; 00363 else 00364 m_PadNumber = n; 00365 } 00366 } 00367 00368 // END 00369