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.3 by dnisson, Thu Sep 3 18:02:35 2009 UTC vs.
Revision 1.14 by dnisson, Wed Sep 23 03:31:30 2009 UTC

# Line 7 | Line 7
7   #include "FWCore/MessageLogger/interface/MessageLogger.h"
8   #include "PhysicsTools/UtilAlgos/interface/TFileService.h"
9  
10 < #include "SimDataFormats/HepMCProduct/interface/HepMCProduct.h"
11 < #include "DataFormats/Candidate/interface/Particle.h"
10 > #include "DataFormats/HepMCCandidate/interface/GenParticleFwd.h"
11 > #include "DataFormats/HepMCCandidate/interface/GenParticle.h"
12   #include "DataFormats/ParticleFlowCandidate/interface/PFCandidateFwd.h"
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>
# Line 29 | Line 35
35   using namespace std;
36   using namespace fastjet;
37  
32 // Class to represent a "generic" particle, whether raw or reconstructed
33 class GenericParticle {
34 public:
35  GenericParticle(double __px, double __py, double __pz, double __e,
36                  double __charge = 0.0)
37  : _px(__px), _py(__py), _pz(__pz), _e(__e), _charge(__charge) {
38  }
39  GenericParticle(const HepMC::GenParticle &genParticle)
40  : _charge(0.0) {
41    _px = genParticle.momentum().px();
42    _py = genParticle.momentum().py();
43    _pz = genParticle.momentum().pz();
44    _e = genParticle.momentum().e();
45  }
46  GenericParticle(const reco::PFCandidate &pfCandidate)
47  : _charge(0.0) {
48    _px = pfCandidate.px();
49    _py = pfCandidate.py();
50    _pz = pfCandidate.pz();
51    _e = pfCandidate.energy();
52  }
53  double px() {
54    return _px;
55  }
56  double py() {
57    return _py;
58  }
59  double pz() {
60    return _pz;
61  }
62  double e() {
63    return _e;
64  }
65  double charge() {
66    return _charge;
67  }
68  double eta() {
69    double theta = acos(_pz/sqrt(_px*_px + _py*_py + _pz*_pz));
70    return -log(tan(theta*0.5));
71  }
72  double phi() {
73    double phi0 = acos(_px/sqrt(_px*_px + _py*_py));
74    return _py > 0.0 ? phi0 : -phi0;
75  }
76  double m() {
77    return sqrt(_e*_e - _px*_px - _py*_py - _pz*_pz);
78  }
79 private:
80  double _px;
81  double _py;
82  double _pz;
83  double _e;
84  double _charge;
85 };
86
38   class JetFinderAnalyzer : public JetFitAnalyzer {
39   public:
40    struct jet {
# Line 164 | Line 115 | private:
115                                             TH2 *);
116    virtual void analyze_results(jetfit::results r,
117                                 std::vector<jetfit::trouble> t, TH2 *);
118 <  vector<GenericParticle *> get_particles(const edm::Event&);
118 >  vector<reco::Candidate *> get_particles(const edm::Event&);
119    void fetchCandidateCollection(edm::Handle<reco::PFCandidateCollection>&,
120                                  const edm::InputTag&, const edm::Event&) const;
121 +  void fetchCandidateCollection(edm::Handle<reco::GenParticleCollection>&,
122 +                                const edm::InputTag&, const edm::Event&) const;
123  
124    fstream ofs;
125    edm::InputTag inputTagPFCandidates_;
126 +  edm::InputTag inputTagGenParticles_;
127    int info_type_;
128    double smear_;
129    int smear_coord_;
130 +  string jet_algo_;
131   };
132  
133   map<TH2 *, vector< vector< JetFinderAnalyzer::jet > > >
# Line 183 | Line 138 | JetFinderAnalyzer::JetFinderAnalyzer(con
138   {
139    info_type_ = pSet.getUntrackedParameter("info_type", 0);
140  
141 +  if (info_type_ == 0) {
142 +    inputTagGenParticles_ = pSet.getParameter<edm::InputTag>("GenParticles");
143 +  }
144    if (info_type_ == 1) {
145      inputTagPFCandidates_ = pSet.getParameter<edm::InputTag>("PFCandidates");
146    }
# Line 191 | Line 149 | JetFinderAnalyzer::JetFinderAnalyzer(con
149    smear_coord_ = pSet.getUntrackedParameter("smear_coord", 0);
150    // 0 = eta-phi smear
151    // 1 = proper angle smear
152 +  jet_algo_ = pSet.getParameter<string>("jet_algo");
153    set_user_minuit(jetfinder);
154   }
155  
# Line 211 | Line 170 | JetFinderAnalyzer::fetchCandidateCollect
170    
171   }
172  
173 < vector<GenericParticle *> JetFinderAnalyzer::get_particles(const edm::Event &evt) {
173 > void
174 > JetFinderAnalyzer::fetchCandidateCollection(edm::Handle<reco::GenParticleCollection>& c,
175 >                                      const edm::InputTag& tag,
176 >                                      const edm::Event& iEvent) const {
177 >  
178 >  bool found = iEvent.getByLabel(tag, c);
179 >  
180 >  if(!found ) {
181 >    ostringstream  err;
182 >    err<<" cannot get GenParticles: "
183 >       <<tag<<endl;
184 >    edm::LogError("GenParticles")<<err.str();
185 >    throw cms::Exception( "MissingProduct", err.str());
186 >  }
187 >  
188 > }
189 >
190 > vector<reco::Candidate *> JetFinderAnalyzer::get_particles(const edm::Event &evt) {
191   // fill unreduced histo
192 <  edm::Handle<edm::HepMCProduct> hRaw;
192 >  edm::Handle<reco::GenParticleCollection> hRaw;
193    edm::Handle<reco::PFCandidateCollection> hPFlow;
194    if (info_type_ == 0) {
195 <    evt.getByLabel("source", hRaw);
195 >    fetchCandidateCollection(hRaw,
196 >                             inputTagGenParticles_,
197 >                             evt);
198    }
199    if (info_type_ == 1) {
200      fetchCandidateCollection(hPFlow,
# Line 224 | Line 202 | vector<GenericParticle *> JetFinderAnaly
202                               evt);
203    }
204      
205 <  vector<GenericParticle *> particles;
205 >  vector<reco::Candidate *> particles;
206  
207    switch (info_type_) {
208    case 0:
209 <    const HepMC::GenEvent *hmcEvt = hRaw->GetEvent();
210 <    for (HepMC::GenEvent::particle_const_iterator
211 <           pit = hmcEvt->particles_begin(); pit != hmcEvt->particles_end();
234 <         pit++) {
235 <      if ((*pit)->status() == 1) {
236 <        particles.push_back(new GenericParticle(**pit));
209 >    for (unsigned i = 0; i < hRaw->size(); i++) {
210 >      if ((*hRaw)[i].status() == 1) {
211 >        particles.push_back((reco::Candidate *)&((*hRaw)[i]));
212        }
213      }
239    
214      break;
215    case 1:
216      for (unsigned i = 0; i < hPFlow->size(); i++) {
217 <      particles.push_back(new GenericParticle((*hPFlow)[i]));
217 >      particles.push_back((reco::Candidate *)&((*hPFlow)[i]));
218      }
219      break;
220    default:
# Line 251 | Line 225 | vector<GenericParticle *> JetFinderAnaly
225   }
226  
227   TH2D * JetFinderAnalyzer::make_histo(const edm::Event &evt, const edm::EventSetup&) {
228 <  ostringstream oss;
255 <  oss << "eta_phi_energy_unred"<<evt.id().event() << flush;
256 <  TH2D *unred_histo = new TH2D(oss.str().c_str(), oss.str().c_str(),
257 <                               600, -2.5, 2.5, 600, -PI, PI);
228 >  const reco::Jet * highest_e_jet;
229  
230 <  vector<GenericParticle *> particles = get_particles(evt);
231 <  for (int i = 0; i < particles.size(); i++) {
232 <    unred_histo->Fill(particles[i]->eta(),
233 <                      particles[i]->phi(),
234 <                      particles[i]->e());
230 >  if (info_type_ == 0) {
231 >    edm::Handle< vector<reco::GenJet> > evtJets;
232 >    evt.getByLabel(jet_algo_, evtJets);
233 >    for (unsigned i = 0; i < evtJets->size(); i++) {
234 >      if (i == 0 || (*evtJets)[i].energy() > highest_e_jet->energy()) {
235 >        highest_e_jet = &((*evtJets)[i]);
236 >      }
237 >    }
238    }
239 <
240 <  // reduce histo
241 <  ostringstream oss2;
242 <  oss2 << "eta_phi_energy_red"<<evt.id().event() << flush;
243 <  edm::Service<TFileService> fs;
244 <  // draw cone of radius 0.5 around highest energy bin, reduce
271 <  double maxE = 0.0;
272 <  int max_i = 29, max_j = 29;
273 <  for (int i = 0; i < unred_histo->GetNbinsX(); i++) {
274 <    for (int j = 0; j < unred_histo->GetNbinsY(); j++) {
275 <      double E = unred_histo->GetBinContent(i+1, j+1);
276 <      if (E > maxE) {
277 <        maxE = E;
278 <        max_i = i;
279 <        max_j = j;
239 >  else if (info_type_ == 1) {
240 >    edm::Handle< vector<reco::PFJet> > evtJets;
241 >    evt.getByLabel(jet_algo_, evtJets);
242 >    for (unsigned i = 0; i < evtJets->size(); i++) {
243 >      if (i == 0 || (*evtJets)[i].energy() > highest_e_jet->energy()) {
244 >        highest_e_jet = &((*evtJets)[i]);
245        }
246      }
247    }
248 <  
249 <  double rcone = 0.5;
250 <  double Xlo = unred_histo->GetXaxis()->GetXmin();
251 <  double Xhi = unred_histo->GetXaxis()->GetXmax();
252 <  double Ylo = unred_histo->GetYaxis()->GetXmin();
253 <  double Yhi = unred_histo->GetYaxis()->GetXmax();
254 <  double XbinSize = (Xhi - Xlo) /
255 <    static_cast<double>(unred_histo->GetXaxis()->GetNbins());
256 <  double YbinSize = (Yhi - Ylo) /
257 <    static_cast<double>(unred_histo->GetYaxis()->GetNbins());
258 <  double max_x = (static_cast<double>(max_i) + 0.5) * XbinSize + Xlo;
259 <  double max_y = (static_cast<double>(max_j) + 0.5) * YbinSize + Ylo;
260 <  TH2D *histo = fs->make<TH2D>(oss2.str().c_str(), oss2.str().c_str(),
261 <                               60, max_x-rcone, max_x+rcone,
262 <                               60, max_y-rcone, max_y+rcone);
263 <
264 <  // create an unsmeared reduced histo
265 <  TH2D *histo_unsmeared = fs->make<TH2D>((oss2.str()+"_unsmeared").c_str(),
266 <                                         (oss2.str()+"_unsmeared").c_str(),
267 <                                         60, max_x-rcone, max_x+rcone,
303 <                                         60, max_y-rcone, max_y+rcone);
248 >  cout << "found highest e jet" << endl;
249 >    
250 >  if (highest_e_jet == 0) {
251 >    cerr << "No fatjets found!" << endl; exit(1);
252 >  }
253 >
254 >  vector<const reco::Candidate *> particles =
255 >    highest_e_jet->getJetConstituentsQuick();
256 >  cout << "found highest e jet" << endl;
257 >
258 >  ostringstream oss;
259 >  oss << "eta_phi_energy"<<evt.id().event() << flush;
260 >  TH2D *histo = new TH2D(oss.str().c_str(), oss.str().c_str(),
261 >                         30,
262 >                         highest_e_jet->eta()-0.5,
263 >                         highest_e_jet->eta()+0.5,
264 >                         30,
265 >                         highest_e_jet->phi()-0.5,
266 >                         highest_e_jet->phi()+0.5);
267 >
268    for (int i = 0; i < particles.size(); i++) {
269 <    double N = particles[i]->e();
270 <    double x = particles[i]->eta();
271 <    double y = particles[i]->phi();
308 <    histo_unsmeared->Fill(x, y, N);
269 >    histo->Fill(particles[i]->eta(),
270 >                      particles[i]->phi(),
271 >                      particles[i]->energy());
272    }
273  
274 <  // create a smeared reduced histo
274 >  // create a smeared histo
275    // create a temporary 2D vector for smeared energies
276 <  XbinSize = (histo->GetXaxis()->GetXmax()
276 >  double XbinSize = (histo->GetXaxis()->GetXmax()
277                - histo->GetXaxis()->GetXmin()) /
278      static_cast<double>(histo->GetXaxis()->GetNbins());
279 <  YbinSize = (histo->GetYaxis()->GetXmax()
279 >  double YbinSize = (histo->GetYaxis()->GetXmax()
280                - histo->GetYaxis()->GetXmin()) /
281      static_cast<double>(histo->GetYaxis()->GetNbins());
282 <  vector< vector<double> > smeared(60, vector<double>(60, 0.0) );
282 >  double Xlo = histo->GetXaxis()->GetXmin();
283 >  double Ylo = histo->GetYaxis()->GetXmin();
284 >  vector< vector<double> > smeared(30, vector<double>(30, 0.0) );
285    switch (smear_coord_) {
286    case 1:
287      for (int i = 0; i < particles.size(); i++) {
288 <      double N = particles[i]->e();
288 >      double N = particles[i]->energy();
289        double x = particles[i]->eta();
290        double y = particles[i]->phi();
291        // loop over bins and add Gaussian in proper angle to smeared
292 <      for (vector< vector<double> >::size_type i2 = 0; i2 < 60; i2++) {
293 <        for (vector< double >::size_type j2 = 0; j2 < 60; j2++) {
292 >      for (vector< vector<double> >::size_type i2 = 0; i2 < 30; i2++) {
293 >        for (vector< double >::size_type j2 = 0; j2 < 30; j2++) {
294            double eta = static_cast<double>((signed int)i2) * XbinSize +
295 <            max_x - rcone - x;
296 <          double phi = acos(cos(static_cast<double>((signed int)j2) * YbinSize +
297 <            max_y - rcone - y));
298 <          phi = sin(phi) > 0 ? phi : -phi;
295 >            Xlo;
296 >          double phi0 = static_cast<double>((signed int)j2) * YbinSize +
297 >            Ylo;
298 >          double phi = acos(cos(phi0));
299 >          phi = sin(phi0) > 0 ? phi : -phi;
300            
301            // transform eta, phi to proper angle
302            double theta = 2.0*atan(exp(-eta));
# Line 338 | Line 304 | TH2D * JetFinderAnalyzer::make_histo(con
304            
305            smeared[i2][j2] += (N*XbinSize*YbinSize/(2.0*PI*smear_*smear_))
306              * exp(-0.5*(theta*theta + iota*iota)/(smear_*smear_));
307 +
308 +          // correct for out-of-range phi
309 +          double transform = 0.0;
310 +          if (histo->GetYaxis()->GetXmin() < -PI) {
311 +            transform = -2.0*PI;
312 +            phi += transform;
313 +            iota = asin(sin(theta)*sin(phi));
314 +            smeared[i2][j2] += (N*XbinSize*YbinSize/(2.0*PI*smear_*smear_))
315 +            * exp(-0.5*(theta*theta + iota*iota)/(smear_*smear_));
316 +          }
317 +          if (histo->GetYaxis()->GetXmax() > PI) {
318 +            transform = 2.0*PI;
319 +            phi += transform;
320 +            iota = asin(sin(theta)*sin(phi));
321 +            smeared[i2][j2] += (N*XbinSize*YbinSize/(2.0*PI*smear_*smear_))
322 +            * exp(-0.5*(theta*theta + iota*iota)/(smear_*smear_));
323 +          }
324          }
325        }
326      }
# Line 345 | Line 328 | TH2D * JetFinderAnalyzer::make_histo(con
328    case 0:
329    default:
330      for (int i = 0; i < particles.size(); i++) {
331 <      double N = particles[i]->e();
331 >      double N = particles[i]->energy();
332        double x = particles[i]->eta();
333        double y = particles[i]->phi();
334        // loop over bins and add Gaussian to smeared
335 <      for (vector< vector<double> >::size_type i2 = 0; i2 < 60; i2++) {
336 <        for (vector< double >::size_type j2 = 0; j2 < 60; j2++) {
335 >      for (vector< vector<double> >::size_type i2 = 0; i2 < 30; i2++) {
336 >        for (vector< double >::size_type j2 = 0; j2 < 30; j2++) {
337            double eta = static_cast<double>((signed int)i2) * XbinSize
338 <            + max_x - rcone - x;
339 <          double phi = acos(cos(static_cast<double>((signed int)j2) * YbinSize
340 <            + max_y - rcone - y));
341 <          phi = sin(phi) > 0 ? phi : -phi;
338 >            + Xlo;
339 >          double phi0 = static_cast<double>((signed int)j2) * YbinSize +
340 >            Ylo;
341 >          double phi = acos(cos(phi0));
342 >          phi = sin(phi0) > 0 ? phi : -phi;
343            smeared[i2][j2] += (N*XbinSize*YbinSize/(2.0*PI*smear_*smear_))
344              * exp(-0.5*(eta*eta + phi*phi)/(smear_*smear_));
345 +
346 +          // correct for out-of-range phi
347 +          double transform = 0.0;
348 +          if (histo->GetYaxis()->GetXmin() < -PI) {
349 +            transform = -2.0*PI;
350 +            phi += transform;
351 +            smeared[i2][j2] += (N*XbinSize*YbinSize/(2.0*PI*smear_*smear_))
352 +            * exp(-0.5*(eta*eta + phi*phi)/(smear_*smear_));
353 +          }
354 +          if (histo->GetYaxis()->GetXmax() > PI) {
355 +            transform = 2.0*PI;
356 +            phi += transform;
357 +            smeared[i2][j2] += (N*XbinSize*YbinSize/(2.0*PI*smear_*smear_))
358 +            * exp(-0.5*(eta*eta + phi*phi)/(smear_*smear_));
359 +          }
360          }
361        }
362      }  
363    }
364    // set histogram to match smear vector
365 <  for (int i = 1; i <= 60; i++) {
366 <    for (int j = 1; j <= 60; j++) {
365 >  for (int i = 1; i <= 30; i++) {
366 >    for (int j = 1; j <= 30; j++) {
367        histo->SetBinContent(i, j, smeared[i-1][j-1]);
368      }
369    }
# Line 372 | Line 371 | TH2D * JetFinderAnalyzer::make_histo(con
371    return histo;
372   }
373  
374 < void seed_with_CA(vector<GenericParticle *> gParticles, TH2 *histo,
374 > template <class Jet>
375 > void seed_with_jetcoll(vector<Jet> jets,
376                    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]->e();
389 <    double eta = gParticles[i]->eta();
390 <    double phi = gParticles[i]->phi();
391 <    if ((eta - x_max)*(eta - x_max) + (phi - y_max)*(phi - y_max) < 0.25) {
392 <      PseudoJet j(pmom);
393 <      particles.push_back(j);
394 <    }
395 <  }
396 <
397 <  // choose a jet definition
398 <  double R = 0.2;
399 <  JetDefinition jet_def(cambridge_algorithm, R);
400 <
401 <  // run clustering and extract the jets
402 <  ClusterSequence cs(particles, jet_def);
403 <  vector<PseudoJet> jets = cs.inclusive_jets();
404 <
405 <  double XbinSize = (histo->GetXaxis()->GetXmax()
406 <                     - histo->GetXaxis()->GetXmin()) /
407 <    static_cast<double>(histo->GetXaxis()->GetNbins());
408 <  double YbinSize = (histo->GetYaxis()->GetXmax()
409 <                     - histo->GetYaxis()->GetXmin()) /
410 <    static_cast<double>(histo->GetYaxis()->GetNbins());
411 <
412 <  // seed with C-A jets
377 >  // seed with jet collection
378    int ijset = 0;
379    for (unsigned ij = 0; ij < jets.size(); ij++) {
380 <    double N = jets[ij].e();
381 <    if (N > 50.0) {
380 >    double N = jets[ij].energy();
381 >    double eta = jets[ij].eta();
382 >    double phi = jets[ij].phi();
383 >    if (N > 10.0) {
384        _mdef.set_special_par(ijset, 0, N, _mdef.chisquare_error(N)*0.1,
385                              0.0, 1.0e6);
386 <      _mdef.set_special_par(ijset, 1, jets[ij].eta(), 0.01,
386 >      _mdef.set_special_par(ijset, 1, eta, 0.01,
387                              0.0, 0.0);
388 <      double mdef_phi = jets[ij].phi() > PI ? jets[ij].phi() - 2*PI
389 <        : jets[ij].phi();
388 >      double mdef_phi = phi > PI ? phi - 2*PI
389 >        : phi;
390        _mdef.set_special_par(ijset, 2, mdef_phi, 0.01,
391                              0.0, 0.0);
392        _mdef.set_special_par(ijset, 3, 0.1, 0.001, 0.0, 0.0);
# Line 434 | Line 401 | jetfit::model_def& JetFinderAnalyzer::ma
401    class jf_model_def : public jetfit::model_def {
402    public:
403      virtual double chisquare_error(double E) {
404 <      return 0.97*E + 14.0;
405 <      // study from 08-27-09
404 >      return exp(-(4.2 + 0.11*E));
405 >      // study from 09-04-09
406      }
407    };
408  
# Line 451 | Line 418 | jetfit::model_def& JetFinderAnalyzer::ma
418    _mdef->set_indiv_par(2, string("mu_y"), 0.0, 0.0, 0.0, 0.0);
419    _mdef->set_indiv_par(3, string("sig"), 0.1, 0.001, 0.0, 0.0);
420  
421 <  seed_with_CA(get_particles(evt), histo, *_mdef);
421 >  // get jetcoll from event file and select highest e jet
422 >  if (info_type_ == 0) {
423 >    edm::Handle< vector<reco::GenJet> > jet_collection;
424 >    evt.getByLabel(jet_algo_, jet_collection);
425 >    reco::GenJet highest_e_jet;
426 >    bool found_jet = false;
427 >    for (unsigned i = 0; i < jet_collection->size(); i++) {
428 >      if (!found_jet || (*jet_collection)[i].energy() > highest_e_jet.energy())
429 >        {
430 >          highest_e_jet = (*jet_collection)[i];
431 >        }
432 >    }
433 >    vector<reco::GenJet> highest_e_jet_coll;
434 >    highest_e_jet_coll.push_back(highest_e_jet);
435 >    seed_with_jetcoll(highest_e_jet_coll, *_mdef);
436 >  }
437 >  if (info_type_ == 1) {
438 >    edm::Handle< vector<reco::PFJet> > jet_collection;
439 >    evt.getByLabel(jet_algo_, jet_collection);
440 >    reco::PFJet highest_e_jet;
441 >    bool found_jet = false;
442 >    for (unsigned i = 0; i < jet_collection->size(); i++) {
443 >      if (!found_jet || (*jet_collection)[i].energy() > highest_e_jet.energy())
444 >        {
445 >          highest_e_jet = (*jet_collection)[i];
446 >        }
447 >    }
448 >    vector<reco::PFJet> highest_e_jet_coll;
449 >    highest_e_jet_coll.push_back(highest_e_jet);
450 >    seed_with_jetcoll(highest_e_jet_coll, *_mdef);
451 >  }
452  
453    jetfit::set_model_def(_mdef);
454  
# Line 498 | Line 495 | jetfit::model_def& JetFinderAnalyzer::ma
495        }
496        jetfit::set_ngauss(_mdef->get_n_special_par_sets());
497        init_fit_histo->SetBinContent(i+1, j+1,
498 <                                    jetfit::fit_fcn(x, y, pval));
498 >                                    jetfit::fit_fcn(x, y, pval)
499 >                                    * XbinSize * YbinSize);
500      }
501    }
502  
# Line 551 | Line 549 | ostream& operator<<(ostream &out, jetfit
549      else
550        out << "Not calculated" << endl;
551    }
552 +  else {
553 +    out << "Error matrix accurate" << endl;
554 +  }
555  
556    return out;
557   }
# Line 559 | Line 560 | void JetFinderAnalyzer::analyze_results(
560                                       std::vector<jetfit::trouble> t,
561                                       TH2 *hist_orig) {
562    ofs << "Histogram "<<hist_orig->GetName() << endl;
563 <  for (int i = 0; i < unique_jets[hist_orig].size(); i++) {
563 >  for (int i = unique_jets[hist_orig].size() - r.chisquare.size();
564 >       i < unique_jets[hist_orig].size(); i++) {
565 >    int ir = i - unique_jets[hist_orig].size() + r.chisquare.size();
566      ofs << "For "<<i+1<<" gaussians: " << endl
567 <        << t.at(i) << endl
568 <        << unique_jets[hist_orig][i].size()<<" unique jets found" << endl;
567 >        << t.at(i) << endl;
568 >    ofs << "chisquare="<<r.chisquare.at(ir)
569 >        << endl;
570 >    ofs << unique_jets[hist_orig][i].size()<<" unique jets found" << endl;
571      for (int j = 0; j < unique_jets[hist_orig][i].size(); j++) {
572        jet _jet = unique_jets[hist_orig][i][j];
573        ofs << "Jet "<<j<<": Energy = "<<_jet.energy<<", eta = "<<_jet.eta

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines