PUPPI softdrop jet mass scale and resolution
Introduction
PUPPI softdrop mass scale
The PUPPI softdrop mass scale is estimated from a fit to the W-jet mass peak in tt MC (see REF) and is estimated to be close to unity, see table below.
To implement, multiply the corrected (dedicated PUPPI softdrop jet mass corrections, NOT
L2L3 corrected) by the jet mass scale (currently 0.999)
float jms = 0.999;
float oldmass = myPuppiSoftdropmass_corrected;
jmsCorrectedMass = oldmass*jms;
Systematics: Evaluation and implementation
The systematic uncertainties due to jet mass scale are evaluated by scaling the central value of the JMS up and down within its uncertainty. Three uncertainties on the JMS are quoted: one statistical (fit uncertainty), one systematic uncertainty due to choice of MC generator and an additional systematic uncertainty due to choice of fit method (see REF). The JMS is then scaled up and down with the given uncertainty and the impact on signal yield, scaling the mass either up or down, is calculated. To scale the JMS up and down, do
float jms = 0.999;
float jmsUnc = 0.004;
float oldmass = myPuppiSoftdropmass_corrected;
jmsScaleUpMass = oldmass*(jms+jmsUnc);
jmsScaleDownMass = oldmass*(jms-jmsUnc);
The impact on the W-jet mass peak when scaling the mass up and down within the uncertainty is shown in the image below where blue is the mass with the current JMS applied, red is after scaling the JMS up (0.999+0.004) and green after scaling down (0.999-0.004). The effects are tiny as the uncertainty is < 1%.
PUPPI softdrop mass resolution
The PUPPI softdrop mass resolution is evaluated from a fit to the W-jet mass peak in data and in MC, where the resolution is taken from the ratio of the Gaussian widths obtained in data/MC. The numerical values are listed in the table below.
The systematics include a systematics based on the use of different generators to produce the tt MC and one based on the use of different fit procedures when fitting the W-jet mass peak.
The PUPPI softdrop mass resolution is worse in data then in MC and need to be smeared. This is done in a very similar way as for jet energy resolution smearing. We use a hybrid method were one scales or smears the PUPPI softdrop jet mass by
- 1) scaling based on gen-reco softdrop mass difference, where the scaled mass is
scaledSDMass = max(0., recoSDMass + ( (jmr-1)*(recoSDMass-genMass) ) );
or
- 2) take a random number from Gaussian with width √(SF*SF-1) * σMC, where σMC is the ratio of the width of the fitted W-jet softdrop mass peak for reco PUPPI jets divided by the width obtained for AK8 genjets. The smeared mass is then
smearedMass = tr_->Gaus( recoSDMass, TMath::Sqrt(jmr*jmr-1)*(massResolution-1)* recoSDMass);
Scaling is only used for well-matched jets, where well-matched means: ΔR(AK8,genJet) < 0.4 and pT,AK8-pT,GEN < 3*pT,AK8*jerSigmaPt. Here AK8 is the
AK8PFCHS jet matched to the PUPPI jet (the PUPPI softdrop mass is "assigned" to a
AK8PFCHS jet via a dR matching.) If this requirement is NOT met, proceed with smearing the mass instead. For a typical
BulkGraviton to WW signal sample, the matching requirement only fails 4% of the, hence most jets are scaled and not smeared. A set of TF1s needed in order to get the mass resolution, can be found here:
https://github.com/thaarres/PuppiSoftdropMassCorr/tree/master/weights
--> "puppiSoftdropResol.root". For an example code snippet, see below
// The following assumes that you have two TLorentzvectors; puppijet_tlv and AK8jet_tlv, where the PUPPI jet is matched to the AK8PFCHS jet.
// "oldmass" is the corrected PUPPI softdrop mass (corrected using the jet mass corrections described above).
float mass = 0;
float jms = 0.999;
float jmr = 1.079;
float massResolution = 0;
//Evaluate PUPPI softdropMC mass resolution as a function of PUPPI jet pt and eta:
TFile* filejmr = TFile::Open("puppiSoftdropResol.root","READ");
TF1* puppisd_resolution_cen = (TF1*)filejmr->Get("massResolution_0eta1v3");
TF1* puppisd_resolution_for = (TF1*)filejmr->Get("massResolution_1v3eta2v5");
if( fabs(puppijet_tlv.Eta()) <= 1.3 ){
massResolution = puppisd_resolution_cen->Eval( puppijet_tlv.Pt() );
}
else{
massResolution = puppisd_resolution_for->Eval( puppijet_tlv.Pt() );
}
//Apply jet mass scale (see above)
mass = oldmass*jms;
bool scaled = false;
// First try scaling:
for( int j = 0; j < data_.ngenJetsAK8 ; ++j ){
float genMass = (*data_.genJetAK8_softdropmass).at(j);
TLorentzVector genJet;
genJet.SetPtEtaPhiE( (*data_.genJetAK8_pt).at(j), (*data_.genJetAK8_eta).at(j), (*data_.genJetAK8_phi).at(j), (*data_.genJetAK8_e).at(j) );
if( AK8jet_tlv.DeltaR(genJet) > 0.4 || ( fabs(AK8jet_tlv.Pt()-genJet.Pt()) > (3*AK8jet_tlv.Pt()*jerSigmaPt))) continue;
mass = max(float(0.), mass + ((jmr-1)*(mass-genMass)));
scaled = true;
break;
}
//Scaling failed, move to smearing:
if( !scaled ){
mass = tr_->Gaus( mass, TMath::Sqrt(jmr*jmr-1)*(massResolution-1)*mass);
}
The fitted W-jet mass peak for a Bulk Graviton to WW signal sample (2
TeV) is shown in the plot below. The fitted width is increased by 7% after smearing.
Systematics: Evaluation and implementation
The systematic uncertainty due to jet mass resolution is evaluated in the same way as for the jet mass scale. First, the uncertainty on the JMR is calculated (again, one statistical and two systematic uncertainties). We then proceed by scaling the central value of the JMR up and down with the resulting JMR uncertainty, checking the impact on the final signal yield. As the smearing procedure does not allow "improving" the jet mass resolution (the resulting effect of scaling the JMR down), the "scaling method" only is used to calculate the JMR systematic uncertainty. Find an example code snippet below
float mass = = oldmass*jms; // Use softdrop mass with JMS applied
float jmr = 1.079;
float jmrUnc = 0.105;
if( scaleUncPar_.find("JMRup") != std::string::npos ){ // Flag to calculate JMS up
for( int j = 0; j < data_.ngenJetsAK8 ; ++j ){
if( (*data_.genJetAK8_pt).at(j) < 0.01 ) continue;
TLorentzVector genJet;
genJet.SetPtEtaPhiE( (*data_.genJetAK8_pt).at(j), (*data_.genJetAK8_eta).at(j), (*data_.genJetAK8_phi).at(j), (*data_.genJetAK8_e).at(j) );
if( AK8jet_tlv.DeltaR(genJet) > 0.4) continue;
float genMass = (*data_.genJetAK8_softdropmass).at(j);
mass = max(float(0.), mass + ((jmr+jmrUnc-1)*(mass-genMass)));
}
}
else if( scaleUncPar_.find("JMRdown") != std::string::npos ){ // Flag to calculate JMS down
for( int j = 0; j < data_.ngenJetsAK8 ; ++j ){
if( (*data_.genJetAK8_pt).at(j) < 0.01 ) continue;
TLorentzVector genJet;
genJet.SetPtEtaPhiE( (*data_.genJetAK8_pt).at(j), (*data_.genJetAK8_eta).at(j), (*data_.genJetAK8_phi).at(j), (*data_.genJetAK8_e).at(j) );
if( AK8jet_tlv.DeltaR(genJet) > 0.4) continue;
float genMass = (*data_.genJetAK8_softdropmass).at(j);
mass = max(float(0.), mass + ((jmr-jmrUnc-1)*(mass-genMass)));
}
}
The fitted W-jet mass peak before and after scaling the jet mass resolution up/down within the uncertainty is shown below. A better resolution is achieved when scaling the JMR down, and a worse resolution when scaling up.
Documentation
Public results
- JME-16-003
: "Jet algorithms performance in 13 TeV data" In process!!
Talks
Internal and analysis notes (for CMS internal usage only)
- CMS AN-2016/215
: "Identification and calibration of boosted hadronic W/Z bosons at 13 TeV"