Пример #1
0
Jet smearedJet(const Jet & origJet, unsigned mode) {
	if (origJet.getVarF("jn_genpt") <= 0)
		return origJet;

	//smearing factors are described in https://twiki.cern.ch/twiki/bin/view/CMS/JetResolution
	double eta = fabs(origJet.lorentzVector().Eta());
	double pt = origJet.lorentzVector().Pt();
	double ptSF = 1.0;
	double ptSF_err = 0.06;
	if (eta < 0.5) {
		ptSF = 1.052;
		ptSF_err = sqrt(pow(0.012, 2) + pow(0.5 * (0.062 + 0.061), 2));
	} else if (eta >= 0.5 && eta < 1.1) {
		ptSF = 1.057;
		ptSF_err = sqrt(pow(0.012, 2) + pow(0.5 * (0.056 + 0.055), 2));
	} else if (eta >= 1.1 && eta < 1.7) {
		ptSF = 1.096;
		ptSF_err = sqrt(pow(0.017, 2) + pow(0.5 * (0.063 + 0.062), 2));
	} else if (eta >= 1.7 && eta < 2.3) {
		ptSF = 1.134;
		ptSF_err = sqrt(pow(0.035, 2) + pow(0.5 * (0.087 + 0.085),2));
	} else if (eta >= 2.3 && eta < 5.0) {
		ptSF = 1.288;
		ptSF_err = sqrt(pow(0.127, 2) + pow(0.5 * (0.155 + 0.153), 2));
	}

	if (mode == 1)
		ptSF += ptSF_err;
	else if (mode == 2)
		ptSF -= ptSF_err;
	
	ptSF = max(0., (origJet.getVarF("jn_genpt") + ptSF * (pt - origJet.getVarF("jn_genpt")))) / pt;  //deterministic version
	if (ptSF <= 0)
		return origJet;

	double px = origJet.getVarF("jn_px") * ptSF;
	double py = origJet.getVarF("jn_py") * ptSF;
	double pz = origJet.getVarF("jn_pz");
	double mass = origJet.lorentzVector().M();
	double en = sqrt(mass * mass + px * px + py * py + pz * pz);

	Jet smearedJet(origJet);
	smearedJet.addFloatVar( "jn_px", px );
	smearedJet.addFloatVar( "jn_py", py );
	smearedJet.addFloatVar( "jn_pz", pz );
	smearedJet.addFloatVar( "jn_en", en );
	return smearedJet;
}
Пример #2
0
vector<Jet> selectJetsCMG(const Event & ev, const vector<Lepton> & leptons, JetCorrectionUncertainty  & jecUnc, TLorentzVector * diff, unsigned mode, double ptMin, double etaMax) {
#else
vector<Jet> selectJetsCMG(const Event & ev, const vector<Lepton> & leptons, TLorentzVector * diff, unsigned mode, double ptMin, double etaMax) {
#endif

	const SingleVariableContainer<int> * jn = dynamic_cast<const SingleVariableContainer<int> *>(ev.findVariable("jn"));
	const ArrayVariableContainer<float> * jn_px = dynamic_cast<const ArrayVariableContainer<float> *>(ev.findVariable("jn_px"));
	const ArrayVariableContainer<float> * jn_py = dynamic_cast<const ArrayVariableContainer<float> *>(ev.findVariable("jn_py"));
	const ArrayVariableContainer<float> * jn_pz = dynamic_cast<const ArrayVariableContainer<float> *>(ev.findVariable("jn_pz"));
	const ArrayVariableContainer<float> * jn_en = dynamic_cast<const ArrayVariableContainer<float> *>(ev.findVariable("jn_en"));
	const ArrayVariableContainer<float> * jn_jp = dynamic_cast<const ArrayVariableContainer<float> *>(ev.findVariable("jn_jp"));
	const ArrayVariableContainer<float> * jn_genpx = dynamic_cast<const ArrayVariableContainer<float> *>(ev.findVariable("jn_genjpx"));
	const ArrayVariableContainer<float> * jn_genpy = dynamic_cast<const ArrayVariableContainer<float> *>(ev.findVariable("jn_genjpy"));
	const ArrayVariableContainer<float> * jn_genpz = dynamic_cast<const ArrayVariableContainer<float> *>(ev.findVariable("jn_genjpz"));
	const ArrayVariableContainer<float> * jn_genen = dynamic_cast<const ArrayVariableContainer<float> *>(ev.findVariable("jn_genjen"));
	const ArrayVariableContainer<int> * jn_idbits = dynamic_cast<const ArrayVariableContainer<int> *>(ev.findVariable("jn_idbits"));

	if (mode == 1 || mode == 2) {
		if (diff == 0)
			throw string("ERROR - selectJetsCMG(): NULL pointer!");
		diff->SetPxPyPzE(0, 0, 0, 0);
	}

	vector<Jet> jets;
	for ( int i = 0; i < jn->getVal(); ++i ) {
		TLorentzVector jet(jn_px->getVal(i), jn_py->getVal(i), jn_pz->getVal(i), jn_en->getVal(i));
		bool matchesLepton = false;
		for (unsigned k = 0; k < leptons.size(); ++k) {
			TLorentzVector lepton = leptons[k].lorentzVector();
			double delR = deltaR(lepton.Eta(), lepton.Phi(), jet.Eta(), jet.Phi());
			if (delR < 0.15) {
				matchesLepton = true;
				break;
			}
		}
		if (matchesLepton)
			continue;
		if (mode == 1 || mode == 2) {
#ifdef CMSSWENV
			jecUnc.setJetEta(jet.Eta());
			jecUnc.setJetPt(jet.Pt());
			double sF = fabs(jecUnc.getUncertainty(true));
			if ( sF > 0.3 ) {
				cout << setw(10) << jet.Pt() << setw(10) << jet.Eta() << setw(10) << sF << endl;	
				throw string("ERROR!");	
			}
			if (mode == 1)
				sF = 1 + sF;
			else
				sF = 1 - sF;
			TLorentzVector newJet = sF * jet;
			(*diff) += (newJet - jet);
			jet = newJet;
#else
			throw string("ERROR: Jet Uncertainty Systematic variation not supported!");
#endif
		}
		Jet tmp;
		tmp.addFloatVar( jn_px->getName(), jet.Px() );
		tmp.addFloatVar( jn_py->getName(), jet.Py() );
		tmp.addFloatVar( jn_pz->getName(), jet.Pz() );
		tmp.addFloatVar( jn_en->getName(), jet.E() );
		tmp.addIntVar( jn_idbits->getName(), jn_idbits->getVal(i) );
		tmp.addFloatVar( jn_jp->getName(), jn_jp->getVal(i) );
		TLorentzVector genJet( jn_genpx->getVal(i), jn_genpy->getVal(i), jn_genpz->getVal(i), jn_genen->getVal(i) );
		tmp.addFloatVar( "jn_genpt", genJet.Pt() );

		jets.push_back(tmp);
	}
	return jets;
}

TLorentzVector smearJets(vector<Jet> & jets, unsigned mode) {
	TLorentzVector jetDiff;
	for ( unsigned j = 0; j < jets.size(); ++j ) {
		Jet smJet = smearedJet( jets[j], mode );
		jetDiff += (smJet.lorentzVector() - jets[j].lorentzVector());
		jets[j] = smJet;
	}
	return jetDiff;
}