/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Muc/MucCalibAlg/MucCalibAlg-00-02-16/src/MucStripCal.cxx

Go to the documentation of this file.
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 

Generated on Tue Nov 29 23:12:55 2016 for BOSS_7.0.2 by  doxygen 1.4.7