Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

MdcCosGeom Class Reference

#include <MdcCosGeom.h>

List of all members.

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 MdcCosLayergetLayer (int ilay) const
const MdcCosLayergetLayer (int ilay) const
const int getLayerSize () const
const int getLayerSize () const
const MdcCosWiregetWire (int ilay, int icell) const
const MdcCosWiregetWire (int iwire) const
const MdcCosWiregetWire (int ilay, int icell) const
const MdcCosWiregetWire (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
MdcCosLayerm_player [LAYERNMAX]
MdcCosLayerm_player [LAYERNMAX]
MdcCosWirem_pwire [WIRENMAX]
MdcCosWirem_pwire [WIRENMAX]
double m_rot
int m_wiretable [LAYERNMAX][CELLNMAX]


Constructor & Destructor Documentation

MdcCosGeom::MdcCosGeom std::string  fwireconf,
std::string  fAlign
 

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 }

MdcCosGeom::~MdcCosGeom  ) 
 

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 }

MdcCosGeom::MdcCosGeom std::string  fwireconf,
std::string  fAlign
 

MdcCosGeom::~MdcCosGeom  ) 
 


Member Function Documentation

void MdcCosGeom::check std::string  fchk  )  const
 

void MdcCosGeom::check std::string  fchk  )  const
 

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 }

const void MdcCosGeom::getAlignPar double  alignPar[]  )  const
 

const void MdcCosGeom::getAlignPar double  alignPar[]  )  const
 

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 }

const MdcCosLayer* MdcCosGeom::getLayer int  ilay  )  const [inline]
 

00036 { return m_player[ilay]; }

const MdcCosLayer* MdcCosGeom::getLayer int  ilay  )  const [inline]
 

00036 { return m_player[ilay]; }

const int MdcCosGeom::getLayerSize  )  const [inline]
 

00030 { return m_nLayer; }

const int MdcCosGeom::getLayerSize  )  const [inline]
 

00030 { return m_nLayer; }

const MdcCosWire* MdcCosGeom::getWire int  ilay,
int  icell
const
 

const MdcCosWire* MdcCosGeom::getWire int  iwire  )  const [inline]
 

00033 { return m_pwire[iwire]; }

const MdcCosWire * MdcCosGeom::getWire int  ilay,
int  icell
const
 

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 }

const MdcCosWire* MdcCosGeom::getWire int  iwire  )  const [inline]
 

00033 { return m_pwire[iwire]; }

const int MdcCosGeom::getWireSize  )  const [inline]
 

00031 { return m_nWire; }

const int MdcCosGeom::getWireSize  )  const [inline]
 

00031 { return m_nWire; }

bool MdcCosGeom::initAlign  )  [private]
 

bool MdcCosGeom::initAlign  )  [private]
 

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 }

bool MdcCosGeom::initialize double  rot  ) 
 

bool MdcCosGeom::initialize double  rot  ) 
 

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 }

bool MdcCosGeom::initPream  ) 
 

bool MdcCosGeom::initPream  ) 
 

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 }

bool MdcCosGeom::initWire  ) 
 

bool MdcCosGeom::initWire  ) 
 

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 }

bool MdcCosGeom::setTension  ) 
 

bool MdcCosGeom::setTension  ) 
 

00353                            {
00354      return true;
00355 }


Member Data Documentation

double MdcCosGeom::m_alignPar [private]
 

std::string MdcCosGeom::m_falign [private]
 

int MdcCosGeom::m_fan [private]
 

std::string MdcCosGeom::m_fwconf [private]
 

int MdcCosGeom::m_iRXb [private]
 

int MdcCosGeom::m_iRXf [private]
 

int MdcCosGeom::m_iRYb [private]
 

int MdcCosGeom::m_iRYf [private]
 

int MdcCosGeom::m_iRZb [private]
 

int MdcCosGeom::m_iRZf [private]
 

int MdcCosGeom::m_iTXb [private]
 

int MdcCosGeom::m_iTXf [private]
 

int MdcCosGeom::m_iTYb [private]
 

int MdcCosGeom::m_iTYf [private]
 

int MdcCosGeom::m_iTZb [private]
 

int MdcCosGeom::m_iTZf [private]
 

int MdcCosGeom::m_nLayer [private]
 

int MdcCosGeom::m_nWire [private]
 

MdcCosLayer* MdcCosGeom::m_player[LAYERNMAX] [private]
 

MdcCosLayer* MdcCosGeom::m_player[LAYERNMAX] [private]
 

MdcCosWire* MdcCosGeom::m_pwire[WIRENMAX] [private]
 

MdcCosWire* MdcCosGeom::m_pwire[WIRENMAX] [private]
 

double MdcCosGeom::m_rot [private]
 

int MdcCosGeom::m_wiretable [private]
 


The documentation for this class was generated from the following files:
Generated on Wed Feb 2 16:24:22 2011 for BOSS6.5.5 by  doxygen 1.3.9.1