CMS 3D CMS Logo

HiFJRhoFlowModulationProducer.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: RecoHI/HiJetAlgos/plugins/HiFJRhoFlowModulationProducer
4 // Class: HiFJRhoFlowModulationProducer
5 
26 
27 #include "TF1.h"
28 #include "TH1.h"
29 #include "TMath.h"
30 #include "TMinuitMinimizer.h"
31 
32 #include <algorithm>
33 #include <cmath>
34 #include <memory>
35 #include <string>
36 #include <utility>
37 #include <vector>
38 
39 namespace {
40  double lineFunction(double* x, double* par) { return par[0]; }
41  double flowFunction(double* x, double* par) {
42  return par[0] * (1. + 2. * (par[1] * std::cos(2. * (x[0] - par[2])) + par[3] * std::cos(3. * (x[0] - par[4]))));
43  }
44 }; // namespace
45 
47 public:
49  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
50 
51 private:
52  void produce(edm::Event&, const edm::EventSetup&) override;
53 
54  const bool doEvtPlane_;
55  const bool doFreePlaneFit_;
56  const bool doJettyExclusion_;
57  const int evtPlaneLevel_;
61  std::unique_ptr<TF1> lineFit_p_;
62  std::unique_ptr<TF1> flowFit_p_;
63 };
65  : doEvtPlane_(iConfig.getParameter<bool>("doEvtPlane")),
66  doFreePlaneFit_(iConfig.getParameter<bool>("doFreePlaneFit")),
67  doJettyExclusion_(iConfig.getParameter<bool>("doJettyExclusion")),
68  evtPlaneLevel_(iConfig.getParameter<int>("evtPlaneLevel")),
69  jetToken_(doJettyExclusion_ ? consumes<reco::JetView>(iConfig.getParameter<edm::InputTag>("jetTag"))
70  : edm::EDGetTokenT<reco::JetView>()),
71  pfCandsToken_(consumes<reco::PFCandidateCollection>(iConfig.getParameter<edm::InputTag>("pfCandSource"))),
72  evtPlaneToken_(consumes<reco::EvtPlaneCollection>(iConfig.getParameter<edm::InputTag>("EvtPlane"))) {
73  produces<std::vector<double>>("rhoFlowFitParams");
74  TMinuitMinimizer::UseStaticMinuit(false);
75  lineFit_p_ = std::unique_ptr<TF1>(new TF1("lineFit", lineFunction, -TMath::Pi(), TMath::Pi()));
76  flowFit_p_ = std::unique_ptr<TF1>(new TF1("flowFit", flowFunction, -TMath::Pi(), TMath::Pi()));
77 }
78 
79 // ------------ method called to produce the data ------------
81  int nPhiBins = 10;
82  auto const& pfCands = iEvent.get(pfCandsToken_);
83  static constexpr int kMaxEvtPlane = 29;
84  std::array<float, kMaxEvtPlane> hiEvtPlane;
85 
86  if (doEvtPlane_) {
87  auto const& evtPlanes = iEvent.get(evtPlaneToken_);
88  assert(evtPlanes.size() == hi::NumEPNames);
89  std::transform(evtPlanes.begin(), evtPlanes.end(), hiEvtPlane.begin(), [this](auto const& ePlane) -> float {
90  return ePlane.angle(evtPlaneLevel_);
91  });
92  }
93 
96  iEvent.getByToken(jetToken_, jets);
97 
98  int nFill = 0;
99 
100  double eventPlane2 = -100;
101  double eventPlane3 = -100;
102 
103  constexpr int nParamVals = 9;
104  auto rhoFlowFitParamsOut = std::make_unique<std::vector<double>>(nParamVals, 1e-6);
105 
106  rhoFlowFitParamsOut->at(0) = 0;
107  rhoFlowFitParamsOut->at(1) = 0;
108  rhoFlowFitParamsOut->at(2) = 0;
109  rhoFlowFitParamsOut->at(3) = 0;
110  rhoFlowFitParamsOut->at(4) = 0;
111 
112  double eventPlane2Cos = 0;
113  double eventPlane2Sin = 0;
114 
115  double eventPlane3Cos = 0;
116  double eventPlane3Sin = 0;
117 
118  std::vector<bool> pfcuts(pfCands.size(), false);
119  int iCand = -1;
120  for (auto const& pfCandidate : pfCands) {
121  iCand++;
122  if (pfCandidate.particleId() != 1 || std::abs(pfCandidate.eta()) > 1.0 || pfCandidate.pt() < .3 ||
123  pfCandidate.pt() > 3.) {
124  continue;
125  }
126 
127  if (doJettyExclusion_) {
128  bool isGood = true;
129  for (auto const& jet : *jets) {
130  if (deltaR2(jet, pfCandidate) < .16) {
131  isGood = false;
132  break;
133  }
134  }
135  if (!isGood) {
136  continue;
137  }
138  }
139 
140  nFill++;
141  pfcuts[iCand] = true;
142 
143  if (!doEvtPlane_) {
144  eventPlane2Cos += std::cos(2 * pfCandidate.phi());
145  eventPlane2Sin += std::sin(2 * pfCandidate.phi());
146 
147  eventPlane3Cos += std::cos(3 * pfCandidate.phi());
148  eventPlane3Sin += std::sin(3 * pfCandidate.phi());
149  }
150  }
151 
152  if (!doEvtPlane_) {
153  eventPlane2 = std::atan2(eventPlane2Sin, eventPlane2Cos) / 2.;
154  eventPlane3 = std::atan2(eventPlane3Sin, eventPlane3Cos) / 3.;
155  } else {
156  eventPlane2 = hiEvtPlane[hi::HF2];
157  eventPlane3 = hiEvtPlane[hi::HF3];
158  }
159  int pfcuts_count = 0;
160  if (nFill >= 100 && eventPlane2 > -99) {
161  nPhiBins = std::max(10, nFill / 30);
162 
163  std::string name = "phiTestIEta4_" + std::to_string(iEvent.id().event()) + "_h";
164  std::string nameFlat = "phiTestIEta4_Flat_" + std::to_string(iEvent.id().event()) + "_h";
165  std::unique_ptr<TH1F> phi_h = std::make_unique<TH1F>(name.data(), "", nPhiBins, -TMath::Pi(), TMath::Pi());
166  phi_h->SetDirectory(nullptr);
167  for (auto const& pfCandidate : pfCands) {
168  if (pfcuts.at(pfcuts_count))
169  phi_h->Fill(pfCandidate.phi());
170  pfcuts_count++;
171  }
172  flowFit_p_->SetParameter(0, 10);
173  flowFit_p_->SetParameter(1, 0);
174  flowFit_p_->SetParameter(2, eventPlane2);
175  flowFit_p_->SetParameter(3, 0);
176  flowFit_p_->SetParameter(4, eventPlane3);
177  if (!doFreePlaneFit_) {
178  flowFit_p_->FixParameter(2, eventPlane2);
179  flowFit_p_->FixParameter(4, eventPlane3);
180  }
181 
182  lineFit_p_->SetParameter(0, 10);
183 
184  phi_h->Fit(flowFit_p_.get(), "Q SERIAL", "", -TMath::Pi(), TMath::Pi());
185  phi_h->Fit(lineFit_p_.get(), "Q SERIAL", "", -TMath::Pi(), TMath::Pi());
186  rhoFlowFitParamsOut->at(0) = flowFit_p_->GetParameter(0);
187  rhoFlowFitParamsOut->at(1) = flowFit_p_->GetParameter(1);
188  rhoFlowFitParamsOut->at(2) = flowFit_p_->GetParameter(2);
189  rhoFlowFitParamsOut->at(3) = flowFit_p_->GetParameter(3);
190  rhoFlowFitParamsOut->at(4) = flowFit_p_->GetParameter(4);
191 
192  rhoFlowFitParamsOut->at(5) = flowFit_p_->GetChisquare();
193  rhoFlowFitParamsOut->at(6) = flowFit_p_->GetNDF();
194 
195  rhoFlowFitParamsOut->at(7) = lineFit_p_->GetChisquare();
196  rhoFlowFitParamsOut->at(8) = lineFit_p_->GetNDF();
197 
198  phi_h.reset();
199  pfcuts.clear();
200  }
201 
202  iEvent.put(std::move(rhoFlowFitParamsOut), "rhoFlowFitParams");
203 }
204 
205 // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
208  desc.add<bool>("doEvtPlane", false);
209  desc.add<edm::InputTag>("EvtPlane", edm::InputTag("hiEvtPlane"));
210  desc.add<bool>("doJettyExclusion", false);
211  desc.add<bool>("doFreePlaneFit", false);
212  desc.add<bool>("doFlatTest", false);
213  desc.add<edm::InputTag>("jetTag", edm::InputTag("ak4PFJets"));
214  desc.add<edm::InputTag>("pfCandSource", edm::InputTag("particleFlow"));
215  desc.add<int>("evtPlaneLevel", 0);
216  descriptions.add("hiFJRhoFlowModulationProducer", desc);
217 }
218 
ConfigurationDescriptions.h
EvtPlane.h
Handle.h
electrons_cff.bool
bool
Definition: electrons_cff.py:393
HiFJRhoFlowModulationProducer::HiFJRhoFlowModulationProducer
HiFJRhoFlowModulationProducer(const edm::ParameterSet &)
Definition: HiFJRhoFlowModulationProducer.cc:64
PFCandidate.h
edm::EDGetTokenT
Definition: EDGetToken.h:33
edm
HLT enums.
Definition: AlignableModifier.h:19
HLT_FULL_cff.InputTag
InputTag
Definition: HLT_FULL_cff.py:89353
edm::ParameterSetDescription
Definition: ParameterSetDescription.h:52
HiFJRhoFlowModulationProducer
Definition: HiFJRhoFlowModulationProducer.cc:46
cms::cuda::assert
assert(be >=bs)
HiFJRhoFlowModulationProducer::doEvtPlane_
const bool doEvtPlane_
Definition: HiFJRhoFlowModulationProducer.cc:54
EDProducer.h
Jet.h
HiFJRhoFlowModulationProducer::produce
void produce(edm::Event &, const edm::EventSetup &) override
Definition: HiFJRhoFlowModulationProducer.cc:80
reco::JetView
edm::View< Jet > JetView
edm references
Definition: JetCollection.h:11
singleTopDQM_cfi.jets
jets
Definition: singleTopDQM_cfi.py:42
HiFJRhoFlowModulationProducer::doJettyExclusion_
const bool doJettyExclusion_
Definition: HiFJRhoFlowModulationProducer.cc:56
reco
fixed size matrix
Definition: AlignmentAlgorithmBase.h:45
tools.TF1
TF1
Definition: tools.py:23
HiFJRhoFlowModulationProducer::jetToken_
const edm::EDGetTokenT< reco::JetView > jetToken_
Definition: HiFJRhoFlowModulationProducer.cc:58
edm::Handle
Definition: AssociativeIterator.h:50
WorkerMaker.h
HiFJRhoFlowModulationProducer::pfCandsToken_
const edm::EDGetTokenT< reco::PFCandidateCollection > pfCandsToken_
Definition: HiFJRhoFlowModulationProducer.cc:59
funct::sin
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
MakerMacros.h
HiFJRhoFlowModulationProducer::doFreePlaneFit_
const bool doFreePlaneFit_
Definition: HiFJRhoFlowModulationProducer.cc:55
HiFJRhoFlowModulationProducer::lineFit_p_
std::unique_ptr< TF1 > lineFit_p_
Definition: HiFJRhoFlowModulationProducer.cc:61
funct::cos
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
DEFINE_FWK_MODULE
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
edm::ConfigurationDescriptions::add
void add(std::string const &label, ParameterSetDescription const &psetDescription)
Definition: ConfigurationDescriptions.cc:57
EventID.h
hi::HF2
Definition: HiEvtPlaneList.h:23
hi::HF3
Definition: HiEvtPlaneList.h:24
HcalDetIdTransform::transform
unsigned transform(const HcalDetId &id, unsigned transformCode)
Definition: HcalDetIdTransform.cc:7
JetCollection.h
ParameterSetDescription.h
EDGetToken.h
reco::EvtPlaneCollection
std::vector< EvtPlane > EvtPlaneCollection
Definition: EvtPlane.h:62
edm::ConfigurationDescriptions
Definition: ConfigurationDescriptions.h:28
AlCaHLTBitMon_QueryRunRegistry.string
string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
edm::ParameterSet
Definition: ParameterSet.h:47
HiEvtPlane_cfi.hiEvtPlane
hiEvtPlane
Definition: HiEvtPlane_cfi.py:3
Event.h
deltaR.h
SiStripPI::max
Definition: SiStripPayloadInspectorHelper.h:169
HiFJRhoFlowModulationProducer::flowFit_p_
std::unique_ptr< TF1 > flowFit_p_
Definition: HiFJRhoFlowModulationProducer.cc:62
createfilelist.int
int
Definition: createfilelist.py:10
iEvent
int iEvent
Definition: GenABIO.cc:224
edm::stream::EDProducer
Definition: EDProducer.h:38
edm::EventSetup
Definition: EventSetup.h:57
HiEvtPlaneList.h
l1t::PFCandidateCollection
std::vector< l1t::PFCandidate > PFCandidateCollection
Definition: PFCandidate.h:57
HiFJRhoFlowModulationProducer::evtPlaneLevel_
const int evtPlaneLevel_
Definition: HiFJRhoFlowModulationProducer.cc:57
submitPVResolutionJobs.desc
string desc
Definition: submitPVResolutionJobs.py:251
eostools.move
def move(src, dest)
Definition: eostools.py:511
HLTMuonOfflineAnalyzer_cfi.deltaR2
deltaR2
Definition: HLTMuonOfflineAnalyzer_cfi.py:105
metsig::jet
Definition: SignAlgoResolutions.h:47
genVertex_cff.x
x
Definition: genVertex_cff.py:12
HiFJRhoFlowModulationProducer::evtPlaneToken_
const edm::EDGetTokenT< reco::EvtPlaneCollection > evtPlaneToken_
Definition: HiFJRhoFlowModulationProducer.cc:60
Skims_PA_cff.name
name
Definition: Skims_PA_cff.py:17
Pi
const double Pi
Definition: CosmicMuonParameters.h:18
hi::NumEPNames
static const int NumEPNames
Definition: HiEvtPlaneList.h:28
funct::abs
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
View.h
ParameterSet.h
ParameterSetDescriptionFiller.h
ecaldqm::binning::nPhiBins
Definition: MESetBinningUtils.h:69
edm::Event
Definition: Event.h:73
StreamID.h
edm::InputTag
Definition: InputTag.h:15
HiFJRhoFlowModulationProducer::fillDescriptions
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
Definition: HiFJRhoFlowModulationProducer.cc:206
PFCandidateFwd.h
MillePedeFileConverter_cfg.e
e
Definition: MillePedeFileConverter_cfg.py:37