3 #include <boost/cstdint.hpp>
8 #include "CLHEP/Random/RandGauss.h"
9 #include "CLHEP/Random/RandFlat.h"
17 double computeSigma(
const double &
value,
const double & perCentError) {
18 return (perCentError/100)*
value;
25 edm::LogInfo(
"SiStripLorentzAngleGenerator") <<
"[SiStripLorentzAngleGenerator::SiStripLorentzAngleGenerator]";
30 edm::LogInfo(
"SiStripLorentzAngleGenerator") <<
"[SiStripLorentzAngleGenerator::~SiStripLorentzAngleGenerator]";
34 if( uniform )
hallMobility_ = CLHEP::RandFlat::shoot(meanMin, meanMax);
35 else if( sigma>0 )
hallMobility_ = CLHEP::RandGauss::shoot(meanMin, sigma);
40 if( estimatedValuesMax.size() != 0 ) {
41 std::vector<double>::const_iterator
min = estimatedValuesMin.begin();
42 std:: vector<double>::const_iterator
max = estimatedValuesMax.begin();
43 std::vector<bool>::iterator uniformIt = uniform.begin();
44 for( ; min != estimatedValuesMin.end(); ++
min, ++
max, ++uniformIt ) {
45 if( *min != *max ) *uniformIt =
true;
56 std::vector<double> TIB_EstimatedValuesMin(
_pset.
getParameter<std::vector<double> >(
"TIB_EstimatedValuesMin"));
57 std::vector<double> TIB_EstimatedValuesMax(
_pset.
getParameter<std::vector<double> >(
"TIB_EstimatedValuesMax"));
58 std::vector<double> TOB_EstimatedValuesMin(
_pset.
getParameter<std::vector<double> >(
"TOB_EstimatedValuesMin"));
59 std::vector<double> TOB_EstimatedValuesMax(
_pset.
getParameter<std::vector<double> >(
"TOB_EstimatedValuesMax"));
60 std::vector<double> TIB_PerCent_Errs(
_pset.
getParameter<std::vector<double> >(
"TIB_PerCent_Errs"));
61 std::vector<double> TOB_PerCent_Errs(
_pset.
getParameter<std::vector<double> >(
"TOB_PerCent_Errs"));
64 if( (TIB_EstimatedValuesMax.size() != 0 && (TIB_EstimatedValuesMin.size() != TIB_EstimatedValuesMax.size())) ||
65 (TOB_EstimatedValuesMax.size() != 0 && (TOB_EstimatedValuesMin.size() != TOB_EstimatedValuesMax.size())) ) {
66 std::cout <<
"ERROR: size of min and max values is different" << std::endl;
67 std::cout <<
"TIB_EstimatedValuesMin.size() = " << TIB_EstimatedValuesMin.size() <<
", TIB_EstimatedValuesMax.size() " << TIB_EstimatedValuesMax.size() << std::endl;
68 std::cout <<
"TOB_EstimatedValuesMin.size() = " << TOB_EstimatedValuesMin.size() <<
", TOB_EstimatedValuesMax.size() " << TOB_EstimatedValuesMax.size() << std::endl;
70 std::vector<bool> uniformTIB(TIB_EstimatedValuesMin.size(),
false);
71 std::vector<bool> uniformTOB(TOB_EstimatedValuesMin.size(),
false);
73 setUniform(TIB_EstimatedValuesMin, TIB_EstimatedValuesMax, uniformTIB);
74 setUniform(TOB_EstimatedValuesMin, TOB_EstimatedValuesMax, uniformTOB);
79 std::vector<double> StdDevs_TIB(TIB_EstimatedValuesMin.size(), 0);
80 std::vector<double> StdDevs_TOB(TOB_EstimatedValuesMin.size(), 0);
81 transform(TIB_EstimatedValuesMin.begin(), TIB_EstimatedValuesMin.end(), TIB_PerCent_Errs.begin(), StdDevs_TIB.begin(), computeSigma);
82 transform(TOB_EstimatedValuesMin.begin(), TOB_EstimatedValuesMin.end(), TOB_PerCent_Errs.begin(), StdDevs_TOB.begin(), computeSigma);
85 double TIBmeanValueMin = std::accumulate( TIB_EstimatedValuesMin.begin(), TIB_EstimatedValuesMin.end(), 0.)/double(TIB_EstimatedValuesMin.size());
86 double TIBmeanValueMax = std::accumulate( TIB_EstimatedValuesMax.begin(), TIB_EstimatedValuesMax.end(), 0.)/double(TIB_EstimatedValuesMax.size());
87 double TOBmeanValueMin = std::accumulate( TOB_EstimatedValuesMin.begin(), TOB_EstimatedValuesMin.end(), 0.)/double(TOB_EstimatedValuesMin.size());
88 double TOBmeanValueMax = std::accumulate( TOB_EstimatedValuesMax.begin(), TOB_EstimatedValuesMax.end(), 0.)/double(TOB_EstimatedValuesMax.size());
89 double TIBmeanPerCentError = std::accumulate( TIB_PerCent_Errs.begin(), TIB_PerCent_Errs.end(), 0.)/double(TIB_PerCent_Errs.size());
90 double TOBmeanPerCentError = std::accumulate( TOB_PerCent_Errs.begin(), TOB_PerCent_Errs.end(), 0.)/double(TOB_PerCent_Errs.size());
91 double TIBmeanStdDev = (TIBmeanPerCentError/100)*TIBmeanValueMin;
92 double TOBmeanStdDev = (TOBmeanPerCentError/100)*TOBmeanValueMin;
94 const std::vector<uint32_t> DetIds =
reader.getAllDetIds();
95 for(std::vector<uint32_t>::const_iterator detit=DetIds.begin(); detit!=DetIds.end(); detit++){
105 layerId = theTIBDetId.
layer() - 1;
106 setHallMobility( TIB_EstimatedValuesMin[layerId], TIB_EstimatedValuesMax[layerId], StdDevs_TIB[layerId], uniformTIB[layerId] );
110 layerId = theTOBDetId.
layer() - 1;
111 setHallMobility( TOB_EstimatedValuesMin[layerId], TOB_EstimatedValuesMax[layerId], StdDevs_TOB[layerId], uniformTOB[layerId] );
115 setHallMobility( TIBmeanValueMin, TIBmeanValueMax, TIBmeanStdDev, uniformTIB[0] );
121 setHallMobility( TIBmeanValueMin, TIBmeanValueMax, TIBmeanStdDev, uniformTIB[0] );
124 setHallMobility( TOBmeanValueMin, TOBmeanValueMax, TOBmeanStdDev, uniformTOB[0] );
129 edm::LogError(
"SiStripLorentzAngleGenerator")<<
" detid already exists"<<std::endl;
T getParameter(std::string const &) const
SiStripLorentzAngleGenerator(const edm::ParameterSet &, const edm::ActivityRegistry &)
tuple SiStripLorentzAngle
void setUniform(const std::vector< double > &TIB_EstimatedValuesMin, const std::vector< double > &TIB_EstimatedValuesMax, std::vector< bool > &uniformTIB)
Method used to determine whether to generate with a uniform distribution for each layer...
unsigned int layer() const
layer id
bool putLorentzAngle(const uint32_t &, float &)
SiStripLorentzAngle * obj_
const T & max(const T &a, const T &b)
int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
unsigned int layer() const
layer id
unsigned int ringNumber() const
std::string fullPath() const
~SiStripLorentzAngleGenerator()
void setHallMobility(const double &meanMin, const double &meanMax, const double &sigma, const bool uniform)