00001 #ifndef HLTriggerOffline_BJet_FlavouredJetPlots_h
00002 #define HLTriggerOffline_BJet_FlavouredJetPlots_h
00003
00004
00005 #include <vector>
00006 #include <string>
00007
00008
00009 #include <TDirectory.h>
00010
00011
00012 #include "DataFormats/JetReco/interface/Jet.h"
00013 #include "DataFormats/JetReco/interface/JetTracksAssociation.h"
00014 #include "DataFormats/TrackReco/interface/Track.h"
00015 #include "HLTriggerOffline/BJet/interface/JetPlots.h"
00016
00017 typedef unsigned int flavour_t;
00018 typedef std::vector<flavour_t> flavours_t;
00019 struct FlavouredJetPlots {
00020
00021 std::vector<flavours_t> m_flavours;
00022 std::vector<std::string> m_labels;
00023 std::vector<JetPlots> m_plots;
00024
00025 void init(
00026 const std::string & name,
00027 const std::string & title,
00028 const std::vector<flavours_t> & flavours,
00029 const std::vector<std::string> & labels,
00030 unsigned int energyBins,
00031 double minEnergy,
00032 double maxEnergy,
00033 unsigned int geometryBins,
00034 double maxEta,
00035 bool hasTracks = false
00036 ) {
00037 m_flavours = flavours;
00038 m_labels = labels; m_labels.push_back("other");
00039 m_plots.resize( m_flavours.size() + 1);
00040 for (unsigned int i = 0; i <= m_flavours.size(); ++i)
00041 m_plots[i].init(name + "_" + m_labels[i], title + " (" + m_labels[i] + ")", energyBins, minEnergy, maxEnergy, geometryBins, maxEta, hasTracks);
00042 }
00043
00044 void fill(const reco::Jet & jet, flavour_t flavour) {
00045 bool match = false;
00046 for (unsigned int i = 0; i < m_flavours.size(); ++i) {
00047 if (std::find(m_flavours[i].begin(), m_flavours[i].end(), flavour) != m_flavours[i].end()) {
00048 m_plots[i].fill(jet);
00049 match = true;
00050 }
00051 }
00052 if (not match)
00053 m_plots[m_flavours.size()].fill(jet);
00054 }
00055
00056 void fill(const reco::Jet & jet, const reco::TrackRefVector & tracks, flavour_t flavour) {
00057 bool match = false;
00058 for (unsigned int i = 0; i < m_flavours.size(); ++i) {
00059 if (std::find(m_flavours[i].begin(), m_flavours[i].end(), flavour) != m_flavours[i].end()) {
00060 m_plots[i].fill(jet, tracks);
00061 match = true;
00062 }
00063 }
00064 if (not match)
00065 m_plots[m_flavours.size()].fill(jet);
00066 }
00067
00068 void save(TDirectory & file) {
00069 for (unsigned int i = 0; i <= m_flavours.size(); ++i)
00070 m_plots[i].save(file);
00071 }
00072
00073 FlavouredJetPlots efficiency(const FlavouredJetPlots & denominator) {
00074 FlavouredJetPlots efficiency;
00075 efficiency.m_flavours = m_flavours;
00076 efficiency.m_labels = m_labels;
00077 efficiency.m_plots.resize(m_flavours.size() + 1);
00078 for (unsigned int i = 0; i <= m_flavours.size(); ++i)
00079 efficiency.m_plots[i] = m_plots[i].efficiency( denominator.m_plots[i] );
00080 return efficiency;
00081 }
00082 };
00083
00084 #endif // HLTriggerOffline_BJet_FlavouredJetPlots_h