00001
00002
00003
00004
00005
00013
00014
00015
00016
00017
00018
00019
00020 #include <cassert>
00021 #include <sstream>
00022 #include <numeric>
00023
00024 #include "TNtuple.h"
00025
00026
00027 #include "FWCore/Framework/interface/Frameworkfwd.h"
00028 #include "FWCore/Framework/interface/EDAnalyzer.h"
00029 #include "FWCore/Framework/interface/Event.h"
00030 #include "FWCore/Framework/interface/MakerMacros.h"
00031 #include "FWCore/ServiceRegistry/interface/Service.h"
00032 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00033
00034 #include "DataFormats/Common/interface/Handle.h"
00035 #include "DataFormats/Histograms/interface/MEtoEDMFormat.h"
00036 #include "DataFormats/JetReco/interface/FFTJetPileupSummary.h"
00037 #include "DataFormats/VertexReco/interface/Vertex.h"
00038 #include "DataFormats/VertexReco/interface/VertexFwd.h"
00039
00040 #include "SimDataFormats/PileupSummaryInfo/interface/PileupSummaryInfo.h"
00041
00042 #include "CommonTools/UtilAlgos/interface/TFileService.h"
00043
00044 #include "DataFormats/JetReco/interface/DiscretizedEnergyFlow.h"
00045
00046 #define init_param(type, varname) varname (ps.getParameter< type >( #varname ))
00047
00048
00049
00050
00051 class FFTJetPileupAnalyzer : public edm::EDAnalyzer
00052 {
00053 public:
00054 explicit FFTJetPileupAnalyzer(const edm::ParameterSet&);
00055 ~FFTJetPileupAnalyzer();
00056
00057 private:
00058 FFTJetPileupAnalyzer();
00059 FFTJetPileupAnalyzer(const FFTJetPileupAnalyzer&);
00060 FFTJetPileupAnalyzer& operator=(const FFTJetPileupAnalyzer&);
00061
00062
00063
00064 void analyzePileup(const std::vector<PileupSummaryInfo>& pInfo);
00065
00066 virtual void beginJob() ;
00067 virtual void analyze(const edm::Event&, const edm::EventSetup&);
00068 virtual void endJob() ;
00069
00070 edm::InputTag histoLabel;
00071 edm::InputTag summaryLabel;
00072 edm::InputTag fastJetRhoLabel;
00073 edm::InputTag fastJetSigmaLabel;
00074 edm::InputTag gridLabel;
00075 edm::InputTag srcPVs;
00076 std::string pileupLabel;
00077 std::string ntupleName;
00078 std::string ntupleTitle;
00079 bool collectHistos;
00080 bool collectSummaries;
00081 bool collectFastJetRho;
00082 bool collectPileup;
00083 bool collectOOTPileup;
00084 bool collectGrids;
00085 bool collectGridDensity;
00086 bool collectVertexInfo;
00087 bool verbosePileupInfo;
00088
00089 double vertexNdofCut;
00090 double crazyEnergyCut;
00091
00092 std::vector<float> ntupleData;
00093 TNtuple* nt;
00094 int totalNpu;
00095 int totalNPV;
00096 unsigned long counter;
00097 };
00098
00099
00100
00101
00102 FFTJetPileupAnalyzer::FFTJetPileupAnalyzer(const edm::ParameterSet& ps)
00103 : init_param(edm::InputTag, histoLabel),
00104 init_param(edm::InputTag, summaryLabel),
00105 init_param(edm::InputTag, fastJetRhoLabel),
00106 init_param(edm::InputTag, fastJetSigmaLabel),
00107 init_param(edm::InputTag, gridLabel),
00108 init_param(edm::InputTag, srcPVs),
00109 init_param(std::string, pileupLabel),
00110 init_param(std::string, ntupleName),
00111 init_param(std::string, ntupleTitle),
00112 init_param(bool, collectHistos),
00113 init_param(bool, collectSummaries),
00114 init_param(bool, collectFastJetRho),
00115 init_param(bool, collectPileup),
00116 init_param(bool, collectOOTPileup),
00117 init_param(bool, collectGrids),
00118 init_param(bool, collectGridDensity),
00119 init_param(bool, collectVertexInfo),
00120 init_param(bool, verbosePileupInfo),
00121 init_param(double, vertexNdofCut),
00122 init_param(double, crazyEnergyCut),
00123 nt(0),
00124 totalNpu(-1),
00125 totalNPV(-1),
00126 counter(0)
00127 {
00128 }
00129
00130
00131 FFTJetPileupAnalyzer::~FFTJetPileupAnalyzer()
00132 {
00133 }
00134
00135
00136
00137
00138
00139 void FFTJetPileupAnalyzer::analyzePileup(
00140 const std::vector<PileupSummaryInfo>& info)
00141 {
00142 const unsigned nBx = info.size();
00143 if (collectPileup)
00144 ntupleData.push_back(static_cast<float>(nBx));
00145
00146 double sumpt_Lo = 0.0, sumpt_Hi = 0.0;
00147 totalNpu = 0;
00148
00149 int npu_by_Bx[3] = {0,};
00150 double sumpt_Lo_by_Bx[3] = {0.0,}, sumpt_Hi_by_Bx[3] = {0.0,};
00151
00152 if (verbosePileupInfo)
00153 std::cout << "\n**** Pileup info begin" << std::endl;
00154
00155 bool isCrazy = false;
00156 for (unsigned ibx = 0; ibx < nBx; ++ibx)
00157 {
00158 const PileupSummaryInfo& puInfo(info[ibx]);
00159
00160 const int bx = puInfo.getBunchCrossing();
00161 const int npu = puInfo.getPU_NumInteractions();
00162 const std::vector<float>& lopt(puInfo.getPU_sumpT_lowpT());
00163 const std::vector<float>& hipt(puInfo.getPU_sumpT_highpT());
00164 const double losum = std::accumulate(lopt.begin(), lopt.end(), 0.0);
00165 const double hisum = std::accumulate(hipt.begin(), hipt.end(), 0.0);
00166
00167 if (losum >= crazyEnergyCut)
00168 isCrazy = true;
00169 if (hisum >= crazyEnergyCut)
00170 isCrazy = true;
00171
00172 totalNpu += npu;
00173 sumpt_Lo += losum;
00174 sumpt_Hi += hisum;
00175
00176 const unsigned idx = bx < 0 ? 0U : (bx == 0 ? 1U : 2U);
00177 npu_by_Bx[idx] += npu;
00178 sumpt_Lo_by_Bx[idx] += losum;
00179 sumpt_Hi_by_Bx[idx] += hisum;
00180
00181 if (verbosePileupInfo)
00182 std::cout << "ibx " << ibx << " bx " << bx
00183 << " npu " << npu << " losum " << losum
00184 << " hisum " << hisum
00185 << std::endl;
00186 }
00187
00188 if (verbosePileupInfo)
00189 std::cout << "**** Pileup info end\n" << std::endl;
00190
00191 if (isCrazy)
00192 {
00193 totalNpu = -1;
00194 sumpt_Lo = 0.0;
00195 sumpt_Hi = 0.0;
00196 for (unsigned ibx = 0; ibx < 3; ++ibx)
00197 {
00198 npu_by_Bx[ibx] = -1;
00199 sumpt_Lo_by_Bx[ibx] = 0.0;
00200 sumpt_Hi_by_Bx[ibx] = 0.0;
00201 }
00202 }
00203
00204 if (collectPileup)
00205 {
00206 ntupleData.push_back(totalNpu);
00207 ntupleData.push_back(sumpt_Lo);
00208 ntupleData.push_back(sumpt_Hi);
00209 }
00210
00211 if (collectOOTPileup)
00212 for (unsigned ibx = 0; ibx < 3; ++ibx)
00213 {
00214 ntupleData.push_back(npu_by_Bx[ibx]);
00215 ntupleData.push_back(sumpt_Lo_by_Bx[ibx]);
00216 ntupleData.push_back(sumpt_Hi_by_Bx[ibx]);
00217 }
00218 }
00219
00220
00221
00222 void FFTJetPileupAnalyzer::beginJob()
00223 {
00224
00225 std::string vars = "cnt:run:event";
00226 if (collectPileup)
00227 vars += ":nbx:npu:sumptLowCut:sumptHiCut";
00228 if (collectOOTPileup)
00229 {
00230 vars += ":npu_negbx:sumptLowCut_negbx:sumptHiCut_negbx";
00231 vars += ":npu_0bx:sumptLowCut_0bx:sumptHiCut_0bx";
00232 vars += ":npu_posbx:sumptLowCut_posbx:sumptHiCut_posbx";
00233 }
00234 if (collectSummaries)
00235 vars += ":estimate:pileup:uncert:uncertCode";
00236 if (collectFastJetRho)
00237 vars += ":fjrho:fjsigma";
00238 if (collectGridDensity)
00239 vars += ":gridEtDensity:gridEtDensityMixed";
00240 if (collectVertexInfo)
00241 vars += ":nPV";
00242
00243
00244 edm::Service<TFileService> fs;
00245 nt = fs->make<TNtuple>(ntupleName.c_str(), ntupleTitle.c_str(),
00246 vars.c_str());
00247 ntupleData.reserve(nt->GetNvar());
00248 }
00249
00250
00251
00252 void FFTJetPileupAnalyzer::analyze(const edm::Event& iEvent,
00253 const edm::EventSetup& iSetup)
00254 {
00255 ntupleData.clear();
00256 ntupleData.push_back(counter);
00257 totalNpu = -1;
00258 totalNPV = -1;
00259
00260 const long runnumber = iEvent.id().run();
00261 const long eventnumber = iEvent.id().event();
00262 ntupleData.push_back(runnumber);
00263 ntupleData.push_back(eventnumber);
00264
00265
00266 if (collectPileup || collectOOTPileup)
00267 {
00268 edm::Handle<std::vector<PileupSummaryInfo> > puInfo;
00269 if (iEvent.getByLabel(pileupLabel, puInfo))
00270 analyzePileup(*puInfo);
00271 else
00272 {
00273 if (collectPileup)
00274 {
00275 ntupleData.push_back(-1);
00276 ntupleData.push_back(-1);
00277 ntupleData.push_back(0.f);
00278 ntupleData.push_back(0.f);
00279 }
00280 if (collectOOTPileup)
00281 for (unsigned ibx = 0; ibx < 3; ++ibx)
00282 {
00283 ntupleData.push_back(-1);
00284 ntupleData.push_back(0.f);
00285 ntupleData.push_back(0.f);
00286 }
00287 }
00288 }
00289
00290 if (collectHistos)
00291 {
00292 edm::Handle<TH2D> input;
00293 iEvent.getByLabel(histoLabel, input);
00294
00295 edm::Service<TFileService> fs;
00296 TH2D* copy = new TH2D(*input);
00297
00298 std::ostringstream os;
00299 os << copy->GetName() << '_' << counter << '_'
00300 << totalNpu << '_' << runnumber << '_' << eventnumber;
00301 const std::string& newname(os.str());
00302 copy->SetNameTitle(newname.c_str(), newname.c_str());
00303
00304 copy->SetDirectory(fs->getBareDirectory());
00305 }
00306
00307 if (collectSummaries)
00308 {
00309 edm::Handle<reco::FFTJetPileupSummary> summary;
00310 iEvent.getByLabel(summaryLabel, summary);
00311
00312 ntupleData.push_back(summary->uncalibratedQuantile());
00313 ntupleData.push_back(summary->pileupRho());
00314 ntupleData.push_back(summary->pileupRhoUncertainty());
00315 ntupleData.push_back(summary->uncertaintyCode());
00316 }
00317
00318 if (collectFastJetRho)
00319 {
00320 edm::Handle<double> fjrho, fjsigma;
00321 iEvent.getByLabel(fastJetRhoLabel, fjrho);
00322 iEvent.getByLabel(fastJetSigmaLabel, fjsigma);
00323
00324 ntupleData.push_back(*fjrho);
00325 ntupleData.push_back(*fjsigma);
00326 }
00327
00328 if (collectGrids)
00329 {
00330 edm::Handle<reco::DiscretizedEnergyFlow> input;
00331 iEvent.getByLabel(gridLabel, input);
00332
00333
00334 const double* data = input->data();
00335 assert(data);
00336 assert(input->phiBin0Edge() == 0.0);
00337 const unsigned nEta = input->nEtaBins();
00338 const unsigned nPhi = input->nPhiBins();
00339
00340
00341 std::ostringstream os;
00342 os << "FFTJetGrid_" << counter << '_'
00343 << totalNpu << '_' << runnumber << '_' << eventnumber;
00344 const std::string& newname(os.str());
00345
00346
00347 edm::Service<TFileService> fs;
00348 TH2F* h = fs->make<TH2F>(newname.c_str(), newname.c_str(),
00349 nEta, input->etaMin(), input->etaMax(),
00350 nPhi, 0.0, 2.0*M_PI);
00351 h->GetXaxis()->SetTitle("Eta");
00352 h->GetYaxis()->SetTitle("Phi");
00353 h->GetZaxis()->SetTitle("Transverse Energy");
00354
00355 for (unsigned ieta=0; ieta<nEta; ++ieta)
00356 for (unsigned iphi=0; iphi<nPhi; ++iphi)
00357 h->SetBinContent(ieta+1U, iphi+1U, data[ieta*nPhi + iphi]);
00358 }
00359
00360 if (collectGridDensity)
00361 {
00362 edm::Handle<std::pair<double,double> > etSum;
00363 iEvent.getByLabel(histoLabel, etSum);
00364
00365 ntupleData.push_back(etSum->first);
00366 ntupleData.push_back(etSum->second);
00367 }
00368
00369 if (collectVertexInfo)
00370 {
00371 edm::Handle<reco::VertexCollection> pvCollection;
00372 iEvent.getByLabel(srcPVs, pvCollection);
00373 totalNPV = 0;
00374 if (!pvCollection->empty())
00375 for (reco::VertexCollection::const_iterator pv = pvCollection->begin();
00376 pv != pvCollection->end(); ++pv)
00377 {
00378 const double ndof = pv->ndof();
00379 if (!pv->isFake() && ndof > vertexNdofCut)
00380 ++totalNPV;
00381 }
00382 ntupleData.push_back(totalNPV);
00383 }
00384
00385 assert(ntupleData.size() == static_cast<unsigned>(nt->GetNvar()));
00386 nt->Fill(&ntupleData[0]);
00387
00388 ++counter;
00389 }
00390
00391
00392
00393 void FFTJetPileupAnalyzer::endJob()
00394 {
00395 }
00396
00397
00398
00399 DEFINE_FWK_MODULE(FFTJetPileupAnalyzer);