Object * quote(Object * object) { if (object->getObjectType() == DOUBLET) { Doublet * doublet = dynamic_cast<Doublet *>(object); return doublet->getCar(); } return new Nil; }
MultipletSignature<Quartet211> SignatureLeptonTagger::Signature(Doublet const& doublet, Singlet const& singlet_1, Singlet const& singlet_2) const { Quartet211 quartet; if ((doublet.Jet() + singlet_1.Jet()).Mass() > (doublet.Jet() + singlet_2.Jet()).Mass()) quartet.SetMultiplets(doublet, singlet_1, singlet_2); else quartet.SetMultiplets(doublet, singlet_2, singlet_1); if (quartet.Overlap()) throw Overlap(); return MultipletSignature<Quartet211>(quartet); }
Doublet Higgs::PrepareDoublet(Doublet const& doublet, std::vector<Lepton>& leptons) { INFO0; // if (auto optional = MassDrop(doublet)) prepared = *optional; auto jet_1 = static_cast<boca::Jet>(doublet.Singlet1()); auto jet_2 = static_cast<boca::Jet>(doublet.Singlet2()); auto prepared = Doublet{bottom_reader_.Multiplet(jet_1), bottom_reader_.Multiplet(jet_2)}; prepared.SetClosestLepton(leptons); return prepared; }
Object * cdr(Object * object) { if (object->getObjectType() != DOUBLET) { return new Nil; } Doublet * doubletInput = dynamic_cast<Doublet *>(object); if (doubletInput->getCar()->getObjectType() != DOUBLET) { return new Nil; } return doubletInput->getCdr(); }
Object * car(Object * object) { if (object->getObjectType() != DOUBLET) { return new Nil; } Doublet * doubletInput = dynamic_cast<Doublet *>(object); if (doubletInput->getCar()->getObjectType() != DOUBLET) { return new Nil; } Doublet doubletCar = Doublet(((*doubletInput).getCar()), new Nil); return doubletCar.getCar(); }
int length(Doublet doublet) { if (doublet.getCar()->getObjectType() == NIL) { return 0; } Object * cdr = doublet.getCdr(); if (cdr->getObjectType() != DOUBLET) { return 1; } Doublet * doubletCdr = dynamic_cast<Doublet *>(cdr); return 1 + length(*doubletCdr); }
boost::optional<Doublet> Higgs::SetTag(Doublet& doublet, std::vector<Lepton>& leptons, PreCuts const& pre_cuts, Tag tag) { INFO0; doublet = PrepareDoublet(doublet, leptons); if (Problematic(doublet, pre_cuts, tag)) return boost::none; doublet.SetTag(tag); return doublet; }
boost::optional<Doublet> Higgs::Multiplet(Doublet& doublet, std::vector<Lepton>& leptons, PreCuts const& pre_cuts, TMVA::Reader const& reader) { INFO0; doublet = PrepareDoublet(doublet, leptons); if (Problematic(doublet, pre_cuts)) return boost::none; doublet.SetBdt(Bdt(doublet, reader)); return doublet; }
MultipletSignature<Octet332> SignatureT::Signature(Triplet const& triplet_1, Triplet const& triplet_2, Doublet const& doublet) const { Octet332 octet; if (boca::Jet((triplet_1.Jet() + doublet.Jet())).Mass() > boca::Jet(triplet_2.Jet() + doublet.Jet()).Mass()) octet.SetMultiplets(triplet_1, triplet_2, doublet); else octet.SetMultiplets(triplet_2, triplet_1, doublet); if (octet.Overlap()) throw Overlap(); return MultipletSignature<Octet332>(octet); }
Object * cons(Object * object) { if (object->getObjectType() == NIL) { Doublet doublet(new Nil, new Nil); Object * res = &doublet; return res; } if (object->getObjectType() != DOUBLET) { return new Nil; } Doublet * doubletInput = dynamic_cast<Doublet *>(object); if (doubletInput->getCdr()->getObjectType() == NIL) { Doublet doubletOutput(doubletInput->getCar(), new Nil); Object * res = &doubletOutput; return res; } Doublet doubletOutput(doubletInput->getCar(), doubletInput->getCdr()); Object * res = &doubletOutput; return res; }
boost::optional<Doublet> Higgs::MassDrop(Doublet const& doublet) { INFO0; auto cluster_sequence = ClusterSequence{doublet.Constituents(), Settings::JetDefinition(doublet.DeltaR() + 2. * Settings::JetConeSize())}; auto exclusive_jets = cluster_sequence.ExclusiveJets(1); if (exclusive_jets.empty()) return boost::none; auto mass_drop_tagger = fastjet::MassDropTagger{0.667, 0.09}; auto mass_drop_jet = mass_drop_tagger(exclusive_jets.front().FastJet()); if (mass_drop_jet == 0) return boost::none; auto radius = boca::Jet(mass_drop_jet.pieces().at(0)).DeltaRTo(mass_drop_jet.pieces().at(1)); radius = std::min(radius / 2., 300_mrad); auto filter = fastjet::Filter{Settings::JetDefinition(radius), fastjet::SelectorNHardest(3)}; auto filtered_jet = filter.result(mass_drop_jet); if (!filtered_jet.has_pieces()) return boost::none; auto pieces = SortedByPt(JetVector(filtered_jet.pieces())); if (pieces.size() < 2) return boost::none; return Doublet(bottom_reader_.Multiplet(pieces.at(0)), bottom_reader_.Multiplet(pieces.at(1))); }
Object * set(Object * object) { if (object->getObjectType() != DOUBLET) { return new Nil; } Doublet * doubletInput = dynamic_cast<Doublet *>(object); if (doubletInput->getCar()->getObjectType() != DOUBLET) { return new Nil; } Object * value = new Nil; if (doubletInput->getCdr()->getObjectType() != NIL) { Doublet * doubletCdr = dynamic_cast<Doublet *>(doubletInput->getCdr()); value = doubletCdr->getCar(); } Object * car = doubletInput->getCar(); return &(*car = *value); }