32 using namespace trigger;
37 thirdTrackMass_(iConfig.getParameter<double>(
"ThirdTrackMass")),
38 fourthTrackMass_(iConfig.getParameter<double>(
"FourthTrackMass")),
39 maxEta_(iConfig.getParameter<double>(
"MaxEta")),
40 minPt_(iConfig.getParameter<double>(
"MinPt")),
41 minInvMass_(iConfig.getParameter<double>(
"MinInvMass")),
42 maxInvMass_(iConfig.getParameter<double>(
"MaxInvMass")),
43 maxNormalisedChi2_(iConfig.getParameter<double>(
"MaxNormalisedChi2")),
44 minLxySignificance_(iConfig.getParameter<double>(
"MinLxySignificance")),
45 minCosinePointingAngle_(iConfig.getParameter<double>(
"MinCosinePointingAngle")),
46 minD0Significance_(iConfig.getParameter<double>(
"MinD0Significance")),
47 fastAccept_(iConfig.getParameter<bool>(
"FastAccept")),
48 beamSpotTag_ (iConfig.getParameter<edm::
InputTag> (
"BeamSpotTag"))
53 produces<VertexCollection>();
54 produces<CandidateCollection>();
79 const double MuMass(0.106);
80 const double MuMass2(MuMass*MuMass);
127 vector<TrackRef> trkMuCands;
130 vector<bool> isUsedCand(trkcands->size(),
false);
135 for (RecoChargedCandidateCollection::const_iterator mucand1=mucands->begin(), endCand1=mucands->end(); mucand1!=endCand1; ++mucand1) {
137 if ( mucands->size()<2)
break;
138 if ( trkcands->size()<2)
break;
141 LogDebug(
"HLTDisplacedMumukkFilter") <<
" 1st muon: q*pt= " << trk1->charge()*trk1->pt() <<
", eta= " << trk1->eta() <<
", hits= " << trk1->numberOfValidHits();
144 if (fabs(trk1->eta()) >
maxEta_)
continue;
147 if (trk1->pt() <
minPt_)
continue;
149 RecoChargedCandidateCollection::const_iterator mucand2 = mucand1; ++mucand2;
151 for (RecoChargedCandidateCollection::const_iterator endCand2=mucands->end(); mucand2!=endCand2; ++mucand2) {
155 LogDebug(
"HLTDisplacedMumukkFilter") <<
" 2nd muon: q*pt= " << trk2->charge()*trk2->pt() <<
", eta= " << trk2->eta() <<
", hits= " << trk2->numberOfValidHits();
158 if (fabs(trk2->eta()) >
maxEta_)
continue;
161 if (trk2->pt() <
minPt_)
continue;
163 RecoChargedCandidateCollection::const_iterator trkcand, endCandTrk;
165 std::vector<bool>::iterator isUsedIter, endIsUsedCand;
168 for ( trkcand = trkcands->begin(), endCandTrk=trkcands->end(), isUsedIter = isUsedCand.begin(), endIsUsedCand = isUsedCand.end(); trkcand != endCandTrk && isUsedIter != endIsUsedCand; ++trkcand, ++isUsedIter) {
172 if (
overlap(*mucand1,*trkcand)) {
173 trkMuCands.push_back(trk3);
177 else if (
overlap(*mucand2,*trkcand)){
178 trkMuCands.push_back(trk3);
183 if(trkMuCands.size()==2)
break;
190 for ( trkcand = trkcands->begin(), endCandTrk=trkcands->end(), isUsedIter = isUsedCand.begin(), endIsUsedCand = isUsedCand.end(); trkcand != endCandTrk && isUsedIter != endIsUsedCand; ++trkcand, ++isUsedIter) {
194 LogDebug(
"HLTDisplacedMumukkFilter") <<
" 3rd track: q*pt= " << trk3->charge()*trk3->pt() <<
", eta= " << trk3->eta() <<
", hits= " << trk3->numberOfValidHits();
198 for (
unsigned int itmc=0;itmc<trkMuCands.size();itmc++)
if(trk3==trkMuCands.at(itmc)) skip=
true;
202 if(*isUsedIter)
continue;
205 if (fabs(trk3->eta()) >
maxEta_)
continue;
208 if (trk3->pt() <
minPt_)
continue;
210 RecoChargedCandidateCollection::const_iterator trkcand2;
212 std::vector<bool>::iterator isUsedIter2;
214 for ( trkcand2 = trkcands->begin(), isUsedIter2 = isUsedCand.begin() ; trkcand2 != endCandTrk && isUsedIter2 != endIsUsedCand; ++trkcand2,++isUsedIter2) {
216 if (trkcand2==trkcand)
continue;
220 LogDebug(
"HLTDisplacedMumukkFilter") <<
" 4th track: q*pt= " << trk4->charge()*trk4->pt() <<
", eta= " << trk4->eta() <<
", hits= " << trk4->numberOfValidHits();
224 for (
unsigned int itmc=0;itmc<trkMuCands.size();itmc++)
if(trk4==trkMuCands.at(itmc)) skip2=
true;
228 if(*isUsedIter2)
continue;
231 if (fabs(trk4->eta()) >
maxEta_)
continue;
234 if (trk4->pt() <
minPt_)
continue;
237 e1 =
sqrt(trk1->momentum().Mag2()+MuMass2);
238 e2 =
sqrt(trk2->momentum().Mag2()+MuMass2);
239 e3 =
sqrt(trk3->momentum().Mag2()+thirdTrackMass2);
240 e4 =
sqrt(trk4->momentum().Mag2()+fourthTrackMass2);
250 double invmass =
abs(p.mass());
252 LogDebug(
"HLTDisplacedMumukkFilter") <<
" Invmass= " << invmass;
269 vector<TransientTrack> t_tks;
270 t_tks.push_back((*theB).build(&trk1));
271 t_tks.push_back((*theB).build(&trk2));
272 t_tks.push_back((*theB).build(&trk3));
273 t_tks.push_back((*theB).build(&trk4));
275 if (t_tks.size()!=4)
continue;
289 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);
291 float lxy = displacementFromBeamspot.
perp();
292 float lxyerr =
sqrt(err.
rerr(displacementFromBeamspot));
298 Vertex::Point vperp(displacementFromBeamspot.
x(),displacementFromBeamspot.
y(),0.);
301 float cosAlpha = vperp.Dot(pperp)/(vperp.R()*pperp.R());
303 LogDebug(
"HLTDisplacedMumukkFilter") <<
" vertex fit normalised chi2: " << normChi2 <<
", Lxy significance: " << lxy/lxyerr <<
", cosine pointing angle: " << cosAlpha;
306 vertexCollection->push_back(vertex);
312 LogDebug(
"HLTDisplacedMumukkFilter") <<
" Event passed!";
322 vector<RecoChargedCandidateRef> vref;
324 for (
unsigned int i=0;
i<vref.size();
i++) {
329 }
else if (trktmp==trk2) {
331 }
else if (trktmp==trk3) {
333 }
else if (trktmp==trk4) {
336 if (i1done && i2done && i3done && i4done)
break;
365 const bool accept (counter >= 1);
367 LogDebug(
"HLTDisplacedMumukkFilter") <<
" >>>>> Result of HLTDisplacedMumukkFilter is "<< accept <<
", number of muon pairs passing thresholds= " << counter;
369 iEvent.
put(vertexCollection);
391 double dpt = a.
pt() - b.
pt();
397 double deta = a.
eta() - b.
eta();
400 if ((dphi + deta) < eps) {
GlobalError positionError() const
T getParameter(std::string const &) const
double z0() const
z coordinate
void getObjects(Vids &ids, VRphoton &refs) const
various physics-level getters:
Measurement1D transverseImpactParameter() const
const Vector & momentum() const
track momentum vector
const double minLxySignificance_
virtual double pt() const =0
transverse momentum
virtual CachingVertex< 5 > vertex(const std::vector< reco::TransientTrack > &tracks) const
edm::Ref< RecoChargedCandidateCollection > RecoChargedCandidateRef
reference to an object in a collection of RecoChargedCandidate objects
const double maxNormalisedChi2_
std::vector< Vertex > VertexCollection
collection of Vertex objects
bool accept(const edm::Event &event, const edm::TriggerResults &triggerTable, const std::string &triggerPath)
CovarianceMatrix covariance() const
return track covariance matrix
const double thirdTrackMass_
void addObject(int id, const reco::RecoEcalCandidateRef &ref)
setters for L3 collections: (id=physics type, and Ref<C>)
virtual int overlap(const reco::Candidate &, const reco::Candidate &)
double dydz() const
dydz slope
float normalisedChiSquared() const
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
virtual bool hltFilter(edm::Event &, const edm::EventSetup &, trigger::TriggerFilterObjectWithRefs &filterproduct)
GlobalPoint position() const
math::XYZPoint Point
point in the space
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
double dxdz() const
dxdz slope
const Point & vertex() const
reference point on the track. This method is DEPRECATED, please use referencePoint() instead ...
edm::InputTag muCandLabel_
double significance() const
const double minD0Significance_
XYZVectorD XYZVector
spatial vector with cartesian internal representation
T rerr(const GlobalPoint &aPoint) const
T const * product() const
void addCollectionTag(const edm::InputTag &collectionTag)
collectionTags
virtual FreeTrajectoryState initialFreeState(const reco::Track &, const MagneticField *)
const double minCosinePointingAngle_
const double fourthTrackMass_
HLTmmkkFilter(const edm::ParameterSet &)
edm::InputTag trkCandLabel_
double y0() const
y coordinate
int charge() const
track electric charge
edm::InputTag beamSpotTag_
T const * get() const
Returns C++ pointer to the item.
edm::OwnVector< Candidate > CandidateCollection
collection of Candidate objects
math::XYZTLorentzVector LorentzVector
Lorentz vector.
math::PtEtaPhiELorentzVectorF LorentzVector
virtual double phi() const =0
momentum azimuthal angle
virtual double eta() const =0
momentum pseudorapidity
double x0() const
x coordinate