Pileup reweighting - elliot-hughes/fatjet_analysis GitHub Wiki
This prescription follows instructions detailed on the PileupMCReweightingUtilities Twiki page.
In order to calculate pile-up re-weighting factors (the next step), you need to first instantiate a edm::LumiReWeighting object from two, independent, inputs: the pile-up distribution measured in the data, and the pile-up distribution used in MC generation.
The 2016 data distribution is calculated on LXPLUS, in a CMSSW environment, by running
pileupCalc.py -i luminosity_mask.json --inputLumiJSON /afs/cern.ch/cms/CAF/CMSCOMM/COMM_DQM/certification/Collisions16/13TeV/PileUp/pileup_latest.txt --calcMode true --minBiasXsec 69200 --maxPileupBin 75 --numPileupBins 75 pileup_distribution_data16.rootwhere
luminosity_mask.json is the luminosity mask you used for processing the data. The luminosity masks I use are listed on Data. The final result of this script is a histogram that contains the pile-up distribution. More documentation related to this calculation is available on the PileupJSONFileforData Twiki page.
The distribution I use is located at /Analyzers/FatjetAnalyzer/test/pileup_data/pileup_distribution_data16.root.
The pile-up distribution used in a particular MC sample depends on the sample's generation. For example, the moriond17 distribution exists as a list in /SimGeneral/MixingModule/python/mix_2016_25ns_Moriond17MC_PoissonOOTPU_cfi.py.
The distributions for the MC generations I use are saved in /Analyzers/FatjetAnalyzer/test/pileup_data. These histograms are created using the get_pileup_distributions_mc.cc macro, located in the same directory, which reads in the official data I copied into decortication/macros/pileup.cc.
In an EDAnalyzer, you can calculate the pile-up re-weight factors for each event (after following the previous step) but including the following:
#include "SimDataFormats/PileupSummaryInfo/interface/PileupSummaryInfo.h"
#include "PhysicsTools/Utilities/interface/LumiReWeighting.h"
[...]
edm::LumiReWeighting lumi_weights;
[...]
lumi_weights = edm::LumiReWeighting("pileup_data/pileup_distribution_moriond17.root", "pileup_data/pileup_distribution_data16.root", "pileup", "pileup");
[...]
# Inside the event loop:
float tnpv = -1; # True number of primary vertices
float wpu = 1; # Pile-up re-weight factor
if (!is_data_) {
Handle<vector<PileupSummaryInfo>> info;
iEvent.getByToken(pileupInfo, info);
for (std::vector<PileupSummaryInfo>::const_iterator pvi = info->begin(); pvi != info->end(); ++pvi) {
int bx = pvi->getBunchCrossing();
if (bx == 0) {
tnpv = pvi->getTrueNumInteractions();
continue;
}
}
wpu = lumi_weights.weight(tnpv);
}
This is implemented in /Analyzers/FatjetAnalyzer/plugins/JetTuplizer.cc.