CMS 3D CMS Logo

Static Public Member Functions | Private Member Functions | Private Attributes

SymmetryFit Class Reference

#include <SymmetryFit.h>

List of all members.

Static Public Member Functions

static TF1 * fitfunction ()
static std::string name (std::string base)
static std::vector< double > pol2_from_pol2 (TH1 *hist)
static std::vector< double > pol2_from_pol3 (TH1 *hist)
static TH1 * symmetryChi2 (const TH1 *, const std::pair< unsigned, unsigned >)
static TH1 * symmetryChi2 (std::string, const std::vector< TH1 * > &, const std::pair< unsigned, unsigned >)

Private Member Functions

float chi2 (std::pair< unsigned, unsigned >)
float chi2_element (std::pair< unsigned, unsigned >)
std::vector< std::pair
< unsigned, unsigned > > 
continuousRanges () const
void fillchi2 ()
std::pair< unsigned, unsigned > findUsableMinMax () const
int fit ()
void makeChi2Histogram ()
SymmetryFit operator+= (const SymmetryFit &R)
 SymmetryFit (const TH1 *, const std::pair< unsigned, unsigned >)

Private Attributes

TH1 * chi2_
const unsigned minDF_
const std::pair< unsigned,
unsigned > 
minmaxUsable_
unsigned ndf_
const std::pair< unsigned,
unsigned > 
range_
const TH1 * symm_candidate_

Detailed Description

Definition at line 8 of file SymmetryFit.h.


Constructor & Destructor Documentation

SymmetryFit::SymmetryFit ( const TH1 *  h,
const std::pair< unsigned, unsigned >  r 
) [private]

Definition at line 32 of file SymmetryFit.cc.

References fillchi2(), and makeChi2Histogram().


Member Function Documentation

float SymmetryFit::chi2 ( std::pair< unsigned, unsigned >  point) [private]

Definition at line 98 of file SymmetryFit.cc.

References chi2_element(), i, minmaxUsable_, ndf_, and XX.

Referenced by fillchi2().

{
  point.first -= minmaxUsable_.first;
  point.second += minmaxUsable_.first;
  float XX=0;
  unsigned i=ndf_;
  while(i-->0) {
    XX += chi2_element(point); 
    point.first--; 
    point.second++;
  }
  return XX;
}
float SymmetryFit::chi2_element ( std::pair< unsigned, unsigned >  range) [private]

Definition at line 112 of file SymmetryFit.cc.

References funct::pow(), and symm_candidate_.

Referenced by chi2().

{
  float
    y0(symm_candidate_->GetBinContent(range.first)),
    y1(symm_candidate_->GetBinContent(range.second)),
    e0(symm_candidate_->GetBinError(range.first)),
    e1(symm_candidate_->GetBinError(range.second));           assert(e0&&e1);

  return pow(y0-y1, 2)/(e0*e0+e1*e1);
}
std::vector< std::pair< unsigned, unsigned > > SymmetryFit::continuousRanges ( ) const [private]

Definition at line 72 of file SymmetryFit.cc.

References i, SiStripMonitorClusterAlca_cfi::Nbins, diffTwoXMLs::ranges, and symm_candidate_.

Referenced by findUsableMinMax().

{
  std::vector<std::pair<unsigned,unsigned> > ranges;
  const unsigned Nbins = symm_candidate_->GetNbinsX();
  unsigned i=0;
  while(++i<=Nbins) {
    if(symm_candidate_->GetBinError(i)) {
      std::pair<unsigned,unsigned> range(i,i+1);
      while(++i<=Nbins && symm_candidate_->GetBinError(i)) range.second++;
      ranges.push_back(range);
    }
  }
  return ranges;
}
void SymmetryFit::fillchi2 ( ) [private]

Definition at line 88 of file SymmetryFit.cc.

References chi2(), chi2_, i, dttmaxenums::L, minDF_, ndf_, dttmaxenums::R, and range_.

Referenced by SymmetryFit().

{
  if(ndf_<minDF_) return;

  for(int i=1;  i<=chi2_->GetNbinsX() ; ++i) {
    const unsigned L( range_.first-1+(i-1)/2 ), R( range_.first+i/2 );
    chi2_->SetBinContent( i, chi2( std::make_pair(L,R)) );
  }
}
std::pair< unsigned, unsigned > SymmetryFit::findUsableMinMax ( ) const [private]

Definition at line 54 of file SymmetryFit.cc.

References cont, continuousRanges(), first, dttmaxenums::L, max(), min, dttmaxenums::R, range_, and edm::second().

{
  unsigned NEAR(0), FAR(0);
  const std::vector<std::pair<unsigned,unsigned> > cont = continuousRanges();
  for(unsigned L=0; L<cont.size(); L++) { if( cont[L].first > range_.first) continue;
    for(unsigned R=L; R<cont.size(); R++) { if( cont[R].second < range_.second) continue;

      const unsigned far = std::min( range_.first - cont[L].first,    
                                      cont[R].second - range_.second );
      const unsigned near = std::max( range_.second<cont[L].second ? 0 : range_.second - cont[L].second,  
                                     cont[R].first<range_.first ? 0 : cont[R].first - range_.first );

      if ( (far>near) && (far-near)>(FAR-NEAR) ) { FAR = far; NEAR = near;}
    }
  }
  return std::make_pair(NEAR,FAR);
}
int SymmetryFit::fit ( ) [private]

Definition at line 123 of file SymmetryFit.cc.

References chi2_, f, fitfunction(), ndf_, AlCaHLTBitMon_ParallelJobs::p, and pol2_from_pol3().

Referenced by symmetryChi2().

                     {

  std::vector<double> p = pol2_from_pol3(chi2_);
  if( !p.size() || 
      p[0] < chi2_->GetBinCenter(1) || 
      p[0] > chi2_->GetBinCenter(chi2_->GetNbinsX()))
    return 7;

  TF1* f = fitfunction();
  f->SetParameter(0, p[0]);  f->SetParLimits(0, p[0], p[0]);
  f->SetParameter(1, p[1]);  f->SetParLimits(1, p[1], p[1]);
  f->SetParameter(2, p[2]);  f->SetParLimits(2, p[2], p[2]);
  f->SetParameter(3, ndf_);  f->SetParLimits(3, ndf_,ndf_); //Fixed
  chi2_->Fit(f,"WQ");
  return 0;
}
TF1 * SymmetryFit::fitfunction ( ) [static]

Definition at line 140 of file SymmetryFit.cc.

References f.

Referenced by fit().

{
  TF1* f = new TF1("SymmetryFit","((x-[0])/[1])**2+[2]+0*[3]");
  f->SetParName(0,"middle");
  f->SetParName(1,"uncertainty");
  f->SetParName(2,"chi2");
  f->SetParName(3,"NDF");
  return f;
}
void SymmetryFit::makeChi2Histogram ( ) [private]

Definition at line 44 of file SymmetryFit.cc.

References chi2_, name(), SiStripMonitorClusterAlca_cfi::Nbins, range_, AlCaHLTBitMon_QueryRunRegistry::string, and symm_candidate_.

Referenced by SymmetryFit().

{
  std::string XXname = name(symm_candidate_->GetName());
  unsigned Nbins = 2*( range_.second - range_.first ) + 1;
  double binwidth = symm_candidate_->GetBinWidth(1);
  double low = symm_candidate_->GetBinCenter(range_.first) - 3*binwidth/4;
  double up = symm_candidate_->GetBinCenter(range_.second-1) + 3*binwidth/4;
  chi2_ = new TH1F(XXname.c_str(),"", Nbins, low, up);
}
static std::string SymmetryFit::name ( std::string  base) [inline, static]

Definition at line 14 of file SymmetryFit.h.

Referenced by makeChi2Histogram().

{return base+"_symmchi2";}
SymmetryFit SymmetryFit::operator+= ( const SymmetryFit R) [inline, private]

Definition at line 29 of file SymmetryFit.h.

References chi2_, and ndf_.

{ ndf_+=R.ndf_; chi2_->Add(R.chi2_); return *this;}
std::vector< double > SymmetryFit::pol2_from_pol2 ( TH1 *  hist) [static]

Definition at line 151 of file SymmetryFit.cc.

References AlCaHLTBitMon_ParallelJobs::p, mathSSE::sqrt(), ntuplemaker::status, and v.

                                                       {
  std::vector<double> v;

  int status = hist->Fit("pol2","WQ");
  if(!status) {
    std::vector<double> p;
    p.push_back(hist->GetFunction("pol2")->GetParameter(0));
    p.push_back(hist->GetFunction("pol2")->GetParameter(1));
    p.push_back(hist->GetFunction("pol2")->GetParameter(2));
    if(p[2]>0) {
      v.push_back( -0.5*p[1]/p[2] );
      v.push_back( 1./sqrt(p[2]) );
      v.push_back( p[0]-0.25*p[1]*p[1]/p[2] );
    }
  }
  return v;
}
std::vector< double > SymmetryFit::pol2_from_pol3 ( TH1 *  hist) [static]

Definition at line 169 of file SymmetryFit.cc.

References AlCaHLTBitMon_ParallelJobs::p, funct::pow(), mathSSE::sqrt(), ntuplemaker::status, and v.

Referenced by fit().

                                                       {
  std::vector<double> v;

  int status = hist->Fit("pol3","WQ");
  if(!status) {
    std::vector<double> p;
    p.push_back(hist->GetFunction("pol3")->GetParameter(0));
    p.push_back(hist->GetFunction("pol3")->GetParameter(1));
    p.push_back(hist->GetFunction("pol3")->GetParameter(2));
    p.push_back(hist->GetFunction("pol3")->GetParameter(3));
    double radical = p[2]*p[2] - 3*p[1]*p[3] ;
    if(radical>0) {
      double x0 = ( -p[2] + sqrt(radical) ) / ( 3*p[3] ) ;
      v.push_back( x0 );
      v.push_back( pow( radical, -0.25) );
      v.push_back( p[0] + p[1]*x0 + p[2]*x0*x0 + p[3]*x0*x0*x0 );
    }
  }
  return v;
}
TH1 * SymmetryFit::symmetryChi2 ( std::string  basename,
const std::vector< TH1 * > &  candidates,
const std::pair< unsigned, unsigned >  range 
) [static]

Definition at line 6 of file SymmetryFit.cc.

References chi2_, runregparse::combined, fit(), and ntuplemaker::status.

Referenced by LA_Filler_Fitter::make_and_fit_symmchi2().

{
  TH1* fake = (TH1*)(candidates[0]->Clone(basename.c_str())); 
  fake->Reset();
  SymmetryFit combined(fake,range);
  delete fake;

  BOOST_FOREACH(const TH1* candidate, candidates) {
    SymmetryFit sf(candidate,range); 
    combined+=sf; 
    delete sf.chi2_; 
  }

  int status = combined.fit();
  if(status) { delete combined.chi2_; combined.chi2_=0;}
  return combined.chi2_;
}
TH1 * SymmetryFit::symmetryChi2 ( const TH1 *  candidate,
const std::pair< unsigned, unsigned >  range 
) [static]

Definition at line 24 of file SymmetryFit.cc.

References chi2_, fit(), and ntuplemaker::status.

{
  SymmetryFit sf(candidate, range);
  int status = sf.fit();
  if(status) { delete sf.chi2_; sf.chi2_=0; }
  return sf.chi2_;
}

Member Data Documentation

TH1* SymmetryFit::chi2_ [private]

Definition at line 35 of file SymmetryFit.h.

Referenced by fillchi2(), fit(), makeChi2Histogram(), operator+=(), and symmetryChi2().

const unsigned SymmetryFit::minDF_ [private]

Definition at line 32 of file SymmetryFit.h.

Referenced by fillchi2().

const std::pair<unsigned,unsigned> SymmetryFit::minmaxUsable_ [private]

Definition at line 33 of file SymmetryFit.h.

Referenced by chi2().

unsigned SymmetryFit::ndf_ [private]

Definition at line 34 of file SymmetryFit.h.

Referenced by chi2(), fillchi2(), fit(), and operator+=().

const std::pair<unsigned,unsigned> SymmetryFit::range_ [private]

Definition at line 33 of file SymmetryFit.h.

Referenced by fillchi2(), findUsableMinMax(), and makeChi2Histogram().

const TH1* SymmetryFit::symm_candidate_ [private]

Definition at line 31 of file SymmetryFit.h.

Referenced by chi2_element(), continuousRanges(), and makeChi2Histogram().