00001 #ifndef CandUtils_makeCompositeCandidate_h 00002 #define CandUtils_makeCompositeCandidate_h 00003 #include "DataFormats/Candidate/interface/CompositeCandidate.h" 00004 #include "DataFormats/Candidate/interface/ShallowCloneCandidate.h" 00005 #include <memory> 00006 00007 namespace helpers { 00008 struct CompositeCandidateMaker { 00009 CompositeCandidateMaker( std::auto_ptr<reco::CompositeCandidate> cmp ) : 00010 cmp_( cmp ) { 00011 } 00012 void addDaughter( const reco::Candidate & dau ) { 00013 cmp_->addDaughter( dau ); 00014 } 00015 template<typename S> 00016 std::auto_ptr<reco::Candidate> operator[]( const S & setup ) { 00017 setup.set( * cmp_ ); 00018 return release(); 00019 } 00020 private: 00021 std::auto_ptr<reco::CompositeCandidate> cmp_; 00022 std::auto_ptr<reco::Candidate> release() { 00023 std::auto_ptr<reco::Candidate> ret( cmp_.get() ); 00024 cmp_.release(); 00025 return ret; 00026 } 00027 }; 00028 } 00029 00030 helpers::CompositeCandidateMaker 00031 makeCompositeCandidate( const reco::Candidate & c1, 00032 const reco::Candidate & c2 ); 00033 00034 helpers::CompositeCandidateMaker 00035 makeCompositeCandidate( const reco::Candidate & c1, 00036 const reco::Candidate & c2, 00037 const reco::Candidate & c3 ); 00038 00039 helpers::CompositeCandidateMaker 00040 makeCompositeCandidate( const reco::Candidate & c1, 00041 const reco::Candidate & c2, 00042 const reco::Candidate & c3 ); 00043 00044 00045 helpers::CompositeCandidateMaker 00046 makeCompositeCandidate( const reco::Candidate & c1, 00047 const reco::Candidate & c2, 00048 const reco::Candidate & c3, 00049 const reco::Candidate & c4 ); 00050 00051 template<typename C> 00052 helpers::CompositeCandidateMaker 00053 makeCompositeCandidate( const typename C::const_iterator & begin, 00054 const typename C::const_iterator & end ) { 00055 helpers::CompositeCandidateMaker 00056 cmp( std::auto_ptr<reco::CompositeCandidate>( new reco::CompositeCandidate ) ); 00057 for( typename C::const_iterator i = begin; i != end; ++ i ) 00058 cmp.addDaughter( * i ); 00059 return cmp; 00060 } 00061 00062 helpers::CompositeCandidateMaker 00063 makeCompositeCandidateWithRefsToMaster( const reco::CandidateRef & c1, 00064 const reco::CandidateRef & c2 ); 00065 00066 helpers::CompositeCandidateMaker 00067 makeCompositeCandidateWithRefsToMaster( const reco::CandidateRef & c1, 00068 const reco::CandidateRef & c2, 00069 const reco::CandidateRef & c3 ); 00070 00071 helpers::CompositeCandidateMaker 00072 makeCompositeCandidateWithRefsToMaster( const reco::CandidateRef & c1, 00073 const reco::CandidateRef & c2, 00074 const reco::CandidateRef & c3, 00075 const reco::CandidateRef & c4 ); 00076 00077 template<typename C> 00078 helpers::CompositeCandidateMaker 00079 makeCompositeCandidateWithRefsToMaster( const typename C::const_iterator & begin, 00080 const typename C::const_iterator & end ) { 00081 helpers::CompositeCandidateMaker 00082 cmp( std::auto_ptr<reco::CompositeCandidate>( new reco::CompositeCandidate ) ); 00083 for( typename C::const_iterator i = begin; i != end; ++ i ) 00084 cmp.addDaughter( ShallowCloneCandidate( CandidateBaseRef( * i ) ) ); 00085 return cmp; 00086 } 00087 00088 #endif