20 void add(
const HepMatrix& deriv,
const HepSymMatrix& weight,
21 const HepSymMatrix& variance,
const HepVector& residual ) {
22 addfirst( deriv, weight, variance, residual ) ;
27 void add(
const HepMatrix& deriv,
const HepSymMatrix& weight,
28 const HepSymMatrix& variance,
const HepVector& residual,
const HepSymMatrix& secondweight) {
29 addfirst( deriv, weight, variance, residual ) ;
40 void addfirst(
const HepMatrix& deriv,
const HepSymMatrix& weight,
const HepSymMatrix& variance,
const HepVector& residual ) ;
41 void addsecond(
const HepMatrix& deriv,
const HepSymMatrix& weight) ;
53 : m_dim(
dim), m_integrals(
dim,0),m_halfdChisqdX(
dim,0)
55 m_h2 =
new TH2F(
"h2",name,dim,-0.5,dim-0.5,nbins,
xmin,
xmax) ;
56 m_unweightedh2 =
new TH2F(
"unweightedh2",name,dim,-0.5,dim-0.5,nbins,
xmin,
xmax) ;
60 void HistoChisqProjection::addfirst(
const HepMatrix& deriv,
const HepSymMatrix& weight,
61 const HepSymMatrix& variance,
const HepVector& residual )
63 int dimr =
weight.num_row() ;
64 HepMatrix derivtimesweight(deriv*weight) ;
66 for(
int irow=1; irow<=dimr; ++irow) {
67 double thissigma = sqrt( variance.fast(irow,irow) ) ;
69 for(
int ipar=0; ipar<m_dim; ++ipar) {
70 double thisweight = derivtimesweight(ipar+1, irow ) * thissigma ;
71 double thispull =
residual(irow) / thissigma ;
76 m_h2->Fill(
double(ipar), thispull, thisweight ) ;
77 m_unweightedh2->Fill(
double(ipar), thispull ) ;
78 m_integrals[ipar] += thisweight ;
79 m_halfdChisqdX(ipar+1) += thisweight*thispull ;
84 void HistoChisqProjection::addsecond(
const HepMatrix& deriv,
const HepSymMatrix& weight )
86 m_halfd2ChisqdX2 +=
weight.similarity(deriv) ;
96 double xi = (
x[0] -
mean)/sigma ;
97 static double sqrt2pi = sqrt(2*
M_PI) ;
100 return norm *
exp(-0.5*xi*xi) ;
105 HistoChisqProjection::getFittedHalfDChisqDX(std::ostream& os)
const {
106 HepVector halfDChisqDX(m_dim,0) ;
108 TF1
f1(
"mygaus",gausfunc,m_h2->GetYaxis()->GetXmin(),m_h2->GetYaxis()->GetXmax(),3) ;
109 for(
int ipar=1; ipar<=m_dim; ++ipar) {
111 sprintf(hisname,
"tmph1_%d",ipar) ;
112 TH1* tmph1 = m_h2->ProjectionY(hisname,ipar,ipar,
"e") ;
113 binwidth = tmph1->GetXaxis()->GetBinWidth(1) ;
114 tmph1->SetDirectory(m_h2->GetDirectory()) ;
115 f1.SetParameter(0,tmph1->Integral());
116 f1.SetParLimits(0,0.5*tmph1->Integral(),2*tmph1->Integral()) ;
117 f1.SetParameter(1,0) ;
118 f1.SetParameter(2,tmph1->GetRMS()) ;
119 tmph1->Fit(&f1,
"Q0I") ;
120 tmph1->GetListOfFunctions()->Add(
f1.Clone()) ;
121 halfDChisqDX(ipar) =
f1.GetParameter(1) * m_integrals[ipar-1] ;
122 os <<
"fitresult: " <<
f1.GetParameter(1) <<
" weight: " << m_integrals[ipar-1] <<
" integrated mean: "
123 << m_halfdChisqdX(ipar) / m_integrals[ipar-1] << std::endl ;
125 return halfDChisqDX ;
void add(const CLHEP::HepMatrix &deriv, const CLHEP::HepSymMatrix &weight, const CLHEP::HepSymMatrix &variance, const CLHEP::HepVector &residual)
CLHEP::HepVector m_halfdChisqdX
CLHEP::HepVector getNormalHalfDChisqDX() const
void addfirst(const CLHEP::HepMatrix &derivative, const CLHEP::HepSymMatrix &weight, const CLHEP::HepSymMatrix &variance, const CLHEP::HepVector &residual)
HistoChisqProjection(const char *name, int dim, int nbins, float xmin, float xmax)
void addsecond(const CLHEP::HepMatrix &derivative, const CLHEP::HepSymMatrix &weight)
CLHEP::HepSymMatrix m_halfd2ChisqdX2
std::vector< double > m_integrals
CLHEP::HepVector getFittedHalfDChisqDX(std::ostream &os=std::cout) const
void setDirectory(TDirectory *dir)
void mean(std::vector< double > &bins, std::vector< double > &values, const std::vector< std::string > &files, const std::string &histname, const std::string &tplotname, const std::string &label="")
double gausfunc(double *x, double *par)