Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // Author: Rachid Mazini 26 // Author: Rachid Mazini 27 // Rachid.Mazini@cern.ch 27 // Rachid.Mazini@cern.ch 28 // Language: C++ 28 // Language: C++ 29 // Tested on : g++ (egcs.2.1.1, RH6. 29 // Tested on : g++ (egcs.2.1.1, RH6.1) 30 // Prerequisites: None 30 // Prerequisites: None 31 // Purpose: Source file defining 31 // Purpose: Source file defining the geometry of EMModule 0 of the 32 // FCAL. 32 // FCAL. 33 // Developped: 10-March-2000 R.M. 33 // Developped: 10-March-2000 R.M. 34 // 34 // 35 // 35 // 36 //-------------------------------------------- 36 //----------------------------------------------------------------------------- 37 37 38 #include <fstream> 38 #include <fstream> 39 #include <cstdlib> 39 #include <cstdlib> 40 40 41 #include "FCALEMModule.hh" 41 #include "FCALEMModule.hh" 42 42 43 #include "FCALMaterialConsultant.hh" 43 #include "FCALMaterialConsultant.hh" 44 44 45 #include "G4SDManager.hh" 45 #include "G4SDManager.hh" 46 #include "FCALEMModuleSD.hh" 46 #include "FCALEMModuleSD.hh" 47 47 48 #include "G4PhysicalConstants.hh" 48 #include "G4PhysicalConstants.hh" 49 #include "G4SystemOfUnits.hh" 49 #include "G4SystemOfUnits.hh" 50 #include "G4Box.hh" 50 #include "G4Box.hh" 51 #include "G4Tubs.hh" 51 #include "G4Tubs.hh" 52 #include "G4LogicalVolume.hh" 52 #include "G4LogicalVolume.hh" 53 #include "G4VPhysicalVolume.hh" 53 #include "G4VPhysicalVolume.hh" 54 #include "G4PVPlacement.hh" 54 #include "G4PVPlacement.hh" 55 #include "G4SubtractionSolid.hh" 55 #include "G4SubtractionSolid.hh" 56 56 57 #include "G4ThreeVector.hh" 57 #include "G4ThreeVector.hh" 58 #include "G4VisAttributes.hh" 58 #include "G4VisAttributes.hh" 59 #include "G4Colour.hh" 59 #include "G4Colour.hh" 60 60 61 FCALEMModule::FCALEMModule() : 61 FCALEMModule::FCALEMModule() : 62 FcalEmModuleSD(0) 62 FcalEmModuleSD(0) 63 { 63 { 64 F1LArGapID = new G4int[2400]; 64 F1LArGapID = new G4int[2400]; 65 F1LArIX = new G4int[2400]; 65 F1LArIX = new G4int[2400]; 66 F1LArJY = new G4int[2400]; 66 F1LArJY = new G4int[2400]; 67 F1LArITile = new G4int[2400]; 67 F1LArITile = new G4int[2400]; 68 F1LArGapPosX = new G4double[2400]; 68 F1LArGapPosX = new G4double[2400]; 69 F1LArGapPosY = new G4double[2400]; 69 F1LArGapPosY = new G4double[2400]; 70 } 70 } 71 71 72 72 73 FCALEMModule::~FCALEMModule(){ 73 FCALEMModule::~FCALEMModule(){ 74 delete [] F1LArGapID; 74 delete [] F1LArGapID; 75 delete [] F1LArGapPosX; 75 delete [] F1LArGapPosX; 76 delete [] F1LArGapPosY; 76 delete [] F1LArGapPosY; 77 delete [] F1LArIX; 77 delete [] F1LArIX; 78 delete [] F1LArJY; 78 delete [] F1LArJY; 79 delete [] F1LArITile; 79 delete [] F1LArITile; 80 } 80 } 81 81 82 82 83 void FCALEMModule::InitializeGeometry() { 83 void FCALEMModule::InitializeGeometry() { 84 #include "FCALEMModuleParameters.input" 84 #include "FCALEMModuleParameters.input" 85 std::ifstream File 85 std::ifstream File 86 ("geom_data/FCal1Electrodes.dat"); 86 ("geom_data/FCal1Electrodes.dat"); 87 87 88 if(!File) G4cerr << "Failed to open file FC 88 if(!File) G4cerr << "Failed to open file FCal1Electrodes data file " << G4endl; 89 File.seekg(0); 89 File.seekg(0); 90 90 91 NF1LarGap = 0; 91 NF1LarGap = 0; 92 while(!(File.eof())) { 92 while(!(File.eof())) { 93 NF1LarGap++; 93 NF1LarGap++; 94 File >> F1LArGapID[NF1LarGap] >> F1LArGapP 94 File >> F1LArGapID[NF1LarGap] >> F1LArGapPosX[NF1LarGap] >> F1LArGapPosY[NF1LarGap] 95 >> F1LArIX[NF1LarGap] >> F1LArJY[NF1LarGap 95 >> F1LArIX[NF1LarGap] >> F1LArJY[NF1LarGap] >> F1LArITile[NF1LarGap]; 96 }; 96 }; 97 G4cout << "********" << " Number of Rods in 97 G4cout << "********" << " Number of Rods in FCAL1 : " << NF1LarGap-1 << G4endl;; 98 } 98 } 99 99 100 100 101 101 102 G4LogicalVolume * FCALEMModule::Construct() 102 G4LogicalVolume * FCALEMModule::Construct() 103 { 103 { 104 //----------------------------- 104 //----------------------------- 105 // construction of materials 105 // construction of materials 106 //----------------------------- 106 //----------------------------- 107 FCALMaterialConsultant *FCALMaterials = << 107 FCALMaterialConsultant * FCALMaterials = new FCALMaterialConsultant(); 108 FCALMaterialConsultant::GetInstance(); << 108 FCALMaterials->construct(); 109 109 110 G4VisAttributes * ColorOfEMModule = new G4Vi 110 G4VisAttributes * ColorOfEMModule = new G4VisAttributes(G4Colour(1.,0.,0.5)); 111 // G4VisAttributes * ColorOfLArg = new G4VisA 111 // G4VisAttributes * ColorOfLArg = new G4VisAttributes(G4Colour(0.,0.,1.)); 112 112 113 //---------------------------- 113 //---------------------------- 114 // Read Parameters 114 // Read Parameters 115 //---------------------------- 115 //---------------------------- 116 InitializeGeometry(); 116 InitializeGeometry(); 117 117 118 //----------------------------------------- 118 //----------------------------------------- 119 // Logical to be returned (FCAL EM module) 119 // Logical to be returned (FCAL EM module) 120 //----------------------------------------- 120 //----------------------------------------- 121 G4Tubs * SolidEmModule = 121 G4Tubs * SolidEmModule = 122 new G4Tubs("EmModuleSold", EmModuleRMin, E 122 new G4Tubs("EmModuleSold", EmModuleRMin, EmModuleRMax, EmModuleLenght, 123 EmModuleStartPhi,EmModuleDPhi); 123 EmModuleStartPhi,EmModuleDPhi); 124 G4LogicalVolume * LogicalEmModule = 124 G4LogicalVolume * LogicalEmModule = 125 new G4LogicalVolume(SolidEmModule, FCALMat 125 new G4LogicalVolume(SolidEmModule, FCALMaterials->Material("Copper"), 126 "EmModuleLogical"); 126 "EmModuleLogical"); 127 127 128 LogicalEmModule->SetSmartless(FCALEmSmart); 128 LogicalEmModule->SetSmartless(FCALEmSmart); 129 129 130 LogicalEmModule->SetVisAttributes(ColorOfEM 130 LogicalEmModule->SetVisAttributes(ColorOfEMModule); 131 // LogicalEmModule->SetVisAttributes(G4VisA << 131 // LogicalEmModule->SetVisAttributes(G4VisAttributes::Invisible); 132 132 133 133 134 //--------------------- 134 //--------------------- 135 // FCAL Cable Troff 135 // FCAL Cable Troff 136 //--------------------- 136 //--------------------- 137 G4Tubs * SolidF1CableTroff = 137 G4Tubs * SolidF1CableTroff = 138 new G4Tubs("F1CableTroffSolid", F1CableTro 138 new G4Tubs("F1CableTroffSolid", F1CableTroffRMin, F1CableTroffRMax, 139 F1CableTroffLenght, F1CableTroffStart 139 F1CableTroffLenght, F1CableTroffStartPhi, F1CableTroffDPhi); 140 G4LogicalVolume * LogicalF1CableTroff = 140 G4LogicalVolume * LogicalF1CableTroff = 141 new G4LogicalVolume(SolidF1CableTroff, FCA 141 new G4LogicalVolume(SolidF1CableTroff, FCALMaterials->Material("FCAL1CuArKap"), 142 "F1CableTroffLogical"); 142 "F1CableTroffLogical"); 143 143 144 G4ThreeVector F1CableTroffTrans(0.,0.,0.); 144 G4ThreeVector F1CableTroffTrans(0.,0.,0.); 145 G4RotationMatrix F1CableTroffRot; 145 G4RotationMatrix F1CableTroffRot; 146 146 147 G4int i=0; 147 G4int i=0; 148 for(i=0 ; i < NCableTroff ; i++) 148 for(i=0 ; i < NCableTroff ; i++) 149 { 149 { 150 // G4VPhysicalVolume * PhysicalF1CableTro 150 // G4VPhysicalVolume * PhysicalF1CableTroff = 151 new G4PVPlacement(G4Transform3D(F1CableTroff 151 new G4PVPlacement(G4Transform3D(F1CableTroffRot,F1CableTroffTrans), 152 LogicalF1CableTroff,"F1CableTroffPhysi 152 LogicalF1CableTroff,"F1CableTroffPhysical", 153 LogicalEmModule,0,i+1); 153 LogicalEmModule,0,i+1); 154 154 155 F1CableTroffRot.rotateZ(F1CableTroffRotZ 155 F1CableTroffRot.rotateZ(F1CableTroffRotZ); 156 } 156 } 157 157 158 LogicalF1CableTroff->SetVisAttributes(ColorO 158 LogicalF1CableTroff->SetVisAttributes(ColorOfEMModule); 159 // LogicalF1CableTroff->SetVisAttributes(G4V << 159 // LogicalF1CableTroff->SetVisAttributes(G4VisAttributes::Invisible); 160 160 161 161 162 //---------------------- 162 //---------------------- 163 // LArg gaps 163 // LArg gaps 164 //---------------------- 164 //---------------------- 165 165 166 G4Tubs * SolidF1LArGap = 166 G4Tubs * SolidF1LArGap = 167 new G4Tubs("F1LArGapSolid",F1LArGapRmin, F 167 new G4Tubs("F1LArGapSolid",F1LArGapRmin, F1LArGapRmax, F1LArGapLenght, 168 F1LArGapStartPhi,F1LArGapDPhi); 168 F1LArGapStartPhi,F1LArGapDPhi); 169 169 170 G4LogicalVolume * LogicalF1LArGap = 170 G4LogicalVolume * LogicalF1LArGap = 171 new G4LogicalVolume(SolidF1LArGap, FCALMa 171 new G4LogicalVolume(SolidF1LArGap, FCALMaterials->Material("LiquidArgon"), 172 "LArg Gap"); 172 "LArg Gap"); 173 173 174 for(i=1; i < NF1LarGap; i++){ 174 for(i=1; i < NF1LarGap; i++){ 175 // G4VPhysicalVolume * PhysicalF1LArGap = 175 // G4VPhysicalVolume * PhysicalF1LArGap = 176 new G4PVPlacement(0,G4ThreeVector(F1LAr 176 new G4PVPlacement(0,G4ThreeVector(F1LArGapPosX[i]*cm,F1LArGapPosY[i]*cm,0.*cm), 177 LogicalF1LArGap,"F1LArGapPhysical", Lo 177 LogicalF1LArGap,"F1LArGapPhysical", LogicalEmModule, 0, i); 178 }; 178 }; 179 179 180 // LogicalF1LArGap->SetVisAttributes(ColorO 180 // LogicalF1LArGap->SetVisAttributes(ColorOfLArg); 181 LogicalF1LArGap->SetVisAttributes(G4VisAttr << 181 LogicalF1LArGap->SetVisAttributes(G4VisAttributes::Invisible); 182 182 183 183 184 // Sensitive Volumes 184 // Sensitive Volumes 185 G4SDManager* SDman = G4SDManager::GetSDMpoi 185 G4SDManager* SDman = G4SDManager::GetSDMpointer(); 186 186 187 if(!FcalEmModuleSD) 187 if(!FcalEmModuleSD) 188 { 188 { 189 FcalEmModuleSD = new FCALEMModuleSD("FC 189 FcalEmModuleSD = new FCALEMModuleSD("FCALTB/EmModuleSD"); 190 SDman->AddNewDetector(FcalEmModuleSD); 190 SDman->AddNewDetector(FcalEmModuleSD); 191 } 191 } 192 LogicalF1LArGap->SetSensitiveDetector(FcalE 192 LogicalF1LArGap->SetSensitiveDetector(FcalEmModuleSD); 193 193 194 194 195 195 196 return LogicalEmModule; 196 return LogicalEmModule; 197 197 198 } 198 } 199 199 200 200 201 G4int FCALEMModule::GetF1TileID(G4int GapID) 201 G4int FCALEMModule::GetF1TileID(G4int GapID) 202 { return F1LArITile[GapID]; } 202 { return F1LArITile[GapID]; } 203 203 204 G4double FCALEMModule::GetF1LArGapPosX(G4int G 204 G4double FCALEMModule::GetF1LArGapPosX(G4int GapID) 205 { return F1LArGapPosX[GapID]; } 205 { return F1LArGapPosX[GapID]; } 206 206 207 207 208 208