ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/JetFitAnalyzer/test/JetFinderAnalyzer.cc
(Generate patch)

Comparing UserCode/JetFitAnalyzer/test/JetFinderAnalyzer.cc (file contents):
Revision 1.8 by dnisson, Fri Sep 4 20:07:04 2009 UTC vs.
Revision 1.23 by dnisson, Thu Nov 26 21:06:02 2009 UTC

# Line 13 | Line 13
13   #include "DataFormats/ParticleFlowCandidate/interface/PFCandidate.h"
14   #include "DataFormats/ParticleFlowReco/interface/PFBlock.h"
15  
16 + /* Jet reco stuff */
17 + #include "DataFormats/JetReco/interface/PFJetCollection.h"
18 + #include "DataFormats/JetReco/interface/GenJetCollection.h"
19 + #include "DataFormats/JetReco/interface/PFJet.h"
20 + #include "DataFormats/JetReco/interface/GenJet.h"
21 +
22   #include <map>
23   #include <vector>
24   #include <limits>
25   #include <cmath>
26   #include <cstdlib>
27 + #include <iostream>
28   #include <fstream>
29   #include <sstream>
30  
# Line 31 | Line 38 | using namespace fastjet;
38  
39   class JetFinderAnalyzer : public JetFitAnalyzer {
40   public:
34  struct jet {
35    double energy;
36    double eta;
37    double phi;
38  };
39
41    explicit JetFinderAnalyzer( const edm::ParameterSet&);
42    ~JetFinderAnalyzer() {}
43  
44   private:
45 <  static map<TH2 *, vector< vector<jet> > > unique_jets;
46 <
47 <  static double phi_cutoff_;
47 <
48 <  static double g2int(double xlo, double xhi, double ylo, double yhi,
49 <               double *pval) {
50 <    double sum1 = 0.0;
51 <    double sum2 = 0.0;
52 <    double xmid = 0.5 * (xlo + xhi);
53 <    double ymid = 0.5 * (ylo + yhi);
54 <    double xstep = (xhi - xlo) / 50.0;
55 <    double ystep = (yhi - ylo) / 50.0;
56 <    for (int i = 0; i < 50; i++) {
57 <      double x = (static_cast<double>(i) + 0.5) * xstep + xlo;
58 <      sum1 += xstep * jetfit::fit_fcn(x, ymid, pval);
59 <    }
60 <    for (int i = 0; i < 50; i++) {
61 <      double y = (static_cast<double>(i) + 0.5) * ystep + ylo;
62 <      sum2 += ystep * jetfit::fit_fcn(xmid, y, pval);
63 <    }
64 <    return sum1 * sum2;
65 <  }
66 <
67 <  static void jetfinder(TMinuit *gMinuit, TH2 *hist, int ngauss) {
68 <    double dist_sq = numeric_limits<double>::infinity();
69 <    unique_jets[hist].resize(ngauss);
70 <    int nbinsX = hist->GetXaxis()->GetNbins();
71 <    int nbinsY = hist->GetYaxis()->GetNbins();
72 <    double XbinSize = (hist->GetXaxis()->GetXmax()
73 <                       - hist->GetXaxis()->GetXmin())
74 <      / static_cast<double>(nbinsX);
75 <    double YbinSize = (hist->GetYaxis()->GetXmax()
76 <                       - hist->GetYaxis()->GetXmin())
77 <      / static_cast<double>(nbinsY);
78 <    for (int i = 0; i < ngauss; i++) {
79 <      double N, mu_x, mu_y, sig, err, lo, hi;
80 <      int iuint;
81 <      TString name;
82 <      gMinuit->mnpout(4*i, name, N, err, lo, hi, iuint);
83 <      gMinuit->mnpout(4*i + 1, name, mu_x, err, lo, hi, iuint);
84 <      gMinuit->mnpout(4*i + 2, name, mu_y, err, lo, hi, iuint);
85 <      gMinuit->mnpout(4*i + 3, name, sig, err, lo, hi, iuint);
86 <      for (int j = 0; j < i; j++) {
87 <        double N2, mu_x2, mu_y2, sig2;
88 <        gMinuit->mnpout(4*j, name, N2, err, lo, hi, iuint);
89 <        gMinuit->mnpout(4*j + 1, name, mu_x2, err, lo, hi, iuint);
90 <        gMinuit->mnpout(4*j + 2, name, mu_y2, err, lo, hi, iuint);
91 <        gMinuit->mnpout(4*j + 3, name, sig2, err, lo, hi, iuint);
92 <        double _dist_sq = (mu_x2 - mu_x)*(mu_x2 - mu_x)
93 <          + (mu_y2 - mu_y)*(mu_y2 - mu_y);
94 <        if (_dist_sq < dist_sq)
95 <          dist_sq = _dist_sq;
96 <      }
97 <
98 <      jet j;
99 <      j.energy = N;
100 <      j.eta = mu_x; j.phi = mu_y;
101 <      unique_jets[hist][ngauss-1].push_back(j);
102 <    }
103 <  }
104 <
105 <  virtual void beginJob(const edm::EventSetup&);
106 <  virtual TH2D* make_histo(const edm::Event&, const edm::EventSetup&);
107 <  virtual jetfit::model_def& make_model_def(const edm::Event&,
45 >  virtual void beginJob(const edm::EventSetup &es);
46 >  virtual TH2D * make_histo(const edm::Event &, const edm::EventSetup &);
47 >  virtual HistoFitter::ModelDefinition& make_model_def(const edm::Event&,
48                                             const edm::EventSetup&,
49                                             TH2 *);
50 <  virtual void analyze_results(jetfit::results r,
51 <                               std::vector<jetfit::trouble> t, TH2 *);
50 >  virtual void analyze_results(HistoFitter::FitResults r,
51 >                               std::vector<HistoFitter::Trouble> t, TH2 *);
52    vector<reco::Candidate *> get_particles(const edm::Event&);
113  void fetchCandidateCollection(edm::Handle<reco::PFCandidateCollection>&,
114                                const edm::InputTag&, const edm::Event&) const;
115  void fetchCandidateCollection(edm::Handle<reco::GenParticleCollection>&,
116                                const edm::InputTag&, const edm::Event&) const;
53  
54    fstream ofs;
55    edm::InputTag inputTagPFCandidates_;
# Line 121 | Line 57 | private:
57    int info_type_;
58    double smear_;
59    int smear_coord_;
60 +  string jet_algo_;
61 +  string reclustered_jet_algo_;
62   };
63  
126 map<TH2 *, vector< vector< JetFinderAnalyzer::jet > > >
127 JetFinderAnalyzer::unique_jets;
128
64   JetFinderAnalyzer::JetFinderAnalyzer(const edm::ParameterSet &pSet)
65    : JetFitAnalyzer(pSet) // this is important!
66   {
# Line 142 | Line 77 | JetFinderAnalyzer::JetFinderAnalyzer(con
77    smear_coord_ = pSet.getUntrackedParameter("smear_coord", 0);
78    // 0 = eta-phi smear
79    // 1 = proper angle smear
80 <  set_user_minuit(jetfinder);
80 >  jet_algo_ = pSet.getParameter<string>("jet_algo");
81   }
82  
83 < void
84 < JetFinderAnalyzer::fetchCandidateCollection(edm::Handle<reco::PFCandidateCollection>& c,
150 <                                      const edm::InputTag& tag,
151 <                                      const edm::Event& iEvent) const {
152 <  
153 <  bool found = iEvent.getByLabel(tag, c);
154 <  
155 <  if(!found ) {
156 <    ostringstream  err;
157 <    err<<" cannot get PFCandidates: "
158 <       <<tag<<endl;
159 <    edm::LogError("PFCandidates")<<err.str();
160 <    throw cms::Exception( "MissingProduct", err.str());
161 <  }
162 <  
163 < }
164 <
165 < void
166 < JetFinderAnalyzer::fetchCandidateCollection(edm::Handle<reco::GenParticleCollection>& c,
167 <                                      const edm::InputTag& tag,
168 <                                      const edm::Event& iEvent) const {
169 <  
170 <  bool found = iEvent.getByLabel(tag, c);
171 <  
172 <  if(!found ) {
173 <    ostringstream  err;
174 <    err<<" cannot get GenParticles: "
175 <       <<tag<<endl;
176 <    edm::LogError("GenParticles")<<err.str();
177 <    throw cms::Exception( "MissingProduct", err.str());
178 <  }
179 <  
180 < }
83 > TH2D * JetFinderAnalyzer::make_histo(const edm::Event &evt, const edm::EventSetup&) {
84 >  const reco::Jet * highest_e_jet = 0;
85  
182 vector<reco::Candidate *> JetFinderAnalyzer::get_particles(const edm::Event &evt) {
183 // fill unreduced histo
184  edm::Handle<reco::GenParticleCollection> hRaw;
185  edm::Handle<reco::PFCandidateCollection> hPFlow;
86    if (info_type_ == 0) {
87 <    fetchCandidateCollection(hRaw,
88 <                             inputTagGenParticles_,
89 <                             evt);
90 <  }
91 <  if (info_type_ == 1) {
92 <    fetchCandidateCollection(hPFlow,
193 <                             inputTagPFCandidates_,
194 <                             evt);
195 <  }
196 <    
197 <  vector<reco::Candidate *> particles;
198 <
199 <  switch (info_type_) {
200 <  case 0:
201 <    for (unsigned i = 0; i < hRaw->size(); i++) {
202 <      if ((*hRaw)[i].status() == 1) {
203 <        particles.push_back((reco::Candidate *)&((*hRaw)[i]));
87 >    edm::Handle< vector<reco::GenJet> > evtJets;
88 >    evt.getByLabel(jet_algo_, evtJets);
89 >    for (unsigned i = 0; i < evtJets->size(); i++) {
90 >      if (highest_e_jet == 0
91 >          || (*evtJets)[i].energy() > highest_e_jet->energy()) {
92 >        highest_e_jet = &((*evtJets)[i]);
93        }
94      }
206    break;
207  case 1:
208    for (unsigned i = 0; i < hPFlow->size(); i++) {
209      particles.push_back((reco::Candidate *)&((*hPFlow)[i]));
210    }
211    break;
212  default:
213    cerr << "Unknown event type" << endl; // TODO use MessageLogger
214  }
215
216  return particles;
217 }
218
219 TH2D * JetFinderAnalyzer::make_histo(const edm::Event &evt, const edm::EventSetup&) {
220  ostringstream oss;
221  oss << "eta_phi_energy_unred"<<evt.id().event() << flush;
222  TH2D *unred_histo = new TH2D(oss.str().c_str(), oss.str().c_str(),
223                               600, -2.5, 2.5, 600, -PI, PI);
224
225  vector<reco::Candidate *> particles = get_particles(evt);
226  for (int i = 0; i < particles.size(); i++) {
227    unred_histo->Fill(particles[i]->eta(),
228                      particles[i]->phi(),
229                      particles[i]->energy());
95    }
96 <
97 <  // reduce histo
98 <  ostringstream oss2;
99 <  oss2 << "eta_phi_energy_red"<<evt.id().event() << flush;
100 <  edm::Service<TFileService> fs;
101 <  // draw cone of radius 0.5 around highest energy bin, reduce
102 <  double maxE = 0.0;
238 <  int max_i = 29, max_j = 29;
239 <  for (int i = 0; i < unred_histo->GetNbinsX(); i++) {
240 <    for (int j = 0; j < unred_histo->GetNbinsY(); j++) {
241 <      double E = unred_histo->GetBinContent(i+1, j+1);
242 <      if (E > maxE) {
243 <        maxE = E;
244 <        max_i = i;
245 <        max_j = j;
96 >  else if (info_type_ == 1) {
97 >    edm::Handle< vector<reco::PFJet> > evtJets;
98 >    evt.getByLabel(jet_algo_, evtJets);
99 >    for (unsigned i = 0; i < evtJets->size(); i++) {
100 >      if (highest_e_jet == 0
101 >          || (*evtJets)[i].energy() > highest_e_jet->energy()) {
102 >        highest_e_jet = &((*evtJets)[i]);
103        }
104      }
105    }
106 <  
107 <  double rcone = 0.5;
108 <  double Xlo = unred_histo->GetXaxis()->GetXmin();
109 <  double Xhi = unred_histo->GetXaxis()->GetXmax();
253 <  double Ylo = unred_histo->GetYaxis()->GetXmin();
254 <  double Yhi = unred_histo->GetYaxis()->GetXmax();
255 <  double XbinSize = (Xhi - Xlo) /
256 <    static_cast<double>(unred_histo->GetXaxis()->GetNbins());
257 <  double YbinSize = (Yhi - Ylo) /
258 <    static_cast<double>(unred_histo->GetYaxis()->GetNbins());
259 <  double max_x = (static_cast<double>(max_i) + 0.5) * XbinSize + Xlo;
260 <  double max_y = (static_cast<double>(max_j) + 0.5) * YbinSize + Ylo;
261 <  TH2D *histo = fs->make<TH2D>(oss2.str().c_str(), oss2.str().c_str(),
262 <                               60, max_x-rcone, max_x+rcone,
263 <                               60, max_y-rcone, max_y+rcone);
264 <
265 <  // create an unsmeared reduced histo
266 <  TH2D *histo_unsmeared = fs->make<TH2D>((oss2.str()+"_unsmeared").c_str(),
267 <                                         (oss2.str()+"_unsmeared").c_str(),
268 <                                         60, max_x-rcone, max_x+rcone,
269 <                                         60, max_y-rcone, max_y+rcone);
270 <  for (int i = 0; i < particles.size(); i++) {
271 <    double N = particles[i]->energy();
272 <    double x = particles[i]->eta();
273 <    double y = particles[i]->phi();
274 <    histo_unsmeared->Fill(x, y, N);
106 >    
107 >  if (highest_e_jet == 0) {
108 >    cerr << "No fat jets found!" << endl;
109 >    return 0;
110    }
111  
112 <  // create a smeared reduced histo
112 >  vector<const reco::Candidate *> particles =
113 >    highest_e_jet->getJetConstituentsQuick();
114 >
115 >  ostringstream oss;
116 >  oss << "eta_phi_energy"<<evt.id().event() << flush;
117 >  edm::Service<TFileService> fs;
118 >  TH2D *histo = fs->make<TH2D>(oss.str().c_str(), oss.str().c_str(),
119 >                         30,
120 >                         highest_e_jet->eta()-0.5,
121 >                         highest_e_jet->eta()+0.5,
122 >                         30,
123 >                         highest_e_jet->phi()-0.5,
124 >                         highest_e_jet->phi()+0.5);
125 >
126 >  if (smear_ > 0.0) {
127 >  // create a smeared histo
128    // create a temporary 2D vector for smeared energies
129 <  XbinSize = (histo->GetXaxis()->GetXmax()
129 >  double XbinSize = (histo->GetXaxis()->GetXmax()
130                - histo->GetXaxis()->GetXmin()) /
131      static_cast<double>(histo->GetXaxis()->GetNbins());
132 <  YbinSize = (histo->GetYaxis()->GetXmax()
132 >  double YbinSize = (histo->GetYaxis()->GetXmax()
133                - histo->GetYaxis()->GetXmin()) /
134      static_cast<double>(histo->GetYaxis()->GetNbins());
135 <  vector< vector<double> > smeared(60, vector<double>(60, 0.0) );
135 >  double Xlo = histo->GetXaxis()->GetXmin();
136 >  double Xhi = histo->GetXaxis()->GetXmax();
137 >  double Ylo = histo->GetYaxis()->GetXmin();
138 >  double Yhi = histo->GetYaxis()->GetXmax();
139 >  vector< vector<double> > smeared(30, vector<double>(30, 0.0) );
140    switch (smear_coord_) {
141    case 1:
142      for (int i = 0; i < particles.size(); i++) {
143        double N = particles[i]->energy();
144        double x = particles[i]->eta();
145        double y = particles[i]->phi();
146 +      if (y < Ylo) {
147 +        y += 2.0*PI;
148 +      }
149 +      if (y > Yhi) {
150 +        y -= 2.0*PI;
151 +      }
152        // loop over bins and add Gaussian in proper angle to smeared
153 <      for (vector< vector<double> >::size_type i2 = 0; i2 < 60; i2++) {
154 <        for (vector< double >::size_type j2 = 0; j2 < 60; j2++) {
153 >      for (vector< vector<double> >::size_type i2 = 0; i2 < 30; i2++) {
154 >        for (vector< double >::size_type j2 = 0; j2 < 30; j2++) {
155            double eta = static_cast<double>((signed int)i2) * XbinSize +
156 <            max_x - rcone - x;
157 <          double phi0 = static_cast<double>((signed int)j2) * YbinSize +
158 <            max_y - rcone - y;
159 <          double phi = acos(cos(phi0));
300 <          phi = sin(phi0) > 0 ? phi : -phi;
301 <          
156 >            Xlo - x;
157 >          double phi = static_cast<double>((signed int)j2) * YbinSize +
158 >            Ylo - y;
159 >
160            // transform eta, phi to proper angle
161            double theta = 2.0*atan(exp(-eta));
162            double iota = asin(sin(theta)*sin(phi));
163            
164            smeared[i2][j2] += (N*XbinSize*YbinSize/(2.0*PI*smear_*smear_))
165              * exp(-0.5*(theta*theta + iota*iota)/(smear_*smear_));
308
309          // correct for out-of-range phi
310          double transform = 0.0;
311          if (histo->GetYaxis()->GetXmin() < -PI) {
312            transform = -2.0*PI;
313            phi += transform;
314            iota = asin(sin(theta)*sin(phi));
315            smeared[i2][j2] += (N*XbinSize*YbinSize/(2.0*PI*smear_*smear_))
316            * exp(-0.5*(theta*theta + iota*iota)/(smear_*smear_));
317          }
318          if (histo->GetYaxis()->GetXmax() > PI) {
319            transform = 2.0*PI;
320            phi += transform;
321            iota = asin(sin(theta)*sin(phi));
322            smeared[i2][j2] += (N*XbinSize*YbinSize/(2.0*PI*smear_*smear_))
323            * exp(-0.5*(theta*theta + iota*iota)/(smear_*smear_));
324          }
166          }
167        }
168      }
# Line 332 | Line 173 | TH2D * JetFinderAnalyzer::make_histo(con
173        double N = particles[i]->energy();
174        double x = particles[i]->eta();
175        double y = particles[i]->phi();
176 +      if (y < Ylo) {
177 +        y += 2.0*PI;
178 +      }
179 +      if (y > Yhi) {
180 +        y -= 2.0*PI;
181 +      }
182        // loop over bins and add Gaussian to smeared
183 <      for (vector< vector<double> >::size_type i2 = 0; i2 < 60; i2++) {
184 <        for (vector< double >::size_type j2 = 0; j2 < 60; j2++) {
183 >      for (vector< vector<double> >::size_type i2 = 0; i2 < 30; i2++) {
184 >        for (vector< double >::size_type j2 = 0; j2 < 30; j2++) {
185            double eta = static_cast<double>((signed int)i2) * XbinSize
186 <            + max_x - rcone - x;
187 <          double phi0 = static_cast<double>((signed int)j2) * YbinSize +
188 <            max_y - rcone - y;
342 <          double phi = acos(cos(phi0));
343 <          phi = sin(phi0) > 0 ? phi : -phi;
344 <          smeared[i2][j2] += (N*XbinSize*YbinSize/(2.0*PI*smear_*smear_))
345 <            * exp(-0.5*(eta*eta + phi*phi)/(smear_*smear_));
186 >            + Xlo - x;
187 >          double phi = static_cast<double>((signed int)j2) * YbinSize +
188 >            Ylo - y;
189  
190 <          // correct for out-of-range phi
348 <          double transform = 0.0;
349 <          if (histo->GetYaxis()->GetXmin() < -PI) {
350 <            transform = -2.0*PI;
351 <            phi += transform;
352 <            smeared[i2][j2] += (N*XbinSize*YbinSize/(2.0*PI*smear_*smear_))
353 <            * exp(-0.5*(eta*eta + phi*phi)/(smear_*smear_));
354 <          }
355 <          if (histo->GetYaxis()->GetXmax() > PI) {
356 <            transform = 2.0*PI;
357 <            phi += transform;
358 <            smeared[i2][j2] += (N*XbinSize*YbinSize/(2.0*PI*smear_*smear_))
190 >          smeared[i2][j2] += (N*XbinSize*YbinSize/(2.0*PI*smear_*smear_))
191              * exp(-0.5*(eta*eta + phi*phi)/(smear_*smear_));
360          }
192          }
193        }
194      }  
195    }
196    // set histogram to match smear vector
197 <  for (int i = 1; i <= 60; i++) {
198 <    for (int j = 1; j <= 60; j++) {
197 >  for (int i = 1; i <= 30; i++) {
198 >    for (int j = 1; j <= 30; j++) {
199        histo->SetBinContent(i, j, smeared[i-1][j-1]);
200      }
201    }
202 <
203 <  return histo;
204 < }
205 <
206 < void seed_with_CA(vector<reco::Candidate *> gParticles, TH2 *histo,
207 <                  jetfit::model_def &_mdef) {
377 <  // create a PseudoJet vector
378 <  vector<PseudoJet> particles;
379 <  for (unsigned i = 0; i < gParticles.size(); i++) {
380 <    double x_max = (histo->GetXaxis()->GetXmax()
381 <                    + histo->GetXaxis()->GetXmin()) / 2.0;
382 <    double y_max = (histo->GetYaxis()->GetXmax()
383 <                    + histo->GetYaxis()->GetXmin()) / 2.0;
384 <    valarray<double> pmom(4);
385 <    pmom[0] = gParticles[i]->px();
386 <    pmom[1] = gParticles[i]->py();
387 <    pmom[2] = gParticles[i]->pz();
388 <    pmom[3] = gParticles[i]->energy();
389 <    double eta = gParticles[i]->eta();
390 <    double phi = gParticles[i]->phi();
391 <    // phi range corrections
392 <    if (phi - y_max > 2.0*PI) phi -= 2.0*PI;
393 <    if (phi - y_max < -2.0*PI) phi += 2.0*PI;
394 <    if ((eta - x_max)*(eta - x_max) + (phi - y_max)*(phi - y_max) < 0.25) {
395 <      PseudoJet j(pmom);
396 <      particles.push_back(j);
202 >  }
203 >  else {
204 >    // don't smear--just fill with particles
205 >    for (int i = 0; i < particles.size(); i++) {
206 >      histo->Fill(particles[i]->eta(), particles[i]->phi(),
207 >                  particles[i]->energy());
208      }
209    }
210  
211 <  // choose a jet definition
212 <  double R = 0.2;
402 <  JetDefinition jet_def(cambridge_algorithm, R);
403 <
404 <  // run clustering and extract the jets
405 <  ClusterSequence cs(particles, jet_def);
406 <  vector<PseudoJet> jets = cs.inclusive_jets();
407 <
408 <  double XbinSize = (histo->GetXaxis()->GetXmax()
409 <                     - histo->GetXaxis()->GetXmin()) /
410 <    static_cast<double>(histo->GetXaxis()->GetNbins());
411 <  double YbinSize = (histo->GetYaxis()->GetXmax()
412 <                     - histo->GetYaxis()->GetXmin()) /
413 <    static_cast<double>(histo->GetYaxis()->GetNbins());
211 >  return histo;
212 > }
213  
214 <  // seed with C-A jets
215 <  int ijset = 0;
216 <  for (unsigned ij = 0; ij < jets.size(); ij++) {
217 <    double N = jets[ij].e();
218 <    if (N > 50.0) {
219 <      _mdef.set_special_par(ijset, 0, N, _mdef.chisquare_error(N)*0.1,
220 <                            0.0, 1.0e6);
221 <      _mdef.set_special_par(ijset, 1, jets[ij].eta(), 0.01,
222 <                            0.0, 0.0);
223 <      double mdef_phi = jets[ij].phi() > PI ? jets[ij].phi() - 2*PI
224 <        : jets[ij].phi();
225 <      _mdef.set_special_par(ijset, 2, mdef_phi, 0.01,
226 <                            0.0, 0.0);
227 <      _mdef.set_special_par(ijset, 3, 0.1, 0.001, 0.0, 0.0);
228 <      ijset++;
229 <    }
230 <  }
214 > template <class Jet>
215 > void seed_with_jetcoll(vector<Jet> jets,
216 >                  HistoFitter::ModelDefinition &_mdef, double phi_lo = -PI,
217 >                       double phi_hi = PI) {
218 >  // seed with jet collection
219 >  double N = jets[0].energy();
220 >  double eta = jets[0].eta();
221 >  double phi = jets[0].phi();
222 >  _mdef.setIndivParameter(0, string("N0"), N, _mdef.chisquareSigma(N)*0.1,
223 >                          0.0, 1.0e6);
224 >  _mdef.setIndivParameter(1, string("mu_x0"), eta, 0.01,
225 >                          0.0, 0.0);
226 >  if (phi < phi_lo) {
227 >    phi += 2.0*PI;
228 >  }
229 >  if (phi > phi_hi) {
230 >    phi -= 2.0*PI;
231 >  }
232 >  _mdef.setIndivParameter(2, string("mu_y0"), phi, 0.01,
233 >                          0.0, 0.0);
234 >  _mdef.setIndivParameter(3, string("sig0"), 0.1, 0.001, 0.0, 0.0);
235   }
236  
237 < jetfit::model_def& JetFinderAnalyzer::make_model_def(const edm::Event& evt,
237 > HistoFitter::ModelDefinition& JetFinderAnalyzer::make_model_def(const edm::Event& evt,
238                                                   const edm::EventSetup&,
239                                                   TH2 *histo) {
240 <  class jf_model_def : public jetfit::model_def {
240 >  class jf_model_def : public HistoFitter::ModelDefinition {
241    public:
242 <    virtual double chisquare_error(double E) {
243 <      return exp(-(4.2 + 0.11*E));
441 <      // study from 09-04-09
242 >    virtual double chisquareSigma(double E) {
243 >      return 0.298 - 0.9557*E; // study 11-09-09
244      }
245    };
246  
247    jf_model_def *_mdef = new jf_model_def();
248    TFormula *formula = new TFormula("gaus2d",
249                                       "[0]*exp(-0.5*((x-[1])**2 + (y-[2])**2)/([3]**2))/(2*pi*[3]**2)");
250 <  _mdef->set_formula(formula);
251 <  _mdef->set_indiv_max_E(0);
252 <  _mdef->set_indiv_max_x(1);
253 <  _mdef->set_indiv_max_y(2);
254 <  _mdef->set_indiv_par(0, string("N"), 0.0, 0.0, 0.0, 1.0e6);
255 <  _mdef->set_indiv_par(1, string("mu_x"), 0.0, 0.0, 0.0, 0.0);
256 <  _mdef->set_indiv_par(2, string("mu_y"), 0.0, 0.0, 0.0, 0.0);
257 <  _mdef->set_indiv_par(3, string("sig"), 0.1, 0.001, 0.0, 0.0);
250 >  _mdef->setFormula(formula);
251 >  _mdef->setIndivEnergy(0);
252 >  _mdef->setIndivMeanX(1);
253 >  _mdef->setIndivMeanY(2);
254 >  _mdef->setIndivParameter(0, string("N"), 0.0, 0.0, 0.0, 1.0e6);
255 >  _mdef->setIndivParameter(1, string("mu_x"), 0.0, 0.0, 0.0, 0.0);
256 >  _mdef->setIndivParameter(2, string("mu_y"), 0.0, 0.0, 0.0, 0.0);
257 >  _mdef->setIndivParameter(3, string("sig"), 0.1, 0.001, 0.0, 0.0);
258  
259 <  seed_with_CA(get_particles(evt), histo, *_mdef);
458 <
459 <  jetfit::set_model_def(_mdef);
460 <
461 <  // generate initial fit histogram
462 <  edm::Service<TFileService> fs;
463 <  TH2D *init_fit_histo = fs->make<TH2D>(("init_fit_"+string(histo->GetName()))
464 <                                        .c_str(),
465 <                                        ("Initial fit for "
466 <                                         +string(histo->GetName())).c_str(),
467 <                                        histo->GetXaxis()->GetNbins(),
468 <                                        histo->GetXaxis()->GetXmin(),
469 <                                        histo->GetXaxis()->GetXmax(),
470 <                                        histo->GetXaxis()->GetNbins(),
471 <                                        histo->GetXaxis()->GetXmin(),
472 <                                        histo->GetXaxis()->GetXmax());
473 <  double XbinSize = (histo->GetXaxis()->GetXmax()
474 <                     - histo->GetXaxis()->GetXmin()) /
475 <    static_cast<double>(histo->GetXaxis()->GetNbins());
476 <  double YbinSize = (histo->GetYaxis()->GetXmax()
477 <                     - histo->GetYaxis()->GetXmin()) /
478 <    static_cast<double>(histo->GetYaxis()->GetNbins());
479 <  double Xlo = histo->GetXaxis()->GetXmin();
480 <  double Xhi = histo->GetXaxis()->GetXmax();
481 <  double Ylo = histo->GetYaxis()->GetXmin();
482 <  double Yhi = histo->GetYaxis()->GetXmax();
259 >  _mdef->setMaxNumberOfGaussians(3);
260  
261 <  for (int i = 0; i < 60; i++) {
262 <    for (int j = 0; j < 60; j++) {
263 <      double x = (static_cast<double>(i) + 0.5)*XbinSize + Xlo;
264 <      double y = (static_cast<double>(j) + 0.5)*YbinSize + Ylo;
265 <      double pval[256];
266 <      if (_mdef->get_n_special_par_sets() > 64) {
267 <        cerr << "Parameter overload" << endl;
268 <        return *_mdef;
269 <      }
270 <      else {
271 <        for (int is = 0; is < _mdef->get_n_special_par_sets(); is++) {
495 <          for (int ii = 0; ii < 4; ii++) {
496 <            double spval, sperr, splo, sphi;
497 <            _mdef->get_special_par(is, ii, spval, sperr, splo, sphi);
498 <            pval[4*is + ii] = spval;
499 <          }
261 >  // get jetcoll from event file and select highest e jet
262 >  if (info_type_ == 0) {
263 >    edm::Handle< vector<reco::GenJet> > jet_collection;
264 >    evt.getByLabel(jet_algo_, jet_collection);
265 >    reco::GenJet highest_e_jet;
266 >    bool found_jet = false;
267 >    for (unsigned i = 0; i < jet_collection->size(); i++) {
268 >      if (!found_jet || (*jet_collection)[i].energy() > highest_e_jet.energy())
269 >        {
270 >          highest_e_jet = (*jet_collection)[i];
271 >          found_jet = true;
272          }
501      }
502      jetfit::set_ngauss(_mdef->get_n_special_par_sets());
503      init_fit_histo->SetBinContent(i+1, j+1,
504                                    jetfit::fit_fcn(x, y, pval));
273      }
274 +    vector<reco::GenJet> highest_e_jet_coll;
275 +    highest_e_jet_coll.push_back(highest_e_jet);
276 +    seed_with_jetcoll(highest_e_jet_coll, *_mdef,
277 +                      histo->GetYaxis()->GetXmin(),
278 +                      histo->GetYaxis()->GetXmax());
279 +  }
280 +  if (info_type_ == 1) {
281 +    edm::Handle< vector<reco::PFJet> > jet_collection;
282 +    evt.getByLabel(jet_algo_, jet_collection);
283 +    reco::PFJet highest_e_jet;
284 +    bool found_jet = false;
285 +    for (unsigned i = 0; i < jet_collection->size(); i++) {
286 +      if (!found_jet || (*jet_collection)[i].energy() > highest_e_jet.energy())
287 +        {
288 +          highest_e_jet = (*jet_collection)[i];
289 +          found_jet = true;
290 +        }
291 +    }
292 +    vector<reco::PFJet> highest_e_jet_coll;
293 +    highest_e_jet_coll.push_back(highest_e_jet);
294 +    seed_with_jetcoll(highest_e_jet_coll, *_mdef,
295 +                      histo->GetYaxis()->GetXmin(),
296 +                      histo->GetYaxis()->GetXmax());
297    }
298  
299    return *_mdef;
300   }
301  
302   void JetFinderAnalyzer::beginJob(const edm::EventSetup &es) {
512  ofs.open("jetfindlog.txt", ios::out);
513  if (ofs.fail()) {
514    cerr << "Opening jetfindlog.txt FAILED" << endl;
515  }
516  ofs << "Jetfinder log" << endl
517      << "=============" << endl << endl;
518 }
519
520 ostream& operator<<(ostream &out, jetfit::trouble t) {
521  string action, error_string;
522  
523  if (t.istat != 3) {
524    switch(t.occ) {
525    case jetfit::T_NULL:
526      action = "Program"; break;
527    case jetfit::T_SIMPLEX:
528      action = "SIMPLEX"; break;
529    case jetfit::T_MIGRAD:
530      action = "MIGRAD"; break;
531    case jetfit::T_MINOS:
532      action = "MINOS"; break;
533    default:
534      action = "Program"; break;
535    }
536
537    switch (t.istat) {
538    case 0:
539      error_string = "Unable to calculate error matrix"; break;
540    case 1:
541      error_string = "Error matrix a diagonal approximation"; break;
542    case 2:
543      error_string = "Error matrix not positive definite"; break;
544    case 3:
545      error_string = "Converged successfully"; break;
546    default:
547      ostringstream oss;
548      oss<<"Unknown status code "<<t.istat << flush;
549      error_string = oss.str(); break;
550    }
303  
552    if (t.occ != jetfit::T_NULL)
553      out << action<<" trouble: "<<error_string;
554    else
555      out << "Not calculated" << endl;
556  }
557
558  return out;
304   }
305  
306 < void JetFinderAnalyzer::analyze_results(jetfit::results r,
307 <                                     std::vector<jetfit::trouble> t,
306 > void JetFinderAnalyzer::analyze_results(HistoFitter::FitResults r,
307 >                                     std::vector<HistoFitter::Trouble> t,
308                                       TH2 *hist_orig) {
309 <  ofs << "Histogram "<<hist_orig->GetName() << endl;
565 <  for (int i = 0; i < unique_jets[hist_orig].size(); i++) {
566 <    ofs << "For "<<i+1<<" gaussians: " << endl
567 <        << t.at(i) << endl
568 <        << "chisquare="<<r.chisquare.at(i) << endl
569 <        << unique_jets[hist_orig][i].size()<<" unique jets found" << endl;
570 <    for (int j = 0; j < unique_jets[hist_orig][i].size(); j++) {
571 <      jet _jet = unique_jets[hist_orig][i][j];
572 <      ofs << "Jet "<<j<<": Energy = "<<_jet.energy<<", eta = "<<_jet.eta
573 <          << ", phi = "<<_jet.phi << endl;
574 <    }
575 <    ofs << endl;
576 <  }
577 <  ofs << endl;
578 <
579 <  // save fit function histograms to root file
580 <  edm::Service<TFileService> fs;
581 <  for (vector< vector<double> >::size_type i = 0;
582 <       i < r.pval.size(); i++) {
583 <    jetfit::set_ngauss(r.pval[i].size() / 4);
584 <    TF2 *tf2 = new TF2("fit_func", jetfit::fit_fcn_TF2,
585 <                       hist_orig->GetXaxis()->GetXmin(),
586 <                       hist_orig->GetXaxis()->GetXmax(),
587 <                       hist_orig->GetYaxis()->GetXmin(),
588 <                       hist_orig->GetYaxis()->GetXmax(),
589 <                       r.pval[i].size());
590 <    for (vector<double>::size_type j = 0; j < r.pval[i].size(); j++) {
591 <      tf2->SetParameter(j, r.pval[i][j]);
592 <    }
593 <    ostringstream fit_histo_oss;
594 <    fit_histo_oss << hist_orig->GetName()<<"_fit_"<<i << flush;
595 <    tf2->SetNpx(hist_orig->GetXaxis()->GetNbins());
596 <    tf2->SetNpy(hist_orig->GetYaxis()->GetNbins());
597 <    TH2D *fit_histo = fs->make<TH2D>(fit_histo_oss.str().c_str(),
598 <                                     fit_histo_oss.str().c_str(),
599 <                                     hist_orig->GetXaxis()->GetNbins(),
600 <                                     hist_orig->GetXaxis()->GetXmin(),
601 <                                     hist_orig->GetXaxis()->GetXmax(),
602 <                                     hist_orig->GetYaxis()->GetNbins(),
603 <                                     hist_orig->GetYaxis()->GetXmin(),
604 <                                     hist_orig->GetYaxis()->GetXmax());
605 <    TH1 *tf2_histo = tf2->CreateHistogram();
606 <    double XbinSize = (fit_histo->GetXaxis()->GetXmax()
607 <                       - fit_histo->GetXaxis()->GetXmin())
608 <      / static_cast<double>(fit_histo->GetXaxis()->GetNbins());
609 <    double YbinSize = (fit_histo->GetYaxis()->GetXmax()
610 <                       - fit_histo->GetYaxis()->GetXmin())
611 <      / static_cast<double>(fit_histo->GetYaxis()->GetNbins());
612 <    for (int ih = 0; ih < tf2->GetNpx(); ih++) {
613 <      for (int jh = 0; jh < tf2->GetNpy(); jh++) {
614 <        fit_histo->SetBinContent(ih+1, jh+1,
615 <                        tf2_histo->GetBinContent(ih+1, jh+1)
616 <                                 * XbinSize * YbinSize);
617 <      }
618 <    }
619 <  }
620 <
621 <  // save results to file
622 <  ostringstream res_tree_oss, rt_title_oss;
623 <  res_tree_oss << hist_orig->GetName()<<"_results" << flush;
624 <  rt_title_oss << "Fit results for "<<hist_orig->GetName() << flush;
309 >  // perform analysis of fit results
310   }
311  
312   DEFINE_FWK_MODULE(JetFinderAnalyzer);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines