4 useCondDB_ (parameters.getParameter<
bool>(
"useCondDB") ),
5 gbrForestLabel_(parameters.getParameter<
std::
string>(
"gbrForestLabel") ),
6 weightFile_ (parameters.getParameter<
edm::FileInPath>(
"weightFile") ),
7 useAdaBoost_ (parameters.getParameter<
bool>(
"useAdaBoost") ),
8 jetChargeExp_ (parameters.getParameter<double>(
"jetChargeExp") ),
9 svChargeExp_ (parameters.getParameter<double>(
"svChargeExp") )
11 uses(0,
"pfImpactParameterTagInfos");
12 uses(1,
"pfInclusiveSecondaryVertexFinderCvsLTagInfos");
13 uses(2,
"softPFMuonsTagInfos");
14 uses(3,
"softPFElectronsTagInfos");
27 std::vector< std::string >
variables ({
"tr_ch_inc",
"sv_ch",
"mu_sip2d",
"mu_delR",
"mu_ptrel",
"mu_pfrac",
"mu_char",
"el_delR",
"el_ptrel",
"el_pfrac",
"el_mva",
"el_char",
"pt1_ch/j_pt",
"pt2_ch/j_pt",
"pt3_ch/j_pt"});
49 size_t n_ip_info = ip_info.jet()->getJetConstituents().size();
50 size_t n_sv_info = sv_info.nVertices();
51 size_t n_sm_info = sm_info.leptons();
52 size_t n_se_info = se_info.leptons();
58 if ( n_ip_info + n_sv_info + n_sm_info + n_se_info > 0 ) {
62 float pt_ratio1_ch = 0;
63 float pt_ratio2_ch = 0;
64 float pt_ratio3_ch = 0;
88 for (
size_t i_ip=0; i_ip < n_ip_info; ++i_ip)
90 const reco::Candidate * trackPtr = ip_info.jet()->getJetConstituents().at(i_ip).get();
91 if ( trackPtr->
charge() == 0 )
continue;
94 tr_ch_num += tr_ch_weight * trackPtr->
charge();
95 tr_ch_den += tr_ch_weight;
98 if ( fabs(pt_ratio1_ch) < trackPtr->
pt() ) {
99 pt_ratio3_ch = pt_ratio2_ch;
100 pt_ratio2_ch = pt_ratio1_ch;
101 pt_ratio1_ch = trackPtr->
pt() * trackPtr->
charge();
102 }
else if ( fabs(pt_ratio2_ch) < trackPtr->
pt() ) {
103 pt_ratio3_ch = pt_ratio2_ch;
104 pt_ratio2_ch = trackPtr->
pt() * trackPtr->
charge();
105 }
else if ( fabs(pt_ratio3_ch) < trackPtr->
pt() ) {
106 pt_ratio3_ch = trackPtr->
pt() * trackPtr->
charge();
110 float jet_pt = ip_info.jet()->pt();
112 pt_ratio1_ch = pt_ratio1_ch / jet_pt;
113 pt_ratio2_ch = pt_ratio2_ch / jet_pt;
114 pt_ratio3_ch = pt_ratio3_ch / jet_pt;
118 if ( tr_ch_den > 0 ) tr_ch_inc = tr_ch_num / tr_ch_den;
123 float jet_pt = sv_info.jet()->pt();
131 for (
size_t i_vtx=0; i_vtx<n_sv_info; ++i_vtx)
133 float sv_mass = sv_info.secondaryVertex(i_vtx).p4().mass();
134 float sv_chi2 = sv_info.secondaryVertex(i_vtx).vertexNormalizedChi2();
135 float sv_pfrac = sv_info.secondaryVertex(i_vtx).pt()/jet_pt;
136 float sv_L = sv_info.flightDistance(i_vtx).value();
137 float sv_sL = sv_info.flightDistance(i_vtx).significance();
138 float delEta = sv_info.secondaryVertex(i_vtx).momentum().eta()-sv_info.flightDirection(i_vtx).eta();
139 float delPhi = sv_info.secondaryVertex(i_vtx).momentum().phi()-sv_info.flightDirection(i_vtx).phi();
140 if ( fabs(delPhi)>
M_PI ) delPhi = 2*
M_PI - fabs(delPhi);
141 float sv_delR =
sqrt( delEta*delEta + delPhi*delPhi );
143 if ( sv_mass>max_mass && sv_mass>1.4 && sv_chi2<3 && sv_chi2>0 && sv_pfrac>0.25 && sv_L<2.5 && sv_sL>4 && sv_delR<0.1 )
153 size_t n_sv_tracks = sv_info.vertexTracks(vtx_idx).size();
154 for (
size_t i_tr=0; i_tr < n_sv_tracks; ++i_tr)
160 sv_ch_num += sv_ch_weight * trackPtr->
charge();
161 sv_ch_den += sv_ch_weight;
164 if ( sv_ch_den > 0 ) sv_ch = sv_ch_num / sv_ch_den;
174 for (
size_t i_lep=0; i_lep<n_sm_info; ++i_lep)
176 float lep_pt = sm_info.lepton(0)->pt();
177 if ( lep_pt > max_pt )
184 mu_sip2d = sm_info.properties(lep_idx).sip2d;
186 mu_delR = sm_info.properties(lep_idx).deltaR;
187 mu_ptrel = sm_info.properties(lep_idx).ptRel;
188 mu_pfrac = sm_info.properties(lep_idx).ratio;
189 mu_char = sm_info.properties(lep_idx).charge;
198 for (
size_t i_lep=0; i_lep<n_se_info; ++i_lep)
200 float lep_pt = se_info.lepton(0)->pt();
201 if ( lep_pt > max_pt )
210 el_delR = se_info.properties(lep_idx).deltaR;
211 el_ptrel = se_info.properties(lep_idx).ptRel;
212 el_pfrac = se_info.properties(lep_idx).ratio;
213 el_mva = se_info.properties(lep_idx).elec_mva;
214 el_char = se_info.properties(lep_idx).charge;
217 std::map<std::string,float>
inputs;
218 inputs[
"tr_ch_inc"] = tr_ch_inc;
219 inputs[
"pt1_ch/j_pt"] = pt_ratio1_ch;
220 inputs[
"pt2_ch/j_pt"] = pt_ratio2_ch;
221 inputs[
"pt3_ch/j_pt"] = pt_ratio3_ch;
222 inputs[
"sv_ch"] = sv_ch;
223 inputs[
"mu_sip2d"] = mu_sip2d;
225 inputs[
"mu_delR"] = mu_delR;
226 inputs[
"mu_ptrel"] = mu_ptrel;
227 inputs[
"mu_pfrac"] = mu_pfrac;
228 inputs[
"mu_char"] = mu_char;
231 inputs[
"el_delR"] = el_delR;
232 inputs[
"el_ptrel"] = el_ptrel;
233 inputs[
"el_pfrac"] = el_pfrac;
234 inputs[
"el_mva"] = el_mva;
235 inputs[
"el_char"] = el_char;
238 value =
mvaID->evaluate(inputs);
250 desc.
add<
bool>(
"useCondDB",
false);
253 desc.
add<
bool>(
"useAdaBoost",
true);
254 desc.
add<
double>(
"jetChargeExp",0.8);
255 desc.
add<
double>(
"svChargeExp",0.5);
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
const T & get(unsigned int index=0) const
const double svChargeExp_
const edm::FileInPath weightFile_
~CandidateChargeBTagComputer() override
std::unique_ptr< TMVAEvaluator > mvaID
const reco::Track * toTrack(const reco::TrackBaseRef &t)
PRODUCT const & get(ESGetToken< PRODUCT, T > const &iToken) const
static double delPhi(const double phi1, const double phi2)
void addDefault(ParameterSetDescription const &psetDescription)
const DepRecordT getRecord() const
double pt() const
track transverse momentum
void uses(unsigned int id, const std::string &label)
ParameterDescriptionBase * add(U const &iLabel, T const &value)
const double jetChargeExp_
void initialize(const JetTagComputerRecord &record) override
virtual double pt() const =0
transverse momentum
CandidateChargeBTagComputer(const edm::ParameterSet ¶meters)
virtual int charge() const =0
electric charge
float discriminator(const TagInfoHelper &tagInfo) const override
std::string fullPath() const
int charge() const
track electric charge
const std::string gbrForestLabel_
Power< A, B >::type pow(const A &a, const B &b)