Go to the documentation of this file.00001 #ifndef RecoTauTag_RecoTau_RecoTauConstructor_h
00002 #define RecoTauTag_RecoTau_RecoTauConstructor_h
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include "DataFormats/Common/interface/Handle.h"
00028 #include "DataFormats/ParticleFlowCandidate/interface/PFCandidate.h"
00029 #include "DataFormats/ParticleFlowCandidate/interface/PFCandidateFwd.h"
00030 #include "DataFormats/TauReco/interface/PFTau.h"
00031 #include "DataFormats/JetReco/interface/PFJetCollection.h"
00032 #include "DataFormats/TauReco/interface/RecoTauPiZero.h"
00033
00034 namespace reco { namespace tau {
00035
00036 class RecoTauConstructor {
00037 public:
00038 enum Region {
00039 kSignal,
00040 kIsolation
00041 };
00042
00043 enum ParticleType {
00044 kChargedHadron,
00045 kGamma,
00046 kNeutralHadron,
00047 kAll
00048 };
00049
00051 RecoTauConstructor(const PFJetRef& jetRef,
00052 const edm::Handle<PFCandidateCollection>& pfCands,
00053 bool copyGammasFromPiZeros=false);
00054
00055
00056
00057
00058
00059
00060
00062 template<typename T> void setleadPFChargedHadrCand(const T& cand) {
00063 tau_->setleadPFChargedHadrCand(convertToRef(cand));
00064 }
00065
00067 template<typename T> void setleadPFNeutralCand(const T& cand) {
00068 tau_->setleadPFNeutralCand(convertToRef(cand));
00069 }
00070
00072 template<typename T> void setleadPFCand(const T& cand) {
00073 tau_->setleadPFCand(convertToRef(cand));
00074 }
00075
00077 void addPFCand(Region region, ParticleType type, const PFCandidateRef& ref);
00078
00080 void reserve(Region region, ParticleType type, size_t size);
00081
00082
00083 template<typename InputIterator>
00084 void addPFCands(Region region, ParticleType type,
00085 const InputIterator& begin, const InputIterator& end) {
00086 for(InputIterator iter = begin; iter != end; ++iter) {
00087 addPFCand(region, type, convertToRef(*iter));
00088 }
00089 }
00090
00092 void reservePiZero(Region region, size_t size);
00093
00095 void addPiZero(Region region, const RecoTauPiZero& piZero);
00096
00098 template<typename InputIterator>
00099 void addPiZeros(Region region,
00100 const InputIterator& begin, const InputIterator& end)
00101 {
00102 for(InputIterator iter = begin; iter != end; ++iter)
00103 {
00104 addPiZero(region, *iter);
00105 }
00106 }
00107
00108
00109 std::auto_ptr<reco::PFTau> get(bool setupLeadingCandidates=true);
00110
00111
00112 const reco::Candidate::LorentzVector& p4() const { return p4_; }
00113
00114
00115 private:
00116 typedef std::pair<Region, ParticleType> CollectionKey;
00117 typedef std::map<CollectionKey, PFCandidateRefVector*> CollectionMap;
00118 typedef boost::shared_ptr<std::vector<PFCandidateRef> > SortedListPtr;
00119 typedef std::map<CollectionKey, SortedListPtr> SortedCollectionMap;
00120
00121 bool copyGammas_;
00122
00123 PFCandidateRefVector * getCollection(Region region, ParticleType type);
00124 SortedListPtr getSortedCollection(Region region, ParticleType type);
00125
00126
00127 void sortAndCopyIntoTau();
00128
00129
00130 PFCandidateRef convertToRef(const PFCandidatePtr& pfPtr) const;
00131 PFCandidateRef convertToRef(const CandidatePtr& candPtr) const;
00132 PFCandidateRef convertToRef(const PFCandidateRef& pfRef) const;
00133
00134 const edm::Handle<PFCandidateCollection>& pfCands_;
00135 std::auto_ptr<reco::PFTau> tau_;
00136 CollectionMap collections_;
00137
00138
00139 SortedCollectionMap sortedCollections_;
00140
00141
00142 reco::Candidate::LorentzVector p4_;
00143 };
00144 } }
00145 #endif