00001
00002
00003
00004
00005
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "FWCore/Framework/interface/Frameworkfwd.h"
00022 #include "FWCore/Framework/interface/EDAnalyzer.h"
00023 #include "FWCore/Framework/interface/Event.h"
00024 #include "FWCore/Framework/interface/MakerMacros.h"
00025 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00026 #include "FWCore/Utilities/interface/InputTag.h"
00027 #include "FWCore/Framework/interface/ESHandle.h"
00028 #include "FWCore/Framework/interface/EventSetup.h"
00029 #include "Utilities/General/interface/FileInPath.h"
00030
00031 #include "FWCore/Framework/interface/IOVSyncValue.h"
00032 #include "FWCore/ServiceRegistry/interface/Service.h"
00033 #include "CondCore/DBOutputService/interface/PoolDBOutputService.h"
00034
00035
00036 #include "DataFormats/BTauReco/interface/TrackIPTagInfo.h"
00037 #include "CondFormats/BTauObjects/interface/TrackProbabilityCalibration.h"
00038 #include "CondFormats/BTauObjects/interface/CalibratedHistogram.h"
00039
00040 #include "CondFormats/DataRecord/interface/BTagTrackProbability2DRcd.h"
00041 #include "CondFormats/DataRecord/interface/BTagTrackProbability3DRcd.h"
00042
00043 #include "TClass.h"
00044
00045 #include "TBufferFile.h"
00046
00047 #include "TBufferXML.h"
00048 #include <iostream>
00049 #include <fstream>
00050 #include <sstream>
00051 #include <string>
00052 #include <vector>
00053 #include <memory>
00054
00055 #include "TrackClassMatch.h"
00056
00057
00058 using namespace reco;
00059 using namespace std;
00060
00061
00062
00063
00064
00065
00066 class ImpactParameterCalibration : public edm::EDAnalyzer {
00067 public:
00068 explicit ImpactParameterCalibration(const edm::ParameterSet&);
00069 ~ImpactParameterCalibration();
00070
00071
00072 private:
00073 virtual void beginJob() ;
00074 virtual void analyze(const edm::Event&, const edm::EventSetup&);
00075 virtual void endJob() ;
00076
00077 virtual void initFromFirstES(const edm::EventSetup&);
00078 edm::ParameterSet config;
00079 bool m_needInitFromES;
00080 TrackProbabilityCalibration * fromXml(edm::FileInPath xmlCalibration);
00081
00082 static TrackProbabilityCategoryData createCategory(double pmin,double pmax,
00083 double etamin, double etamax,
00084 int nhitmin, int nhitmax,
00085 int npixelhitsmin, int npixelhitsmax,
00086 double cmin, double cmax, int withFirst)
00087 {
00088 TrackProbabilityCategoryData c;
00089 c.pMin=pmin;
00090 c.pMax=pmax;
00091 c.etaMin=etamin;
00092 c.etaMax=etamax;
00093 c.nHitsMin=nhitmin;
00094 c.nHitsMax=nhitmax;
00095 c.nPixelHitsMin=npixelhitsmin;
00096 c.nPixelHitsMax=npixelhitsmax;
00097 c.chiMin=cmin;
00098 c.chiMax=cmax;
00099 c.withFirstPixel=withFirst;
00100 return c;
00101 }
00102
00103 TrackProbabilityCalibration * m_calibration[2];
00104 edm::InputTag m_iptaginfo;
00105 edm::InputTag m_pv;
00106 unsigned int minLoop, maxLoop;
00107
00108 };
00109
00110 ImpactParameterCalibration::ImpactParameterCalibration(const edm::ParameterSet& iConfig):config(iConfig)
00111 {
00112 m_needInitFromES = false;
00113 m_iptaginfo = iConfig.getParameter<edm::InputTag>("tagInfoSrc");
00114 m_pv = iConfig.getParameter<edm::InputTag>("primaryVertexSrc");
00115 bool createOnlyOne = iConfig.getUntrackedParameter<bool>("createOnlyOneCalibration", false);
00116 minLoop=0;
00117 maxLoop=1;
00118 if (createOnlyOne == true){
00119 int whichCalib = iConfig.getUntrackedParameter<int>("dimension", 2);
00120 if (whichCalib==2){
00121 std::cout <<" Writing only 2D calibrations"<<std::endl;
00122 minLoop=1;
00123 maxLoop=1;
00124 }else if (whichCalib==3){
00125 std::cout <<" Writing only 3D calibrations"<<std::endl;
00126 minLoop=0;
00127 maxLoop=0;
00128 }else {
00129 std::cout <<" Dimension not found: "<<whichCalib<<"; it must be either 2 or 3"<<std::endl;
00130 }
00131 }
00132
00133 }
00134
00135
00136 ImpactParameterCalibration::~ImpactParameterCalibration()
00137 {
00138 }
00139
00140
00141 void
00142 ImpactParameterCalibration::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup)
00143 {
00144 if(m_needInitFromES) initFromFirstES(iSetup);
00145 using namespace edm;
00146 using namespace reco;
00147
00148 Handle<TrackIPTagInfoCollection> ipHandle;
00149 iEvent.getByLabel(m_iptaginfo, ipHandle);
00150 const TrackIPTagInfoCollection & ip = *(ipHandle.product());
00151
00152
00153
00154 Handle<reco::VertexCollection> primaryVertex;
00155 iEvent.getByLabel(m_pv,primaryVertex);
00156
00157 vector<TrackProbabilityCalibration::Entry>::iterator found;
00158 vector<TrackProbabilityCalibration::Entry>::iterator it_begin;
00159 vector<TrackProbabilityCalibration::Entry>::iterator it_end;
00160
00161
00162 TrackIPTagInfoCollection::const_iterator it = ip.begin();
00163 for(; it != ip.end(); it++)
00164 {
00165 TrackRefVector selTracks=it->selectedTracks();
00166
00167 if(primaryVertex.product()->size() == 0)
00168 {
00169 std::cout << "No PV in the event!!" << std::endl;
00170 continue;
00171 }
00172 const Vertex & pv = *(primaryVertex.product()->begin());
00173
00174 for(unsigned int i=minLoop; i <= maxLoop;i++)
00175 {
00176 it_begin=m_calibration[i]->data.begin();
00177 it_end=m_calibration[i]->data.end();
00178
00179 for(unsigned int j=0;j<selTracks.size(); j++)
00180 {
00181 double ipsig;
00182 if (i==0) ipsig = it->impactParameterData()[j].ip3d.significance();
00183 else ipsig = it->impactParameterData()[j].ip2d.significance();
00184 TrackClassMatch::Input input(*selTracks[j],*it->jet(),pv);
00185 if(ipsig < 0)
00186 {
00187 found = std::find_if(it_begin,it_end,bind1st(TrackClassMatch(),input));
00188
00189 if(found!=it_end)
00190 found->histogram.fill(-ipsig);
00191 else
00192 {std::cout << "No category for this track!!" << std::endl;
00193 std::cout << "p " <<(*selTracks[j]).p () << std::endl;
00194 std::cout << "eta " << (*selTracks[j]).eta() << std::endl;
00195 std::cout << "NHit " << (*selTracks[j]).numberOfValidHits() << std::endl;
00196 std::cout << "NPixHit " << (*selTracks[j]).hitPattern().numberOfValidPixelHits() << std::endl;
00197 std::cout << "FPIXHIT " << (*selTracks[j]).hitPattern().hasValidHitInFirstPixelBarrel() << std::endl;}
00198
00199 }
00200 }
00201 }
00202 }
00203
00204
00205
00206 }
00207
00208
00209
00210
00211
00212
00213
00214 void ImpactParameterCalibration::initFromFirstES(const edm::EventSetup& iSetup)
00215 {
00216 using namespace edm;
00217
00218 CalibratedHistogram hist(config.getParameter<int>("nBins"),0,config.getParameter<double>("maxSignificance"));
00219 bool resetHistogram = config.getParameter<bool>("resetHistograms");
00220 ESHandle<TrackProbabilityCalibration> calib2DHandle;
00221 iSetup.get<BTagTrackProbability2DRcd>().get(calib2DHandle);
00222 ESHandle<TrackProbabilityCalibration> calib3DHandle;
00223 iSetup.get<BTagTrackProbability3DRcd>().get(calib3DHandle);
00224 const TrackProbabilityCalibration * ca[2];
00225 ca[0] = calib3DHandle.product();
00226 ca[1] = calib2DHandle.product();
00227 for(unsigned int i=minLoop;i <=maxLoop ;i++)
00228 for(unsigned int j=0;j<ca[i]->data.size() ; j++)
00229 {
00230 TrackProbabilityCalibration::Entry e;
00231 e.category=ca[i]->data[j].category;
00232
00233 if(resetHistogram)
00234 e.histogram=hist;
00235 else
00236 e.histogram=ca[i]->data[j].histogram;
00237
00238 m_calibration[i]->data.push_back(e);
00239 }
00240
00241
00242 }
00243
00244
00245
00246 void
00247 ImpactParameterCalibration::beginJob()
00248 {
00249 using namespace edm;
00250 m_calibration[0] = new TrackProbabilityCalibration();
00251 m_calibration[1] = new TrackProbabilityCalibration();
00252
00253 CalibratedHistogram hist(config.getParameter<int>("nBins"),0,config.getParameter<double>("maxSignificance"));
00254
00255 std::string categories = config.getParameter<std::string>("inputCategories");
00256
00257 if(categories == "HardCoded")
00258 {
00259 vector<TrackProbabilityCategoryData> v;
00260
00261
00262
00263 v.push_back(createCategory(0, 5000, 0 , 2.5, 8 , 50, 1, 1, 0 , 5 , 0));
00264 v.push_back(createCategory(0, 5000, 0 , 2.5, 8 , 50, 2, 8, 2.5, 5 , 0));
00265 v.push_back(createCategory(0, 8 , 0 , 0.8, 8 , 50, 3, 8, 0 , 2.5, 0));
00266 v.push_back(createCategory(0, 8 , 0.8, 1.6, 8 , 50, 3, 8, 0 , 2.5, 0));
00267 v.push_back(createCategory(0, 8 , 1.6, 2.5, 8 , 50, 3, 8, 0 , 2.5, 0));
00268 v.push_back(createCategory(0, 8 , 0 , 2.5, 8 , 50, 2, 8, 0 , 2.5, 0));
00269 v.push_back(createCategory(8, 5000, 0 , 0.8, 8 , 50, 3, 8, 0 , 2.5, 0));
00270 v.push_back(createCategory(8, 5000, 0.8, 1.6, 8 , 50, 3, 8, 0 , 2.5, 0));
00271 v.push_back(createCategory(8, 5000, 1.6, 2.5, 8 , 50, 3, 8, 0 , 2.5, 0));
00272 v.push_back(createCategory(8, 5000, 0 , 2.5, 8 , 50, 2 ,2, 0 , 2.5, 0));
00273 for(unsigned int i=minLoop;i <=maxLoop ;i++)
00274 for(unsigned int j=0;j<v.size() ; j++)
00275 {
00276 TrackProbabilityCalibration::Entry e;
00277 e.category=v[j];
00278 e.histogram=hist;
00279 m_calibration[i]->data.push_back(e);
00280 }
00281
00282 }
00283 if(categories == "RootXML")
00284 {
00285 bool resetHistogram = config.getParameter<bool>("resetHistograms");
00286 const TrackProbabilityCalibration * ca[2];
00287 ca[0] = fromXml(config.getParameter<edm::FileInPath>("calibFile3d"));
00288 ca[1] = fromXml(config.getParameter<edm::FileInPath>("calibFile2d"));
00289
00290 for(unsigned int i=minLoop;i <=maxLoop ;i++)
00291 for(unsigned int j=0;j<ca[i]->data.size() ; j++)
00292 {
00293 TrackProbabilityCalibration::Entry e;
00294 e.category=ca[i]->data[j].category;
00295
00296 if(resetHistogram)
00297 e.histogram=hist;
00298 else
00299 e.histogram=ca[i]->data[j].histogram;
00300
00301 m_calibration[i]->data.push_back(e);
00302 }
00303
00304 delete ca[0];
00305 delete ca[1];
00306
00307 }
00308 if(categories == "EventSetup")
00309 {
00310 m_needInitFromES=true;
00311 }
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343 }
00344
00345 TrackProbabilityCalibration * ImpactParameterCalibration::fromXml(edm::FileInPath xmlCalibration)
00346 {
00347 std::ifstream xmlFile(xmlCalibration.fullPath().c_str());
00348 if (!xmlFile.good())
00349 throw cms::Exception("BTauFakeMVAJetTagConditions")
00350 << "File \"" << xmlCalibration.fullPath()
00351 << "\" could not be opened for reading."
00352 << std::endl;
00353 std::ostringstream ss;
00354 ss << xmlFile.rdbuf();
00355 xmlFile.close();
00356 TClass *classType = 0;
00357 void *ptr = TBufferXML(TBuffer::kRead).ConvertFromXMLAny(
00358 ss.str().c_str(), &classType, kTRUE, kFALSE);
00359 if (!ptr)
00360 throw cms::Exception("ImpactParameterCalibration")
00361 << "Unknown error parsing XML serialization"
00362 << std::endl;
00363
00364 if (std::strcmp(classType->GetName(),
00365 "TrackProbabilityCalibration")) {
00366 classType->Destructor(ptr);
00367 throw cms::Exception("ImpactParameterCalibration")
00368 << "Serialized object has wrong C++ type."
00369 << std::endl;
00370 }
00371
00372 return static_cast<TrackProbabilityCalibration*>(ptr);
00373 }
00374
00375
00376
00377
00378
00379 void
00380 ImpactParameterCalibration::endJob() {
00381
00382 if(config.getParameter<bool>("writeToDB"))
00383 {
00384 edm::Service<cond::service::PoolDBOutputService> mydbservice;
00385 if( !mydbservice.isAvailable() ) return;
00386 if(minLoop == 0 ) mydbservice->createNewIOV<TrackProbabilityCalibration>(m_calibration[0], mydbservice->beginOfTime(), mydbservice->endOfTime(),"BTagTrackProbability3DRcd");
00387 if(maxLoop == 1) mydbservice->createNewIOV<TrackProbabilityCalibration>(m_calibration[1], mydbservice->beginOfTime(), mydbservice->endOfTime(),"BTagTrackProbability2DRcd");
00388 }
00389
00390
00391 if(config.getParameter<bool>("writeToRootXML"))
00392 {
00393 if(maxLoop == 1 ){
00394 std::ofstream of2("2d.xml");
00395 TBufferXML b2(TBuffer::kWrite);
00396 of2 << b2.ConvertToXML(const_cast<void*>(static_cast<const void*>(m_calibration[1])),
00397 TClass::GetClass("TrackProbabilityCalibration"),
00398 kTRUE, kFALSE);
00399 of2.close();
00400 }
00401 if(minLoop == 0 ){
00402 std::ofstream of3("3d.xml");
00403 TBufferXML b3(TBuffer::kWrite);
00404 of3 << b3.ConvertToXML(const_cast<void*>(static_cast<const void*>(m_calibration[0])),
00405 TClass::GetClass("TrackProbabilityCalibration"),
00406 kTRUE, kFALSE);
00407 of3.close();
00408 }
00409 }
00410
00411
00412 if(config.getParameter<bool>("writeToBinary"))
00413 {
00414 if(maxLoop == 1 ){
00415
00416 std::ofstream ofile("2d.dat");
00417 TBufferFile buffer(TBuffer::kWrite);
00418 buffer.StreamObject(const_cast<void*>(static_cast<const void*>(m_calibration[1])),
00419 TClass::GetClass("TrackProbabilityCalibration"));
00420 Int_t size = buffer.Length();
00421 ofile.write(buffer.Buffer(),size);
00422 ofile.close();
00423 }
00424 if(minLoop == 0 ){
00425 std::ofstream ofile3("3d.dat");
00426 TBufferFile buffer3(TBuffer::kWrite);
00427 buffer3.StreamObject(const_cast<void*>(static_cast<const void*>(m_calibration[0])),
00428 TClass::GetClass("TrackProbabilityCalibration"));
00429 Int_t size3 = buffer3.Length();
00430 ofile3.write(buffer3.Buffer(),size3);
00431 ofile3.close();
00432 }
00433 }
00434
00435
00436
00437
00438
00439 }
00440
00441
00442 DEFINE_FWK_MODULE(ImpactParameterCalibration);