Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:15:35

0001 #ifndef HeavyFlavorAnalysis_SpecificDecay_BPHDecayToResResBuilder_h
0002 #define HeavyFlavorAnalysis_SpecificDecay_BPHDecayToResResBuilder_h
0003 /** \class BPHDecayToResResBuilder
0004  *
0005  *  Description: 
0006  *     Base class to build a particle decaying to two particles, decaying
0007  *     themselves in cascade, for generic particle types
0008  *
0009  *  \author Paolo Ronchese INFN Padova
0010  *
0011  */
0012 
0013 //----------------------
0014 // Base Class Headers --
0015 //----------------------
0016 #include "HeavyFlavorAnalysis/SpecificDecay/interface/BPHDecayToResResBuilderBase.h"
0017 #include "HeavyFlavorAnalysis/SpecificDecay/interface/BPHDecayConstrainedBuilder.h"
0018 #include "HeavyFlavorAnalysis/SpecificDecay/interface/BPHDecaySpecificBuilder.h"
0019 
0020 //------------------------------------
0021 // Collaborating Class Declarations --
0022 //------------------------------------
0023 #include "FWCore/Framework/interface/EventSetup.h"
0024 
0025 class BPHEventSetupWrapper;
0026 
0027 //---------------
0028 // C++ Headers --
0029 //---------------
0030 #include <iostream>
0031 #include <string>
0032 #include <vector>
0033 
0034 //              ---------------------
0035 //              -- Class Interface --
0036 //              ---------------------
0037 
0038 template <class ProdType, class Res1Type, class Res2Type>
0039 class BPHDecayToResResBuilder : public BPHDecayToResResBuilderBase,
0040                                 public BPHDecayConstrainedBuilder<ProdType, Res1Type>,
0041                                 public BPHDecaySpecificBuilder<ProdType> {
0042 public:
0043   using typename BPHDecayGenericBuilder<ProdType>::prod_ptr;
0044   typedef typename Res1Type::const_pointer res1_ptr;
0045   typedef typename Res2Type::const_pointer res2_ptr;
0046 
0047   /** Constructor
0048    */
0049   BPHDecayToResResBuilder(const BPHEventSetupWrapper& es,
0050                           const std::string& res1Name,
0051                           double res1Mass,
0052                           double res1Width,
0053                           const std::vector<res1_ptr>& res1Collection,
0054                           const std::string& res2Name,
0055                           const std::vector<res2_ptr>& res2Collection)
0056       : BPHDecayGenericBuilderBase(es, nullptr),
0057         BPHDecayConstrainedBuilderBase(res1Name, res1Mass, res1Width),
0058         BPHDecayToResResBuilderBase(res2Name),
0059         BPHDecayConstrainedBuilder<ProdType, Res2Type>(res1Collection),
0060         sCollection(&res2Collection) {}
0061 
0062   // deleted copy constructor and assignment operator
0063   BPHDecayToResResBuilder(const BPHDecayToResResBuilder& x) = delete;
0064   BPHDecayToResResBuilder& operator=(const BPHDecayToResResBuilder& x) = delete;
0065 
0066   /** Destructor
0067    */
0068   ~BPHDecayToResResBuilder() override = default;
0069 
0070 protected:
0071   BPHDecayToResResBuilder(const std::vector<res1_ptr>& res1Collection,
0072                           const std::string& res2Name,
0073                           const std::vector<res2_ptr>& res2Collection)
0074       : BPHDecayToResResBuilderBase(res2Name),
0075         BPHDecayConstrainedBuilder<ProdType, Res2Type>(res1Collection),
0076         sCollection(&res2Collection) {}
0077 
0078   const std::vector<res2_ptr>* sCollection;
0079 
0080   void addRes2Collection(BPHRecoBuilder& brb) override {
0081     const std::vector<res2_ptr>& sc = *this->sCollection;
0082     if (res2Sel->getMassMax() > 0.0) {
0083       sCollectSel.clear();
0084       sCollectSel.reserve(sc.size());
0085       for (const res2_ptr& s : sc) {
0086         if (res2Sel->accept(*s))
0087           sCollectSel.push_back(s);
0088       }
0089       brb.add(sName, sCollectSel);
0090     } else
0091       brb.add(sName, *this->sCollection);
0092   }
0093 
0094 private:
0095   std::vector<res2_ptr> sCollectSel;
0096 };
0097 
0098 #endif