/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Simulation/BOOST/EmcSim/EmcSim-00-00-46/src/BesEmcGeometry.cc

Go to the documentation of this file.
00001 //---------------------------------------------------------------------------//
00002 //      BESIII Object_Oreiented Simulation and Reconstruction Tool           //
00003 //---------------------------------------------------------------------------//
00004 //Descpirtion: Geometry of EMC detector 
00005 //Author: Fu Chengdong
00006 //Created: Oct 23, 2003
00007 //Comment:
00008 //---------------------------------------------------------------------------//
00009 //
00010 #include "G4ThreeVector.hh"
00011 
00012 #include "BesEmcGeometry.hh"
00013 #include "BesEmcParameter.hh"
00014 #include "G4ios.hh"
00015 
00016 BesEmcGeometry::BesEmcGeometry()
00017 {
00018   verboseLevel = 0;
00019 }
00020 
00021 BesEmcGeometry::~BesEmcGeometry()
00022 {;}
00023 
00024 void BesEmcGeometry::ReadEMCParameters()
00025 {
00026   // Read EMC parameters from database
00027   BesEmcParameter& emcPara=BesEmcParameter::GetInstance();
00028     
00029   TaperRingDz = emcPara.GetTaperRingDz();
00030   TaperRingThickness1 = emcPara.GetTaperRingThickness1();
00031   TaperRingThickness2 = emcPara.GetTaperRingThickness2();
00032   TaperRingThickness3 = emcPara.GetTaperRingThickness3();
00033   TaperRingTheta = emcPara.GetTaperRingTheta()*deg;
00034   TaperRingInnerLength = emcPara.GetTaperRingInnerLength();
00035   TaperRingOuterLength = emcPara.GetTaperRingOuterLength();
00036  
00037   BSCRmin           = emcPara.GetBSCRmin();
00038   BSCDz             = emcPara.GetBSCDz()-TaperRingThickness3;
00039 
00040   BSCRmin1          = emcPara.GetBSCRmin1();
00041   BSCRmax1          = emcPara.GetBSCRmax1();
00042   BSCRmin2          = emcPara.GetBSCRmin2();
00043   //BSCRmax2          = emcPara.GetBSCRmax2();
00044   BSCDz1            = emcPara.GetBSCDz1()-TaperRingThickness3;
00045   
00046   BSCAngleRotat     = emcPara.GetBSCAngleRotat()*deg;
00047   BSCNbPhi          = emcPara.GetBSCNbPhi();
00048   BSCNbTheta        = emcPara.GetBSCNbTheta();
00049   
00050   BSCCryLength      = emcPara.GetCrystalLength();
00051   BSCCryLength1     = emcPara.GetCrystalLength1();
00052   BSCYFront0        = emcPara.GetBSCYFront0();
00053   BSCYFront         = emcPara.GetBSCYFront();
00054   BSCYFront1        = emcPara.GetBSCYFront1();
00055   BSCPosition0      = emcPara.GetBSCPosition0();
00056   BSCPosition1      = emcPara.GetBSCPosition1();
00057 
00058   fTyvekThickness   = emcPara.GetTyvekThickness();
00059   fAlThickness      = emcPara.GetAlThickness();
00060   fMylarThickness   = emcPara.GetMylarThickness();
00061   
00062   rearBoxLength     = emcPara.GetRearBoxLength();
00063   rearBoxDz         = emcPara.GetRearBoxDz();
00064   
00065   HangingPlateDz    = emcPara.GetHangingPlateDz();
00066   OCGirderAngle     = emcPara.GetOCGirderAngle()*deg;
00067 
00068   rearCasingThickness = emcPara.GetRearCasingThickness();
00069 
00070   orgGlassLengthX   = emcPara.GetOrgGlassLengthX();
00071   orgGlassLengthY   = emcPara.GetOrgGlassLengthY();
00072   orgGlassLengthZ   = emcPara.GetOrgGlassLengthZ();
00073 
00074   PDLengthX         = emcPara.GetPDLengthX();
00075   PDLengthY         = emcPara.GetPDLengthY();
00076   PDLengthZ         = emcPara.GetPDLengthZ();
00077 
00078   AlPlateDz         = emcPara.GetAlPlateDz();
00079   PABoxDz           = emcPara.GetPABoxDz();
00080   PABoxThickness    = emcPara.GetPABoxThickness();
00081 
00082   cableDr           = emcPara.GetCableDr();
00083   waterPipeDr       = emcPara.GetWaterPipeDr();
00084   waterPipeThickness= emcPara.GetWaterPipeThickness();
00085 
00086   SPBarThickness    = emcPara.GetSPBarThickness();
00087   SPBarThickness1   = emcPara.GetSPBarThickness1();
00088   SPBarwidth        = emcPara.GetSPBarwidth();
00089 
00090   EndRingDz         = emcPara.GetEndRingDz();
00091   EndRingDr         = emcPara.GetEndRingDr();
00092   EndRingRmin       = emcPara.GetEndRingRmin();
00093   
00094   for(G4int i=0;i<BSCNbTheta*6;i++)
00095   {
00096     zHalfLength[i]  =0;
00097     thetaAxis[i]    =0;
00098     phiAxis  [i]    =0;
00099     yHalfLength1[i] =0; 
00100     xHalfLength1[i] =0;
00101     xHalfLength2[i] =0;
00102     tanAlpha1[i]    =0;
00103     yHalfLength2[i] =0;
00104     xHalfLength3[i] =0; 
00105     xHalfLength4[i] =0;
00106     tanAlpha2[i]    =0;
00107     thetaPosition[i]=0;
00108     xPosition[i]    =0;
00109     yPosition[i]    =0;
00110     zPosition[i]    =0;
00111   }     
00112 }
00113 
00114 void BesEmcGeometry::PrintEMCParameters()
00115 {
00116   // Print EMC parameters
00117   ;
00118 }
00119 
00120 void BesEmcGeometry::ComputeEMCParameters()
00121 {
00122   ReadEMCParameters();
00123   
00124   // Compute derived parameters of the calorimeter
00125   G4double theta0;
00126   G4int i;
00127   //for debug
00128   //G4Exception("BesEmcGeometry::ComputeEMCParameters() starting.......");
00129   //
00130   //support frame
00131   //
00132   const G4double delta=1.*mm; //for opening-cut girder
00133   TaperRingRmin1 = BSCRmax1-TaperRingThickness1;
00134   TaperRingRmin2 = TaperRingRmin1+TaperRingDz*tan(TaperRingTheta);
00135   TaperRingDr = TaperRingThickness2/cos(TaperRingTheta);
00136   TaperRingOuterLength1 = TaperRingOuterLength+TaperRingThickness3*tan(TaperRingTheta);
00137   
00138   BSCRmax2 = TaperRingRmin2+TaperRingDr-TaperRingThickness3*tan(TaperRingTheta);
00139   BSCRmax = BSCRmin+33.8*cm;
00140   BSCPhiDphi= 360.*deg/BSCNbPhi;
00141   BSCPhiSphi= -BSCPhiDphi/2.;
00142   BSCPhiDz  = BSCDz;
00143   BSCPhiRmax= BSCRmax-0.5*cm;
00144   BSCPhiRmin= BSCRmin/sin(90.*deg+BSCPhiDphi/2.)
00145     *sin(90.*deg+BSCPhiDphi/2.-BSCAngleRotat); //Rmin after rotate
00146   SPBarDphi=2*atan(SPBarwidth/(2*BSCRmax));
00147 
00148   //crystal No.1(from z=0 to big)
00149   zHalfLength[0] = BSCCryLength/2.;
00150   yHalfLength1[0]= BSCYFront0/2.;
00151   xHalfLength1[0]= BSCPhiRmin*tan(BSCPhiDphi)/2.;
00152   xHalfLength2[0]= xHalfLength1[0];
00153 
00154   //there are 3 choices of rminprojected
00155   G4double rminprojected=BSCRmin*cos(BSCAngleRotat);
00156     rminprojected=BSCRmin;//according to hardware design
00157   //rminprojected=BSCPhiRmin;
00158     yHalfLength2[0]= yHalfLength1[0]
00159     +(BSCYFront0-BSCPosition0)/rminprojected*BSCCryLength/2.;
00160   xHalfLength3[0]= xHalfLength1[0]*(BSCPhiRmin+BSCCryLength)/BSCPhiRmin;
00161   xHalfLength4[0]= xHalfLength2[0]*(BSCPhiRmin+BSCCryLength)/BSCPhiRmin;
00162 
00163   thetaPosition[0]= 90.*deg;
00164   xPosition[0]    = BSCPhiRmin+BSCCryLength/2.;
00165   yPosition[0]    = 
00166     -(xHalfLength1[0]+xHalfLength3[0]+xHalfLength2[0]+xHalfLength4[0])/4.;
00167   zPosition[0]    = (yHalfLength1[0]+yHalfLength2[0])/2.;
00168   
00169   theta0= 90.*deg-atan((BSCYFront0-BSCPosition0)/rminprojected);
00170   if(verboseLevel>1)
00171     {
00172       G4cout << "------------------------------------>1"<< G4endl
00173              << "The direction of crystal is:"
00174              << theta0/deg <<"(deg)."<< G4endl;
00175     }
00176 
00177   rearBoxPosX[0] = xPosition[0]+BSCCryLength/2.+rearBoxDz/2.;
00178   rearBoxPosY[0] = -(xHalfLength3[0]+xHalfLength4[0])/2.;
00179   rearBoxPosZ[0] = yHalfLength2[0];
00180 
00181   OCGirderRmin1[0] = rearBoxPosX[0]+rearBoxDz/2.+delta;
00182   OCGirderRmin2[0] = rearBoxPosX[0]+rearBoxDz/2.+delta;
00183   OCGirderDz[0] = rearBoxLength;
00184   OCGirderPosZ[0] = rearBoxLength/2;
00185 
00186   cableLength[0] = BSCDz-rearBoxPosZ[0];
00187   cablePosX[0] = BSCPhiRmax-cableDr-2.*mm;
00188   cablePosY[0] = rearBoxPosY[0]-3*cableDr;
00189   cablePosZ[0] = BSCDz-cableLength[0]/2;
00190 
00191   //crystal No.2
00192   zHalfLength[1]= BSCCryLength/2.;
00193   yHalfLength1[1]= BSCYFront0/2.;
00194   G4double deltaR= BSCYFront0*cos(theta0);
00195   xHalfLength1[1]= xHalfLength1[0];
00196   xHalfLength2[1]= xHalfLength1[1]*(BSCPhiRmin+deltaR)/BSCPhiRmin;
00197   yHalfLength2[1]= yHalfLength1[1]
00198     +tan(theta0-atan(rminprojected/(BSCYFront0*(1.+1./sin(theta0))-
00199                                     BSCPosition1)))*BSCCryLength/2.;
00200   deltaR=deltaR+BSCCryLength*sin(theta0);
00201   xHalfLength4[1]= xHalfLength1[1]*(BSCPhiRmin+deltaR)/BSCPhiRmin;
00202   deltaR=deltaR-yHalfLength2[1]*2.*cos(theta0);
00203   xHalfLength3[1]= xHalfLength1[1]*(BSCPhiRmin+deltaR)/BSCPhiRmin;
00204 
00205   thetaPosition[1]= theta0;
00206   xPosition[1]    = BSCPhiRmin+BSCCryLength/2.*sin(theta0)
00207                   + (3.*yHalfLength1[1]-yHalfLength2[1])/2.*cos(theta0);
00208   yPosition[1]    = 
00209     -(xHalfLength1[1]+xHalfLength3[1]+xHalfLength2[1]+xHalfLength4[1])/4.;
00210   zPosition[1]    = yHalfLength1[0]*2.
00211     + (yHalfLength1[1]*2./tan(theta0)+BSCCryLength/2.)*cos(theta0)
00212     + (yHalfLength1[1]+yHalfLength2[1])/2.*sin(theta0);
00213 
00214   rearBoxPosX[1] = xPosition[1]+(BSCCryLength/2.+rearBoxDz/2.)*sin(theta0);
00215   rearBoxPosY[1] = -(xHalfLength3[1]+xHalfLength4[1])/2.;
00216   rearBoxPosZ[1] = zPosition[1]+(BSCCryLength/2.+rearBoxDz/2.)*cos(theta0);
00217 
00218   OCGirderRmin1[1] = rearBoxPosX[1]+rearBoxDz*sin(theta0)/2.+rearBoxLength*cos(theta0)/2+delta;
00219   OCGirderRmin2[1] = rearBoxPosX[1]+rearBoxDz*sin(theta0)/2.-rearBoxLength*cos(theta0)/2+delta;
00220   OCGirderDz[1] = rearBoxLength*sin(theta0);
00221   OCGirderPosZ[1] = rearBoxPosZ[1]+rearBoxDz*cos(theta0)/2.;
00222 
00223   cableLength[1] = BSCDz-rearBoxPosZ[1];
00224   cablePosX[1] = cablePosX[0];
00225   cablePosY[1] = cablePosY[0]+2*cableDr;
00226   cablePosZ[1] = BSCDz-cableLength[1]/2;
00227 
00228   theta0= theta0-atan((yHalfLength2[1]-yHalfLength1[1])*2./BSCCryLength);
00229 
00230   for(i=2;i<BSCNbTheta;i++)
00231     {
00232       if(verboseLevel>1)
00233         {
00234           G4cout << "------------------------------------>"<<i<< G4endl
00235                  << "The direction of crystal is:"
00236                  << theta0/deg <<"(deg)." << G4endl;
00237         }
00238       G4double CryLength;
00239       if(i==BSCNbTheta-1) //the rightest crystal
00240       {
00241         CryLength=BSCCryLength1;    //24cm
00242         yHalfLength1[i]=BSCYFront1/2.;
00243       } else {
00244         //crystal No.i+1
00245         CryLength=BSCCryLength;   //28cm
00246         yHalfLength1[i]=BSCYFront/2.;
00247       }
00248       zHalfLength[i]=CryLength/2;
00249 
00250       deltaR=yHalfLength1[i]*2.*cos(theta0);
00251       xHalfLength1[i]=xHalfLength1[0];
00252       xHalfLength2[i]=xHalfLength1[i]/BSCPhiRmin*(BSCPhiRmin+deltaR);
00253       yHalfLength2[i]=yHalfLength1[i]
00254         *(1.+CryLength/(rminprojected/sin(theta0)
00255                            +yHalfLength1[i]*2./tan(theta0)));
00256       deltaR=deltaR+CryLength*sin(theta0);
00257       xHalfLength4[i]=xHalfLength1[i]/BSCPhiRmin*(BSCPhiRmin+deltaR);
00258       deltaR=deltaR-yHalfLength2[i]*2.*cos(theta0);
00259       xHalfLength3[i]=xHalfLength1[i]/BSCPhiRmin*(BSCPhiRmin+deltaR);
00260 
00261       thetaPosition[i]=theta0;
00262       xPosition[i]=BSCPhiRmin+zHalfLength[i]*sin(theta0)
00263                   + (3.*yHalfLength1[i]-yHalfLength2[i])/2.*cos(theta0);
00264       yPosition[i]=
00265         -(xHalfLength1[i]+xHalfLength3[i]+xHalfLength2[i]+xHalfLength4[i])/4.;
00266       zPosition[i]=BSCPosition1+rminprojected/tan(theta0)
00267         +(2.*yHalfLength1[i]/tan(theta0)+zHalfLength[i])*cos(theta0)
00268         +(yHalfLength1[i]+yHalfLength2[i])/2.*sin(theta0);
00269 
00270       rearBoxPosX[i] = xPosition[i]+(CryLength/2.+rearBoxDz/2.)*sin(theta0);
00271       rearBoxPosY[i] = -(xHalfLength3[i]+xHalfLength4[i])/2.;
00272       rearBoxPosZ[i] = zPosition[i]+(CryLength/2.+rearBoxDz/2.)*cos(theta0);
00273       
00274       OCGirderRmin1[i] = rearBoxPosX[i]+rearBoxDz*sin(theta0)/2.+rearBoxLength*cos(theta0)/2+delta;
00275       OCGirderRmin2[i] = rearBoxPosX[i]+rearBoxDz*sin(theta0)/2.-rearBoxLength*cos(theta0)/2+delta;
00276       OCGirderDz[i] = rearBoxLength*sin(theta0);
00277       OCGirderPosZ[i] = rearBoxPosZ[i]+rearBoxDz*cos(theta0)/2.;
00278 
00279      G4int xCable,yCable;
00280       xCable = i/4;
00281       yCable = i-4*(G4int)(i/4);
00282       cableLength[i] = BSCDz-(rearBoxPosZ[i]+rearBoxDz/2.*cos(theta0));
00283       cablePosX[i] = cablePosX[0]-xCable*2*cableDr;
00284       cablePosY[i] = cablePosY[0]+yCable*2*cableDr;
00285       cablePosZ[i] = BSCDz-cableLength[i]/2;
00286 
00287       theta0=theta0-atan(2.*yHalfLength1[i]/(rminprojected/sin(theta0)
00288                                              +2.*yHalfLength1[i]/tan(theta0)));
00289       
00290     }
00291   thetaPosition[BSCNbTheta]=theta0;
00292     if(verboseLevel>1)
00293     {
00294       G4cout << "------------------------------------>"<<i<< G4endl
00295              << "The direction of crystal is:"
00296              << theta0/deg <<"(deg)." << G4endl;
00297     }
00298    
00299   G4double oop;
00300   G4double dx=0.001*mm; //zoom out of crystals to avoid overlap
00301   for(i=0;i<BSCNbTheta;i++)
00302     {
00303       xHalfLength1[i]-=dx;
00304       xHalfLength2[i]-=dx;
00305       xHalfLength3[i]-=dx;
00306       xHalfLength4[i]-=dx;
00307       yHalfLength1[i]-=dx;
00308       yHalfLength2[i]-=dx;
00309 
00310       G4double CryLength;
00311       if(i==BSCNbTheta-1) //the rightest crystal
00312       {
00313         CryLength=BSCCryLength1;
00314       } else {
00315         CryLength=BSCCryLength;
00316       }
00317       oop=sqrt((yHalfLength2[i]-yHalfLength1[i])*(yHalfLength2[i]
00318                                                   -yHalfLength1[i])
00319                +(xHalfLength3[i]+xHalfLength4[i]-xHalfLength1[i]
00320                  -xHalfLength2[i])*(xHalfLength3[i]+xHalfLength4[i]
00321                                     -xHalfLength1[i]-xHalfLength2[i])/4);
00322       thetaAxis[i]=atan(oop/CryLength);
00323       phiAxis[i]  =180.*deg+atan((yHalfLength2[i]-yHalfLength1[i])
00324                          /(xHalfLength3[i]+xHalfLength4[i]
00325                            -xHalfLength1[i]-xHalfLength2[i])*2.);
00326       tanAlpha2[i]=-(xHalfLength4[i]-xHalfLength3[i])/yHalfLength2[i]/2.;
00327       tanAlpha1[i]=-(xHalfLength2[i]-xHalfLength1[i])/yHalfLength1[i]/2.;
00328       //G4cout <<thetaAxis[i]<<",  "
00329       //     <<phiAxis[i]<<",  "
00330       //     <<tanAlpha1[i]<<",  "
00331       //     <<tanAlpha2[i]<<G4endl;
00332     }
00333     
00334 }
00335 
00336 void BesEmcGeometry::ModifyForCasing()
00337 {
00338   // Compute the sizes of the naked crystals and the casing
00339   // Casing size
00340   // BSCNbTheta---->2*BSCNbTheta-1 : before crystal
00341   // 2*BSCNbTheta-->3*BSCNbTheta-1 : a side of crystal
00342   // 3*BSCNbTheta-->4*BSCNbTheta-1 : b side of crystal
00343   // 4*BSCNbTheta-->5*BSCNbTheta-1 : c side of crystal
00344   // 5*BSCNbTheta-->6*BSCNbTheta-1 : d side of crystal
00345   //                         d
00346   //                    ----------
00347   //                   |          |
00348   //                   |          |  
00349   //               c   |          |    a
00350   //                   |          |
00351   //                   |          |
00352   //                   |         / 
00353   //                   |     /
00354   //                   | / 
00355   //                         b   
00356   G4double totalThickness=fTyvekThickness+fAlThickness+fMylarThickness;//
00357   G4double delta=0.,angle1=0.*deg,angle2=0.*deg;
00358   G4double oop; //the distance of the centers of the two parallel plane
00359 
00360   G4double rminprojected=BSCRmin*cos(BSCAngleRotat);
00361   rminprojected=BSCRmin;//accord with hardware design
00362   //rminprojected=BSCPhiRmin;
00363 
00364   G4int i;
00365   for(i=0;i<BSCNbTheta;i++)
00366     {
00367       G4double CryLength;
00368       if(i==BSCNbTheta-1) //the rightest crystal
00369       {
00370         CryLength=BSCCryLength1;
00371       } else {
00372         CryLength=BSCCryLength;
00373       }
00374       zHalfLength[BSCNbTheta+i]=totalThickness/2.;
00375       yHalfLength1[BSCNbTheta+i]=yHalfLength1[i];
00376       yHalfLength2[BSCNbTheta+i]=yHalfLength1[i]
00377         +(yHalfLength2[i]-yHalfLength1[i])*totalThickness/CryLength;
00378       xHalfLength1[BSCNbTheta+i]=xHalfLength1[i];
00379       xHalfLength2[BSCNbTheta+i]=xHalfLength2[i];
00380       xHalfLength1[BSCNbTheta*2+i]=xHalfLength3[BSCNbTheta+i]=
00381         xHalfLength1[i]*(CryLength-totalThickness)/CryLength
00382         +xHalfLength3[i]*totalThickness/CryLength;
00383       xHalfLength2[BSCNbTheta*4+i]=xHalfLength4[BSCNbTheta+i]=
00384         xHalfLength2[i]*(CryLength-totalThickness)/CryLength
00385         +xHalfLength4[i]*totalThickness/CryLength;
00386       
00387       zHalfLength[BSCNbTheta*5+i]=zHalfLength[BSCNbTheta*4+i]=
00388       zHalfLength[BSCNbTheta*3+i]=zHalfLength[BSCNbTheta*2+i]=
00389         zHalfLength[i]-totalThickness/2.;
00390       
00391       yHalfLength2[BSCNbTheta*2+i]=yHalfLength1[BSCNbTheta*2+i]=
00392         totalThickness/cos(thetaPosition[i+1]-thetaPosition[i])/2.;
00393       xHalfLength3[BSCNbTheta*2+i]=xHalfLength3[i];
00394       xHalfLength4[BSCNbTheta*2+i]=xHalfLength3[i]
00395         +(xHalfLength4[i]-xHalfLength3[i])*yHalfLength2[BSCNbTheta*2+i]
00396         /yHalfLength2[i];
00397       xHalfLength2[BSCNbTheta*2+i]=xHalfLength3[BSCNbTheta+i]
00398         +(xHalfLength4[BSCNbTheta+i]-xHalfLength3[BSCNbTheta+i])
00399         *yHalfLength1[BSCNbTheta*2+i]/yHalfLength2[BSCNbTheta*1+i];
00400       
00401       yHalfLength2[BSCNbTheta*4+i]=yHalfLength1[BSCNbTheta*4+i]=
00402         totalThickness/2.;
00403       xHalfLength4[BSCNbTheta*4+i]=xHalfLength4[i];
00404       xHalfLength3[BSCNbTheta*4+i]=xHalfLength4[i]
00405         -(xHalfLength4[i]-xHalfLength3[i])*yHalfLength2[BSCNbTheta*4+i]
00406         /yHalfLength2[i];
00407       xHalfLength1[BSCNbTheta*4+i]=xHalfLength4[BSCNbTheta+i]
00408         -(xHalfLength4[BSCNbTheta+i]-xHalfLength3[BSCNbTheta+i])
00409         *yHalfLength1[BSCNbTheta*4+i]/yHalfLength2[BSCNbTheta*1+i];
00410       
00411       delta=totalThickness/2.+yHalfLength1[BSCNbTheta*2+i];
00412       angle1=atan(yHalfLength2[i]/(xHalfLength4[i]-xHalfLength3[i]));
00413       angle2=atan(2.*(xHalfLength4[i]-xHalfLength2[i])*sin(angle1)
00414                   /CryLength);
00415       
00416       yHalfLength1[BSCNbTheta*5+i]=yHalfLength1[BSCNbTheta*3+i]=
00417         yHalfLength1[i]-delta;
00418       yHalfLength2[BSCNbTheta*5+i]=yHalfLength2[BSCNbTheta*3+i]=
00419         yHalfLength2[i]-delta;
00420       xHalfLength4[BSCNbTheta*3+i]=xHalfLength3[BSCNbTheta*3+i]=
00421       xHalfLength2[BSCNbTheta*3+i]=xHalfLength1[BSCNbTheta*3+i]=
00422         totalThickness/cos(angle2)/sin(angle1)/2.;
00423       xHalfLength4[BSCNbTheta*5+i]=xHalfLength3[BSCNbTheta*5+i]=
00424       xHalfLength2[BSCNbTheta*5+i]=xHalfLength1[BSCNbTheta*5+i]=
00425         totalThickness/2.;
00426       
00427       zHalfLength[i]=zHalfLength[i]-totalThickness/2.;
00428       yHalfLength1[i]=yHalfLength1[i]-delta;
00429       yHalfLength2[i]=yHalfLength2[i]-delta;
00430       delta=totalThickness*(1.+1./cos(angle2)/sin(angle1))/2.;
00431       xHalfLength1[i]=xHalfLength1[i]-delta;
00432       xHalfLength2[i]=xHalfLength2[i]-delta;
00433       xHalfLength3[i]=xHalfLength3[i]-delta;
00434       xHalfLength4[i]=xHalfLength4[i]-delta;
00435 
00436       oop=sqrt((yHalfLength2[i]-yHalfLength1[i])*(yHalfLength2[i]
00437                                                   -yHalfLength1[i])
00438                +(xHalfLength3[i]+xHalfLength4[i]-xHalfLength1[i]
00439                  -xHalfLength2[i])*(xHalfLength3[i]+xHalfLength4[i]
00440                                     -xHalfLength1[i]-xHalfLength2[i])/4);
00441       thetaAxis[i]=atan(oop/CryLength);
00442       // -phi  --->180+phi 
00443       phiAxis[i]  =180.*deg+atan((yHalfLength2[i]-yHalfLength1[i])
00444                                  /(xHalfLength3[i]+xHalfLength4[i]
00445                                    -xHalfLength1[i]-xHalfLength2[i])*2.);
00446 
00447       oop=sqrt((yHalfLength2[BSCNbTheta+i]-yHalfLength1[BSCNbTheta+i])
00448                *(yHalfLength2[BSCNbTheta+i]-yHalfLength1[BSCNbTheta+i])
00449                +(xHalfLength3[BSCNbTheta+i]+xHalfLength4[BSCNbTheta+i]
00450                  -xHalfLength1[BSCNbTheta+i]-xHalfLength2[BSCNbTheta+i])
00451                *(xHalfLength3[BSCNbTheta+i]+xHalfLength4[BSCNbTheta+i]
00452                  -xHalfLength1[BSCNbTheta+i]-xHalfLength2[BSCNbTheta+i])/4);
00453       thetaAxis[BSCNbTheta+i]=atan(oop/totalThickness);
00454       phiAxis  [BSCNbTheta+i]=
00455         -atan((yHalfLength2[BSCNbTheta+i]-yHalfLength1[BSCNbTheta+i])
00456               /(xHalfLength3[BSCNbTheta+i]+xHalfLength4[BSCNbTheta+i]
00457                 -xHalfLength1[BSCNbTheta+i]-xHalfLength2[BSCNbTheta+i])*2.);
00458 
00459       oop=sqrt((yHalfLength2[i]-yHalfLength1[i])*(yHalfLength2[i]
00460                                                   -yHalfLength1[i])*4
00461                +(xHalfLength3[BSCNbTheta*2+i]+xHalfLength4[BSCNbTheta*2+i]
00462                  -xHalfLength1[BSCNbTheta*2+i]-xHalfLength2[BSCNbTheta*2+i])
00463                *(xHalfLength3[BSCNbTheta*2+i]+xHalfLength4[BSCNbTheta*2+i]
00464                  -xHalfLength1[BSCNbTheta*2+i]-xHalfLength2[BSCNbTheta*2+i])
00465                /4);
00466       thetaAxis[BSCNbTheta*2+i]=atan(oop/(zHalfLength[BSCNbTheta*2+i]*2));
00467       phiAxis  [BSCNbTheta*2+i]=
00468         -atan((yHalfLength2[i]-yHalfLength1[i])
00469               /(xHalfLength3[BSCNbTheta*2+i]+xHalfLength4[BSCNbTheta*2+i]
00470                 -xHalfLength1[BSCNbTheta*2+i]-xHalfLength2[BSCNbTheta*2+i])*4);
00471 
00472       oop=sqrt((yHalfLength2[i]-yHalfLength1[i])*(yHalfLength2[i]
00473                                                   -yHalfLength1[i])*4
00474                +(xHalfLength4[i]-xHalfLength2[i])
00475                *(xHalfLength4[i]-xHalfLength2[i])*4);
00476       thetaAxis[BSCNbTheta*3+i]=atan(oop/(zHalfLength[BSCNbTheta*3+i]*2));
00477       phiAxis  [BSCNbTheta*3+i]=-atan((yHalfLength2[i]-yHalfLength1[i])
00478                                       /(xHalfLength4[i]-xHalfLength2[i]));
00479       
00480       thetaAxis[BSCNbTheta*4+i]=
00481         atan((xHalfLength4[BSCNbTheta*4+i]+xHalfLength3[BSCNbTheta*4+i]
00482               -xHalfLength2[BSCNbTheta*4+i]-xHalfLength1[BSCNbTheta*4+i])/2.
00483              /(zHalfLength[BSCNbTheta*4+i]*2));
00484       phiAxis  [BSCNbTheta*4+i]=0;
00485 
00486       thetaAxis[BSCNbTheta*5+i]=atan((xHalfLength3[BSCNbTheta*5+i]
00487                                       -xHalfLength1[BSCNbTheta*5+i])
00488                                      /(zHalfLength[BSCNbTheta*5+i]*2));
00489       phiAxis  [BSCNbTheta*5+i]=-90.*deg;
00490       
00491       tanAlpha2[BSCNbTheta+i]=tanAlpha1[BSCNbTheta+i]=tanAlpha1[i]=
00492         -(xHalfLength2[i]-xHalfLength1[i])/yHalfLength1[i]/2.;
00493       tanAlpha1[BSCNbTheta*2+i]=(xHalfLength2[BSCNbTheta*2+i]
00494                                  -xHalfLength1[BSCNbTheta*2+i])
00495         /yHalfLength1[BSCNbTheta*2+i]/2.;
00496       tanAlpha1[BSCNbTheta*3+i]=tanAlpha1[i]*2.;
00497       tanAlpha1[BSCNbTheta*4+i]=(xHalfLength2[BSCNbTheta*4+i]
00498                                  -xHalfLength1[BSCNbTheta*4+i])
00499         /yHalfLength1[BSCNbTheta*4+i]/2.;
00500       tanAlpha1[BSCNbTheta*5+i]=(xHalfLength2[BSCNbTheta*5+i]
00501                                  -xHalfLength1[BSCNbTheta*5+i])
00502         /yHalfLength1[BSCNbTheta*5+i]/2.;
00503       
00504       tanAlpha2[i]=-(xHalfLength4[i]-xHalfLength3[i])/yHalfLength2[i]/2.;
00505       //tanAlpha2[BSCNbTheta+i]=(xHalfLength4[BSCNbTheta+i]-xHalfLength3[BSCNbTheta+i])/yHalfLength2[BSCNbTheta+i]/2.;
00506       tanAlpha2[BSCNbTheta*2+i]=(xHalfLength4[BSCNbTheta*2+i]
00507                                  -xHalfLength3[BSCNbTheta*2+i])
00508         /yHalfLength2[BSCNbTheta*2+i]/2.;
00509       tanAlpha2[BSCNbTheta*3+i]=tanAlpha2[i]*2.;
00510       tanAlpha2[BSCNbTheta*4+i]=(xHalfLength4[BSCNbTheta*4+i]
00511                                  -xHalfLength3[BSCNbTheta*4+i])
00512         /yHalfLength2[BSCNbTheta*4+i]/2.;
00513       tanAlpha2[BSCNbTheta*5+i]=(xHalfLength4[BSCNbTheta*5+i]
00514                                  -xHalfLength3[BSCNbTheta*5+i])
00515         /yHalfLength2[BSCNbTheta*5+i]/2.;
00516 
00517       zPosition[BSCNbTheta*5+i]=zPosition[BSCNbTheta*3+i]=zPosition[i]=
00518         zPosition[i]+totalThickness/2.*cos(thetaPosition[i])
00519         -yHalfLength1[BSCNbTheta*2+i]*sin(thetaPosition[i]);
00520       zPosition[i]=totalThickness/2.;//for the newest method
00521       xPosition[BSCNbTheta*5+i]=xPosition[BSCNbTheta*3+i]=xPosition[i]=
00522         xPosition[i]+totalThickness/2.*sin(thetaPosition[i])
00523         +totalThickness*(1./cos(thetaPosition[i+1]-thetaPosition[i])-1)/2.
00524         *cos(thetaPosition[i]);
00525       xPosition[i]=totalThickness*(1.-1./cos(angle2)/sin(angle1))/2.;
00526                                                    //for the newest method
00527       yPosition[i]=yPosition[i]
00528         +totalThickness*(1.-1./cos(angle2)/sin(angle1))/2.;
00529       yPosition[i]=yHalfLength1[BSCNbTheta*2+i]-totalThickness/2.;//for the newest method
00530       yPosition[BSCNbTheta*3+i]=yPosition[i]*2.+xHalfLength1[BSCNbTheta*3+i];
00531       yPosition[BSCNbTheta*5+i]=xHalfLength1[BSCNbTheta*5+i];
00532 
00533       xPosition[BSCNbTheta+i]=BSCPhiRmin
00534         +zHalfLength[BSCNbTheta+i]*sin(thetaPosition[i])
00535         +(3.*yHalfLength1[BSCNbTheta+i]-yHalfLength2[BSCNbTheta+i])/2.
00536         *cos(thetaPosition[i]);
00537       yPosition[BSCNbTheta+i]=(xHalfLength1[BSCNbTheta+i]
00538                                +xHalfLength3[BSCNbTheta+i]
00539                                +xHalfLength2[BSCNbTheta+i]
00540                                +xHalfLength4[BSCNbTheta+i])/4.;
00541       zPosition[BSCNbTheta+i]=BSCPosition1+rminprojected/tan(thetaPosition[i])
00542         +(2.*yHalfLength1[BSCNbTheta+i]/tan(thetaPosition[i])
00543           +zHalfLength[BSCNbTheta+i])*cos(thetaPosition[i])
00544         +(yHalfLength1[BSCNbTheta+i]+yHalfLength2[BSCNbTheta+i])/2.
00545         *sin(thetaPosition[i]);
00546 
00547       xPosition[BSCNbTheta*2+i]=xPosition[i]
00548         +((yHalfLength1[i]+yHalfLength2[i])/2.+yHalfLength1[BSCNbTheta*2+i])
00549         *cos(thetaPosition[i]);
00550       zPosition[BSCNbTheta*2+i]=zPosition[i]
00551         -((yHalfLength1[i]+yHalfLength2[i])/2.+yHalfLength1[BSCNbTheta*2+i])
00552         *sin(thetaPosition[i]);
00553       yPosition[BSCNbTheta*2+i]=(xHalfLength1[BSCNbTheta*2+i]
00554                                  +xHalfLength3[BSCNbTheta*2+i]
00555                                  +xHalfLength2[BSCNbTheta*2+i]
00556                                  +xHalfLength4[BSCNbTheta*2+i])/4.;
00557 
00558       xPosition[BSCNbTheta*4+i]=xPosition[i]
00559         -((yHalfLength1[i]+yHalfLength2[i])/2.+yHalfLength1[BSCNbTheta*4+i])
00560         *cos(thetaPosition[i]);
00561       zPosition[BSCNbTheta*4+i]=zPosition[i]
00562         -((yHalfLength1[i]+yHalfLength2[i])/2.+yHalfLength1[BSCNbTheta*4+i])
00563         *sin(thetaPosition[i]);
00564       yPosition[BSCNbTheta*4+i]=(xHalfLength1[BSCNbTheta*4+i]
00565                                  +xHalfLength3[BSCNbTheta*4+i]
00566                                  +xHalfLength2[BSCNbTheta*4+i]
00567                                  +xHalfLength4[BSCNbTheta*4+i])/4.;
00568 
00569     }
00570 
00571   if(verboseLevel>1)
00572     for(i=0;i<BSCNbTheta*6;i++)
00573       {
00574         G4cout << "The sizes of the " << i+1 << " crystal are:" << G4endl
00575                << "zHalfLength =" << zHalfLength[i]/cm  << "(cm)," << G4endl
00576                << "thetaAxis   =" << thetaAxis[i]/deg   << "(deg),"<< G4endl
00577                << "phiAxis     =" << phiAxis[i]/deg     << "(deg),"<< G4endl
00578                << "yHalfLength1=" << yHalfLength1[i]/cm << "(cm)," << G4endl
00579                << "xHalfLength1=" << xHalfLength1[i]/cm << "(cm)," << G4endl
00580                << "xHalfLength2=" << xHalfLength2[i]/cm << "(cm)," << G4endl
00581                << "tanAlpha1   =" << tanAlpha1[i]                  << G4endl
00582                << "yHalfLength2=" << yHalfLength2[i]/cm << "(cm)," << G4endl
00583                << "xHalfLength3=" << xHalfLength3[i]/cm << "(cm)," << G4endl
00584                << "xHalfLength4=" << xHalfLength4[i]/cm << "(cm)," << G4endl
00585                << "tanAlpha2   =" << tanAlpha2[i]       << "."     << G4endl
00586                << "The position of the " << i+1 << " crystal is:" << G4endl
00587                << "(" << xPosition[i]/cm << ","
00588                << yPosition[i]/cm << ","
00589                << zPosition[i]/cm << ")cm" << G4endl;
00590       }
00591   
00592 }
00593 
00594 void BesEmcGeometry::SetCasingThickness(G4ThreeVector val)
00595 {
00596   // change Gap thickness and recompute the calorimeter parameters
00597   fTyvekThickness = val('X');
00598   fAlThickness    = val('Y');
00599   fMylarThickness = val('Z');
00600 }
00601 
00602 G4double BesEmcGeometry::GetXPosition(G4int NbCrystal)
00603 {
00604   if(NbCrystal>=0&&NbCrystal<BSCNbTheta*6)
00605     {
00606       return xPosition[NbCrystal];
00607     }
00608   else
00609     {
00610       return 0.;
00611     }
00612 }
00613 
00614 G4double BesEmcGeometry::GetYPosition(G4int NbCrystal)
00615 {
00616   if(NbCrystal>=0&&NbCrystal<BSCNbTheta*6)
00617     {
00618       return yPosition[NbCrystal];
00619     }
00620   else
00621     {
00622       return 0.;
00623     }
00624 }
00625 
00626 G4double BesEmcGeometry::GetZPosition(G4int NbCrystal)
00627 {
00628   if(NbCrystal>=0&&NbCrystal<BSCNbTheta*6)
00629     {
00630       return zPosition[NbCrystal];
00631     }
00632   else
00633     {
00634       return 0.;
00635     }
00636 }
00637 
00638 G4double BesEmcGeometry::GetThetaPosition(G4int NbCrystal)
00639 {
00640   if(NbCrystal>=0&&NbCrystal<BSCNbTheta*6)
00641     {
00642       return thetaPosition[NbCrystal];
00643     }
00644   else
00645     {
00646       return 0.;
00647     }
00648 }
00649 
00650 G4double BesEmcGeometry::GetZHalfLength(G4int NbCrystal)
00651 {
00652   if(NbCrystal>=0&&NbCrystal<BSCNbTheta*6)
00653     {
00654       return zHalfLength[NbCrystal];
00655     }
00656   else
00657     {
00658       return 0.;
00659     }
00660 }
00661 
00662 G4double BesEmcGeometry::GetThetaAxis(G4int NbCrystal)
00663 {
00664   if(NbCrystal>=0&&NbCrystal<BSCNbTheta*6)
00665     {
00666       return thetaAxis[NbCrystal];
00667     }
00668   else
00669     {
00670       return 0.;
00671     }
00672 }
00673 
00674 G4double BesEmcGeometry::GetPhiAxis(G4int NbCrystal)
00675 {
00676   if(NbCrystal>=0&&NbCrystal<BSCNbTheta*6)
00677     {
00678       return phiAxis[NbCrystal];
00679     }
00680   else
00681     {
00682       return 0.;
00683     }
00684 }
00685 
00686 G4double BesEmcGeometry::GetYHalfLength1(G4int NbCrystal)
00687 {
00688   if(NbCrystal>=0&&NbCrystal<BSCNbTheta*6)
00689     {
00690       return yHalfLength1[NbCrystal];
00691     }
00692   else
00693     {
00694       return 0.;
00695     }
00696 }
00697 
00698 G4double BesEmcGeometry::GetXHalfLength1(G4int NbCrystal)
00699 {
00700   if(NbCrystal>=0&&NbCrystal<BSCNbTheta*6)
00701     {
00702       return xHalfLength1[NbCrystal];
00703     }
00704   else
00705     {
00706       return 0.;
00707     }
00708 }
00709 
00710 G4double BesEmcGeometry::GetXHalfLength2(G4int NbCrystal)
00711 {
00712   if(NbCrystal>=0&&NbCrystal<BSCNbTheta*6)
00713     {
00714       return xHalfLength2[NbCrystal];
00715     }
00716   else
00717     {
00718       return 0.;
00719     }
00720 }
00721 
00722 G4double BesEmcGeometry::GetTanAlpha1(G4int NbCrystal)
00723 {
00724   if(NbCrystal>=0&&NbCrystal<BSCNbTheta*6)
00725     {
00726       return tanAlpha1[NbCrystal];
00727     }
00728   else
00729     {
00730       return 0.;
00731     }
00732 }
00733 
00734 G4double BesEmcGeometry::GetYHalfLength2(G4int NbCrystal)
00735 {
00736   if(NbCrystal>=0&&NbCrystal<BSCNbTheta*6)
00737     {
00738       return yHalfLength2[NbCrystal];
00739     }
00740   else
00741     {
00742       return 0.;
00743     }
00744 }
00745 
00746 G4double BesEmcGeometry::GetXHalfLength3(G4int NbCrystal)
00747 {
00748   if(NbCrystal>=0&&NbCrystal<BSCNbTheta*6)
00749     {
00750       return xHalfLength3[NbCrystal];
00751     }
00752   else
00753     {
00754       return 0.;
00755     }
00756 }
00757 
00758 G4double BesEmcGeometry::GetXHalfLength4(G4int NbCrystal)
00759 {
00760   if(NbCrystal>=0&&NbCrystal<BSCNbTheta*6)
00761     {
00762       return xHalfLength4[NbCrystal];
00763     }
00764   else
00765     {
00766       return 0.;
00767     }
00768 }
00769 
00770 G4double BesEmcGeometry::GetTanAlpha2(G4int NbCrystal)
00771 {
00772   if(NbCrystal>=0&&NbCrystal<BSCNbTheta*6)
00773     {
00774       return tanAlpha2[NbCrystal];
00775     }
00776   else
00777     {
00778       return 0.;
00779     }
00780 }
00781 
00782 G4VPhysicalVolume* BesEmcGeometry::GetPhysiBSCCrystal(G4int NbCrystal)
00783 {
00784   if(NbCrystal>=0&&NbCrystal<BSCNbTheta*6)
00785     {
00786       return physiBSCCrystal[NbCrystal];
00787     }
00788   else
00789     {
00790       return NULL;
00791     }
00792 }

Generated on Tue Nov 29 23:14:26 2016 for BOSS_7.0.2 by  doxygen 1.4.7