Go to the documentation of this file.00001 #include "Validation/Geometry/interface/MaterialBudgetCategorizer.h"
00002
00003
00004 #include "G4LogicalVolumeStore.hh"
00005 #include "G4Material.hh"
00006 #include "G4UnitsTable.hh"
00007 #include "G4EmCalculator.hh"
00008 #include "G4UnitsTable.hh"
00009
00010
00011 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00012 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00013
00014
00015 #include <fstream>
00016 #include <vector>
00017
00018 using namespace std;
00019
00020 MaterialBudgetCategorizer::MaterialBudgetCategorizer()
00021 {
00022 buildMaps();
00023 }
00024
00025 void MaterialBudgetCategorizer::buildMaps()
00026 {
00027
00028 G4LogicalVolumeStore* lvs = G4LogicalVolumeStore::GetInstance();
00029 G4LogicalVolumeStore::iterator ite;
00030 int ii = 0;
00031 for (ite = lvs->begin(); ite != lvs->end(); ite++) {
00032 theVolumeMap[(*ite)->GetName()] = ii++;
00033 }
00034
00035
00036 const G4MaterialTable* matTable = G4Material::GetMaterialTable();
00037 G4int matSize = matTable->size();
00038 for( ii = 0; ii < matSize; ii++ ) {
00039 theMaterialMap[ (*matTable)[ii]->GetName()] = ii+1;
00040 }
00041
00042
00043
00044
00045 for( int ii = 0; ii < matSize; ii++ ) {
00046 float sup,sen,cab,col,ele,oth,air;
00047 sup=sen=cab=col=ele=0.;
00048 oth=1.;
00049 air=0;
00050 cout << " material " << (*matTable)[ii]->GetName() << " prepared"
00051 << endl;
00052 if((*matTable)[ii]->GetName()=="Air"
00053 ||
00054 (*matTable)[ii]->GetName()=="Vacuum"
00055 ) {
00056 air=1.000;
00057 oth=0.000;
00058 }
00059
00060 if((*matTable)[ii]->GetName()=="Carbon fibre str.") {
00061 sup=1.000;
00062 oth=0.000;
00063 }
00064
00065 theX0Map[ (*matTable)[ii]->GetName() ].push_back(sup);
00066 theX0Map[ (*matTable)[ii]->GetName() ].push_back(sen);
00067 theX0Map[ (*matTable)[ii]->GetName() ].push_back(cab);
00068 theX0Map[ (*matTable)[ii]->GetName() ].push_back(col);
00069 theX0Map[ (*matTable)[ii]->GetName() ].push_back(ele);
00070 theX0Map[ (*matTable)[ii]->GetName() ].push_back(oth);
00071 theX0Map[ (*matTable)[ii]->GetName() ].push_back(air);
00072
00073 theL0Map[ (*matTable)[ii]->GetName() ].push_back(sup);
00074 theL0Map[ (*matTable)[ii]->GetName() ].push_back(sen);
00075 theL0Map[ (*matTable)[ii]->GetName() ].push_back(cab);
00076 theL0Map[ (*matTable)[ii]->GetName() ].push_back(col);
00077 theL0Map[ (*matTable)[ii]->GetName() ].push_back(ele);
00078 theL0Map[ (*matTable)[ii]->GetName() ].push_back(oth);
00079 theL0Map[ (*matTable)[ii]->GetName() ].push_back(air);
00080 }
00081
00082
00083
00084 cout << endl << endl << "MaterialBudgetCategorizer::Fill X0 Map" << endl;
00085 std::string theMaterialX0FileName = edm::FileInPath("Validation/Geometry/data/trackerMaterials.x0").fullPath();
00086 buildCategoryMap(theMaterialX0FileName, theX0Map);
00087
00088 cout << endl << endl << "MaterialBudgetCategorizer::Fill L0 Map" << endl;
00089 std::string theMaterialL0FileName = edm::FileInPath("Validation/Geometry/data/trackerMaterials.l0").fullPath();
00090 buildCategoryMap(theMaterialL0FileName, theL0Map);
00091
00092 cout << endl << endl << "MaterialBudgetCategorizer::Material Summary --------" << endl;
00093 G4EmCalculator calc;
00094 for( ii = 0; ii < matSize; ii++ ) {
00095
00096 cout << " material " << (*matTable)[ii]->GetName()
00097 << endl
00098 << "\t density = " << G4BestUnit((*matTable)[ii]->GetDensity(),"Volumic Mass")
00099 << endl
00100 << "\t X0 = " << (*matTable)[ii]->GetRadlen() << " mm"
00101 << endl
00102 << "\t Energy threshold for photons for 100 mm range = "
00103 << G4BestUnit(calc.ComputeEnergyCutFromRangeCut(100, G4String("gamma"), (*matTable)[ii]->GetName()) , "Energy")
00104 << endl
00105 << " SUP " << theX0Map[ (*matTable)[ii]->GetName() ][0]
00106 << " SEN " << theX0Map[ (*matTable)[ii]->GetName() ][1]
00107 << " CAB " << theX0Map[ (*matTable)[ii]->GetName() ][2]
00108 << " COL " << theX0Map[ (*matTable)[ii]->GetName() ][3]
00109 << " ELE " << theX0Map[ (*matTable)[ii]->GetName() ][4]
00110 << " OTH " << theX0Map[ (*matTable)[ii]->GetName() ][5]
00111 << " AIR " << theX0Map[ (*matTable)[ii]->GetName() ][6]
00112 << endl
00113 << "\t Lambda0 = " << (*matTable)[ii]->GetNuclearInterLength() << " mm"
00114 << endl
00115 << " SUP " << theL0Map[ (*matTable)[ii]->GetName() ][0]
00116 << " SEN " << theL0Map[ (*matTable)[ii]->GetName() ][1]
00117 << " CAB " << theL0Map[ (*matTable)[ii]->GetName() ][2]
00118 << " COL " << theL0Map[ (*matTable)[ii]->GetName() ][3]
00119 << " ELE " << theL0Map[ (*matTable)[ii]->GetName() ][4]
00120 << " OTH " << theL0Map[ (*matTable)[ii]->GetName() ][5]
00121 << " AIR " << theL0Map[ (*matTable)[ii]->GetName() ][6]
00122 << endl;
00123 if( theX0Map[ (*matTable)[ii]->GetName() ][5] == 1 || theL0Map[ (*matTable)[ii]->GetName() ][5] == 1 )
00124 std::cout << "WARNING: material with no category: " << (*matTable)[ii]->GetName() << std::endl;
00125 }
00126
00127
00128
00129 }
00130
00131 void MaterialBudgetCategorizer::buildCategoryMap(std::string theMaterialFileName, std::map<std::string,std::vector<float> >& theMap) {
00132
00133
00134
00135 std::ifstream theMaterialFile(theMaterialFileName.c_str());
00136 if (!theMaterialFile)
00137 cms::Exception("LogicError") <<" File not found " << theMaterialFile;
00138
00139
00140 float sup,sen,cab,col,ele,oth,air;
00141 sup=sen=cab=col=ele=0.;
00142 oth=1.;
00143 air=0;
00144
00145
00146 std::string materialName;
00147 while(theMaterialFile) {
00148 theMaterialFile >> materialName;
00149 theMaterialFile >> sup >> sen >> cab >> col >> ele;
00150 oth = 0.000;
00151 air = 0.000;
00152 theMap[materialName].clear();
00153 theMap[materialName].push_back(sup);
00154 theMap[materialName].push_back(sen);
00155 theMap[materialName].push_back(cab);
00156 theMap[materialName].push_back(col);
00157 theMap[materialName].push_back(ele);
00158 theMap[materialName].push_back(oth);
00159 theMap[materialName].push_back(air);
00160 cout << " material " << materialName << " filled "
00161 << " SUP " << sup
00162 << " SEN " << sen
00163 << " CAB " << cab
00164 << " COL " << col
00165 << " ELE " << ele
00166 << " OTH " << oth
00167 << " AIR " << air
00168 << endl;
00169 }
00170
00171 }