double TtbarHypothesis::M3() const { JetCollection jets; jets.clear(); jets.push_back(jet1FromW); jets.push_back(jet2FromW); jets.push_back(leptonicBjet); jets.push_back(hadronicBJet); return M3(jets); }
JetCollection BTagWeight::getUDSGJets(const JetCollection& jets) const { JetCollection udsgjets; for (unsigned int index = 0; index < jets.size(); ++index) { if (abs(jets.at(index).partonFlavour()) != 4 && abs(jets.at(index).partonFlavour()) != 5) //not a c- or b-quark udsgjets.push_back(jets.at(index)); } return udsgjets; }
JetCollection BTagWeight::getCJets(const JetCollection& jets) const { JetCollection cjets; for (unsigned int index = 0; index < jets.size(); ++index) { if (abs(jets.at(index).partonFlavour()) == 4) //c-quark cjets.push_back(jets.at(index)); } return cjets; }
JetCollection BTagWeight::getBJets(const JetCollection jets) const { JetCollection bjets; for (unsigned int index = 0; index < jets.size(); ++index) { if (abs(jets.at(index)->partonFlavour()) == 5) //b-quark bjets.push_back(jets.at(index)); } return bjets; }
JetCollection Event::GetBJetCollection(const JetCollection& jets, BtagAlgorithm::value btagAlgorithm, BtagAlgorithm::workingPoint WP) const { JetCollection bjets; for (unsigned int index = 0; index < jets.size(); ++index) { const JetPointer jet = jets.at(index); if (jet->isBJet(btagAlgorithm, WP)) bjets.push_back(jet); } return bjets; }
const JetCollection TopPairEMuReferenceSelection::cleanedBJets(const EventPtr event) const { const JetCollection jets(cleanedJets(event)); JetCollection cleanedBJets; for (unsigned int index = 0; index < jets.size(); ++index) { const JetPointer jet(jets.at(index)); if (isBJet(jet)) cleanedBJets.push_back(jet); } return cleanedBJets; }
const JetCollection TopPairMuPlusJetsReferenceSelection2011::cleanedJets(const EventPtr event) const { const JetCollection jets(event->Jets()); JetCollection cleanedJets; if (!hasExactlyOneIsolatedLepton(event)) //if no signal lepton is found, can't clean jets, return them all! return jets; const LeptonPointer lepton(signalLepton(event)); for (unsigned int index = 0; index < jets.size(); ++index) { const JetPointer jet(jets.at(index)); if (!jet->isWithinDeltaR(0.3, lepton)) cleanedJets.push_back(jet); } return cleanedJets; }
const JetCollection TopPairEMuReferenceSelection::cleanedJets(const EventPtr event) const { const JetCollection jets(event->Jets()); JetCollection cleanedJets; //if no signal lepton is found, can't clean jets, return them all! if (!passesDiLeptonSelection(event)) return jets; const PhotonCollection photons(signalPhotons(event)); const ElectronCollection electrons(signalElectrons(event)); const MuonCollection muons(signalMuons(event)); double minDR = 999999999.; double minDR_pho = 999999999.; for (unsigned int index = 0; index < jets.size(); ++index) { const JetPointer jet(jets.at(index)); for (unsigned int lep = 0; lep < electrons.size(); lep++){ const LeptonPointer lepton(electrons.at(lep)); if(jet->deltaR(lepton) < minDR) minDR = jet->deltaR(lepton); } for (unsigned int lep = 0; lep < muons.size(); lep++){ const LeptonPointer lepton(muons.at(lep)); if(jet->deltaR(lepton) < minDR) minDR = jet->deltaR(lepton); } for (unsigned int pho = 0; pho < photons.size(); pho++){ const PhotonPointer photon(photons.at(pho)); if(jet->deltaR(photon) < minDR_pho) minDR_pho = jet->deltaR(photon); } if (minDR > 0.5 && minDR_pho > 0.3 && isGoodJet(jet)) cleanedJets.push_back(jet); } return cleanedJets; }
bool HLTriggerQCDAnalyser::passesTriggerAnalysisSelection(const EventPtr event) const { const ElectronCollection electrons(event->Electrons()); const JetCollection jets(event->Jets()); if (electrons.size() == 0 || jets.size() < 3) return false; unsigned int nElectrons(0); for (unsigned int index = 0; index < electrons.size(); ++index) { const ElectronPointer electron(electrons.at(index)); if (fabs(electron->eta()) < 2.5 && electron->pt() > 20) ++nElectrons; //if more than 2 electrons passing the selection of > 20GeV, reject event } const ElectronPointer mostEnergeticElectron(electrons.front()); //clean jets against electron JetCollection cleanedJets; for (unsigned int index = 0; index < jets.size(); ++index) { const JetPointer jet(jets.at(index)); if (!jet->isWithinDeltaR(0.3, mostEnergeticElectron)) cleanedJets.push_back(jet); } unsigned int nCleanedJetsAbove30GeV(0), nCleanedJetsAbove45GeV(0); for (unsigned int index = 0; index < cleanedJets.size(); ++index) { const JetPointer jet(cleanedJets.at(index)); if (jet->pt() > 45.) ++nCleanedJetsAbove45GeV; if (jet->pt() > 30.) ++nCleanedJetsAbove30GeV; } return nElectrons == 1 && (nCleanedJetsAbove45GeV >= 3 || (nCleanedJetsAbove45GeV >= 2 && nCleanedJetsAbove30GeV >= 3 && event->runnumber() >= 194270)); }
BAT::TtbarHypothesis HitFitAnalyser::analyseAndReturn(const EventPtr event, const JetCollection jets, const JetCollection bjets, const LeptonPointer selectedLepton ) { weight_ = event->weight() * prescale_ * scale_; treeMan_->setCurrentFolder(histogramFolder_); treeMan_->Fill("EventWeight", weight_ ); // const JetCollection jets(event->getCleanedJets( SelectionCriteria::ElectronPlusJetsReference )); // const JetCollection bJets(event->getCleanedBJets( SelectionCriteria::ElectronPlusJetsReference )); // const LeptonPointer selectedLepton = event->getSignalLepton( SelectionCriteria::ElectronPlusJetsReference ); string metPrefix = METAlgorithm::names.at(0); const METPointer met(event->MET((METAlgorithm::value) 0)); // Get cleaned jets that aren't b tagged JetCollection leadingLightJets; JetCollection leadingBJets; unsigned int maxNJet = std::min(5, int(jets.size())); for ( unsigned int jetIndex=0; jetIndex < maxNJet; ++jetIndex ) { bool isBJet = false; JetPointer thisJet = jets[jetIndex]; for ( unsigned int bJetIndex=0; bJetIndex < bjets.size(); ++bJetIndex ) { JetPointer thisBJet = bjets[bJetIndex]; if ( thisJet == thisBJet ) { isBJet = true; break; } } if ( !isBJet ) leadingLightJets.push_back( thisJet ); else leadingBJets.push_back( thisJet ); } //set MC matching flag if (event->getDataType() == DataType::TTJets_amcatnloFXFX) do_MC_matching = true; else do_MC_matching = false; //prepare the jets collection // Copy jets into an array JetCollection jetCopy; for (JetCollection::const_iterator j = leadingLightJets.begin(); j != leadingLightJets.end(); ++j) { jetCopy.push_back(*j); } JetCollection bJetCopy; for (JetCollection::const_iterator j = leadingBJets.begin(); j != leadingBJets.end(); ++j) { bJetCopy.push_back(*j); } std::sort(jetCopy.begin(), jetCopy.end(), jetPtComp); std::sort(bJetCopy.begin(), bJetCopy.end(), jetPtComp); jetsForFitting.clear(); unsigned numJetsToFit = jetCopy.size(); if (jetCopy.size() >= 2) { if (numJetsToFit > 5) numJetsToFit = 5; jetsForFitting.insert(jetsForFitting.begin(), jetCopy.begin(), jetCopy.begin() + numJetsToFit); } bJetsForFitting.clear(); numJetsToFit = bJetCopy.size(); if (bJetCopy.size() >= 2) { if (numJetsToFit > 5) numJetsToFit = 5; bJetsForFitting.insert(bJetsForFitting.begin(), bJetCopy.begin(), bJetCopy.begin() + numJetsToFit); } BatHitFit hhFitter(electronTranslator_, muonTranslator_, jetTranslator_, metTranslator_, hitfitDefault_, hitfitLepWMass_, hitfitHadWMass_, hitfitTopMass_); // Clear the internal state hhFitter.clear(); // Add lepton into hitfit if ( isElectronChannel_ ) { const ElectronPointer signalElectron(boost::static_pointer_cast<Electron>(selectedLepton)); //TODO: fix the fitter to accept lepton class OR particle!! hhFitter.AddLepton(*signalElectron); } else { const MuonPointer signalMuon(boost::static_pointer_cast<Muon>(selectedLepton)); //TODO: fix the fitter to accept lepton class OR particle!! hhFitter.AddLepton(*signalMuon); } // Add jets into HitFit // Also check if jets matched to ttbar partons are in the jets passed to the fit bool quarkInCollection = false, quarkBarInCollection = false, lebBInCollection = false, hadBInCollection = false; for (size_t jet = 0; jet != jetsForFitting.size(); ++jet) { hhFitter.AddJet(*jetsForFitting.at(jet)); // cout << "Adding light jet with csv : " << jetsForFitting.at(jet)->getBTagDiscriminator(BAT::BtagAlgorithm::value::CombinedSecondaryVertexV2) << endl; if ( jetsForFitting.at(jet)->ttbar_decay_parton() ) { int partonPdg = jetsForFitting.at(jet)->ttbar_decay_parton(); if ( partonPdg == 3 ) quarkInCollection = true; else if ( partonPdg == 4 ) quarkBarInCollection = true; else if ( partonPdg == 5 ) lebBInCollection = true; else if ( partonPdg == 6 ) hadBInCollection = true; } } for (size_t jet = 0; jet != bJetsForFitting.size(); ++jet) { hhFitter.AddBJet(*bJetsForFitting.at(jet)); // cout << "Adding b jet with csv : " << bJetsForFitting.at(jet)->getBTagDiscriminator(BAT::BtagAlgorithm::value::CombinedSecondaryVertexV2) << endl; if ( bJetsForFitting.at(jet)->ttbar_decay_parton() ) { int partonPdg = bJetsForFitting.at(jet)->ttbar_decay_parton(); if ( partonPdg == 3 ) quarkInCollection = true; else if ( partonPdg == 4 ) quarkBarInCollection = true; else if ( partonPdg == 5 ) lebBInCollection = true; else if ( partonPdg == 6 ) hadBInCollection = true; } } // Check if jets matched to ttbar partons are in the jets passed to the fit if (do_MC_matching) { if ( quarkInCollection && quarkBarInCollection && lebBInCollection && hadBInCollection ) { allTTBarJetsPassedToFit_ = true; } int lastTTBarJetPosition = positionOfLastTTBarJet( jets ); if ( lastTTBarJetPosition != -1 ) { allTTBarJetsPassSelection_ = true; treeMan_->Fill("PositionOfLastTTbarJet", lastTTBarJetPosition + 1 ); } else treeMan_->Fill("PositionOfLastTTbarJet", lastTTBarJetPosition ); } // Add missing transverse energy into HitFit hhFitter.SetMet(*met); // Container for input of all jet permutation of the event std::vector<hitfit::Lepjets_Event> hitfitEventsInput; // Container for results of the fit for all jet permutation of the event std::vector<hitfit::Fit_Result> hitfitResult; // // R U N H I T F I T // // Run the kinematic fit and get how many permutations is possible // in the fit size_t nHitFit = hhFitter.FitAllPermutation(); // // Get the number of jets // nHitFitJet = hhFitter.GetEvent().njets(); // Get the input events for all permutations hitfitEventsInput = hhFitter.GetUnfittedEvent(); // Get the fit results for all permutations hitfitResult = hhFitter.GetFitAllPermutation(); double bestChi2 = 999.; unsigned bestX2pos = nHitFit + 1; // // Loop over all permutations and extract the information for (size_t fit = 0; fit != nHitFit; ++fit) { // Get the event after the fit hitfit::Fit_Result fitResult = hitfitResult[fit]; if (hitfitResult[fit].chisq() > 0.0) { treeMan_->Fill("FitChiSquaredAllSolutions",fitResult.chisq()); } // Is this the permutation with smallest chi2? if (fitResult.chisq() > 0.0 && fitResult.chisq() < bestChi2) { bestChi2 = fitResult.chisq(); bestX2pos = fit; } } // // END PART WHICH EXTRACTS INFORMATION FROM HITFIT // if (bestX2pos < nHitFit + 1) { treeMan_->Fill("FitChiSquaredBestSolutions",hitfitResult[bestX2pos].chisq()); treeMan_->Fill("FitChiSquaredProbabilityBestSolutions",TMath::Prob(hitfitResult[bestX2pos].chisq(),1)); //pass hitfit event into BAT format lepton_charge = selectedLepton->charge(); BAT::TtbarHypothesis newHyp = BatEvent(hitfitResult[bestX2pos].ev(), event, "SolutionCategory"); treeMan_->Fill("FittedLeptonicTopPtBestSolution", newHyp.leptonicTop->pt()); treeMan_->Fill("FittedHadronicTopPtBestSolution", newHyp.hadronicTop->pt()); treeMan_->Fill("FittedLeptonicTopRapidityBestSolution", newHyp.leptonicTop->rapidity()); treeMan_->Fill("FittedHadronicTopRapidityBestSolution", newHyp.hadronicTop->rapidity()); treeMan_->Fill("FittedTTbarMassBestSolution", newHyp.resonance->mass()); treeMan_->Fill("FittedTTbarPtBestSolution", newHyp.resonance->pt()); treeMan_->Fill("FittedTTbarRapidityBestSolution", newHyp.resonance->rapidity()); // Get the event before the fit hitfit::Lepjets_Event unfittedEvent = hitfitEventsInput[bestX2pos]; // Now need to perform second kinematic fit hitfit::Fit_Result secondFitResult = performSecondKinematicFit( unfittedEvent, event); BAT::TtbarHypothesis newHyp_afterSecondFit = BatEvent(secondFitResult.ev(), event, "SolutionCategory_second"); treeMan_->Fill("FitChiSquaredBestSolutions_second",secondFitResult.chisq()); treeMan_->Fill("FitChiSquaredProbabilityBestSolutions_second",TMath::Prob(secondFitResult.chisq(),2)); treeMan_->Fill("FittedLeptonicTopPtBestSolution_second", newHyp_afterSecondFit.leptonicTop->pt()); treeMan_->Fill("FittedHadronicTopPtBestSolution_second", newHyp_afterSecondFit.hadronicTop->pt()); treeMan_->Fill("FittedLeptonicTopRapidityBestSolution_second", newHyp_afterSecondFit.leptonicTop->rapidity()); treeMan_->Fill("FittedHadronicTopRapidityBestSolution_second", newHyp_afterSecondFit.hadronicTop->rapidity()); treeMan_->Fill("FittedTTbarMassBestSolution_second", newHyp_afterSecondFit.resonance->mass()); treeMan_->Fill("FittedTTbarPtBestSolution_second", newHyp_afterSecondFit.resonance->pt()); treeMan_->Fill("FittedTTbarRapidityBestSolution_second", newHyp_afterSecondFit.resonance->rapidity()); return newHyp_afterSecondFit; } else { // cout << "No HitFit solution found for this event" << endl; treeMan_->Fill("SolutionCategory", 0 ); treeMan_->Fill("SolutionCategory_second", 0); } return BAT::TtbarHypothesis(); }