CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
CombinedSVComputerV2.cc
Go to the documentation of this file.
1 #include <iostream>
2 #include <cstddef>
3 #include <string>
4 #include <cmath>
5 #include <vector>
6 
7 #include <Math/VectorUtil.h>
8 
11 
26 
28 
34 
36 
37 
38 using namespace reco;
39 
42 };
43 
44 #define range_for(i, x) \
45  for(int i = (x).begin; i != (x).end; i += (x).increment)
46 
48 {
49  edm::ParameterSet psetCopy(pset);
50  psetCopy.addParameter<double>("jetDeltaRMax", 99999.0);
51  return psetCopy;
52 }
53 
55  trackFlip(params.getParameter<bool>("trackFlip")),
56  vertexFlip(params.getParameter<bool>("vertexFlip")),
57  charmCut(params.getParameter<double>("charmCut")),
58  sortCriterium(TrackSorting::getCriterium(params.getParameter<std::string>("trackSort"))),
59  trackSelector(params.getParameter<edm::ParameterSet>("trackSelection")),
60  trackNoDeltaRSelector(dropDeltaR(params.getParameter<edm::ParameterSet>("trackSelection"))),
61  trackPseudoSelector(params.getParameter<edm::ParameterSet>("trackPseudoSelection")),
62  pseudoMultiplicityMin(params.getParameter<unsigned int>("pseudoMultiplicityMin")),
63  trackMultiplicityMin(params.getParameter<unsigned int>("trackMultiplicityMin")),
64  minTrackWeight(params.getParameter<double>("minimumTrackWeight")),
65  useTrackWeights(params.getParameter<bool>("useTrackWeights")),
66  vertexMassCorrection(params.getParameter<bool>("correctVertexMass")),
67  pseudoVertexV0Filter(params.getParameter<edm::ParameterSet>("pseudoVertexV0Filter")),
68  trackPairV0Filter(params.getParameter<edm::ParameterSet>("trackPairV0Filter"))
69 {
70 }
71 
72 inline double CombinedSVComputerV2::flipValue(double value, bool vertex) const
73 {
74  return (vertex ? vertexFlip : trackFlip) ? -value : value;
75 }
76 
78  int size, bool vertex) const
79 {
80  IterationRange range;
81  if (vertex ? vertexFlip : trackFlip) {
82  range.begin = size - 1;
83  range.end = -1;
84  range.increment = -1;
85  } else {
86  range.begin = 0;
87  range.end = size;
88  range.increment = +1;
89  }
90 
91  return range;
92 }
93 
97  const reco::Jet &jet,
98  const GlobalPoint &pv) const
99 {
101  trackIPTagInfo.selectedTracks();
102  const std::vector<TrackIPTagInfo::TrackIPData> &ipData =
103  trackIPTagInfo.impactParameterData();
104  std::vector<std::size_t> indices = trackIPTagInfo.sortedIndexes(sort);
105 
106  IterationRange range = flipIterate(indices.size(), false);
107  TrackKinematics kin;
108  range_for(i, range) {
109  std::size_t idx = indices[i];
110  const TrackIPTagInfo::TrackIPData &data = ipData[idx];
111  const Track &track = *tracks[idx];
112 
113  if (!trackNoDeltaRSelector(track, data, jet, pv))
114  continue;
115 
116  kin.add(track);
117  if (kin.vectorSum().M() > charmCut)
118  return data;
119  }
120 
121  static const TrackIPTagInfo::TrackIPData dummy = {
122  GlobalPoint(),
123  GlobalPoint(),
124  Measurement1D(-1.0, 1.0),
125  Measurement1D(-1.0, 1.0),
126  Measurement1D(-1.0, 1.0),
127  Measurement1D(-1.0, 1.0),
128  0.
129  };
130  return dummy;
131 }
132 
133 static double etaRel(const math::XYZVector &dir, const math::XYZVector &track)
134 {
135  double momPar = dir.Dot(track);
136  double energy = std::sqrt(track.Mag2() + ROOT::Math::Square(ParticleMasses::piPlus));
137 
138  return 0.5 * std::log((energy + momPar) / (energy - momPar));
139 }
140 
143  const SecondaryVertexTagInfo &svInfo) const
144 {
145  using namespace ROOT::Math;
146 
147  edm::RefToBase<Jet> jet = ipInfo.jet();
148 
149  math::XYZVector jetDir = jet->momentum().Unit();
150  bool havePv = ipInfo.primaryVertex().isNonnull();
151  GlobalPoint pv;
152  if (havePv)
153  pv = GlobalPoint(ipInfo.primaryVertex()->x(), ipInfo.primaryVertex()->y(), ipInfo.primaryVertex()->z());
154 
156 
157  TaggingVariableList vars;
158 
159  vars.insert(btau::jetPt, jet->pt(), true);
160  vars.insert(btau::jetEta, jet->eta(), true);
161 
162  if (ipInfo.selectedTracks().size() < trackMultiplicityMin)
163  return vars;
164 
165  vars.insert(btau::jetNTracks, ipInfo.selectedTracks().size(), true);
166 
167  TrackKinematics allKinematics;
168  TrackKinematics vertexKinematics;
169  TrackKinematics trackJetKinematics;
170 
171  double vtx_track_ptSum= 0.;
172  double vtx_track_ESum= 0.;
173  double jet_track_ESum= 0.;
174 
175  int vtx = -1;
176  unsigned int numberofvertextracks = 0;
177 
178  //IF THERE ARE SECONDARY VERTICES THE JET FALLS IN THE RECOVERTEX CATEGORY
179  IterationRange range = flipIterate(svInfo.nVertices(), true);
180  range_for(i, range) {
181  if (vtx < 0) vtx = i; //RecoVertex category (vtx=0) if we enter at least one time in this loop!
182 
183  numberofvertextracks = numberofvertextracks + (svInfo.secondaryVertex(i)).nTracks();
184 
185  const Vertex &vertex = svInfo.secondaryVertex(i);
186  bool hasRefittedTracks = vertex.hasRefittedTracks();
187  for(reco::Vertex::trackRef_iterator track = vertex.tracks_begin(); track != vertex.tracks_end(); track++) {
188  double w = vertex.trackWeight(*track);
189  if (w < minTrackWeight)
190  continue;
191  if (hasRefittedTracks) {
192  Track actualTrack = vertex.refittedTrack(*track);
193  vars.insert(btau::trackEtaRel, etaRel(jetDir,actualTrack.momentum()), true);
194  vertexKinematics.add(actualTrack, w);
195  if(i==0)
196  {
197  math::XYZVector vtx_trackMom = actualTrack.momentum();
198  vtx_track_ptSum += std::sqrt(std::pow(vtx_trackMom.X(),2) + std::pow(vtx_trackMom.Y(),2));
199  vtx_track_ESum += std::sqrt(vtx_trackMom.Mag2() + ROOT::Math::Square(ParticleMasses::piPlus));
200  }
201  } else { //THIS ONE IS TAKEN...
202  vars.insert(btau::trackEtaRel, etaRel(jetDir,(*track)->momentum()), true);
203  vertexKinematics.add(**track, w);
204  if(i==0) // calculate this only for the first vertex
205  {
206  math::XYZVector vtx_trackMom = (*track)->momentum();
207  vtx_track_ptSum += std::sqrt(std::pow(vtx_trackMom.X(),2) + std::pow(vtx_trackMom.Y(),2));
208  vtx_track_ESum += std::sqrt(vtx_trackMom.Mag2() + std::pow(ParticleMasses::piPlus,2));
209  }
210  }
211  }
212  }
213 
214  if (vtx >= 0) {
215  vtxType = btag::Vertices::RecoVertex;
216  vars.insert(btau::flightDistance2dVal,flipValue(svInfo.flightDistance(vtx, true).value(),true),true);
217  vars.insert(btau::flightDistance2dSig,flipValue(svInfo.flightDistance(vtx, true).significance(),true),true);
218  vars.insert(btau::flightDistance3dVal,flipValue(svInfo.flightDistance(vtx, false).value(),true),true);
219  vars.insert(btau::flightDistance3dSig,flipValue(svInfo.flightDistance(vtx, false).significance(),true),true);
220  vars.insert(btau::vertexJetDeltaR,Geom::deltaR(svInfo.flightDirection(vtx), jetDir),true);
221  vars.insert(btau::jetNSecondaryVertices, svInfo.nVertices(), true);
222  vars.insert(btau::vertexNTracks, numberofvertextracks, true);
223  vars.insert(btau::vertexFitProb,(svInfo.secondaryVertex(vtx)).normalizedChi2(), true);
224  }
225 
226 
227  //NOW ATTEMPT TO RECONSTRUCT PSEUDOVERTEX!!!
228  std::vector<std::size_t> indices = ipInfo.sortedIndexes(sortCriterium);
229  const std::vector<TrackIPTagInfo::TrackIPData> &ipData = ipInfo.impactParameterData();
231 
232  std::vector<TrackRef> pseudoVertexTracks;
233 
234  range = flipIterate(indices.size(), false);
235  range_for(i, range) {
236  std::size_t idx = indices[i];
237  const TrackIPTagInfo::TrackIPData &data = ipData[idx];
238  const TrackRef &trackRef = tracks[idx];
239  const Track &track = *trackRef;
240 
241  // if no vertex was reconstructed, attempt pseudo vertex
242  if (vtxType == btag::Vertices::NoVertex && trackPseudoSelector(track, data, *jet, pv)) {
243  pseudoVertexTracks.push_back(trackRef);
244  vertexKinematics.add(track);
245  }
246  }
247 
248  if (vtxType == btag::Vertices::NoVertex && vertexKinematics.numberOfTracks() >= pseudoMultiplicityMin && pseudoVertexV0Filter(pseudoVertexTracks))
249  {
251  for(std::vector<TrackRef>::const_iterator track = pseudoVertexTracks.begin(); track != pseudoVertexTracks.end(); ++track)
252  {
253  vars.insert(btau::trackEtaRel, etaRel(jetDir, (*track)->momentum()), true);
254  math::XYZVector vtx_trackMom = (*track)->momentum();
255  vtx_track_ptSum += std::sqrt(std::pow(vtx_trackMom.X(),2) + std::pow(vtx_trackMom.Y(),2));
256  vtx_track_ESum += std::sqrt(vtx_trackMom.Mag2() + std::pow(ParticleMasses::piPlus,2));
257  }
258  }
259 
260  vars.insert(btau::vertexCategory, vtxType, true);
261 
262 
263 
264  // do a tighter track selection to fill the variable plots...
265  TrackRef trackPairV0Test[2];
266  range = flipIterate(indices.size(), false);
267  range_for(i, range) {
268 
269  std::size_t idx = indices[i];
270  const TrackIPTagInfo::TrackIPData &data = ipData[idx];
271  const TrackRef &trackRef = tracks[idx];
272  const Track &track = *trackRef;
273 
274  jet_track_ESum += std::sqrt((track.momentum()).Mag2() + std::pow(ParticleMasses::piPlus,2));
275  // add track to kinematics for all tracks in jet
276  //allKinematics.add(track); //would make more sense for some variables, e.g. vertexEnergyRatio nicely between 0 and 1, but not necessarily the best option for the discriminating power...
277 
278  // filter tracks -> this track selection can be more tight (used to fill the track related variables...)
279  if (!trackSelector(track, data, *jet, pv))
280  continue;
281 
282  // add track to kinematics for all tracks in jet
283  allKinematics.add(track);
284 
285  // check against all other tracks for K0 track pairs setting the track mass to pi+
286  trackPairV0Test[0] = tracks[idx];
287  bool ok = true;
288  range_for(j, range) {
289  if (i == j)
290  continue;
291 
292  std::size_t pairIdx = indices[j];
293  const TrackIPTagInfo::TrackIPData &pairTrackData = ipData[pairIdx];
294  const TrackRef &pairTrackRef = tracks[pairIdx];
295  const Track &pairTrack = *pairTrackRef;
296 
297  if (!trackSelector(pairTrack, pairTrackData, *jet, pv))
298  continue;
299 
300  trackPairV0Test[1] = pairTrackRef;
301  if (!trackPairV0Filter(trackPairV0Test, 2)) { //V0 filter is more tight (0.03) than the one used for the RecoVertex and PseudoVertex tracks (0.05)
302  ok = false;
303  break;
304  }
305  }
306 
307  if (!ok)
308  continue;
309 
310  trackJetKinematics.add(track);
311 
312 
313  // add track variables
314  math::XYZVector trackMom = track.momentum();
315  double trackMag = std::sqrt(trackMom.Mag2());
316 
317  vars.insert(btau::trackSip3dVal, flipValue(data.ip3d.value(), false), true);
318  vars.insert(btau::trackSip3dSig, flipValue(data.ip3d.significance(), false), true);
319  vars.insert(btau::trackSip2dVal, flipValue(data.ip2d.value(), false), true);
320  vars.insert(btau::trackSip2dSig, flipValue(data.ip2d.significance(), false), true);
321  vars.insert(btau::trackJetDistVal, data.distanceToJetAxis.value(), true);
322  vars.insert(btau::trackDecayLenVal, havePv ? (data.closestToJetAxis - pv).mag() : -1.0, true);
323 
324  vars.insert(btau::trackPtRel, VectorUtil::Perp(trackMom, jetDir), true);
325  vars.insert(btau::trackPPar, jetDir.Dot(trackMom), true);
326  vars.insert(btau::trackDeltaR, VectorUtil::DeltaR(trackMom, jetDir), true);
327  vars.insert(btau::trackPtRatio, VectorUtil::Perp(trackMom, jetDir) / trackMag, true);
328  vars.insert(btau::trackPParRatio, jetDir.Dot(trackMom) / trackMag, true);
329  }
330 
331  vars.insert(btau::trackJetPt, trackJetKinematics.vectorSum().Pt(), true);
332 
333 
334  vars.insert(btau::trackSumJetDeltaR,VectorUtil::DeltaR(allKinematics.vectorSum(), jetDir), true);
335  vars.insert(btau::trackSumJetEtRatio,allKinematics.vectorSum().Et() / ipInfo.jet()->et(), true);
336  vars.insert(btau::trackSip3dSigAboveCharm, flipValue(threshTrack(ipInfo, TrackIPTagInfo::IP3DSig, *jet, pv).ip3d.significance(),false),true);
337  vars.insert(btau::trackSip3dValAboveCharm, flipValue(threshTrack(ipInfo, TrackIPTagInfo::IP3DSig, *jet, pv).ip3d.value(),false),true);
338  vars.insert(btau::trackSip2dSigAboveCharm, flipValue(threshTrack(ipInfo, TrackIPTagInfo::IP2DSig, *jet, pv).ip2d.significance(),false),true);
339  vars.insert(btau::trackSip2dValAboveCharm, flipValue(threshTrack(ipInfo, TrackIPTagInfo::IP2DSig, *jet, pv).ip2d.value(),false),true);
340 
341  if (vtxType != btag::Vertices::NoVertex) {
342  math::XYZTLorentzVector allSum = useTrackWeights ? allKinematics.weightedVectorSum() : allKinematics.vectorSum();
343  math::XYZTLorentzVector vertexSum = useTrackWeights ? vertexKinematics.weightedVectorSum() : vertexKinematics.vectorSum();
344 
345  if (vtxType != btag::Vertices::RecoVertex) {
346  vars.insert(btau::vertexNTracks,vertexKinematics.numberOfTracks(), true);
347  vars.insert(btau::vertexJetDeltaR,VectorUtil::DeltaR(vertexSum, jetDir), true);
348  }
349 
350  double vertexMass = vertexSum.M();
351  double varPi = 0;
352  double varB = 0;
353  if (vtxType == btag::Vertices::RecoVertex) {
355  {
356  GlobalVector dir = svInfo.flightDirection(vtx);
357  double vertexPt2 = math::XYZVector(dir.x(), dir.y(), dir.z()).Cross(vertexSum).Mag2() / dir.mag2();
358  vertexMass = std::sqrt(vertexMass * vertexMass + vertexPt2) + std::sqrt(vertexPt2);
359  }
360  }
361  vars.insert(btau::vertexMass, vertexMass, true);
362  varPi = (vertexMass/5.2794) * (vtx_track_ESum /jet_track_ESum); //5.2794 should be average B meson mass of PDG! CHECK!!!
363  vars.insert(btau::massVertexEnergyFraction, varPi, true);
364  varB = (std::sqrt(5.2794) * vtx_track_ptSum) / ( vertexMass * std::sqrt(jet->pt()));
365  vars.insert(btau::vertexBoostOverSqrtJetPt,varB*varB/(varB*varB + 10.), true);
366 
367  if (allKinematics.numberOfTracks())
368  vars.insert(btau::vertexEnergyRatio, vertexSum.E() / allSum.E(), true);
369  else
370  vars.insert(btau::vertexEnergyRatio, 1, true);
371  }
372 
373  reco::PFJet const * pfJet = dynamic_cast<reco::PFJet const *>( &* jet ) ;
374  pat::Jet const * patJet = dynamic_cast<pat::Jet const *>( &* jet ) ;
375  if ( pfJet != 0 ) {
376  vars.insert(btau::chargedHadronEnergyFraction,pfJet->chargedHadronEnergyFraction(), true);
377  vars.insert(btau::neutralHadronEnergyFraction,pfJet->neutralHadronEnergyFraction(), true);
378  vars.insert(btau::photonEnergyFraction,pfJet->photonEnergyFraction(), true);
379  vars.insert(btau::electronEnergyFraction,pfJet->electronEnergyFraction(), true);
380  vars.insert(btau::muonEnergyFraction,pfJet->muonEnergyFraction(), true);
381  vars.insert(btau::chargedHadronMultiplicity,pfJet->chargedHadronMultiplicity(), true);
382  vars.insert(btau::neutralHadronMultiplicity,pfJet->neutralHadronMultiplicity(), true);
383  vars.insert(btau::photonMultiplicity,pfJet->photonMultiplicity(), true);
384  vars.insert(btau::electronMultiplicity,pfJet->electronMultiplicity(), true);
385  vars.insert(btau::muonMultiplicity,pfJet->muonMultiplicity(), true);
386  vars.insert(btau::hadronMultiplicity,pfJet->chargedHadronMultiplicity()+pfJet->neutralHadronMultiplicity(), true);
387  vars.insert(btau::hadronPhotonMultiplicity,pfJet->chargedHadronMultiplicity()+pfJet->neutralHadronMultiplicity()+pfJet->photonMultiplicity(), true);
388  vars.insert(btau::totalMultiplicity,pfJet->chargedHadronMultiplicity()+pfJet->neutralHadronMultiplicity()+pfJet->photonMultiplicity()+pfJet->electronMultiplicity()+pfJet->muonMultiplicity(), true);
389 
390  }
391  else if( patJet != 0)
392  {
393  vars.insert(btau::chargedHadronEnergyFraction,patJet->chargedHadronEnergyFraction(), true);
394  vars.insert(btau::neutralHadronEnergyFraction,patJet->neutralHadronEnergyFraction(), true);
395  vars.insert(btau::photonEnergyFraction,patJet->photonEnergyFraction(), true);
396  vars.insert(btau::electronEnergyFraction,patJet->electronEnergyFraction(), true);
397  vars.insert(btau::muonEnergyFraction,patJet->muonEnergyFraction(), true);
398  vars.insert(btau::chargedHadronMultiplicity,patJet->chargedHadronMultiplicity(), true);
399  vars.insert(btau::neutralHadronMultiplicity,patJet->neutralHadronMultiplicity(), true);
400  vars.insert(btau::photonMultiplicity,patJet->photonMultiplicity(), true);
401  vars.insert(btau::electronMultiplicity,patJet->electronMultiplicity(), true);
402  vars.insert(btau::muonMultiplicity,patJet->muonMultiplicity(), true);
403  vars.insert(btau::hadronMultiplicity,patJet->chargedHadronMultiplicity()+patJet->neutralHadronMultiplicity(), true);
404  vars.insert(btau::hadronPhotonMultiplicity,patJet->chargedHadronMultiplicity()+patJet->neutralHadronMultiplicity()+patJet->photonMultiplicity(), true);
405  vars.insert(btau::totalMultiplicity,patJet->chargedHadronMultiplicity()+patJet->neutralHadronMultiplicity()+patJet->photonMultiplicity()+patJet->electronMultiplicity()+patJet->muonMultiplicity(), true);
406 
407  }
408  else
409  {
410  throw cms::Exception("InvalidConfiguration") << "From CombinedSVComputerV2::operator: reco::PFJet OR pat::Jet are required by this module" << std::endl;
411  }
412 
413  vars.finalize();
414 
415  return vars;
416 }
int i
Definition: DBlmapReader.cc:9
T mag2() const
Definition: PV3DBase.h:66
const Vector & momentum() const
track momentum vector
Definition: TrackBase.h:148
const reco::TrackIPTagInfo::TrackIPData & threshTrack(const reco::TrackIPTagInfo &trackIPTagInfo, const reco::TrackIPTagInfo::SortCriteria sort, const reco::Jet &jet, const GlobalPoint &pv) const
reco::TrackIPTagInfo::SortCriteria getCriterium(const std::string &name)
Definition: TrackSorting.cc:11
const double w
Definition: UKUtility.cc:23
Measurement1D flightDistance(unsigned int index, bool in2d=false) const
trackRef_iterator tracks_end() const
last iterator over tracks
Definition: Vertex.cc:44
virtual double et() const
transverse energy
const edm::Ref< VertexCollection > & primaryVertex() const
Track refittedTrack(const TrackBaseRef &track) const
Base class for all types of Jets.
Definition: Jet.h:20
bool hasRefittedTracks() const
Checks whether refitted tracks are stored.
Definition: Vertex.h:134
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
T y() const
Definition: PV3DBase.h:63
double flipValue(double value, bool vertex) const
Jets made from PFObjects.
Definition: PFJet.h:21
reco::V0Filter pseudoVertexV0Filter
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:29
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:250
const GlobalVector & flightDirection(unsigned int index) const
reco::V0Filter trackPairV0Filter
reco::TrackSelector trackPseudoSelector
const Vertex & secondaryVertex(unsigned int index) const
float trackWeight(const TrackBaseRef &r) const
returns the weight with which a Track has contributed to the vertex-fit.
T sqrt(T t)
Definition: SSEVec.h:48
void addParameter(std::string const &name, T const &value)
Definition: ParameterSet.h:142
T z() const
Definition: PV3DBase.h:64
int j
Definition: DBlmapReader.cc:9
reco::TrackSelector trackNoDeltaRSelector
reco::TaggingVariableList operator()(const reco::TrackIPTagInfo &ipInfo, const reco::SecondaryVertexTagInfo &svInfo) const
#define end
Definition: vmac.h:37
static double etaRel(const math::XYZVector &dir, const math::XYZVector &track)
virtual edm::RefToBase< Jet > jet(void) const
returns a polymorphic reference to the tagged jet
Definition: JTATagInfo.h:20
double deltaR(double eta1, double eta2, double phi1, double phi2)
Definition: TreeUtility.cc:17
std::vector< size_t > sortedIndexes(SortCriteria mode=IP3DSig) const
double significance() const
Definition: Measurement1D.h:32
tuple tracks
Definition: testEve_cfg.py:39
XYZVectorD XYZVector
spatial vector with cartesian internal representation
Definition: Vector3D.h:30
IterationRange flipIterate(int size, bool vertex) const
tuple idx
DEBUGGING if hasattr(process,&quot;trackMonIterativeTracking2012&quot;): print &quot;trackMonIterativeTracking2012 D...
reco::TrackSelector trackSelector
static edm::ParameterSet dropDeltaR(const edm::ParameterSet &pset)
Analysis-level calorimeter jet class.
Definition: Jet.h:73
double value() const
Definition: Measurement1D.h:28
unsigned int pseudoMultiplicityMin
#define begin
Definition: vmac.h:30
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
CombinedSVComputerV2(const edm::ParameterSet &params)
const std::vector< TrackIPData > & impactParameterData() const
unsigned int trackMultiplicityMin
std::vector< TrackBaseRef >::const_iterator trackRef_iterator
The iteratator for the vector&lt;TrackRef&gt;
Definition: Vertex.h:37
size_type size() const
Size of the RefVector.
Definition: RefVector.h:89
reco::TrackIPTagInfo::SortCriteria sortCriterium
dbl *** dir
Definition: mlp_gen.cc:35
trackRef_iterator tracks_begin() const
first iterator over tracks
Definition: Vertex.cc:39
#define range_for(i, x)
const edm::RefVector< TrackCollection > & selectedTracks() const
T x() const
Definition: PV3DBase.h:62
tuple size
Write out results.
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40
void insert(const TaggingVariable &variable, bool delayed=false)
tuple trackSelector
Tracks selection.
Definition: valSkim_cff.py:4
tuple useTrackWeights
Definition: alignBH_cfg.py:24