00001 #include <algorithm>
00002 #include <cctype>
00003 #include <iomanip>
00004 #include <set>
00005 #include <sstream>
00006 #include <vector>
00007
00008 #include "TFile.h"
00009 #include "TH1F.h"
00010
00011 #include "HepPDT/ParticleID.hh"
00012
00013
00014 #include "DataFormats/JetReco/interface/JetTracksAssociation.h"
00015 #include "DataFormats/TrackReco/interface/TrackFwd.h"
00016 #include "DataFormats/VertexReco/interface/Vertex.h"
00017
00018 #include "FWCore/Framework/interface/Frameworkfwd.h"
00019 #include "FWCore/Framework/interface/EDAnalyzer.h"
00020 #include "FWCore/Framework/interface/ESHandle.h"
00021 #include "FWCore/Framework/interface/MakerMacros.h"
00022 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00023
00024 #include "TrackingTools/IPTools/interface/IPTools.h"
00025
00026 #include "RecoVertex/PrimaryVertexProducer/interface/PrimaryVertexSorter.h"
00027
00028 #include "SimTracker/TrackHistory/interface/TrackClassifier.h"
00029
00030 #include "TrackingTools/Records/interface/TransientTrackRecord.h"
00031
00032
00033
00034
00035
00036 class QualityCutsAnalyzer : public edm::EDAnalyzer
00037 {
00038
00039 public:
00040
00041 explicit QualityCutsAnalyzer(const edm::ParameterSet&);
00042 ~QualityCutsAnalyzer();
00043
00044 private:
00045
00046 virtual void beginJob() ;
00047 virtual void analyze(const edm::Event&, const edm::EventSetup&);
00048 virtual void endJob();
00049
00050
00051
00052 typedef std::vector<int> vint;
00053 typedef std::vector<std::string> vstring;
00054
00055 edm::InputTag trackProducer_;
00056 edm::InputTag primaryVertexProducer_;
00057 edm::InputTag jetTracksAssociation_;
00058
00059 std::string rootFile_;
00060
00061 int minimumNumberOfHits_, minimumNumberOfPixelHits_;
00062 double minimumTransverseMomentum_, maximumChiSquared_;
00063
00064 bool useAllQualities_;
00065 reco::TrackBase::TrackQuality trackQuality_;
00066
00067 void
00068 LoopOverJetTracksAssociation(
00069 const edm::ESHandle<TransientTrackBuilder> &,
00070 const edm::Handle<reco::VertexCollection> &,
00071 const edm::Handle<reco::JetTracksAssociationCollection> &
00072 );
00073
00074
00075
00076 struct histogram_element_t
00077 {
00078 double sdl;
00079 double dta;
00080 double tip;
00081 double lip;
00082 double ips;
00083 double pt;
00084 double chi2;
00085 std::size_t hits;
00086 std::size_t pixelhits;
00087
00088 histogram_element_t(double d, double a, double t, double l, double i, double p, double c, std::size_t h, std::size_t x)
00089 {
00090 sdl = d;
00091 dta = a;
00092 tip = t;
00093 lip = l;
00094 ips = i;
00095 pt = p;
00096 chi2 = c;
00097 hits = h;
00098 pixelhits = x;
00099 }
00100
00101 histogram_element_t(const histogram_element_t & orig)
00102 {
00103 sdl = orig.sdl;
00104 dta = orig.dta;
00105 tip = orig.tip;
00106 lip = orig.lip;
00107 ips = orig.ips;
00108 pt = orig.pt;
00109 chi2 = orig.chi2;
00110 hits = orig.hits;
00111 pixelhits = orig.pixelhits;
00112 }
00113 };
00114
00115 typedef std::vector<std::vector<histogram_element_t> > histogram_data_t;
00116 histogram_data_t histogram_data_;
00117
00118 class histogram_t
00119 {
00120
00121 TH1F* sdl;
00122 TH1F* dta;
00123 TH1F* tip;
00124 TH1F* lip;
00125 TH1F* ips;
00126 TH1F* pixelhits;
00127 TH1F* pt_1gev;
00128 TH1F* chi2;
00129 TH1F* hits;
00130
00131 public:
00132
00133 histogram_t(const std::string & particleType)
00134 {
00135 std::string name, title;
00136 name = std::string("hits_") + particleType;
00137 title = std::string("Hit distribution for ") + particleType;
00138 hits = new TH1F(name.c_str(), title.c_str(), 19, -0.5, 18.5);
00139
00140 name = std::string("chi2_") + particleType;
00141 title = std::string("Chi2 distribution for ") + particleType;
00142 chi2 = new TH1F(name.c_str(), title.c_str(), 100, 0., 30.);
00143
00144 name = std::string("pixelhits_") + particleType;
00145 title = std::string("Pixel hits distribution for ") + particleType;
00146 pixelhits = new TH1F(name.c_str(), title.c_str(), 21, -0.5, 20.5);
00147
00148 name = std::string("pt_1Gev_") + particleType;
00149 title = std::string("Pt distribution close 1Gev for ") + particleType;
00150 pt_1gev = new TH1F(name.c_str(), title.c_str(), 100, 0., 2.);
00151
00152 name = std::string("tip_") + particleType;
00153 title = std::string("Transverse impact parameter distribution for ") + particleType;
00154 tip = new TH1F(name.c_str(), title.c_str(), 100, -0.3, 0.3);
00155
00156 name = std::string("lip_") + particleType;
00157 title = std::string("Longitudinal impact parameter distribution for ") + particleType;
00158 lip = new TH1F(name.c_str(), title.c_str(), 100, -1., 1.);
00159
00160 name = std::string("ips_") + particleType;
00161 title = std::string("IPS distribution for ") + particleType;
00162 ips = new TH1F(name.c_str(), title.c_str(), 100, -25.0, 25.0);
00163
00164 name = std::string("sdl_") + particleType;
00165 title = std::string("Decay length distribution for ") + particleType;
00166 sdl = new TH1F(name.c_str(), title.c_str(), 100, -5., 5.);
00167
00168 name = std::string("dta_") + particleType;
00169 title = std::string("Distance to jet distribution for ") + particleType;
00170 dta = new TH1F(name.c_str(), title.c_str(), 100, 0.0, 0.2);
00171 }
00172
00173 ~histogram_t()
00174 {
00175 delete hits;
00176 delete chi2;
00177 delete pixelhits;
00178 delete pt_1gev;
00179 delete tip;
00180 delete lip;
00181 delete ips;
00182 delete sdl;
00183 delete dta;
00184 }
00185
00186 void Fill(const histogram_element_t & data)
00187 {
00188 hits->Fill(data.hits);
00189 chi2->Fill(data.chi2);
00190 pixelhits->Fill(data.pt);
00191 pt_1gev->Fill(data.pt);
00192 ips->Fill(data.ips);
00193 tip->Fill(data.tip);
00194 lip->Fill(data.lip);
00195 sdl->Fill(data.sdl);
00196 dta->Fill(data.dta);
00197 }
00198
00199 void Write()
00200 {
00201 hits->Write();
00202 chi2->Write();
00203 pixelhits->Write();
00204 pt_1gev->Write();
00205 ips->Write();
00206 tip->Write();
00207 lip->Write();
00208 sdl->Write();
00209 dta->Write();
00210 }
00211 };
00212
00213
00214 TrackClassifier classifier_;
00215
00216 };
00217
00218
00219
00220
00221
00222 QualityCutsAnalyzer::QualityCutsAnalyzer(const edm::ParameterSet& config) : classifier_(config)
00223 {
00224 trackProducer_ = config.getUntrackedParameter<edm::InputTag> ( "trackProducer" );
00225 primaryVertexProducer_ = config.getUntrackedParameter<edm::InputTag> ( "primaryVertexProducer" );
00226 jetTracksAssociation_ = config.getUntrackedParameter<edm::InputTag> ( "jetTracksAssociation" );
00227
00228 rootFile_ = config.getUntrackedParameter<std::string> ( "rootFile" );
00229
00230 minimumNumberOfHits_ = config.getUntrackedParameter<int> ( "minimumNumberOfHits" );
00231 minimumNumberOfPixelHits_ = config.getUntrackedParameter<int> ( "minimumNumberOfPixelHits" );
00232 minimumTransverseMomentum_ = config.getUntrackedParameter<double> ( "minimumTransverseMomentum" );
00233 maximumChiSquared_ = config.getUntrackedParameter<double> ( "maximumChiSquared" );
00234
00235 std::string trackQualityType = config.getUntrackedParameter<std::string>("trackQualityClass");
00236 trackQuality_ = reco::TrackBase::qualityByName(trackQualityType);
00237 useAllQualities_ = false;
00238
00239 std::transform(trackQualityType.begin(), trackQualityType.end(), trackQualityType.begin(), (int(*)(int)) std::tolower);
00240 if (trackQualityType == "any")
00241 {
00242 std::cout << "Using any" << std::endl;
00243 useAllQualities_ = true;
00244 }
00245 }
00246
00247 QualityCutsAnalyzer::~QualityCutsAnalyzer() {}
00248
00249
00250
00251
00252
00253
00254 void
00255 QualityCutsAnalyzer::analyze(const edm::Event& event, const edm::EventSetup& setup)
00256 {
00257
00258 edm::Handle<edm::View<reco::Track> > trackCollection;
00259 event.getByLabel(trackProducer_,trackCollection);
00260
00261 edm::Handle<reco::VertexCollection> primaryVertexCollection;
00262 event.getByLabel(primaryVertexProducer_, primaryVertexCollection);
00263
00264 edm::Handle<reco::JetTracksAssociationCollection> jetTracks;
00265 event.getByLabel(jetTracksAssociation_, jetTracks);
00266
00267 edm::ESHandle<TransientTrackBuilder> TTbuilder;
00268 setup.get<TransientTrackRecord>().get("TransientTrackBuilder", TTbuilder);
00269
00270
00271 classifier_.newEvent(event, setup);
00272
00273 LoopOverJetTracksAssociation(
00274 TTbuilder,
00275 primaryVertexCollection,
00276 jetTracks
00277 );
00278 }
00279
00280
00281
00282 void
00283 QualityCutsAnalyzer::beginJob()
00284 {
00285 histogram_data_.resize(6);
00286 }
00287
00288
00289
00290 void
00291 QualityCutsAnalyzer::endJob()
00292 {
00293 TFile file(rootFile_.c_str(), "RECREATE");
00294 file.cd();
00295
00296
00297 for (std::size_t i=0; i<6; i++)
00298 {
00299 std::string particle;
00300 if (i == 0)
00301 particle = std::string("B_tracks");
00302 else if (i == 1)
00303 particle = std::string("C_tracks");
00304 else if (i == 2)
00305 particle = std::string("nonB_tracks");
00306 else if (i == 3)
00307 particle = std::string("displaced_tracks");
00308 else if (i == 4)
00309 particle = std::string("bad_tracks");
00310 else
00311 particle = std::string("fake_tracks");
00312
00313 histogram_t histogram(particle);
00314
00315 for (std::size_t j=0; j<histogram_data_[i].size(); j++)
00316 histogram.Fill(histogram_data_[i][j]);
00317
00318 histogram.Write();
00319 }
00320
00321 file.Flush();
00322 }
00323
00324
00325 void
00326 QualityCutsAnalyzer::LoopOverJetTracksAssociation(
00327 const edm::ESHandle<TransientTrackBuilder> & TTbuilder,
00328 const edm::Handle<reco::VertexCollection> & primaryVertexProducer_,
00329 const edm::Handle<reco::JetTracksAssociationCollection> & jetTracksAssociation
00330 )
00331 {
00332 const TransientTrackBuilder * bproduct = TTbuilder.product();
00333
00334
00335
00336 reco::Vertex pv;
00337
00338 if (primaryVertexProducer_->size() != 0)
00339 {
00340 PrimaryVertexSorter pvs;
00341 std::vector<reco::Vertex> sortedList = pvs.sortedList(*(primaryVertexProducer_.product()));
00342 pv = (sortedList.front());
00343 }
00344 else
00345 {
00346
00347 reco::Vertex::Error e;
00348 e(0,0)=0.0015*0.0015;
00349 e(1,1)=0.0015*0.0015;
00350 e(2,2)=15.*15.;
00351 reco::Vertex::Point p(0,0,0);
00352 pv = reco::Vertex(p,e,1,1,1);
00353 }
00354
00355 reco::JetTracksAssociationCollection::const_iterator it = jetTracksAssociation->begin();
00356
00357 int i=0;
00358
00359 for (; it != jetTracksAssociation->end(); it++, i++)
00360 {
00361
00362 reco::JetTracksAssociationRef jetTracks(jetTracksAssociation, i);
00363
00364 double pvZ = pv.z();
00365 GlobalVector direction(jetTracks->first->px(), jetTracks->first->py(), jetTracks->first->pz());
00366
00367
00368 reco::TrackRefVector tracks = jetTracks->second;
00369 for (std::size_t index = 0; index < tracks.size(); index++)
00370 {
00371 edm::RefToBase<reco::Track> track(tracks[index]);
00372
00373 double pt = tracks[index]->pt();
00374 double chi2 = tracks[index]->normalizedChi2();
00375 int hits = tracks[index]->hitPattern().numberOfValidHits();
00376 int pixelHits = tracks[index]->hitPattern().numberOfValidPixelHits();
00377
00378 if (
00379 hits < minimumNumberOfHits_ ||
00380 pixelHits < minimumNumberOfPixelHits_ ||
00381 pt < minimumTransverseMomentum_ ||
00382 chi2 > maximumChiSquared_ ||
00383 (!useAllQualities_ && !tracks[index]->quality(trackQuality_))
00384 ) continue;
00385
00386 const reco::TransientTrack transientTrack = bproduct->build(&(*tracks[index]));
00387 double dta = - IPTools::jetTrackDistance(transientTrack, direction, pv).second.value();
00388 double sdl = IPTools::signedDecayLength3D(transientTrack, direction, pv).second.value();
00389 double ips = IPTools::signedImpactParameter3D(transientTrack, direction, pv).second.value();
00390 double d0 = IPTools::signedTransverseImpactParameter(transientTrack, direction, pv).second.value();
00391 double dz = tracks[index]->dz() - pvZ;
00392
00393
00394 classifier_.evaluate( edm::RefToBase<reco::Track>(tracks[index]) );
00395
00396
00397 if ( classifier_.is(TrackClassifier::Fake) )
00398 histogram_data_[5].push_back(histogram_element_t(sdl, dta, d0, dz, ips, pt, chi2, hits, pixelHits));
00399 else if ( classifier_.is(TrackClassifier::BWeakDecay) )
00400 histogram_data_[0].push_back(histogram_element_t(sdl, dta, d0, dz, ips, pt, chi2, hits, pixelHits));
00401 else if ( classifier_.is(TrackClassifier::Bad) )
00402 histogram_data_[4].push_back(histogram_element_t(sdl, dta, d0, dz, ips, pt, chi2, hits, pixelHits));
00403 else if (
00404 !classifier_.is(TrackClassifier::CWeakDecay) &&
00405 !classifier_.is(TrackClassifier::PrimaryVertex)
00406 )
00407 histogram_data_[3].push_back(histogram_element_t(sdl, dta, d0, dz, ips, pt, chi2, hits, pixelHits));
00408 else if ( classifier_.is(TrackClassifier::CWeakDecay) )
00409 histogram_data_[1].push_back(histogram_element_t(sdl, dta, d0, dz, ips, pt, chi2, hits, pixelHits));
00410 else
00411 histogram_data_[2].push_back(histogram_element_t(sdl, dta, d0, dz, ips, pt, chi2, hits, pixelHits));
00412
00413 }
00414 }
00415 }
00416
00417 DEFINE_FWK_MODULE(QualityCutsAnalyzer);