38 muCandTag_ (iConfig.getParameter<
edm::
InputTag>(
"MuCand")),
40 trkCandTag_ (iConfig.getParameter<
edm::
InputTag>(
"TrackCand")),
42 thirdTrackMass_(iConfig.getParameter<double>(
"ThirdTrackMass")),
43 maxEta_(iConfig.getParameter<double>(
"MaxEta")),
44 minPt_(iConfig.getParameter<double>(
"MinPt")),
45 minInvMass_(iConfig.getParameter<double>(
"MinInvMass")),
46 maxInvMass_(iConfig.getParameter<double>(
"MaxInvMass")),
47 maxNormalisedChi2_(iConfig.getParameter<double>(
"MaxNormalisedChi2")),
48 minLxySignificance_(iConfig.getParameter<double>(
"MinLxySignificance")),
49 minCosinePointingAngle_(iConfig.getParameter<double>(
"MinCosinePointingAngle")),
50 minD0Significance_(iConfig.getParameter<double>(
"MinD0Significance")),
51 fastAccept_(iConfig.getParameter<
bool>(
"FastAccept")),
52 beamSpotTag_ (iConfig.getParameter<
edm::
InputTag> (
"BeamSpotTag")),
55 produces<VertexCollection>();
56 produces<CandidateCollection>();
69 desc.
add<
double>(
"ThirdTrackMass",0.106);
70 desc.
add<
double>(
"MaxEta",2.5);
71 desc.
add<
double>(
"MinPt",3.0);
72 desc.
add<
double>(
"MinInvMass",1.2);
73 desc.
add<
double>(
"MaxInvMass",2.2);
74 desc.
add<
double>(
"MaxNormalisedChi2",10.0);
75 desc.
add<
double>(
"MinLxySignificance",3.0);
76 desc.
add<
double>(
"MinCosinePointingAngle",0.9);
77 desc.
add<
double>(
"MinD0Significance",0.0);
78 desc.
add<
bool>(
"FastAccept",
false);
80 descriptions.
add(
"hltmmkFilter",desc);
98 const double MuMass(0.106);
99 const double MuMass2(MuMass*MuMass);
144 vector<TrackRef> trkMuCands;
147 vector<bool> isUsedCand(trkcands->size(),
false);
152 for (
auto mucand1=mucands->begin(), endCand1=mucands->end(); mucand1!=endCand1; ++mucand1) {
154 if ( mucands->size()<2)
break;
155 if ( trkcands->empty())
break;
158 LogDebug(
"HLTDisplacedMumukFilter") <<
" 1st muon: q*pt= " << trk1->charge()*trk1->pt() <<
", eta= " << trk1->eta() <<
", hits= " << trk1->numberOfValidHits();
161 if (fabs(trk1->eta()) >
maxEta_)
continue;
164 if (trk1->pt() <
minPt_)
continue;
166 auto mucand2 = mucand1; ++mucand2;
168 for (
auto endCand2=mucands->end(); mucand2!=endCand2; ++mucand2) {
172 LogDebug(
"HLTDisplacedMumukFilter") <<
" 2nd muon: q*pt= " << trk2->charge()*trk2->pt() <<
", eta= " << trk2->eta() <<
", hits= " << trk2->numberOfValidHits();
175 if (fabs(trk2->eta()) >
maxEta_)
continue;
178 if (trk2->pt() <
minPt_)
continue;
180 RecoChargedCandidateCollection::const_iterator trkcand, endCandTrk;
182 std::vector<bool>::iterator isUsedIter, endIsUsedCand;
185 for ( trkcand = trkcands->begin(), endCandTrk=trkcands->end(), isUsedIter = isUsedCand.begin(), endIsUsedCand = isUsedCand.end(); trkcand != endCandTrk && isUsedIter != endIsUsedCand; ++trkcand, ++isUsedIter) {
189 if (
overlap(*mucand1,*trkcand)) {
190 trkMuCands.push_back(trk3);
194 else if (
overlap(*mucand2,*trkcand)){
195 trkMuCands.push_back(trk3);
200 if(trkMuCands.size()==2)
break;
207 for ( trkcand = trkcands->begin(), endCandTrk=trkcands->end(), isUsedIter = isUsedCand.begin(), endIsUsedCand = isUsedCand.end(); trkcand != endCandTrk && isUsedIter != endIsUsedCand; ++trkcand, ++isUsedIter) {
211 LogDebug(
"HLTDisplacedMumukFilter") <<
" 3rd track: q*pt= " << trk3->charge()*trk3->pt() <<
", eta= " << trk3->eta() <<
", hits= " << trk3->numberOfValidHits();
215 for (
auto & trkMuCand : trkMuCands)
if(trk3==trkMuCand) skip=
true;
219 if(*isUsedIter)
continue;
222 if (fabs(trk3->eta()) >
maxEta_)
continue;
225 if (trk3->pt() <
minPt_)
continue;
228 e1 =
sqrt(trk1->momentum().Mag2()+MuMass2);
229 e2 =
sqrt(trk2->momentum().Mag2()+MuMass2);
230 e3 =
sqrt(trk3->momentum().Mag2()+thirdTrackMass2);
239 double invmass =
abs(p.mass());
241 LogDebug(
"HLTDisplacedMumukFilter") <<
" Invmass= " << invmass;
246 vector<TransientTrack> t_tks;
247 t_tks.push_back((*theB).build(&trk1));
248 t_tks.push_back((*theB).build(&trk2));
249 t_tks.push_back((*theB).build(&trk3));
251 if (t_tks.size()!=3)
continue;
271 GlobalPoint displacementFromBeamspot( -1*((vertexBeamSpot.
x0() -secondaryVertex.
x()) + (secondaryVertex.
z() - vertexBeamSpot.
z0()) * vertexBeamSpot.
dxdz()), -1*((vertexBeamSpot.
y0() - secondaryVertex.
y())+ (secondaryVertex.
z() -vertexBeamSpot.
z0()) * vertexBeamSpot.
dydz()), 0);
273 float lxy = displacementFromBeamspot.
perp();
274 float lxyerr =
sqrt(err.
rerr(displacementFromBeamspot));
280 Vertex::Point vperp(displacementFromBeamspot.
x(),displacementFromBeamspot.
y(),0.);
283 float cosAlpha = vperp.Dot(pperp)/(vperp.R()*pperp.R());
285 LogDebug(
"HLTDisplacedMumukFilter") <<
" vertex fit normalised chi2: " << normChi2 <<
", Lxy significance: " << lxy/lxyerr <<
", cosine pointing angle: " << cosAlpha;
288 vertexCollection->push_back(vertex);
294 LogDebug(
"HLTDisplacedMumukFilter") <<
" Event passed!";
303 vector<RecoChargedCandidateRef> vref;
305 for (
auto &
i : vref) {
310 }
else if (trktmp==trk2) {
312 }
else if (trktmp==trk3) {
315 if (i1done && i2done && i3done)
break;
339 const bool accept (counter >= 1);
341 LogDebug(
"HLTDisplacedMumukFilter") <<
" >>>>> Result of HLTDisplacedMumukFilter is "<< accept <<
", number of muon pairs passing thresholds= " <<
counter;
365 double dpt = a.
pt() - b.
pt();
371 double deta = a.
eta() - b.
eta();
374 if ((dphi + deta) < eps) {
GlobalError positionError() const
static int overlap(const reco::Candidate &, const reco::Candidate &)
double z0() const
z coordinate
edm::EDGetTokenT< reco::RecoChargedCandidateCollection > trkCandToken_
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
HLTmmkFilter(const edm::ParameterSet &)
void getObjects(Vids &ids, VRphoton &refs) const
various physics-level getters:
Measurement1D transverseImpactParameter() const
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
edm::Ref< RecoChargedCandidateCollection > RecoChargedCandidateRef
reference to an object in a collection of RecoChargedCandidate objects
std::vector< Vertex > VertexCollection
collection of Vertex objects
const Vector & momentum() const
track momentum vector
bool accept(const edm::Event &event, const edm::TriggerResults &triggerTable, const std::string &triggerPath)
void addObject(int id, const reco::RecoEcalCandidateRef &ref)
setters for L3 collections: (id=physics type, and Ref<C>)
double dydz() const
dydz slope
float normalisedChiSquared() const
const Point & vertex() const
reference point on the track. This method is DEPRECATED, please use referencePoint() instead ...
CovarianceMatrix covariance() const
return track covariance matrix
GlobalPoint position() const
Abs< T >::type abs(const T &t)
CachingVertex< 5 > vertex(const std::vector< reco::TransientTrack > &tracks) const override
math::XYZPoint Point
point in the space
edm::EDGetTokenT< reco::BeamSpot > beamSpotToken_
T const * get() const
Returns C++ pointer to the item.
edm::InputTag trkCandTag_
ParameterDescriptionBase * add(U const &iLabel, T const &value)
bool hltFilter(edm::Event &, const edm::EventSetup &, trigger::TriggerFilterObjectWithRefs &filterproduct) const override
double dxdz() const
dxdz slope
edm::EDGetTokenT< reco::RecoChargedCandidateCollection > muCandToken_
std::vector< RecoChargedCandidate > RecoChargedCandidateCollection
collectin of RecoChargedCandidate objects
double significance() const
static void makeHLTFilterDescription(edm::ParameterSetDescription &desc)
virtual double eta() const =0
momentum pseudorapidity
virtual double pt() const =0
transverse momentum
XYZVectorD XYZVector
spatial vector with cartesian internal representation
T rerr(const GlobalPoint &aPoint) const
void addCollectionTag(const edm::InputTag &collectionTag)
collectionTags
void add(std::string const &label, ParameterSetDescription const &psetDescription)
const double minCosinePointingAngle_
const double thirdTrackMass_
static std::atomic< unsigned int > counter
double y0() const
y coordinate
int charge() const
track electric charge
const double maxNormalisedChi2_
static FreeTrajectoryState initialFreeState(const reco::Track &, const MagneticField *)
edm::OwnVector< Candidate > CandidateCollection
collection of Candidate objects
const double minD0Significance_
T const * product() const
virtual double phi() const =0
momentum azimuthal angle
math::PtEtaPhiELorentzVectorF LorentzVector
const double minLxySignificance_
double x0() const
x coordinate