00001 00002 00003 #include "G4Geo/MdcG4Geo.h" 00004 #include "G4Geo/BesG4Geo.h" 00005 #include "KalFitAlg/KalFitAlg.h" 00006 #include "KalFitAlg/KalFitTrack.h" 00007 #include "G4Material.hh" 00008 #include "G4Tubs.hh" 00009 #include "GDMLProcessor.hh" 00010 00011 00012 void KalFitAlg::setBesFromGdml(void){ 00013 00014 int i(0); 00015 double Z(0.),A(0.),Ionization(0.),Density(0.),Radlen(0.); 00016 00017 G4LogicalVolume *logicalMdc = 0; 00018 MdcG4Geo* aMdcG4Geo = new MdcG4Geo(); 00019 logicalMdc = aMdcG4Geo->GetTopVolume(); 00020 00022 G4Material* mdcMaterial = logicalMdc->GetMaterial(); 00023 00024 for(i=0; i<mdcMaterial->GetElementVector()->size(); i++){ 00025 Z += (mdcMaterial->GetElement(i)->GetZ())* 00026 (mdcMaterial->GetFractionVector()[i]); 00027 A += (mdcMaterial->GetElement(i)->GetA())* 00028 (mdcMaterial->GetFractionVector()[i]); 00029 } 00030 Ionization = mdcMaterial->GetIonisation()->GetMeanExcitationEnergy(); 00031 Density = mdcMaterial->GetDensity()/(g/cm3); 00032 Radlen = mdcMaterial->GetRadlen(); 00033 std::cout<<"mdcgas: Z: "<<Z<<" A: "<<(A/(g/mole))<<" Ionization: "<<(Ionization/eV)<<" Density: "<<Density<<" Radlen: "<<Radlen<<std::endl; 00034 KalFitMaterial FitMdcMaterial(Z,A/g/mole,Ionization/eV,Density,Radlen/10.); 00035 _BesKalmanFitMaterials.push_back(FitMdcMaterial); 00036 KalFitTrack::mdcGasRadlen_ = Radlen/10.; 00037 00039 G4LogicalVolume* innerWallFilm1Volume = const_cast<G4LogicalVolume*>(GDMLProcessor::GetInstance()->GetLogicalVolume("LogicalMdcInnerFilm1")); 00040 G4Material* innerWallFilm1Material = innerWallFilm1Volume->GetMaterial(); 00041 G4Tubs* innerwallFilm1Tub = dynamic_cast<G4Tubs*>(innerWallFilm1Volume->GetSolid()); 00042 00043 Z = 0.; 00044 A = 0.; 00045 for(i=0; i<innerWallFilm1Material->GetElementVector()->size(); i++){ 00046 Z += (innerWallFilm1Material->GetElement(i)->GetZ())* 00047 (innerWallFilm1Material->GetFractionVector()[i]); 00048 A += (innerWallFilm1Material->GetElement(i)->GetA())* 00049 (innerWallFilm1Material->GetFractionVector()[i]); 00050 } 00051 00052 Ionization = innerWallFilm1Material->GetIonisation()->GetMeanExcitationEnergy(); 00053 Density = innerWallFilm1Material->GetDensity()/(g/cm3); 00054 Radlen = innerWallFilm1Material->GetRadlen(); 00055 std::cout<<"Mdc innerwall Film1, Al: Z: "<<Z<<" A: "<<(A/(g/mole))<<" Ionization: "<<(Ionization/eV)<<" Density: "<<Density<<" Radlen: "<<Radlen<<std::endl; 00056 KalFitMaterial FitInnerwallFilm1Material(Z,A/g/mole,Ionization/eV,Density,Radlen/10.); 00057 _BesKalmanFitMaterials.push_back(FitInnerwallFilm1Material); 00058 00059 00061 G4LogicalVolume* innerwallVolume = const_cast<G4LogicalVolume*>(GDMLProcessor::GetInstance()->GetLogicalVolume("logicalMdcSegment2")); 00062 G4Material* innerwallMaterial = innerwallVolume->GetMaterial(); 00063 G4Tubs* innerwallTub = dynamic_cast<G4Tubs*>(innerwallVolume->GetSolid()); 00064 00065 Z = 0.; 00066 A = 0.; 00067 for(i=0; i<innerwallMaterial->GetElementVector()->size(); i++){ 00068 Z += (innerwallMaterial->GetElement(i)->GetZ())* 00069 (innerwallMaterial->GetFractionVector()[i]); 00070 A += (innerwallMaterial->GetElement(i)->GetA())* 00071 (innerwallMaterial->GetFractionVector()[i]); 00072 } 00073 00074 Ionization = innerwallMaterial->GetIonisation()->GetMeanExcitationEnergy(); 00075 Density = innerwallMaterial->GetDensity()/(g/cm3); 00076 Radlen = innerwallMaterial->GetRadlen(); 00077 std::cout<<"Mdc innerwall, Al: Z: "<<Z<<" A: "<<(A/(g/mole))<<" Ionization: "<<(Ionization/eV)<<" Density: "<<Density<<" Radlen: "<<Radlen<<std::endl; 00078 KalFitMaterial FitInnerwallMaterial(Z,A/g/mole,Ionization/eV,Density,Radlen/10.); 00079 _BesKalmanFitMaterials.push_back(FitInnerwallMaterial); 00080 00082 G4LogicalVolume* innerWallFilm0Volume = const_cast<G4LogicalVolume*>(GDMLProcessor::GetInstance()->GetLogicalVolume("LogicalMdcInnerFilm0")); 00083 G4Material* innerWallFilm0Material = innerWallFilm0Volume->GetMaterial(); 00084 G4Tubs* innerwallFilm0Tub = dynamic_cast<G4Tubs*>(innerWallFilm0Volume->GetSolid()); 00085 00086 Z = 0.; 00087 A = 0.; 00088 for(i=0; i<innerWallFilm0Material->GetElementVector()->size(); i++){ 00089 Z += (innerWallFilm0Material->GetElement(i)->GetZ())* 00090 (innerWallFilm0Material->GetFractionVector()[i]); 00091 A += (innerWallFilm0Material->GetElement(i)->GetA())* 00092 (innerWallFilm0Material->GetFractionVector()[i]); 00093 } 00094 00095 Ionization = innerWallFilm0Material->GetIonisation()->GetMeanExcitationEnergy(); 00096 Density = innerWallFilm0Material->GetDensity()/(g/cm3); 00097 Radlen = innerWallFilm0Material->GetRadlen(); 00098 std::cout<<"Mdc innerwall Film0, Al: Z: "<<Z<<" A: "<<(A/(g/mole))<<" Ionization: "<<(Ionization/eV)<<" Density: "<<Density<<" Radlen: "<<Radlen<<std::endl; 00099 KalFitMaterial FitInnerwallFilm0Material(Z,A/g/mole,Ionization/eV,Density,Radlen/10.); 00100 _BesKalmanFitMaterials.push_back(FitInnerwallFilm0Material); 00101 00103 G4LogicalVolume *logicalBes = 0; 00104 BesG4Geo* aBesG4Geo = new BesG4Geo(); 00105 logicalBes = aBesG4Geo->GetTopVolume(); 00106 00108 G4LogicalVolume* logicalAirVolume = const_cast<G4LogicalVolume*>(GDMLProcessor::GetInstance()->GetLogicalVolume("logicalWorld")); 00109 G4Material* airMaterial = logicalAirVolume->GetMaterial(); 00110 Z = 0.; 00111 A = 0.; 00112 for(i=0; i<airMaterial->GetElementVector()->size(); i++){ 00113 Z += (airMaterial->GetElement(i)->GetZ())* 00114 (airMaterial->GetFractionVector()[i]); 00115 A += (airMaterial->GetElement(i)->GetA())* 00116 (airMaterial->GetFractionVector()[i]); 00117 } 00118 00119 Ionization = airMaterial->GetIonisation()->GetMeanExcitationEnergy(); 00120 Density = airMaterial->GetDensity()/(g/cm3); 00121 Radlen = airMaterial->GetRadlen(); 00122 std::cout<<"air: Z: "<<Z<<" A: "<<(A/(g/mole))<<" Ionization: "<<(Ionization/eV)<<" Density: "<<Density<<" Radlen: "<<Radlen<<std::endl; 00123 KalFitMaterial FitAirMaterial(Z,A/g/mole,Ionization/eV,Density,Radlen/10.); 00124 _BesKalmanFitMaterials.push_back(FitAirMaterial); 00125 00127 G4LogicalVolume* logicalOuterBeVolume = const_cast<G4LogicalVolume*>(GDMLProcessor::GetInstance()->GetLogicalVolume("logicalouterBe")); 00128 G4Material* outerBeMaterial = logicalOuterBeVolume->GetMaterial(); 00129 00130 G4Tubs* outerBeTub = dynamic_cast<G4Tubs*>(logicalOuterBeVolume->GetSolid()); 00131 Z = 0.; 00132 A = 0.; 00133 for(i=0; i<outerBeMaterial->GetElementVector()->size(); i++){ 00134 Z += (outerBeMaterial->GetElement(i)->GetZ())* 00135 (outerBeMaterial->GetFractionVector()[i]); 00136 A += (outerBeMaterial->GetElement(i)->GetA())* 00137 (outerBeMaterial->GetFractionVector()[i]); 00138 } 00139 Ionization = outerBeMaterial->GetIonisation()->GetMeanExcitationEnergy(); 00140 Density = outerBeMaterial->GetDensity()/(g/cm3); 00141 Radlen = outerBeMaterial->GetRadlen(); 00142 std::cout<<"outer beryllium: Z: "<<Z<<" A: "<<(A/(g/mole))<<" Ionization: "<<(Ionization/eV)<<" Density: "<<Density<<" Radlen: "<<Radlen<<std::endl; 00143 KalFitMaterial FitOuterBeMaterial(Z,A/g/mole,Ionization/eV,Density,Radlen/10.); 00144 _BesKalmanFitMaterials.push_back(FitOuterBeMaterial); 00145 00146 00148 G4LogicalVolume* logicalOilLayerVolume = const_cast<G4LogicalVolume*>(GDMLProcessor::GetInstance()->GetLogicalVolume("logicaloilLayer")); 00149 G4Material* oilLayerMaterial = logicalOilLayerVolume->GetMaterial(); 00150 G4Tubs* oilLayerTub = dynamic_cast<G4Tubs*>(logicalOilLayerVolume->GetSolid()); 00151 00152 Z = 0.; 00153 A = 0.; 00154 for(i=0; i<oilLayerMaterial->GetElementVector()->size(); i++){ 00155 Z += (oilLayerMaterial->GetElement(i)->GetZ())* 00156 (oilLayerMaterial->GetFractionVector()[i]); 00157 A += (oilLayerMaterial->GetElement(i)->GetA())* 00158 (oilLayerMaterial->GetFractionVector()[i]); 00159 } 00160 Ionization = oilLayerMaterial->GetIonisation()->GetMeanExcitationEnergy(); 00161 Density = oilLayerMaterial->GetDensity()/(g/cm3); 00162 Radlen = oilLayerMaterial->GetRadlen(); 00163 std::cout<<"cooling oil: Z: "<<Z<<" A: "<<(A/(g/mole))<<" Ionization: "<<(Ionization/eV)<<" Density: "<<Density<<" Radlen: "<<Radlen<<std::endl; 00164 KalFitMaterial FitOilLayerMaterial(Z,A/g/mole,Ionization/eV,Density,Radlen/10.); 00165 _BesKalmanFitMaterials.push_back(FitOilLayerMaterial); 00166 00167 00169 G4LogicalVolume* logicalInnerBeVolume = const_cast<G4LogicalVolume*>(GDMLProcessor::GetInstance()->GetLogicalVolume("logicalinnerBe")); 00170 G4Material* innerBeMaterial = logicalInnerBeVolume->GetMaterial(); 00171 G4Tubs* innerBeTub = dynamic_cast<G4Tubs*>(logicalInnerBeVolume->GetSolid()); 00172 Z = 0.; 00173 A = 0.; 00174 for(i=0; i<innerBeMaterial->GetElementVector()->size(); i++){ 00175 Z += (innerBeMaterial->GetElement(i)->GetZ())* 00176 (innerBeMaterial->GetFractionVector()[i]); 00177 A += (innerBeMaterial->GetElement(i)->GetA())* 00178 (innerBeMaterial->GetFractionVector()[i]); 00179 } 00180 00181 Ionization = innerBeMaterial->GetIonisation()->GetMeanExcitationEnergy(); 00182 Density = innerBeMaterial->GetDensity()/(g/cm3); 00183 Radlen = innerBeMaterial->GetRadlen(); 00184 std::cout<<"inner beryllium: Z: "<<Z<<" A: "<<(A/(g/mole))<<" Ionization: "<<(Ionization/eV)<<" Density: "<<Density<<" Radlen: "<<Radlen<<std::endl; 00185 KalFitMaterial FitInnerBeMaterial(Z,A/g/mole,Ionization/eV,Density,Radlen/10.); 00186 _BesKalmanFitMaterials.push_back(FitInnerBeMaterial); 00187 00188 00190 G4LogicalVolume* logicalGoldLayerVolume = const_cast<G4LogicalVolume*>(GDMLProcessor::GetInstance()->GetLogicalVolume("logicalgoldLayer")); 00191 G4Material* goldLayerMaterial = logicalGoldLayerVolume->GetMaterial(); 00192 G4Tubs* goldLayerTub = dynamic_cast<G4Tubs*>(logicalGoldLayerVolume->GetSolid()); 00193 00194 Z = 0.; 00195 A = 0.; 00196 for(i=0; i<goldLayerMaterial->GetElementVector()->size(); i++){ 00197 Z += (goldLayerMaterial->GetElement(i)->GetZ())* 00198 (goldLayerMaterial->GetFractionVector()[i]); 00199 A += (goldLayerMaterial->GetElement(i)->GetA())* 00200 (goldLayerMaterial->GetFractionVector()[i]); 00201 } 00202 Ionization = goldLayerMaterial->GetIonisation()->GetMeanExcitationEnergy(); 00203 Density = goldLayerMaterial->GetDensity()/(g/cm3); 00204 Radlen = goldLayerMaterial->GetRadlen(); 00205 std::cout<<"gold layer: Z: "<<Z<<" A: "<<(A/(g/mole))<<" Ionization: "<<(Ionization/eV)<<" Density: "<<Density<<" Radlen: "<<Radlen<<std::endl; 00206 KalFitMaterial FitGoldLayerMaterial(Z,A/g/mole,Ionization/eV,Density,Radlen/10.); 00207 _BesKalmanFitMaterials.push_back(FitGoldLayerMaterial); 00208 00209 00211 double radius, thick, length , z0; 00212 00214 radius = innerwallFilm1Tub->GetInnerRadius()/(cm); 00215 thick = innerwallFilm1Tub->GetOuterRadius()/(cm) - innerwallFilm1Tub->GetInnerRadius()/(cm); 00216 length = 2.0*innerwallFilm1Tub->GetZHalfLength()/(cm); 00217 z0 = 0.0; 00218 std::cout<<"innerwallFilm1: "<<" radius: "<<radius<<" thick:"<<thick<<" length: "<<length<<std::endl; 00219 KalFitCylinder innerwallFilm1Cylinder(&_BesKalmanFitMaterials[1], radius, thick, length , z0); 00220 _BesKalmanFitWalls.push_back(innerwallFilm1Cylinder); 00221 00222 00224 radius = innerwallTub->GetInnerRadius()/(cm); 00225 thick = innerwallTub->GetOuterRadius()/(cm) - innerwallTub->GetInnerRadius()/(cm); 00226 length = 2.0*innerwallTub->GetZHalfLength()/(cm); 00227 z0 = 0.0; 00228 std::cout<<"innerwall: "<<" radius: "<<radius<<" thick:"<<thick<<" length: "<<length<<std::endl; 00229 KalFitCylinder innerwallCylinder(&_BesKalmanFitMaterials[2], radius, thick, length , z0); 00230 _BesKalmanFitWalls.push_back(innerwallCylinder); 00231 00233 radius = innerwallFilm0Tub->GetInnerRadius()/(cm); 00234 thick = innerwallFilm0Tub->GetOuterRadius()/(cm) - innerwallFilm0Tub->GetInnerRadius()/(cm); 00235 length = 2.0*innerwallFilm0Tub->GetZHalfLength()/(cm); 00236 z0 = 0.0; 00237 std::cout<<"innerwallFilm0: "<<" radius: "<<radius<<" thick:"<<thick<<" length: "<<length<<std::endl; 00238 KalFitCylinder innerwallFilm0Cylinder(&_BesKalmanFitMaterials[3], radius, thick, length , z0); 00239 _BesKalmanFitWalls.push_back(innerwallFilm0Cylinder); 00240 00242 radius = outerBeTub->GetOuterRadius()/(cm); 00243 thick = innerwallTub->GetInnerRadius()/(cm) - outerBeTub->GetOuterRadius()/(cm); 00244 length = 2.0*innerwallTub->GetZHalfLength()/(cm); 00245 z0 = 0.0; 00246 std::cout<<"outer air: "<<" radius: "<<radius<<" thick:"<<thick<<" length: "<<length<<std::endl; 00247 KalFitCylinder outerAirCylinder(&_BesKalmanFitMaterials[4], radius, thick, length , z0); 00248 _BesKalmanFitWalls.push_back(outerAirCylinder); 00249 00251 radius = outerBeTub->GetInnerRadius()/(cm); 00252 thick = outerBeTub->GetOuterRadius()/(cm) - outerBeTub->GetInnerRadius()/(cm); 00253 length = 2.0*outerBeTub->GetZHalfLength()/(cm); 00254 z0 = 0.0; 00255 std::cout<<"outer Be: "<<" radius: "<<radius<<" thick:"<<thick<<" length: "<<length<<std::endl; 00256 KalFitCylinder outerBeCylinder(&_BesKalmanFitMaterials[5], radius, thick, length , z0); 00257 _BesKalmanFitWalls.push_back(outerBeCylinder); 00258 00260 radius = oilLayerTub->GetInnerRadius()/(cm); 00261 thick = oilLayerTub->GetOuterRadius()/(cm) - oilLayerTub->GetInnerRadius()/(cm); 00262 length = 2.0*oilLayerTub->GetZHalfLength()/(cm); 00263 z0 = 0.0; 00264 std::cout<<"oil layer: "<<" radius: "<<radius<<" thick:"<<thick<<" length: "<<length<<std::endl; 00265 KalFitCylinder oilLayerCylinder(&_BesKalmanFitMaterials[6], radius, thick, length , z0); 00266 _BesKalmanFitWalls.push_back(oilLayerCylinder); 00267 00269 radius = innerBeTub->GetInnerRadius()/(cm); 00270 thick = innerBeTub->GetOuterRadius()/(cm) - innerBeTub->GetInnerRadius()/(cm); 00271 length = 2.0*innerBeTub->GetZHalfLength()/(cm); 00272 z0 = 0.0; 00273 std::cout<<"inner Be: "<<" radius: "<<radius<<" thick:"<<thick<<" length: "<<length<<std::endl; 00274 KalFitCylinder innerBeCylinder(&_BesKalmanFitMaterials[7], radius, thick, length , z0); 00275 _BesKalmanFitWalls.push_back(innerBeCylinder); 00276 00278 radius = goldLayerTub->GetInnerRadius()/(cm); 00279 thick = goldLayerTub->GetOuterRadius()/(cm) - goldLayerTub->GetInnerRadius()/(cm); 00280 length = 2.0*goldLayerTub->GetZHalfLength()/(cm); 00281 z0 = 0.0; 00282 std::cout<<"gold layer: "<<" radius: "<<radius<<" thick:"<<thick<<" length: "<<length<<std::endl; 00283 KalFitCylinder goldLayerCylinder(&_BesKalmanFitMaterials[8], radius, thick, length , z0); 00284 _BesKalmanFitWalls.push_back(goldLayerCylinder); 00285 } 00286 00287 00288 00289