#include <SimG4CMS/Calo/interface/HFShowerParam.h>
Public Member Functions | |
int | getDepth (int i) |
std::vector< double > | getHits (G4Step *aStep) |
G4ThreeVector | getPosHit (int i) |
double | getTSlice (int i) |
HFShowerParam (std::string &name, const DDCompactView &cpv, edm::ParameterSet const &p) | |
virtual | ~HFShowerParam () |
Private Member Functions | |
std::vector< double > | getDDDArray (const std::string &, const DDsvalues_type &) |
Private Attributes | |
HFFibre * | fibre |
std::vector< double > | gpar |
std::vector< Hit > | hits |
double | pePerGeV |
bool | trackEM |
Classes | |
struct | Hit |
Definition at line 21 of file HFShowerParam.h.
HFShowerParam::HFShowerParam | ( | std::string & | name, | |
const DDCompactView & | cpv, | |||
edm::ParameterSet const & | p | |||
) |
Definition at line 19 of file HFShowerParam.cc.
References DDFilteredView::addFilter(), DDSpecificsFilter::equals, Exception, fibre, filter, DDFilteredView::firstChild(), getDDDArray(), edm::ParameterSet::getParameter(), gpar, DDFilteredView::mergedSpecifics(), pePerGeV, DDSpecificsFilter::setCriteria(), sv, trackEM, and value.
00020 : fibre(0) { 00021 00022 edm::ParameterSet m_HF = p.getParameter<edm::ParameterSet>("HFShower"); 00023 pePerGeV = m_HF.getParameter<double>("PEPerGeV"); 00024 trackEM = m_HF.getParameter<bool>("TrackEM"); 00025 edm::LogInfo("HFShower") << "HFShowerParam:: P.E. per GeV " << pePerGeV 00026 << " and Track EM Flag " << trackEM; 00027 00028 G4String attribute = "ReadOutName"; 00029 G4String value = name; 00030 DDSpecificsFilter filter; 00031 DDValue ddv(attribute,value,0); 00032 filter.setCriteria(ddv,DDSpecificsFilter::equals); 00033 DDFilteredView fv(cpv); 00034 fv.addFilter(filter); 00035 bool dodet = fv.firstChild(); 00036 if (dodet) { 00037 DDsvalues_type sv(fv.mergedSpecifics()); 00038 00039 //Special Geometry parameters 00040 gpar = getDDDArray("gparHF",sv); 00041 edm::LogInfo("HFShower") << "HFShowerParam: " <<gpar.size() <<" gpar (cm)"; 00042 for (unsigned int ig=0; ig<gpar.size(); ig++) 00043 edm::LogInfo("HFShower") << "HFShowerParam: gpar[" << ig << "] = " 00044 << gpar[ig]/cm << " cm"; 00045 } else { 00046 edm::LogError("HFShower") << "HFShowerParam: cannot get filtered " 00047 << " view for " << attribute << " matching " 00048 << name; 00049 throw cms::Exception("Unknown", "HFShowerParam") 00050 << "cannot match " << attribute << " to " << name <<"\n"; 00051 } 00052 00053 fibre = new HFFibre(name, cpv, p); 00054 }
HFShowerParam::~HFShowerParam | ( | ) | [virtual] |
std::vector< double > HFShowerParam::getDDDArray | ( | const std::string & | str, | |
const DDsvalues_type & | sv | |||
) | [private] |
Definition at line 147 of file HFShowerParam.cc.
References DDfetch(), DDValue::doubles(), Exception, LogDebug, and value.
Referenced by HFShowerParam().
00148 { 00149 00150 LogDebug("HFShower") << "HFShowerParam:getDDDArray called for " << str; 00151 00152 DDValue value(str); 00153 if (DDfetch(&sv,value)) { 00154 LogDebug("HFShower") << value; 00155 const std::vector<double> & fvec = value.doubles(); 00156 int nval = fvec.size(); 00157 if (nval < 2) { 00158 edm::LogError("HFShower") << "HFShowerParam : # of " << str 00159 << " bins " << nval << " < 2 ==> illegal"; 00160 throw cms::Exception("Unknown", "HFShowerParam") 00161 << "nval < 2 for array " << str << "\n"; 00162 } 00163 00164 return fvec; 00165 } else { 00166 edm::LogError("HFShower") << "HFShowerParam : cannot get array " << str; 00167 throw cms::Exception("Unknown", "HFShowerParam") 00168 << "cannot get array " << str << "\n"; 00169 } 00170 }
Definition at line 129 of file HFShowerParam.cc.
References hits, and LogDebug.
Referenced by HCalSD::getFromParam().
00129 { 00130 00131 int depth = 0; 00132 if (i < static_cast<int>(hits.size())) depth = (hits[i].depth); 00133 LogDebug("HFShower") << "HFShowerParam::getDepth (" << i << "/" 00134 << hits.size() << ") " << depth; 00135 return depth; 00136 }
std::vector< double > HFShowerParam::getHits | ( | G4Step * | aStep | ) |
Definition at line 60 of file HFShowerParam.cc.
References funct::abs(), HFShowerParam::Hit::depth, fibre, gpar, hits, pePerGeV, HFShowerParam::Hit::position, HFShowerParam::Hit::time, track, trackEM, and HFFibre::tShift().
Referenced by HCalSD::getFromParam().
00060 { 00061 00062 std::vector<double> edeps; 00063 hits.clear(); 00064 00065 G4StepPoint * preStepPoint = aStep->GetPreStepPoint(); 00066 G4Track * track = aStep->GetTrack(); 00067 G4ThreeVector hitPoint = preStepPoint->GetPosition(); 00068 G4String partType = track->GetDefinition()->GetParticleName(); 00069 G4ThreeVector localPoint = (preStepPoint->GetTouchable()->GetHistory()->GetTopTransform()).TransformPoint(hitPoint); 00070 double pin = (preStepPoint->GetTotalEnergy())/GeV; 00071 double zint = hitPoint.z(); 00072 double zz = std::abs(zint) - gpar[4]; 00073 00074 edm::LogInfo("HFShower") << "HFShowerParam: getHits " << partType 00075 << " of energy " << pin << " GeV" 00076 << " Pos x,y,z = " << hitPoint.x() << "," 00077 << hitPoint.y() << "," << zint << " (" << zz << "," 00078 << localPoint.z() << ", " << (localPoint.z()+0.5*gpar[1]) << ")"; 00079 00080 HFShowerParam::Hit hit; 00081 hit.position = hitPoint; 00082 // take only e+-/gamma 00083 if (partType == "e-" || partType == "e+" || partType == "gamma" ) { 00084 // Leave out the last part 00085 double edep = 0.; 00086 bool kill = false; 00087 if ((!trackEM) && (zz < (gpar[1]-gpar[2]))) { 00088 edep = pin; 00089 kill = true; 00090 } else { 00091 edep = (aStep->GetTotalEnergyDeposit())/GeV; 00092 } 00093 if (edep > 0) { 00094 edep *= 0.5*pePerGeV; 00095 double tSlice = (aStep->GetPostStepPoint()->GetGlobalTime()); 00096 00097 double time = fibre->tShift(hitPoint,1,false); // remaining part 00098 hit.depth = 1; 00099 hit.time = tSlice+time; 00100 edeps.push_back(edep); 00101 hits.push_back(hit); 00102 if (zz >= gpar[0]) { 00103 time = fibre->tShift(hitPoint,2,false); 00104 hit.depth = 2; 00105 hit.time = tSlice+time; 00106 edeps.push_back(edep); 00107 hits.push_back(hit); 00108 } 00109 if (kill) track->SetTrackStatus(fStopAndKill); 00110 edm::LogInfo("HFShower") << "HFShowerParam: getHits kill (" << kill 00111 << ") track " << track->GetTrackID() 00112 << " and deposit " << edep << " " <<edeps.size() 00113 << " times" << " ZZ " << zz << " " << gpar[0]; 00114 } 00115 } 00116 00117 return edeps; 00118 00119 }
G4ThreeVector HFShowerParam::getPosHit | ( | int | i | ) |
Definition at line 120 of file HFShowerParam.cc.
References hits, and LogDebug.
Referenced by HCalSD::getFromParam().
00120 { 00121 00122 G4ThreeVector pos; 00123 if (i < static_cast<int>(hits.size())) pos = (hits[i].position); 00124 LogDebug("HFShower") << "HFShowerParam::getPosHit (" << i << "/" 00125 << hits.size() << ") " << pos; 00126 return pos; 00127 }
double HFShowerParam::getTSlice | ( | int | i | ) |
Definition at line 138 of file HFShowerParam.cc.
References hits, and LogDebug.
Referenced by HCalSD::getFromParam().
00138 { 00139 00140 double tim = 0.; 00141 if (i < static_cast<int>(hits.size())) tim = (hits[i].time); 00142 LogDebug("HFShower") << "HFShowerParam::getTSlice (" << i << "/" 00143 << hits.size()<< ") " << tim; 00144 return tim; 00145 }
HFFibre* HFShowerParam::fibre [private] |
Definition at line 46 of file HFShowerParam.h.
Referenced by getHits(), HFShowerParam(), and ~HFShowerParam().
std::vector<double> HFShowerParam::gpar [private] |
std::vector<Hit> HFShowerParam::hits [private] |
Definition at line 50 of file HFShowerParam.h.
Referenced by getDepth(), getHits(), getPosHit(), and getTSlice().
double HFShowerParam::pePerGeV [private] |
bool HFShowerParam::trackEM [private] |