#include <HFFibre.h>
Public Member Functions | |
double | attLength (double lambda) |
HFFibre (std::string &name, const DDCompactView &cpv, edm::ParameterSet const &p) | |
double | tShift (G4ThreeVector point, int depth, int fromEndAbs=0) |
double | zShift (G4ThreeVector point, int depth, int fromEndAbs=0) |
~HFFibre () | |
Protected Member Functions | |
std::vector< double > | getDDDArray (const std::string &, const DDsvalues_type &, int &) |
Private Attributes | |
std::vector< double > | attL |
double | cFibre |
std::vector< double > | gpar |
double | lambLim [2] |
std::vector< double > | longFL |
int | nBinAtt |
int | nBinR |
std::vector< double > | radius |
std::vector< double > | shortFL |
HFFibre::HFFibre | ( | std::string & | name, |
const DDCompactView & | cpv, | ||
edm::ParameterSet const & | p | ||
) |
Definition at line 18 of file HFFibre.cc.
References DDFilteredView::addFilter(), attL, cFibre, DDSpecificsFilter::equals, Exception, DDFilteredView::firstChild(), getDDDArray(), edm::ParameterSet::getParameter(), gpar, i, lambLim, longFL, DDFilteredView::mergedSpecifics(), AlCaRecoCosmics_cfg::name, nBinAtt, nBinR, radius, DDSpecificsFilter::setCriteria(), shortFL, and relativeConstraints::value.
{ edm::ParameterSet m_HF = p.getParameter<edm::ParameterSet>("HFShower"); cFibre = c_light*(m_HF.getParameter<double>("CFibre")); edm::LogInfo("HFShower") << "HFFibre:: Speed of light in fibre " << cFibre << " m/ns"; std::string attribute = "Volume"; std::string value = "HF"; DDSpecificsFilter filter1; DDValue ddv1(attribute,value,0); filter1.setCriteria(ddv1,DDSpecificsFilter::equals); DDFilteredView fv1(cpv); fv1.addFilter(filter1); bool dodet = fv1.firstChild(); if (dodet) { DDsvalues_type sv(fv1.mergedSpecifics()); // Attenuation length nBinAtt = -1; attL = getDDDArray("attl",sv,nBinAtt); edm::LogInfo("HFShower") << "HFFibre: " << nBinAtt << " attL "; for (int it=0; it<nBinAtt; it++) edm::LogInfo("HFShower") << "HFFibre: attL[" << it << "] = " << attL[it]*cm << "(1/cm)"; // Limits on Lambda int nb = 2; std::vector<double> nvec = getDDDArray("lambLim",sv,nb); lambLim[0] = static_cast<int>(nvec[0]); lambLim[1] = static_cast<int>(nvec[1]); edm::LogInfo("HFShower") << "HFFibre: Limits on lambda " << lambLim[0] << " and " << lambLim[1]; // Fibre Lengths nb = 0; longFL = getDDDArray("LongFL",sv,nb); edm::LogInfo("HFShower") << "HFFibre: " << nb << " Long Fibre Length"; for (int it=0; it<nb; it++) edm::LogInfo("HFShower") << "HFFibre: longFL[" << it << "] = " << longFL[it]/cm << " cm"; nb = 0; shortFL = getDDDArray("ShortFL",sv,nb); edm::LogInfo("HFShower") << "HFFibre: " << nb << " Short Fibre Length"; for (int it=0; it<nb; it++) edm::LogInfo("HFShower") << "HFFibre: shortFL[" << it << "] = " << shortFL[it]/cm << " cm"; } else { edm::LogError("HFShower") << "HFFibre: cannot get filtered " << " view for " << attribute << " matching " << name; throw cms::Exception("Unknown", "HFFibre") << "cannot match " << attribute << " to " << name <<"\n"; } // Now geometry parameters attribute = "ReadOutName"; value = name; DDSpecificsFilter filter2; DDValue ddv2(attribute,value,0); filter2.setCriteria(ddv2,DDSpecificsFilter::equals); DDFilteredView fv2(cpv); fv2.addFilter(filter2); dodet = fv2.firstChild(); if (dodet) { DDsvalues_type sv(fv2.mergedSpecifics()); //Special Geometry parameters int nb = -1; gpar = getDDDArray("gparHF",sv,nb); edm::LogInfo("HFShower") << "HFFibre: " << nb <<" gpar (cm)"; for (int i=0; i<nb; i++) edm::LogInfo("HFShower") << "HFFibre: gpar[" << i << "] = " << gpar[i]/cm << " cm"; nBinR = -1; radius = getDDDArray("rTable",sv,nBinR); edm::LogInfo("HFShower") << "HFFibre: " << nBinR <<" rTable (cm)"; for (int i=0; i<nBinR; i++) edm::LogInfo("HFShower") << "HFFibre: radius[" << i << "] = " << radius[i]/cm << " cm"; } else { edm::LogError("HFShower") << "HFFibre: cannot get filtered " << " view for " << attribute << " matching " << name; throw cms::Exception("Unknown", "HFFibre") << "cannot match " << attribute << " to " << name <<"\n"; } }
HFFibre::~HFFibre | ( | ) |
Definition at line 111 of file HFFibre.cc.
{}
double HFFibre::attLength | ( | double | lambda | ) |
Definition at line 113 of file HFFibre.cc.
References attL, i, j, lambLim, and nBinAtt.
Referenced by HFShowerLibrary::getHits(), HFShower::getHits(), and HFShowerParam::HFShowerParam().
{ int i = int(nBinAtt*(lambda - lambLim[0])/(lambLim[1]-lambLim[0])); int j =i; if (i >= nBinAtt) j = nBinAtt-1; else if (i < 0) j = 0; double att = attL[j]; #ifdef DebugLog edm::LogInfo("HFShower") << "HFFibre::attLength for Lambda " << lambda << " index " << i << " " << j << " Att. Length " << att; #endif return att; }
std::vector< double > HFFibre::getDDDArray | ( | const std::string & | str, |
const DDsvalues_type & | sv, | ||
int & | nmin | ||
) | [protected] |
Definition at line 179 of file HFFibre.cc.
References DDfetch(), DDValue::doubles(), Exception, LogDebug, and relativeConstraints::value.
Referenced by HFFibre().
{ #ifdef DebugLog LogDebug("HFShower") << "HFFibre:getDDDArray called for " << str << " with nMin " << nmin; #endif DDValue value(str); if (DDfetch(&sv,value)) { #ifdef DebugLog LogDebug("HFShower") << value; #endif const std::vector<double> & fvec = value.doubles(); int nval = fvec.size(); if (nmin > 0) { if (nval < nmin) { edm::LogError("HFShower") << "HFFibre : # of " << str << " bins " << nval << " < " << nmin << " ==> illegal"; throw cms::Exception("Unknown", "HFFibre") << "nval < nmin for array " << str <<"\n"; } } else { if (nval < 1 && nmin != 0) { edm::LogError("HFShower") << "HFFibre : # of " << str << " bins " << nval << " < 1 ==> illegal (nmin=" << nmin << ")"; throw cms::Exception("Unknown", "HFFibre") << "nval < 1 for array " << str <<"\n"; } } nmin = nval; return fvec; } else { if (nmin != 0) { edm::LogError("HFShower") << "HFFibre : cannot get array " << str; throw cms::Exception("Unknown", "HFFibre") << "cannot get array " << str <<"\n"; } else { std::vector<double> fvec; return fvec; } } }
double HFFibre::tShift | ( | G4ThreeVector | point, |
int | depth, | ||
int | fromEndAbs = 0 |
||
) |
Definition at line 131 of file HFFibre.cc.
References cFibre, cond::rpcobgas::time, and zShift().
Referenced by HFShowerLibrary::getHits(), HFShowerParam::getHits(), and HFShower::getHits().
double HFFibre::zShift | ( | G4ThreeVector | point, |
int | depth, | ||
int | fromEndAbs = 0 |
||
) |
Definition at line 143 of file HFFibre.cc.
References gpar, i, longFL, nBinR, radius, shortFL, and mathSSE::sqrt().
Referenced by HFShowerLibrary::getHits(), HFShowerParam::getHits(), and tShift().
{ double zFibre = 0; double hR = sqrt((point.x())*(point.x())+(point.y())*(point.y())); int ieta = 0; double length = 250*cm; if (fromEndAbs < 0) { zFibre = 0.5*gpar[1] - point.z(); } else { for (int i = nBinR-1; i > 0; i--) if (hR < radius[i]) ieta = nBinR - i - 1; if (depth == 2) { if ((int)(shortFL.size()) > ieta) length = shortFL[ieta]; } else { if ((int)(longFL.size()) > ieta) length = longFL[ieta]; } zFibre = length; if (fromEndAbs > 0) { zFibre -= gpar[1]; } else { double zz = 0.5*gpar[1] + point.z(); zFibre -= zz; } if (depth == 2) zFibre += gpar[0]; } #ifdef DebugLog edm::LogInfo("HFShower") << "HFFibre::zShift for point " << point << " (R = " << hR/cm << " cm, Index = " << ieta << ", depth = " << depth << ", Fibre Length = " << length/cm << " cm = " << zFibre/cm << " cm)"; #endif return zFibre; }
std::vector<double> HFFibre::attL [private] |
Definition at line 44 of file HFFibre.h.
Referenced by attLength(), and HFFibre().
double HFFibre::cFibre [private] |
std::vector<double> HFFibre::gpar [private] |
double HFFibre::lambLim[2] [private] |
Definition at line 46 of file HFFibre.h.
Referenced by attLength(), and HFFibre().
std::vector<double> HFFibre::longFL [private] |
int HFFibre::nBinAtt [private] |
Definition at line 45 of file HFFibre.h.
Referenced by attLength(), and HFFibre().
int HFFibre::nBinR [private] |
std::vector<double> HFFibre::radius [private] |
std::vector<double> HFFibre::shortFL [private] |