Go to the documentation of this file.00001 #ifndef GsfBetheHeitlerUpdator_h_
00002 #define GsfBetheHeitlerUpdator_h_
00003
00004 #include "TrackingTools/GsfTracking/interface/GsfMaterialEffectsUpdator.h"
00005 #include "TrackingTools/GsfTracking/interface/Triplet.h"
00006
00007 #include <vector>
00008 #include <iosfwd>
00009 #include <string>
00010
00019 class GsfBetheHeitlerUpdator : public GsfMaterialEffectsUpdator {
00020
00021 private:
00024 class Polynomial {
00025 public:
00027 Polynomial () {}
00031 Polynomial (const std::vector<double>& coefficients) :
00032 theCoeffs(coefficients) {}
00034 double operator() (const double& x) const {
00035 double sum(0.);
00036 for ( std::vector<double>::const_iterator i=theCoeffs.begin();
00037 i!=theCoeffs.end(); i++ ) sum = x*sum + *i;
00038 return sum;
00039 }
00040 private:
00041 std::vector<double> theCoeffs;
00042 };
00043
00044 public:
00045 enum CorrectionFlag { NoCorrection=0, MeanCorrection=1, FullCorrection=2 };
00046
00047 public:
00048 virtual GsfBetheHeitlerUpdator* clone() const
00049 {
00050 return new GsfBetheHeitlerUpdator(*this);
00051 }
00052
00053 public:
00055 GsfBetheHeitlerUpdator (const std::string fileName, const int correctionFlag);
00056
00057
00058 private:
00059 typedef std::vector< Triplet<double,double,double> > GSContainer;
00060
00061 private:
00063 virtual void compute (const TrajectoryStateOnSurface&, const PropagationDirection) const;
00065 void readParameters (const std::string);
00067 Polynomial readPolynomial (std::ifstream&,const int);
00069 inline double logisticFunction (const double x) const {return 1./(1.+exp(-x));}
00071 inline double BetheHeitlerMean (const double rl) const
00072 {
00073 return exp(-rl);
00074 }
00076 inline double BetheHeitlerVariance (const double rl) const
00077 {
00078 return exp(-rl*log(3.)/log(2.)) - exp(-2*rl);
00079 }
00081 void getMixtureParameters (const double, GSContainer&) const;
00083 void correctWeights (GSContainer&) const;
00085 double correctedFirstMean (const double, const GSContainer&) const;
00087 double correctedFirstVar (const double,const GSContainer&) const;
00088
00089 protected:
00091 virtual bool newArguments (const TrajectoryStateOnSurface&, const PropagationDirection) const;
00093 virtual void storeArguments (const TrajectoryStateOnSurface&, const PropagationDirection) const;
00094
00095 private:
00096 int theNrComponents;
00097 int theTransformationCode;
00098 std::vector<Polynomial> thePolyWeights;
00099 std::vector<Polynomial> thePolyMeans;
00100 std::vector<Polynomial> thePolyVars;
00101
00102 int theCorrectionFlag;
00103
00104 mutable float theLastDz;
00105 mutable float theLastP;
00106 mutable PropagationDirection theLastPropDir;
00107 mutable float theLastRadLength;
00108 };
00109
00110 #endif