CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
TrackerSeedValidator.cc
Go to the documentation of this file.
1 /*
2 #include "Validation/RecoTrack/interface/TrackerSeedValidator.h"
3 #include "DQMServices/ClientConfig/interface/FitSlicesYTool.h"
4 
5 #include "FWCore/Framework/interface/MakerMacros.h"
6 
7 #include "DataFormats/TrajectorySeed/interface/TrajectorySeedCollection.h"
8 #include "SimDataFormats/Track/interface/SimTrackContainer.h"
9 #include "SimDataFormats/Vertex/interface/SimVertexContainer.h"
10 #include "SimTracker/TrackAssociation/interface/TrackAssociatorByChi2.h"
11 #include "SimTracker/TrackAssociation/interface/QuickTrackAssociatorByHits.h"
12 #include "SimTracker/TrackerHitAssociation/interface/TrackerHitAssociator.h"
13 #include "SimTracker/Records/interface/TrackAssociatorRecord.h"
14 
15 #include "SimDataFormats/TrackingAnalysis/interface/TrackingParticle.h"
16 
17 #include "FWCore/MessageLogger/interface/MessageLogger.h"
18 #include "TrackingTools/TrajectoryState/interface/FreeTrajectoryState.h"
19 #include "TrackingTools/PatternTools/interface/TSCBLBuilderNoMaterial.h"
20 #include "TrackingTools/TrajectoryState/interface/PerigeeConversions.h"
21 #include <TF1.h>
22 #include "TrackingTools/Records/interface/TransientRecHitRecord.h"
23 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateTransform.h"
24 
25 using namespace std;
26 using namespace edm;
27 
28 void TrackerSeedValidator::beginRun(edm::Run const&, edm::EventSetup const& setup) {
29  setup.get<IdealMagneticFieldRecord>().get(theMF);
30  setup.get<TransientRecHitRecord>().get(builderName,theTTRHBuilder);
31 
32  int j=0;
33  for (unsigned int ww=0;ww<associators.size();ww++){
34  for (unsigned int www=0;www<label.size();www++){
35 
36  dbe_->cd();
37  InputTag algo = label[www];
38  string dirName="Tracking/Seed/";
39  if (algo.process()!="")
40  dirName+=algo.process()+"_";
41  if(algo.label()!="")
42  dirName+=algo.label()+"_";
43  if(algo.instance()!="")
44  dirName+=algo.instance()+"_";
45  // if (dirName.find("Seeds")<dirName.length()){
46  // dirName.replace(dirName.find("Seeds"),6,"");
47  // }
48  string assoc= associators[ww];
49  if (assoc.find("Track")<assoc.length()){
50  assoc.replace(assoc.find("Track"),5,"");
51  }
52  dirName+=assoc;
53  dbe_->setCurrentFolder(dirName.c_str());
54 
55  setUpVectors();
56 
57  dbe_->goUp();
58  string subDirName = dirName + "/simulation";
59  dbe_->setCurrentFolder(subDirName.c_str());
60  h_ptSIM.push_back( dbe_->book1D("ptSIM", "generated p_{t}", 5500, 0, 110 ) );
61  h_etaSIM.push_back( dbe_->book1D("etaSIM", "generated pseudorapidity", 500, -2.5, 2.5 ) );
62  h_tracksSIM.push_back( dbe_->book1D("tracksSIM","number of simluated tracks",100,-0.5,99.5) );
63  h_vertposSIM.push_back( dbe_->book1D("vertposSIM","Transverse position of sim vertices",1000,-0.5,10000.5) );
64 
65  dbe_->cd();
66  dbe_->setCurrentFolder(dirName.c_str());
67  h_tracks.push_back( dbe_->book1D("seeds","number of reconstructed seeds",20,-0.5,19.5) );
68  h_fakes.push_back( dbe_->book1D("fakes","number of fake reco seeds",20,-0.5,19.5) );
69  h_charge.push_back( dbe_->book1D("charge","charge",3,-1.5,1.5) );
70  h_hits.push_back( dbe_->book1D("hits", "number of hits per seed", 30, -0.5, 29.5 ) );
71 
72  h_effic.push_back( dbe_->book1D("effic","efficiency vs #eta",nint,min,max) );
73  h_efficPt.push_back( dbe_->book1D("efficPt","efficiency vs pT",nintpT,minpT,maxpT) );
74  h_fakerate.push_back( dbe_->book1D("fakerate","fake rate vs #eta",nint,min,max) );
75  h_fakeratePt.push_back( dbe_->book1D("fakeratePt","fake rate vs pT",nintpT,minpT,maxpT) );
76  h_effic_vs_hit.push_back( dbe_->book1D("effic_vs_hit","effic vs hit",nintHit,minHit,maxHit) );
77  h_fake_vs_hit.push_back( dbe_->book1D("fakerate_vs_hit","fake rate vs hit",nintHit,minHit,maxHit) );
78 
79  h_recoeta.push_back( dbe_->book1D("num_reco_eta","N of reco seed vs eta",nint,min,max) );
80  h_assoceta.push_back( dbe_->book1D("num_assoc(simToReco)_eta","N of associated seeds (simToReco) vs eta",nint,min,max) );
81  h_assoc2eta.push_back( dbe_->book1D("num_assoc(recoToSim)_eta","N of associated (recoToSim) seeds vs eta",nint,min,max) );
82  h_simuleta.push_back( dbe_->book1D("num_simul_eta","N of simulated tracks vs eta",nint,min,max) );
83  h_recopT.push_back( dbe_->book1D("num_reco_pT","N of reco seed vs pT",nintpT,minpT,maxpT) );
84  h_assocpT.push_back( dbe_->book1D("num_assoc(simToReco)_pT","N of associated seeds (simToReco) vs pT",nintpT,minpT,maxpT) );
85  h_assoc2pT.push_back( dbe_->book1D("num_assoc(recoToSim)_pT","N of associated (recoToSim) seeds vs pT",nintpT,minpT,maxpT) );
86  h_simulpT.push_back( dbe_->book1D("num_simul_pT","N of simulated tracks vs pT",nintpT,minpT,maxpT) );
87 
88  h_eta.push_back( dbe_->book1D("eta", "pseudorapidity residue", 1000, -0.1, 0.1 ) );
89  h_pt.push_back( dbe_->book1D("pullPt", "pull of p_{t}", 100, -10, 10 ) );
90  h_pullTheta.push_back( dbe_->book1D("pullTheta","pull of #theta parameter",250,-25,25) );
91  h_pullPhi.push_back( dbe_->book1D("pullPhi","pull of #phi parameter",250,-25,25) );
92  h_pullDxy.push_back( dbe_->book1D("pullDxy","pull of dxy parameter",250,-25,25) );
93  h_pullDz.push_back( dbe_->book1D("pullDz","pull of dz parameter",250,-25,25) );
94  h_pullQoverp.push_back( dbe_->book1D("pullQoverp","pull of qoverp parameter",250,-25,25) );
95 
96  if (associators[ww]=="quickTrackAssociatorByHits"){
97  h_assocFraction.push_back( dbe_->book1D("assocFraction","fraction of shared hits",200,0,2) );
98  h_assocSharedHit.push_back(dbe_->book1D("assocSharedHit","number of shared hits",20,0,20));
99  }
100 
101  //chi2_vs_nhits.push_back( dbe_->book2D("chi2_vs_nhits","#chi^{2} vs nhits",25,0,25,100,0,10) );
102  nrec_vs_nsim.push_back( dbe_->book2D("nrec_vs_nsim","nrec vs nsim",20,-0.5,19.5,20,-0.5,19.5) );
103 
104  nhits_vs_eta.push_back( dbe_->book2D("nhits_vs_eta","nhits vs eta",nint,min,max,nintHit,minHit,maxHit) );
105  h_hits_eta.push_back( dbe_->bookProfile("hits_eta","mean #hits vs eta",nint,min,max,nintHit,minHit,maxHit) );
106 
107  if(useLogPt){
108  BinLogX(h_efficPt[j]->getTH1F());
109  BinLogX(h_fakeratePt[j]->getTH1F());
110  BinLogX(h_recopT[j]->getTH1F());
111  BinLogX(h_assocpT[j]->getTH1F());
112  BinLogX(h_assoc2pT[j]->getTH1F());
113  BinLogX(h_simulpT[j]->getTH1F());
114  }
115  j++;
116  }
117  }
118  edm::ESHandle<TrackAssociatorBase> theAssociator;
119  for (unsigned int w=0;w<associators.size();w++) {
120  setup.get<TrackAssociatorRecord>().get(associators[w],theAssociator);
121  associator.push_back( theAssociator.product() );
122  }
123 }
124 
125 void TrackerSeedValidator::analyze(const edm::Event& event, const edm::EventSetup& setup){
126 
127  edm::LogInfo("TrackValidator") << "\n====================================================" << "\n"
128  << "Analyzing new event" << "\n"
129  << "====================================================\n" << "\n";
130 
131  edm::Handle<TrackingParticleCollection> TPCollectionHeff ;
132  event.getByLabel(label_tp_effic,TPCollectionHeff);
133  const TrackingParticleCollection tPCeff = *(TPCollectionHeff.product());
134 
135  edm::Handle<TrackingParticleCollection> TPCollectionHfake ;
136  event.getByLabel(label_tp_fake,TPCollectionHfake);
137  const TrackingParticleCollection tPCfake = *(TPCollectionHfake.product());
138 
139  if (tPCeff.size()==0) {edm::LogInfo("TrackValidator") << "TP Collection for efficiency studies has size = 0! Skipping Event." ; return;}
140  if (tPCfake.size()==0) {edm::LogInfo("TrackValidator") << "TP Collection for fake rate studies has size = 0! Skipping Event." ; return;}
141 
142  edm::Handle<reco::BeamSpot> recoBeamSpotHandle;
143  event.getByLabel(bsSrc,recoBeamSpotHandle);
144  reco::BeamSpot bs = *recoBeamSpotHandle;
145 
146  int w=0;
147  for (unsigned int ww=0;ww<associators.size();ww++){
148  for (unsigned int www=0;www<label.size();www++){
149  edm::LogVerbatim("TrackValidator") << "Analyzing "
150  << label[www].process()<<":"
151  << label[www].label()<<":"
152  << label[www].instance()<<" with "
153  << associators[ww].c_str() <<"\n";
154  //
155  //get collections from the event
156  //
157  edm::Handle<edm::View<TrajectorySeed> > seedCollection;
158  event.getByLabel(label[www], seedCollection);
159  if (seedCollection->size()==0) {
160  edm::LogInfo("TrackValidator") << "SeedCollection size = 0!" ;
161  continue;
162  }
163 
164  //associate seeds
165  LogTrace("TrackValidator") << "Calling associateRecoToSim method" << "\n";
166  reco::RecoToSimCollectionSeed recSimColl=associator[ww]->associateRecoToSim(seedCollection,
167  TPCollectionHfake,
168  &event);
169  LogTrace("TrackValidator") << "Calling associateSimToReco method" << "\n";
170  reco::SimToRecoCollectionSeed simRecColl=associator[ww]->associateSimToReco(seedCollection,
171  TPCollectionHeff,
172  &event);
173 
174  //
175  //fill simulation histograms
176  //compute number of seeds per eta interval
177  //
178  edm::LogVerbatim("TrackValidator") << "\n# of TrackingParticles: " << tPCeff.size() << "\n";
179  int ats = 0;
180  int st=0;
181  for (TrackingParticleCollection::size_type i=0; i<tPCeff.size(); i++){
182  TrackingParticleRef tp(TPCollectionHeff, i);
183  if (tp->charge()==0) continue;
184  st++;
185  h_ptSIM[w]->Fill(sqrt(tp->momentum().perp2()));
186  h_etaSIM[w]->Fill(tp->momentum().eta());
187  h_vertposSIM[w]->Fill(sqrt(tp->vertex().perp2()));
188 
189  std::vector<std::pair<edm::RefToBase<TrajectorySeed>, double> > rt;
190  if(simRecColl.find(tp) != simRecColl.end()){
191  rt = simRecColl[tp];
192  if (rt.size()!=0) {
193  ats++;
194  edm::LogVerbatim("TrackValidator") << "TrackingParticle #" << st
195  << " with pt=" << sqrt(tp->momentum().perp2())
196  << " associated with quality:" << rt.begin()->second <<"\n";
197  }
198  }else{
199  edm::LogVerbatim("TrackValidator") << "TrackingParticle #" << st
200  << " with pt=" << sqrt(tp->momentum().perp2())
201  << " NOT associated to any TrajectorySeed" << "\n";
202  }
203  double tpeta=getEta(tp->momentum().eta());
204  for (unsigned int f=0; f<etaintervals[w].size()-1; f++){
205  if (tpeta>etaintervals[w][f]&&
206  tpeta<etaintervals[w][f+1]) {
207  totSIMeta[w][f]++;
208  if (rt.size()!=0) {
209  totASSeta[w][f]++;
210  }
211  }
212  } // END for (unsigned int f=0; f<etaintervals[w].size()-1; f++){
213  double tppt=getPt(sqrt(tp->momentum().perp2()));
214  for (unsigned int f=0; f<pTintervals[w].size()-1; f++){
215  if (tppt>pTintervals[w][f]&&
216  tppt<pTintervals[w][f+1]) {
217  totSIMpT[w][f]++;
218  if (rt.size()!=0) {
219  totASSpT[w][f]++;
220  }
221  }
222  } // END for (unsigned int f=0; f<pTintervals[w].size()-1; f++){
223 
224  totSIM_hit[w][tp->matchedHit()]++;//FIXME
225  if (rt.size()!=0) totASS_hit[w][tp->matchedHit()]++;
226  }
227  if (st!=0) h_tracksSIM[w]->Fill(st);
228 
229 
230  //
231  //fill reconstructed seed histograms
232  //
233  edm::LogVerbatim("TrackValidator") << "\n# of TrajectorySeeds with "
234  << label[www].process()<<":"
235  << label[www].label()<<":"
236  << label[www].instance()
237  << ": " << seedCollection->size() << "\n";
238  int at=0;
239  int rT=0;
240 
241  TSCBLBuilderNoMaterial tscblBuilder;
242  PerigeeConversions tspConverter;
243  for(TrajectorySeedCollection::size_type i=0; i<seedCollection->size(); ++i){
244  edm::RefToBase<TrajectorySeed> seed(seedCollection, i);
245  rT++;
246 
247  //get parameters and errors from the seed state
248  TransientTrackingRecHit::RecHitPointer recHit = theTTRHBuilder->build(&*(seed->recHits().second-1));
249  TrajectoryStateOnSurface state = trajectoryStateTransform::transientState( seed->startingState(), recHit->surface(), theMF.product());
250  TrajectoryStateClosestToBeamLine tsAtClosestApproachSeed = tscblBuilder(*state.freeState(),bs);//as in TrackProducerAlgorithm
251  if(!(tsAtClosestApproachSeed.isValid())){
252  edm::LogVerbatim("SeedValidator")<<"TrajectoryStateClosestToBeamLine not valid";
253  continue;
254  }
255  GlobalPoint vSeed1 = tsAtClosestApproachSeed.trackStateAtPCA().position();
256  GlobalVector pSeed = tsAtClosestApproachSeed.trackStateAtPCA().momentum();
257  GlobalPoint vSeed(vSeed1.x()-bs.x0(),vSeed1.y()-bs.y0(),vSeed1.z()-bs.z0());
258 
259  double etaSeed = state.globalMomentum().eta();
260  double ptSeed = sqrt(state.globalMomentum().perp2());
261  double pmSeed = sqrt(state.globalMomentum().mag2());
262  double pzSeed = state.globalMomentum().z();
263  double numberOfHitsSeed = seed->recHits().second-seed->recHits().first;
264  double qoverpSeed = tsAtClosestApproachSeed.trackStateAtPCA().charge()/pSeed.mag();
265  double thetaSeed = pSeed.theta();
266  double lambdaSeed = M_PI/2-thetaSeed;
267  double phiSeed = pSeed.phi();
268  double dxySeed = (-vSeed.x()*sin(pSeed.phi())+vSeed.y()*cos(pSeed.phi()));
269  double dzSeed = vSeed.z() - (vSeed.x()*pSeed.x()+vSeed.y()*pSeed.y())/pSeed.perp() * pSeed.z()/pSeed.perp();
270 
271  PerigeeTrajectoryError seedPerigeeErrors = tspConverter.ftsToPerigeeError(tsAtClosestApproachSeed.trackStateAtPCA());
272  double qoverpErrorSeed = tsAtClosestApproachSeed.trackStateAtPCA().curvilinearError().matrix().At(0,0);
273  double lambdaErrorSeed = seedPerigeeErrors.thetaError();//=theta error
274  double phiErrorSeed = seedPerigeeErrors.phiError();
275  double dxyErrorSeed = seedPerigeeErrors.transverseImpactParameterError();
276  double dzErrorSeed = seedPerigeeErrors.longitudinalImpactParameterError();
277  double ptErrorSeed = (state.charge()!=0) ? sqrt(
278  ptSeed*ptSeed*pmSeed*pmSeed/state.charge()/state.charge() * tsAtClosestApproachSeed.trackStateAtPCA().curvilinearError().matrix().At(0,0)
279  + 2*ptSeed*pmSeed/state.charge()*pzSeed * tsAtClosestApproachSeed.trackStateAtPCA().curvilinearError().matrix().At(0,1)
280  + pzSeed*pzSeed * tsAtClosestApproachSeed.trackStateAtPCA().curvilinearError().matrix().At(1,1) ) : 1.e6;
281 
282  std::vector<std::pair<TrackingParticleRef, double> > tp;
283  if(recSimColl.find(seed) != recSimColl.end()) {
284  tp = recSimColl[seed];
285  if (tp.size()!=0) {
286  at++;
287  edm::LogVerbatim("SeedValidator") << "TrajectorySeed #" << rT << " associated with quality:" << tp.begin()->second <<"\n";
288  }
289  } else {
290  edm::LogVerbatim("SeedValidator") << "TrajectorySeed #" << rT << " NOT associated to any TrackingParticle" << "\n";
291  }
292 
293  //Compute fake rate vs eta
294  double seedeta=getEta(etaSeed);
295  for (unsigned int f=0; f<etaintervals[w].size()-1; f++){
296  if (seedeta>etaintervals[w][f]&&
297  seedeta<etaintervals[w][f+1]) {
298  totRECeta[w][f]++;
299  if (tp.size()!=0) {
300  totASS2eta[w][f]++;
301  }
302  }
303  }
304  double seedpt=getPt(ptSeed);
305  for (unsigned int f=0; f<pTintervals[w].size()-1; f++){
306  if (seedpt>pTintervals[w][f]&&
307  seedpt<pTintervals[w][f+1]) {
308  totRECpT[w][f]++;
309  if (tp.size()!=0) {
310  totASS2pT[w][f]++;
311  }
312  }
313  }
314  totREC_hit[w][seed->nHits()]++;
315  if (tp.size()!=0) totASS2_hit[w][seed->nHits()]++;
316 
317  //Fill other histos
318  try{
319  if (tp.size()==0) continue;
320 
321  TrackingParticleRef tpr = tp.begin()->first;
322  const SimTrack * assocTrack = &(*tpr->g4Track_begin());
323 
324  if (associators[ww]=="quickTrackAssociatorByHits"){
325  double fraction = tp.begin()->second;
326  h_assocFraction[www]->Fill(fraction);
327  h_assocSharedHit[www]->Fill(fraction*numberOfHitsSeed);
328  }
329 
330  h_hits[w]->Fill(numberOfHitsSeed);
331  h_charge[w]->Fill( state.charge() );
332 
333  //compute tracking particle parameters at point of closest approach to the beamline
334  edm::ESHandle<MagneticField> theMF;
335  setup.get<IdealMagneticFieldRecord>().get(theMF);
336  FreeTrajectoryState
337  ftsAtProduction(GlobalPoint(tpr->vertex().x(),tpr->vertex().y(),tpr->vertex().z()),
338  GlobalVector(assocTrack->momentum().x(),assocTrack->momentum().y(),assocTrack->momentum().z()),
339  TrackCharge(tpr->charge()),
340  theMF.product());
341  TrajectoryStateClosestToBeamLine tsAtClosestApproach = tscblBuilder(ftsAtProduction,bs);//as in TrackProducerAlgorithm
342  GlobalPoint v1 = tsAtClosestApproach.trackStateAtPCA().position();
343  GlobalVector p = tsAtClosestApproach.trackStateAtPCA().momentum();
344  GlobalPoint v(v1.x()-bs.x0(),v1.y()-bs.y0(),v1.z()-bs.z0());
345 
346  double qoverpSim = tsAtClosestApproach.trackStateAtPCA().charge()/p.mag();
347  double lambdaSim = M_PI/2-p.theta();
348  double phiSim = p.phi();
349  double dxySim = (-v.x()*sin(p.phi())+v.y()*cos(p.phi()));
350  double dzSim = v.z() - (v.x()*p.x()+v.y()*p.y())/p.perp() * p.z()/p.perp();
351 
352  // eta residue; pt, k, theta, phi, dxy, dz pulls
353  double qoverpPull=(qoverpSeed-qoverpSim)/qoverpErrorSeed;
354  double thetaPull=(lambdaSeed-lambdaSim)/lambdaErrorSeed;
355  double phiPull=(phiSeed-phiSim)/phiErrorSeed;
356  double dxyPull=(dxySeed-dxySim)/dxyErrorSeed;
357  double dzPull=(dzSeed-dzSim)/dzErrorSeed;
358 
359  double contrib_Qoverp = ((qoverpSeed-qoverpSim)/qoverpErrorSeed)*
360  ((qoverpSeed-qoverpSim)/qoverpErrorSeed)/5;
361  double contrib_dxy = ((dxySeed-dxySim)/dxyErrorSeed)*((dxySeed-dxySim)/dxyErrorSeed)/5;
362  double contrib_dz = ((dzSeed-dzSim)/dzErrorSeed)*((dzSeed-dzSim)/dzErrorSeed)/5;
363  double contrib_theta = ((lambdaSeed-lambdaSim)/lambdaErrorSeed)*
364  ((lambdaSeed-lambdaSim)/lambdaErrorSeed)/5;
365  double contrib_phi = ((phiSeed-phiSim)/phiErrorSeed)*
366  ((phiSeed-phiSim)/phiErrorSeed)/5;
367  LogTrace("SeedValidatorTEST") << "assocChi2=" << tp.begin()->second << "\n"
368  << "" << "\n"
369  << "ptREC=" << ptSeed << "\n"
370  << "etaREC=" << etaSeed << "\n"
371  << "qoverpREC=" << qoverpSeed << "\n"
372  << "dxyREC=" << dxySeed << "\n"
373  << "dzREC=" << dzSeed << "\n"
374  << "thetaREC=" << thetaSeed << "\n"
375  << "phiREC=" << phiSeed << "\n"
376  << "" << "\n"
377  << "qoverpError()=" << qoverpErrorSeed << "\n"
378  << "dxyError()=" << dxyErrorSeed << "\n"
379  << "dzError()=" << dzErrorSeed << "\n"
380  << "thetaError()=" << lambdaErrorSeed << "\n"
381  << "phiError()=" << phiErrorSeed << "\n"
382  << "" << "\n"
383  << "ptSIM=" << sqrt(assocTrack->momentum().perp2()) << "\n"
384  << "etaSIM=" << assocTrack->momentum().Eta() << "\n"
385  << "qoverpSIM=" << qoverpSim << "\n"
386  << "dxySIM=" << dxySim << "\n"
387  << "dzSIM=" << dzSim << "\n"
388  << "thetaSIM=" << M_PI/2-lambdaSim << "\n"
389  << "phiSIM=" << phiSim << "\n"
390  << "" << "\n"
391  << "contrib_Qoverp=" << contrib_Qoverp << "\n"
392  << "contrib_dxy=" << contrib_dxy << "\n"
393  << "contrib_dz=" << contrib_dz << "\n"
394  << "contrib_theta=" << contrib_theta << "\n"
395  << "contrib_phi=" << contrib_phi << "\n"
396  << "" << "\n"
397  <<"chi2PULL="<<contrib_Qoverp+contrib_dxy+contrib_dz+contrib_theta+contrib_phi<<"\n";
398 
399  h_pullQoverp[w]->Fill(qoverpPull);
400  h_pullTheta[w]->Fill(thetaPull);
401  h_pullPhi[w]->Fill(phiPull);
402  h_pullDxy[w]->Fill(dxyPull);
403  h_pullDz[w]->Fill(dzPull);
404 
405  double ptres=ptSeed-sqrt(assocTrack->momentum().perp2());
406  //double etares=etaSeed-assocTrack->momentum().pseudoRapidity();
407  double etares=etaSeed-assocTrack->momentum().Eta();
408 
409  h_pt[w]->Fill(ptres/ptErrorSeed);
410  h_eta[w]->Fill(etares);
411 
412  //#hit vs eta: fill 2D histos
413  nhits_vs_eta[w]->Fill(getEta(etaSeed),numberOfHitsSeed);
414 
415  } catch (cms::Exception e){
416  LogTrace("SeedValidator") << "exception found: " << e.what() << "\n";
417  }
418  }
419  if (at!=0) h_tracks[w]->Fill(at);
420  h_fakes[w]->Fill(rT-at);
421  edm::LogVerbatim("SeedValidator") << "Total Simulated: " << st << "\n"
422  << "Total Associated (simToReco): " << ats << "\n"
423  << "Total Reconstructed: " << rT << "\n"
424  << "Total Associated (recoToSim): " << at << "\n"
425  << "Total Fakes: " << rT-at << "\n";
426  nrec_vs_nsim[w]->Fill(rT,st);
427  w++;
428  }
429  }
430 }
431 
432 void TrackerSeedValidator::endRun(edm::Run const&, edm::EventSetup const&) {
433  LogTrace("SeedValidator") << "TrackerSeedValidator::endRun()";
434  int w=0;
435  for (unsigned int ww=0;ww<associators.size();ww++){
436  for (unsigned int www=0;www<label.size();www++){
437 
438  doProfileX(nhits_vs_eta[w],h_hits_eta[w]);
439 
440  //effic&fake
441  fillPlotFromVectors(h_effic[w],totASSeta[w],totSIMeta[w],"effic");
442  fillPlotFromVectors(h_fakerate[w],totASS2eta[w],totRECeta[w],"fakerate");
443  fillPlotFromVectors(h_efficPt[w],totASSpT[w],totSIMpT[w],"effic");
444  fillPlotFromVectors(h_fakeratePt[w],totASS2pT[w],totRECpT[w],"fakerate");
445  fillPlotFromVectors(h_effic_vs_hit[w],totASS_hit[w],totSIM_hit[w],"effic");
446  fillPlotFromVectors(h_fake_vs_hit[w],totASS2_hit[w],totREC_hit[w],"fakerate");
447 
448  fillPlotFromVector(h_recoeta[w],totRECeta[w]);
449  fillPlotFromVector(h_simuleta[w],totSIMeta[w]);
450  fillPlotFromVector(h_assoceta[w],totASSeta[w]);
451  fillPlotFromVector(h_assoc2eta[w],totASS2eta[w]);
452 
453  fillPlotFromVector(h_recopT[w],totRECpT[w]);
454  fillPlotFromVector(h_simulpT[w],totSIMpT[w]);
455  fillPlotFromVector(h_assocpT[w],totASSpT[w]);
456  fillPlotFromVector(h_assoc2pT[w],totASS2pT[w]);
457 
458  w++;
459  }
460  }
461  if ( out.size() != 0 && dbe_ ) dbe_->save(out);
462 }
463 */
464 
465 
466