00001 //---------------------------------------------------------------------------// 00002 // BOOST --- BESIII Object_Oreiented Simulation Tool // 00003 //---------------------------------------------------------------------------// 00004 //Descpirtion: EMC detector 00005 //Author: Fu Chengdong 00006 //Created: Sep 4, 2003 00007 //Comment: 00008 //---------------------------------------------------------------------------// 00009 // 00010 00011 #ifndef BesEmcConstruction_h 00012 #define BesEmcConstruction_h 1 00013 00014 //#include "G4VUserDetectorConstruction.hh" 00015 #include "globals.hh" 00016 #include "BesSubdetector.hh" 00017 #include "BesEmcGeometry.hh" 00018 #include "BesEmcEndGeometry.hh" 00019 #include "G4VPVParameterisation.hh" 00020 00021 //#include "CLHEP/config/CLHEP.h" 00022 #include "CLHEP/Vector/ThreeVector.h" 00023 #include "CLHEP/Vector/Rotation.h" 00024 #include "CLHEP/Geometry/Point3D.h" 00025 #include "CLHEP/Geometry/Plane3D.h" 00026 #ifndef ENABLE_BACKWARDS_COMPATIBILITY 00027 typedef HepGeom::Point3D<double> HepPoint3D; 00028 #endif 00029 #ifndef ENABLE_BACKWARDS_COMPATIBILITY 00030 // backwards compatibility will be enabled ONLY in CLHEP 1.9 00031 typedef HepGeom::Plane3D<double> HepPlane3D; 00032 #endif 00033 00034 00035 using namespace CLHEP; 00036 00037 class G4Box; 00038 class G4Tubs; 00039 class G4Cons; 00040 class G4Polyhedra; 00041 class G4Trap; 00042 class G4UnionSolid; 00043 class G4LogicalVolume; 00044 class G4VPhysicalVolume; 00045 class G4Material; 00046 class G4UniformMagField; 00047 class BesEmcDetectorMessenger; 00048 class BesEmcSD; 00049 class G4IrregBox; 00050 class G4SubtractionSolid; 00051 00052 class BesEmcConstruction : public BesSubdetector 00053 { 00054 public: // with description 00055 static BesEmcConstruction* GetBesEmcConstruction(); 00056 // Static method which returns the singleton pointer of G4RunManager or 00057 // its derived class. 00058 00059 private: 00060 static BesEmcConstruction* fBesEmcConstruction; 00061 00062 public: 00063 00064 BesEmcConstruction(); 00065 ~BesEmcConstruction(); 00066 00067 public: 00068 00069 inline void SetVerboseLevel(G4int val){ verboseLevel=val;} 00070 00071 void SetCrystalMaterial (G4String); 00072 00073 void SetCasingMaterial (G4String); 00074 void SetCasingThickness(G4ThreeVector); 00075 00076 void SetBSCRmin(G4double); 00077 void SetBSCNbPhi(G4int); 00078 void SetBSCNbTheta(G4int); 00079 void SetStartIDTheta(G4int); 00080 void SetBSCCrystalLength(G4double); 00081 void SetBSCYFront0(G4double); 00082 void SetBSCYFront(G4double); 00083 void SetBSCPosition0(G4double); 00084 void SetBSCPosition1(G4double); 00085 00086 void SetMagField(G4double); 00087 00088 void Construct(G4LogicalVolume*); 00089 00090 void UpdateGeometry(); 00091 00092 void ThreeVectorTrans( G4ThreeVector fPnt[8], double x[8], double y[8], double z[8] ); 00093 void TransformToArb8( const G4ThreeVector fPnt[8], G4ThreeVector newfPnt[8], 00094 G4ThreeVector ¢er, G4ThreeVector &rotAngle ); 00095 Hep3Vector RotAngleFromNewZ( Hep3Vector newZ ); 00096 00097 public: 00098 00099 void PrintEMCParameters(); 00100 00101 G4int GetVerboseLevel() {return verboseLevel;}; 00102 G4double GetMagField() {return fmagField;}; 00103 00104 G4int GetStartIDTheta() {return startID;}; 00105 00106 G4Material* GetCrystalMaterial() {return fCrystalMaterial;}; 00107 G4Material* GetCasingMaterial() {return fCasingMaterial;}; 00108 //G4ThreeVector GetCasingThickness() {return G4ThreeVector(fTyvekThickness,fAlThickness,fMylarThickness);}; 00109 00110 const G4VPhysicalVolume* GetEMC() {return physiEMC; } 00111 const G4VPhysicalVolume* GetBSCPhi() {return physiBSCPhi;}; 00112 const G4VPhysicalVolume* GetBSCTheta() {return physiBSCTheta;}; 00113 const G4VPhysicalVolume* GetBSCCrystal(){return physiBSCCrystal;}; 00114 const G4VPVParameterisation* GetCrystalParam(){return crystalParam;}; 00115 00116 private: 00117 00118 G4int verboseLevel; 00119 G4double fmagField; 00120 00121 G4Material* fCrystalMaterial; 00122 00123 G4int phiNbCrystals; 00124 G4int thetaNbCrystals; 00125 G4int startID; 00126 00127 G4Material* fCasingMaterial; 00128 00129 G4Material* defaultMaterial; 00130 00131 G4Tubs* solidBSC; //Barrel 00132 G4Cons* solidESC; //Endcap 00133 G4UnionSolid* solidEMC; 00134 G4LogicalVolume* logicEMC; 00135 G4VPhysicalVolume* physiEMC; 00136 00137 G4SubtractionSolid* solidBSCWorld; //virtual volume for barrel 00138 G4LogicalVolume* logicBSCWorld; 00139 G4VPhysicalVolume* physiBSCWorld; 00140 00141 G4Tubs* solidBSCPhiTub; 00142 G4Cons* solidConsPhi; 00143 G4SubtractionSolid* solidBSCPhi1; 00144 G4SubtractionSolid* solidBSCPhi; //pointer to the solid Layer 00145 G4LogicalVolume* logicBSCPhi; //pointer to the logical Layer 00146 G4VPhysicalVolume* physiBSCPhi; //pointer to the physical Layer 00147 00148 G4Trap* solidBSCTheta; //pointer to the solid Absorber 00149 G4LogicalVolume* logicBSCTheta; //pointer to the logical Absorber 00150 G4VPhysicalVolume* physiBSCTheta; //pointer to the physical Absorber 00151 00152 G4Trap* solidBSCCrystal; //pointer to the solid Absorber 00153 G4LogicalVolume* logicBSCCrystal; //pointer to the logical Absorber 00154 G4VPhysicalVolume* physiBSCCrystal; //pointer to the physical Absorber 00155 00156 G4UniformMagField* magField; //pointer to the magnetic field 00157 00158 BesEmcDetectorMessenger* detectorMessenger; //pointer to the Messenger 00159 BesEmcSD* besEMCSD; //pointer to the sensitive detector 00160 BesEmcGeometry *besEMCGeometry; 00161 BesEmcEndGeometry *emcEnd; 00162 G4VPVParameterisation* crystalParam; 00163 00164 //Endcap geometry 00165 private: 00166 00167 G4Cons* solidEnd; //pointer to the endcap 00168 G4LogicalVolume* logicEnd; 00169 G4VPhysicalVolume* physiEnd; 00170 00171 G4Cons* solidEndPhi; 00172 G4LogicalVolume* logicEndPhi; 00173 G4VPhysicalVolume* physiEndPhi; 00174 00175 G4IrregBox* solidEndCasing; 00176 G4LogicalVolume* logicEndCasing; 00177 G4VPhysicalVolume* physiEndCasing; 00178 00179 G4IrregBox* solidEndCrystal; 00180 G4LogicalVolume* logicEndCrystal; 00181 G4VPhysicalVolume* physiEndCrystal; 00182 00183 //other substance on the rear face of crystal 00184 private: 00185 00186 G4Box* solidRear; //virtual volume 00187 G4LogicalVolume* logicRear; 00188 G4VPhysicalVolume* physiRear; 00189 00190 G4Box* solidCasingBox; //casing 00191 G4Box* solidAirHole; 00192 G4SubtractionSolid* solidRearCasing; 00193 G4LogicalVolume* logicRearCasing; 00194 G4VPhysicalVolume* physiRearCasing; 00195 00196 G4Box* solidOrgGlass; //organic glass 00197 G4LogicalVolume* logicOrgGlass; 00198 G4VPhysicalVolume* physiOrgGlass; 00199 00200 G4Box* solidPD; //photodiode 00201 G4LogicalVolume* logicPD; 00202 G4VPhysicalVolume* physiPD; 00203 00204 G4Box* solidAlBox; //Al plate 00205 G4SubtractionSolid* solidAlPlate; 00206 G4LogicalVolume* logicAlPlate; 00207 G4VPhysicalVolume* physiAlPlate; 00208 00209 G4Box* solidPreAmpBox; //preamplifier box 00210 G4LogicalVolume* logicPreAmpBox; 00211 G4VPhysicalVolume* physiPreAmpBox; 00212 00213 G4Box* solidAirInPABox; //air in preamplifier box 00214 G4LogicalVolume* logicAirInPABox; 00215 G4VPhysicalVolume* physiAirInPABox; 00216 00217 G4Box* solidHangingPlate; //stainless steel for hanging the crysta 00218 G4LogicalVolume* logicHangingPlate; 00219 G4VPhysicalVolume* physiHangingPlate; 00220 00221 G4Cons* solidOCGirder; //opening-cut girder 00222 G4LogicalVolume* logicOCGirder; 00223 G4VPhysicalVolume* physiOCGirder; 00224 00225 G4Tubs* solidCable; //cable 00226 G4LogicalVolume* logicCable; 00227 G4VPhysicalVolume* physiCable; 00228 00229 G4Tubs* solidWaterPipe; //water pipe 00230 G4LogicalVolume* logicWaterPipe; 00231 G4VPhysicalVolume* physiWaterPipe; 00232 00233 //barrel support frame 00234 private: 00235 G4Tubs* solidSupportBar; //support bar 00236 G4LogicalVolume* logicSupportBar; 00237 G4VPhysicalVolume* physiSupportBar; 00238 00239 G4Tubs* solidSupportBar1; 00240 G4LogicalVolume* logicSupportBar1; 00241 G4VPhysicalVolume* physiSupportBar1; 00242 00243 G4Tubs* solidEndRing; //end ring 00244 G4LogicalVolume* logicEndRing; 00245 G4VPhysicalVolume* physiEndRing; 00246 00247 G4Tubs* solidGear; 00248 G4LogicalVolume* logicGear; 00249 G4VPhysicalVolume* physiGear; 00250 00251 G4Tubs* solidTaperRing1; //taper ring 00252 G4LogicalVolume* logicTaperRing1; 00253 G4VPhysicalVolume* physiTaperRing1; 00254 00255 G4Cons* solidTaperRing2; 00256 G4LogicalVolume* logicTaperRing2; 00257 G4VPhysicalVolume* physiTaperRing2; 00258 00259 G4Cons* solidTaperRing3; 00260 G4LogicalVolume* logicTaperRing3; 00261 G4VPhysicalVolume* physiTaperRing3; 00262 00263 private: 00264 G4Material* rearCasingMaterial; 00265 G4Material* organicGlass; 00266 G4Material* stainlessSteel; 00267 G4Material* cable; 00268 G4Material* waterPipe; 00269 00270 public: 00271 void ConstructSPFrame(G4LogicalVolume*, BesEmcGeometry*); 00272 void ConstructEndGeometry(G4LogicalVolume*); 00273 void GetLogicalVolume(); 00274 void SetVisAndSD(); 00275 G4int ComputeEndCopyNb(G4int); 00276 00277 private: 00278 00279 void DefineMaterials(); 00280 void ComputeEMCParameters(); 00281 // G4VPhysicalVolume* Construct(G4LogicalVolume*); 00282 }; 00283 00284 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 00285 00286 #endif