Go to the documentation of this file.00001
00002
00011 #include "FWCore/Framework/interface/EDProducer.h"
00012 #include "FWCore/Framework/interface/Event.h"
00013 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00014 #include "FWCore/Utilities/interface/InputTag.h"
00015
00016 #include "DataFormats/Math/interface/deltaR.h"
00017 #include "DataFormats/Common/interface/ValueMap.h"
00018 #include "DataFormats/Common/interface/View.h"
00019
00020 #include "DataFormats/Candidate/interface/CandidateFwd.h"
00021 #include "DataFormats/Candidate/interface/Candidate.h"
00022 #include "DataFormats/TrackReco/interface/Track.h"
00023 #include "DataFormats/VertexReco/interface/Vertex.h"
00024 #include "CommonTools/Utils/interface/StringCutObjectSelector.h"
00025 #include "CommonTools/Utils/interface/StringObjectFunction.h"
00026
00027 template<typename T>
00028 class OtherObjectVariableComputer : public edm::EDProducer {
00029 public:
00030 explicit OtherObjectVariableComputer(const edm::ParameterSet & iConfig);
00031 virtual ~OtherObjectVariableComputer() ;
00032
00033 virtual void produce(edm::Event & iEvent, const edm::EventSetup & iSetup);
00034
00035 private:
00036 edm::InputTag probes_;
00037 edm::InputTag objects_;
00038 StringObjectFunction<T,true> objVar_;
00039 double default_;
00040 StringCutObjectSelector<T,true> objCut_;
00041 bool doSort_;
00042 StringObjectFunction<T,true> objSort_;
00043 };
00044
00045 template<typename T>
00046 OtherObjectVariableComputer<T>::OtherObjectVariableComputer(const edm::ParameterSet & iConfig) :
00047 probes_(iConfig.getParameter<edm::InputTag>("probes")),
00048 objects_(iConfig.getParameter<edm::InputTag>("objects")),
00049 objVar_(iConfig.getParameter<std::string>("expression")),
00050 default_(iConfig.getParameter<double>("default")),
00051 objCut_(iConfig.existsAs<std::string>("objectSelection") ? iConfig.getParameter<std::string>("objectSelection") : "", true),
00052 doSort_(iConfig.existsAs<std::string>("objectSortDescendingBy")),
00053 objSort_(doSort_ ? iConfig.getParameter<std::string>("objectSortDescendingBy") : "1", true)
00054 {
00055 produces<edm::ValueMap<float> >();
00056 }
00057
00058
00059 template<typename T>
00060 OtherObjectVariableComputer<T>::~OtherObjectVariableComputer()
00061 {
00062 }
00063
00064 template<typename T>
00065 void
00066 OtherObjectVariableComputer<T>::produce(edm::Event & iEvent, const edm::EventSetup & iSetup) {
00067 using namespace edm;
00068
00069
00070 Handle<View<reco::Candidate> > probes;
00071 Handle<View<T> > objects;
00072 iEvent.getByLabel(probes_, probes);
00073 iEvent.getByLabel(objects_, objects);
00074
00075
00076 std::vector<std::pair<double, double> > selected;
00077 typename View<T>::const_iterator object, endobjects = objects->end();
00078 for (object = objects->begin(); object != endobjects; ++object) {
00079 if (objCut_(*object)) {
00080 selected.push_back(std::pair<double, double>(objSort_(*object), objVar_(*object)));
00081 if (!doSort_) break;
00082 }
00083 }
00084 if (doSort_ && selected.size() > 1) std::sort(selected.begin(), selected.end());
00085
00086
00087 std::vector<float> values(probes->size(), (selected.empty() ? default_ : selected.back().second));
00088
00089
00090 std::auto_ptr<ValueMap<float> > valMap(new ValueMap<float>());
00091 ValueMap<float>::Filler filler(*valMap);
00092 filler.insert(probes, values.begin(), values.end());
00093 filler.fill();
00094 iEvent.put(valMap);
00095 }
00096
00097
00098 typedef OtherObjectVariableComputer<reco::Candidate> OtherCandVariableComputer;
00099
00100
00101
00102 #include "FWCore/Framework/interface/MakerMacros.h"
00103 DEFINE_FWK_MODULE(OtherCandVariableComputer);
00104
00105