CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
MuonTrackAnalyzer.cc
Go to the documentation of this file.
1 
8 
9 // Collaborating Class Header
14 
16 
20 
22 
24 
28 
31 
32 #include "TFile.h"
33 #include "TH1F.h"
34 #include "TH2F.h"
35 
36 using namespace std;
37 using namespace edm;
38 
41 
42  // service parameters
43  pset = ps;
44  ParameterSet serviceParameters = pset.getParameter<ParameterSet>("ServiceParameters");
45  // the services
46  theService = new MuonServiceProxy(serviceParameters);
47 
48  theSimTracksLabel = edm::InputTag("g4SimHits");
49  theSimTracksToken = consumes<edm::SimTrackContainer>(theSimTracksLabel);
50 
51  theTracksLabel = pset.getParameter<InputTag>("Tracks");
52  theTracksToken = consumes<reco::TrackCollection>(theTracksLabel);
53  doTracksAnalysis = pset.getUntrackedParameter<bool>("DoTracksAnalysis",true);
54 
55  doSeedsAnalysis = pset.getUntrackedParameter<bool>("DoSeedsAnalysis",false);
56  if(doSeedsAnalysis){
57  theSeedsLabel = pset.getParameter<InputTag>("MuonSeed");
58  theSeedsToken = consumes<TrajectorySeedCollection>(theSeedsLabel);
59  ParameterSet updatorPar = pset.getParameter<ParameterSet>("MuonUpdatorAtVertexParameters");
60  theSeedPropagatorName = updatorPar.getParameter<string>("Propagator");
61 
62  theUpdator = new MuonUpdatorAtVertex(updatorPar,theService);
63  }
64 
65  theCSCSimHitLabel = pset.getParameter<InputTag>("CSCSimHit");
66  theDTSimHitLabel = pset.getParameter<InputTag>("DTSimHit");
67  theRPCSimHitLabel = pset.getParameter<InputTag>("RPCSimHit");
68  theCSCSimHitToken = consumes<std::vector<PSimHit> >(theCSCSimHitLabel);
69  theDTSimHitToken = consumes<std::vector<PSimHit> >(theDTSimHitLabel);
70  theRPCSimHitToken = consumes<std::vector<PSimHit> >(theRPCSimHitLabel);
71 
72  theEtaRange = (EtaRange) pset.getParameter<int>("EtaRange");
73 
74  // number of sim tracks
75  numberOfSimTracks=0;
76  // number of reco tracks
77  numberOfRecTracks=0;
78 
80  out = pset.getUntrackedParameter<string>("rootFileName");
81  dirName_ = pset.getUntrackedParameter<std::string>("dirName");
82  subsystemname_ = pset.getUntrackedParameter<std::string>("subSystemFolder", "YourSubsystem") ;
83 }
84 
87  if (theService) delete theService;
88 }
89 
91 
92  //theFile->cd();
93 }
95  edm::Run const & iRun,
96  edm::EventSetup const & /* iSetup */){
97 
98  ibooker.cd();
99 
100 
101  InputTag algo = theTracksLabel;
102  string dirName=dirName_;
103  if (algo.process()!="")
104  dirName+=algo.process()+"_";
105  if(algo.label()!="")
106  dirName+=algo.label()+"_";
107  if(algo.instance()!="")
108  dirName+=algo.instance()+"";
109  if (dirName.find("Tracks")<dirName.length()){
110  dirName.replace(dirName.find("Tracks"),6,"");
111  }
112  std::replace(dirName.begin(), dirName.end(), ':', '_');
113  ibooker.setCurrentFolder(dirName.c_str());
114 
115  //ibooker.goUp();
116  std::string simName = dirName;
117  simName+="/SimTracks";
118  hSimTracks = new HTrackVariables(ibooker,simName.c_str(),"SimTracks");
119 
120  ibooker.cd();
121  ibooker.setCurrentFolder(dirName.c_str());
122 
123  // Create the root file
124  //theFile = new TFile(theRootFileName.c_str(), "RECREATE");
125 
126  if(doSeedsAnalysis){
127  ibooker.cd();
128  ibooker.setCurrentFolder(dirName.c_str());
129  hRecoSeedInner = new HTrack(ibooker,dirName.c_str(),"RecoSeed","Inner");
130  hRecoSeedPCA = new HTrack(ibooker,dirName.c_str(),"RecoSeed","PCA");
131  }
132 
133  if(doTracksAnalysis){
134  ibooker.cd();
135  ibooker.setCurrentFolder(dirName.c_str());
136  hRecoTracksPCA = new HTrack(ibooker,dirName.c_str(),"RecoTracks","PCA");
137  hRecoTracksInner = new HTrack(ibooker,dirName.c_str(),"RecoTracks","Inner");
138  hRecoTracksOuter = new HTrack(ibooker,dirName.c_str(),"RecoTracks","Outer");
139 
140  ibooker.cd();
141  ibooker.setCurrentFolder(dirName.c_str());
142 
143  // General Histos
144 
145 
146  hChi2 = ibooker.book1D("chi2","#chi^2",200,0,200);
147  hChi2VsEta = ibooker.book2D("chi2VsEta","#chi^2 VS #eta",120,-3.,3.,200,0,200);
148 
149  hChi2Norm = ibooker.book1D("chi2Norm","Normalized #chi^2",400,0,100);
150  hChi2NormVsEta = ibooker.book2D("chi2NormVsEta","Normalized #chi^2 VS #eta",120,-3.,3.,400,0,100);
151 
152  hHitsPerTrack = ibooker.book1D("HitsPerTrack","Number of hits per track",55,0,55);
153  hHitsPerTrackVsEta = ibooker.book2D("HitsPerTrackVsEta","Number of hits per track VS #eta",
154  120,-3.,3.,55,0,55);
155 
156  hDof = ibooker.book1D("dof","Number of Degree of Freedom",55,0,55);
157  hDofVsEta = ibooker.book2D("dofVsEta","Number of Degree of Freedom VS #eta",120,-3.,3.,55,0,55);
158 
159  hChi2Prob = ibooker.book1D("chi2Prob","#chi^2 probability",200,0,1);
160  hChi2ProbVsEta = ibooker.book2D("chi2ProbVsEta","#chi^2 probability VS #eta",120,-3.,3.,200,0,1);
161 
162  hNumberOfTracks = ibooker.book1D("NumberOfTracks","Number of reconstructed tracks per event",200,0,200);
163  hNumberOfTracksVsEta = ibooker.book2D("NumberOfTracksVsEta",
164  "Number of reconstructed tracks per event VS #eta",
165  120,-3.,3.,10,0,10);
166 
167  hChargeVsEta = ibooker.book2D("ChargeVsEta","Charge vs #eta gen",120,-3.,3.,4,-2.,2.);
168  hChargeVsPt = ibooker.book2D("ChargeVsPt","Charge vs P_{T} gen",250,0,200,4,-2.,2.);
169  hPtRecVsPtGen = ibooker.book2D("PtRecVsPtGen","P_{T} rec vs P_{T} gen",250,0,200,250,0,200);
170 
171  hDeltaPtVsEta = ibooker.book2D("DeltaPtVsEta","#Delta P_{t} vs #eta gen",120,-3.,3.,500,-250.,250.);
172  hDeltaPt_In_Out_VsEta = ibooker.book2D("DeltaPt_In_Out_VsEta_","P^{in}_{t} - P^{out}_{t} vs #eta gen",120,-3.,3.,500,-250.,250.);
173  }
174 
175 }
176 
178  LogInfo("MuonTrackAnalyzer")<< "Number of Sim tracks: " << numberOfSimTracks;
179 
180  LogInfo("MuonTrackAnalyzer") << "Number of Reco tracks: " << numberOfRecTracks;
181 
182 
183  if(doTracksAnalysis){
184  double eff = hRecoTracksPCA->computeEfficiency(hSimTracks,ibooker);
185  LogInfo("MuonTrackAnalyzer") <<" *Track Efficiency* = "<< eff <<"%";
186  }
187 
188  if(doSeedsAnalysis){
189  double eff = hRecoSeedInner->computeEfficiency(hSimTracks,ibooker);
190  LogInfo("MuonTrackAnalyzer")<<" *Seed Efficiency* = "<< eff <<"%";
191  }
192  if ( out.size() != 0 && dbe_ ) dbe_->save(out);
193 }
194 void MuonTrackAnalyzer::analyze(const Event & event, const EventSetup& eventSetup){
195 
196  LogDebug("MuonTrackAnalyzer") << "Run: " << event.id().run() << " Event: " << event.id().event();
197 
198  // Update the services
199  theService->update(eventSetup);
200 
201  Handle<SimTrackContainer> simTracks;
202  event.getByToken(theSimTracksToken,simTracks);
203  fillPlots(event,simTracks);
204 
205 
206  if(doTracksAnalysis)
207  tracksAnalysis(event,eventSetup,simTracks);
208 
209  if(doSeedsAnalysis)
210  seedsAnalysis(event,eventSetup,simTracks);
211 
212 
213 }
214 
215 void MuonTrackAnalyzer::seedsAnalysis(const Event & event, const EventSetup& eventSetup,
216  Handle<SimTrackContainer> simTracks){
217 
219 
220  // Get the RecTrack collection from the event
222  event.getByToken(theSeedsToken, seeds);
223 
224  LogTrace("MuonTrackAnalyzer")<<"Number of reconstructed seeds: " << seeds->size()<<endl;
225 
226  for(TrajectorySeedCollection::const_iterator seed = seeds->begin();
227  seed != seeds->end(); ++seed){
228  TrajectoryStateOnSurface seedTSOS = getSeedTSOS(*seed);
229  pair<SimTrack,double> sim = getSimTrack(seedTSOS,simTracks);
230  fillPlots(seedTSOS, sim.first,
231  hRecoSeedInner, debug);
232 
233  std::pair<bool,FreeTrajectoryState> propSeed =
234  theUpdator->propagateToNominalLine(seedTSOS);
235  if(propSeed.first)
236  fillPlots(propSeed.second, sim.first,
237  hRecoSeedPCA, debug);
238  else
239  LogTrace("MuonTrackAnalyzer")<<"Error in seed propagation"<<endl;
240 
241  }
242 }
243 
244 
245 void MuonTrackAnalyzer::tracksAnalysis(const Event & event, const EventSetup& eventSetup,
246  Handle<SimTrackContainer> simTracks){
248 
249 
250  // Get the RecTrack collection from the event
252  event.getByToken(theTracksToken, tracks);
253 
254  LogTrace("MuonTrackAnalyzer")<<"Reconstructed tracks: " << tracks->size() << endl;
255  hNumberOfTracks->Fill(tracks->size());
256 
257  if(tracks->size()) numberOfRecTracks++;
258 
259  // Loop over the Rec tracks
260  for(reco::TrackCollection::const_iterator t = tracks->begin(); t != tracks->end(); ++t) {
261 
262  reco::TransientTrack track(*t,&*theService->magneticField(),theService->trackingGeometry());
263 
264  TrajectoryStateOnSurface outerTSOS = track.outermostMeasurementState();
265  TrajectoryStateOnSurface innerTSOS = track.innermostMeasurementState();
266  TrajectoryStateOnSurface pcaTSOS = track.impactPointState();
267 
268  pair<SimTrack,double> sim = getSimTrack(pcaTSOS,simTracks);
269  SimTrack simTrack = sim.first;
270  hNumberOfTracksVsEta->Fill(simTrack.momentum().eta(), tracks->size());
271  fillPlots(track,simTrack);
272 
273  LogTrace("MuonTrackAnalyzer") << "State at the outer surface: " << endl;
274  fillPlots(outerTSOS,simTrack,hRecoTracksOuter,debug);
275 
276  LogTrace("MuonTrackAnalyzer") << "State at the inner surface: " << endl;
277  fillPlots(innerTSOS,simTrack,hRecoTracksInner,debug);
278 
279  LogTrace("MuonTrackAnalyzer") << "State at PCA: " << endl;
280  fillPlots(pcaTSOS,simTrack,hRecoTracksPCA,debug);
281 
282  double deltaPt_in_out = innerTSOS.globalMomentum().perp()-outerTSOS.globalMomentum().perp();
283  hDeltaPt_In_Out_VsEta->Fill(simTrack.momentum().eta(),deltaPt_in_out);
284 
285  double deltaPt_pca_sim = pcaTSOS.globalMomentum().perp()-sqrt(simTrack.momentum().Perp2());
286  hDeltaPtVsEta->Fill(simTrack.momentum().eta(),deltaPt_pca_sim);
287 
288  hChargeVsEta->Fill(simTrack.momentum().eta(),pcaTSOS.charge());
289 
290  hChargeVsPt->Fill(sqrt(simTrack.momentum().perp2()),pcaTSOS.charge());
291 
292  hPtRecVsPtGen->Fill(sqrt(simTrack.momentum().perp2()),pcaTSOS.globalMomentum().perp());
293  }
294  LogTrace("MuonTrackAnalyzer")<<"--------------------------------------------"<<endl;
295 }
296 
297 
298 
299 
301 
302  if(!checkMuonSimHitPresence(event,simTracks)) return;
303 
304  // Loop over the Sim tracks
305  SimTrackContainer::const_iterator simTrack;
306  LogTrace("MuonTrackAnalyzer")<<"Simulated tracks: "<<simTracks->size()<<endl;
307 
308  for (simTrack = simTracks->begin(); simTrack != simTracks->end(); ++simTrack)
309  if (abs((*simTrack).type()) == 13) {
310 
311  if( !isInTheAcceptance( (*simTrack).momentum().eta()) ) continue; // FIXME!!
312 
313  numberOfSimTracks++;
314 
315  LogTrace("MuonTrackAnalyzer")<<"Simualted muon:"<<endl;
316  LogTrace("MuonTrackAnalyzer")<<"Sim pT: "<<sqrt((*simTrack).momentum().perp2())<<endl;
317  LogTrace("MuonTrackAnalyzer")<<"Sim Eta: "<<(*simTrack).momentum().eta()<<endl; // FIXME
318 
319  hSimTracks->Fill((*simTrack).momentum().mag(),
320  sqrt((*simTrack).momentum().perp2()),
321  (*simTrack).momentum().eta(),
322  (*simTrack).momentum().phi(),
323  -(*simTrack).type()/ abs((*simTrack).type()) ); // Double FIXME
324  LogTrace("MuonTrackAnalyzer") << "hSimTracks filled" << endl;
325  }
326 
327  LogTrace("MuonTrackAnalyzer") << endl;
328 }
329 
330 
332 
333  LogTrace("MuonTrackAnalyzer")<<"Analizer: New track, chi2: "<<track.chi2()<<" dof: "<<track.ndof()<<endl;
334  hChi2->Fill(track.chi2());
335  hDof->Fill(track.ndof());
336  hChi2Norm->Fill(track.normalizedChi2());
337  hHitsPerTrack->Fill(track.recHitsSize());
338 
339  hChi2Prob->Fill( ChiSquaredProbability(track.chi2(),track.ndof()) );
340 
341  hChi2VsEta->Fill(simTrack.momentum().eta(),track.chi2());
342  hChi2NormVsEta->Fill(simTrack.momentum().eta(),track.normalizedChi2());
343  hChi2ProbVsEta->Fill(simTrack.momentum().eta(),ChiSquaredProbability(track.chi2(),track.ndof()));
344  hHitsPerTrackVsEta->Fill(simTrack.momentum().eta(),track.recHitsSize());
345  hDofVsEta->Fill(simTrack.momentum().eta(),track.ndof());
346 }
347 
348 
351 
352  LogTrace("MuonTrackAnalyzer") << debug.dumpTSOS(recoTSOS)<<endl;
353  histo->Fill(recoTSOS);
354 
355  GlobalVector tsosVect = recoTSOS.globalMomentum();
356  math::XYZVectorD reco(tsosVect.x(), tsosVect.y(), tsosVect.z());
357  double deltaRVal = deltaR<double>(reco.eta(),reco.phi(),
358  simTrack.momentum().eta(),simTrack.momentum().phi());
359  histo->FillDeltaR(deltaRVal);
360 
361  histo->computeResolutionAndPull(recoTSOS,simTrack);
362 }
363 
364 
367 
368  LogTrace("MuonTrackAnalyzer") << debug.dumpFTS(recoFTS)<<endl;
369  histo->Fill(recoFTS);
370 
371  GlobalVector ftsVect = recoFTS.momentum();
372  math::XYZVectorD reco(ftsVect.x(), ftsVect.y(), ftsVect.z());
373  double deltaRVal = deltaR<double>(reco.eta(),reco.phi(),
374  simTrack.momentum().eta(),simTrack.momentum().phi());
375  histo->FillDeltaR(deltaRVal);
376 
377  histo->computeResolutionAndPull(recoFTS,simTrack);
378 }
379 
381  Handle<SimTrackContainer> simTracks){
382 
383 // // Loop over the Sim tracks
384 // SimTrackContainer::const_iterator simTrack;
385 
386 // SimTrack result;
387 // int mu=0;
388 // for (simTrack = simTracks->begin(); simTrack != simTracks->end(); ++simTrack)
389 // if (abs((*simTrack).type()) == 13) {
390 // result = *simTrack;
391 // ++mu;
392 // }
393 
394 // if(mu != 1) LogTrace("MuonTrackAnalyzer") << "WARNING!! more than 1 simulated muon!!" <<endl;
395 // return result;
396 
397 
398  // Loop over the Sim tracks
399  SimTrackContainer::const_iterator simTrack;
400 
402 
403  double bestDeltaR = 10e5;
404  for (simTrack = simTracks->begin(); simTrack != simTracks->end(); ++simTrack){
405  if (abs((*simTrack).type()) != 13) continue;
406 
407  // double newDeltaR = tsos.globalMomentum().basicVector().deltaR(simTrack->momentum().vect());
408  GlobalVector tsosVect = tsos.globalMomentum();
409  math::XYZVectorD vect(tsosVect.x(), tsosVect.y(), tsosVect.z());
410  double newDeltaR = deltaR<double>(vect.eta(),vect.phi(),
411  simTrack->momentum().eta(),simTrack->momentum().phi());
412 
413  if ( newDeltaR < bestDeltaR ) {
414  LogTrace("MuonTrackAnalyzer") << "Matching Track with DeltaR = " << newDeltaR<<endl;
415  bestDeltaR = newDeltaR;
416  result = *simTrack;
417  }
418  }
419  return pair<SimTrack,double>(result,bestDeltaR);
420 }
421 
422 
424  switch(theEtaRange){
425  case all:
426  return ( abs(eta) <= 2.4 ) ? true : false;
427  case barrel:
428  return ( abs(eta) < 1.1 ) ? true : false;
429  case endcap:
430  return ( abs(eta) >= 1.1 && abs(eta) <= 2.4 ) ? true : false;
431  default:
432  {LogTrace("MuonTrackAnalyzer")<<"No correct Eta range selected!! "<<endl; return false;}
433  }
434 }
435 
438 
439  // Get the SimHit collection from the event
440  Handle<PSimHitContainer> dtSimHits;
441  event.getByToken(theDTSimHitToken, dtSimHits);
442 
443 
444  Handle<PSimHitContainer> cscSimHits;
445  event.getByToken(theCSCSimHitToken, cscSimHits);
446 
447  Handle<PSimHitContainer> rpcSimHits;
448  event.getByToken(theRPCSimHitToken, rpcSimHits);
449 
450  map<unsigned int, vector<const PSimHit*> > mapOfMuonSimHits;
451 
452  for(PSimHitContainer::const_iterator simhit = dtSimHits->begin();
453  simhit != dtSimHits->end(); ++simhit) {
454  if (abs(simhit->particleType()) != 13) continue;
455  mapOfMuonSimHits[simhit->trackId()].push_back(&*simhit);
456  }
457 
458  for(PSimHitContainer::const_iterator simhit = cscSimHits->begin();
459  simhit != cscSimHits->end(); ++simhit) {
460  if (abs(simhit->particleType()) != 13) continue;
461  mapOfMuonSimHits[simhit->trackId()].push_back(&*simhit);
462  }
463 
464  for(PSimHitContainer::const_iterator simhit = rpcSimHits->begin();
465  simhit != rpcSimHits->end(); ++simhit) {
466  if (abs(simhit->particleType()) != 13) continue;
467  mapOfMuonSimHits[simhit->trackId()].push_back(&*simhit);
468  }
469 
470  bool presence = false;
471 
472  for (SimTrackContainer::const_iterator simTrack = simTracks->begin();
473  simTrack != simTracks->end(); ++simTrack){
474 
475  if (abs(simTrack->type()) != 13) continue;
476 
477  map<unsigned int, vector<const PSimHit*> >::const_iterator mapIterator =
478  mapOfMuonSimHits.find(simTrack->trackId());
479 
480  if (mapIterator != mapOfMuonSimHits.end())
481  presence = true;
482  }
483 
484  return presence;
485 }
486 
488 
489  // Get the Trajectory State on Det (persistent version of a TSOS) from the seed
490  PTrajectoryStateOnDet pTSOD = seed.startingState();
491 
492  // Transform it in a TrajectoryStateOnSurface
493 
494 
495  DetId seedDetId(pTSOD.detId());
496 
497  const GeomDet* gdet = theService->trackingGeometry()->idToDet( seedDetId );
498 
499  TrajectoryStateOnSurface initialState = trajectoryStateTransform::transientState(pTSOD, &(gdet->surface()), &*theService->magneticField());
500 
501  // Get the layer on which the seed relies
502  const DetLayer *initialLayer = theService->detLayerGeometry()->idToLayer( seedDetId );
503 
505 
506  // ask for compatible layers
507  vector<const DetLayer*> detLayers;
508  detLayers = theService->muonNavigationSchool()->compatibleLayers(*initialLayer, *initialState.freeState(),detLayerOrder);
509 
510  TrajectoryStateOnSurface result = initialState;
511  if(detLayers.size()){
512  const DetLayer* finalLayer = detLayers.back();
513  const TrajectoryStateOnSurface propagatedState = theService->propagator(theSeedPropagatorName)->propagate(initialState, finalLayer->surface());
514  if(propagatedState.isValid())
515  result = propagatedState;
516  }
517 
518  return result;
519 }
#define LogDebug(id)
virtual void beginJob()
T getParameter(std::string const &) const
virtual const BoundSurface & surface() const =0
The surface of the GeometricSearchDet.
void computeResolutionAndPull(TrajectoryStateOnSurface &vtx, SimTrack &simTrack)
Definition: HTrack.cc:146
T perp() const
Definition: PV3DBase.h:72
virtual ~MuonTrackAnalyzer()
Destructor.
std::pair< SimTrack, double > getSimTrack(TrajectoryStateOnSurface &tsos, edm::Handle< edm::SimTrackContainer > simTracks)
bool checkMuonSimHitPresence(const edm::Event &event, edm::Handle< edm::SimTrackContainer > simTracks)
void cd(void)
Definition: DQMStore.cc:268
T y() const
Definition: PV3DBase.h:63
size_t recHitsSize() const
number of RecHits
PropagationDirection
TrajectoryStateOnSurface getSeedTSOS(const TrajectorySeed &seed)
void seedsAnalysis(const edm::Event &event, const edm::EventSetup &eventSetup, edm::Handle< edm::SimTrackContainer > simTracks)
Definition: sim.h:19
double chi2() const
chi-squared of the fit
MuonTrackAnalyzer(const edm::ParameterSet &pset)
Constructor.
tuple result
Definition: mps_fire.py:84
std::string dumpFTS(const FreeTrajectoryState &fts) const
std::string dumpTSOS(const TrajectoryStateOnSurface &tsos) const
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double > > XYZVectorD
spatial vector with cartesian internal representation
Definition: Vector3D.h:8
virtual void endRun(DQMStore::IBooker &ibooker)
T sqrt(T t)
Definition: SSEVec.h:18
bool isInTheAcceptance(double eta)
FreeTrajectoryState const * freeState(bool withErrors=true) const
T z() const
Definition: PV3DBase.h:64
MonitorElement * book1D(Args &&...args)
Definition: DQMStore.h:115
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
float ChiSquaredProbability(double chiSquared, double nrDOF)
unsigned int detId() const
TH1F * hChi2
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
void Fill(TrajectoryStateOnSurface &)
Definition: HTrack.cc:123
GlobalVector momentum() const
#define LogTrace(id)
DQMStore * dbe_
Definition: DetId.h:18
PTrajectoryStateOnDet const & startingState() const
#define debug
Definition: HDRShower.cc:19
void setCurrentFolder(const std::string &fullpath)
Definition: DQMStore.cc:276
TrajectoryStateOnSurface transientState(const PTrajectoryStateOnDet &ts, const Surface *surface, const MagneticField *field)
MonitorElement * book2D(Args &&...args)
Definition: DQMStore.h:133
tuple tracks
Definition: testEve_cfg.py:39
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
double normalizedChi2() const
chi-squared divided by n.d.o.f.
std::string const & label() const
Definition: InputTag.h:36
double ndof() const
number of degrees of freedom of the fit
std::string const & process() const
Definition: InputTag.h:40
void tracksAnalysis(const edm::Event &event, const edm::EventSetup &eventSetup, edm::Handle< edm::SimTrackContainer > simTracks)
GlobalVector globalMomentum() const
void analyze(const edm::Event &event, const edm::EventSetup &eventSetup)
const math::XYZTLorentzVectorD & momentum() const
Definition: CoreSimTrack.h:22
void FillDeltaR(double)
Definition: HTrack.cc:136
T x() const
Definition: PV3DBase.h:62
Definition: HTrack.h:14
std::string const & instance() const
Definition: InputTag.h:37
void fillPlots(const edm::Event &event, edm::Handle< edm::SimTrackContainer > &simTracks)
Definition: Run.h:43