114 #include <CLHEP/Vector/LorentzVector.h>
146 #include "HepPDT/defs.h"
147 #include "HepPDT/TableBuilder.hh"
148 #include "HepPDT/ParticleDataTable.hh"
150 #include "HepMC/GenParticle.h"
151 #include "HepMC/GenEvent.h"
171 #include "valgrind/callgrind.h"
318 std::vector<MuScleFitMuon>
muons;
319 typename std::vector<T>::const_iterator track;
320 for( track = tracks.begin(); track != tracks.end(); ++track ) {
329 <<
": initial value Pt = " << mu.Pt() << std::endl;
335 Double_t hitsTk = track->innerTrack()->hitPattern().numberOfValidTrackerHits();
336 Double_t hitsMuon = track->innerTrack()->hitPattern().numberOfValidMuonHits();
337 Double_t ptError = track->innerTrack()->ptError();
340 std::cout<<
"[MuScleFit::fillMuonCollection]"<<std::endl;
346 muons.push_back (
muon);
359 tracks.push_back(*(muon->globalTrack()));
361 tracks.push_back(*(muon->outerTrack()));
363 tracks.push_back(*(muon->innerTrack()));
365 else if(
theMuonType_ == 10 && !(muon->isStandAloneMuon()) )
366 tracks.push_back(*(muon->innerTrack()));
368 tracks.push_back(*(muon->innerTrack()));
370 tracks.push_back(*(muon->innerTrack()));
383 if ((theMuonType_<-4 || theMuonType_>5) &&
theMuonType_<10) {
384 std::cout <<
"[MuScleFit]: Unknown muon type! Aborting." << std::endl;
428 int resolFitType = pset.
getParameter<
int>(
"ResolFitType");
514 if (MuScleFitUtils::SmearType>0) {
515 std::cout <<
"[MuScleFit-Constructor]: Generating random values for smearing" << std::endl;
516 TF1
G(
"G",
"[0]*exp(-0.5*pow(x,2))", -5., 5.);
518 G.SetParameter (0,norm);
519 for (
int i=0;
i<10000;
i++) {
520 for (
int j=0;
j<7;
j++) {
542 MuScleFitUtils::rapidityBinsForZ_ =
false;
567 MuScleFitUtils::resfind,
568 MuScleFitUtils::speedup, genParticlesName_,
569 compareToSimTracks_, simTracksCollection_,
570 MuScleFitUtils::sherpa_,
debug_));
573 pset.
getParameter<std::vector<double> >(
"LeftWindowBorder"),
574 pset.
getParameter<std::vector<double> >(
"RightWindowBorder"),
606 std::cout <<
"Saving muon pairs to root tree" << std::endl;
611 std::vector<MuonPair>::const_iterator it =
muonPairs_.begin();
612 std::cout<<
"[MuScleFit::~MuScleFit] (Destructor)"<<std::endl;
614 std::cout<<
" Debugging pairs that are going to be written to file"<<std::endl;
615 std::cout<<
" muon1 = "<<it->mu1<<std::endl;
616 std::cout<<
" muon2 = "<<it->mu2<<std::endl;
649 std::stringstream
ss;
652 theFiles_.push_back (
new TFile(rootFileName.c_str(),
"RECREATE"));
654 if (
debug_>0)
std::cout <<
"[MuScleFit]: Root file created" << std::endl;
656 std::cout <<
"creating plotter" << std::endl;
671 if (
debug_>0)
std::cout <<
"[MuScleFit]: Starting loop # " << iLoop << std::endl;
698 unsigned int iFastLoop = 1;
715 std::cout <<
"Starting fast loop number " << iFastLoop << std::endl;
725 if(
iev%50000 == 0 ) {
726 std::cout <<
"Fast looping on event number " <<
iev << std::endl;
731 std::cout <<
"End of fast loop number " << iFastLoop <<
". Ran on " <<
iev <<
" events" << std::endl;
753 std::cout <<
"Ending loop # " << iLoop << std::endl;
763 TDirectory * likelihoodDir =
theFiles_[iLoop]->mkdir(
"likelihood");
784 bool isFired =
false;
789 isFired =triggerResults->accept();
791 std::cout<<
"Trigger "<<isFired<<std::endl;
801 for (
unsigned i=0;
i<triggerNames.
size();
i++) {
805 for (
unsigned int ipath=0; ipath<
triggerPath_.size(); ipath++ ) {
806 if ( hltName.find(
triggerPath_[ipath]) != std::string::npos ) {
807 unsigned int triggerIndex( hltConfig.
triggerIndex(hltName) );
810 if (triggerIndex < triggerResults->
size()) {
811 isFired = triggerResults->accept(triggerIndex);
825 CALLGRIND_START_INSTRUMENTATION;
830 <<
" Run: " <<
event.id().run() <<
" Event: " <<
event.id().event() << std::endl;
851 CALLGRIND_STOP_INSTRUMENTATION;
852 CALLGRIND_DUMP_STATS;
861 std::vector<MuScleFitMuon>
muons;
866 std::cout<<
"[MuScleFit::selectMuons] Debugging muons collections after call to muonSelector_->selectMuons"<<std::endl;
868 for (std::vector<MuScleFitMuon>::const_iterator it = muons.begin(); it < muons.end(); ++it) {
869 std::cout<<
" - muon n. "<<iMu<<
" = "<<(*it)<<std::endl;
876 std::pair<MuScleFitMuon, MuScleFitMuon> recMuFromBestRes =
881 std::cout <<std::setprecision(9)<<
"Pt after findbestrecores: " << (recMuFromBestRes.first).
Pt() <<
" "
882 << (recMuFromBestRes.second).
Pt() << std::endl;
886 recMu1 = recMuFromBestRes.first.p4();
887 recMu2 = recMuFromBestRes.second.p4();
911 Int_t the_numPUvtx(0);
912 Float_t the_TrueNumInteractions(0);
919 std::vector<PileupSummaryInfo>::const_iterator PVI;
920 for(PVI = puInfo->begin(); PVI != puInfo->end(); ++PVI) {
921 int BX = PVI->getBunchCrossing();
923 the_TrueNumInteractions = PVI->getTrueNumInteractions();
924 the_numPUvtx = PVI->getPU_NumInteractions();
932 std::vector<reco::Vertex>::const_iterator itv;
934 for (itv = vertices->begin(); itv != vertices->end(); ++itv) {
936 if(itv->ndof()<5)
continue;
937 if(fabs(itv->z())>50.0)
continue;
938 if(fabs(itv->position().rho())>2.0)
continue;
945 event.getByLabel(
"generator", genEvtInfo);
946 double the_genEvtweight = 1.;
948 the_genEvtweight = genEvtInfo->weight();
952 MuScleFitEvent(event.
run(),
event.id().event(), the_genEvtweight, the_numPUvtx, the_TrueNumInteractions, the_NVtx)
962 std::cout <<
"Reading muon pairs from Root Tree in " << treeFileName << std::endl;
964 std::vector<std::pair<unsigned int, unsigned long long> > evtRun;
972 std::vector<std::pair<unsigned int, unsigned long long> >::iterator evtRunIt = evtRun.begin();
974 std::vector<std::pair<MuScleFitMuon, MuScleFitMuon> >::iterator genIt;
981 double pt1 = it->first.pt();
983 double pt2 = it->second.pt();
985 double eta1 = it->first.eta();
987 double eta2 = it->second.eta();
990 bool dontPass =
false;
991 bool eta1InFirstRange;
992 bool eta2InFirstRange;
993 bool eta1InSecondRange;
994 bool eta2InSecondRange;
996 int ch1 = it->first.charge();
997 int ch2 = it->second.charge();
1010 ((eta1InFirstRange && eta2InSecondRange && ch1>=ch2)||(eta1InSecondRange && eta2InFirstRange && ch1<ch2))
1024 ((eta1InFirstRange && !eta2InFirstRange) && (eta2InSecondRange && !eta1InSecondRange) && ch1>=ch2) ||
1025 ((eta2InFirstRange && !eta1InFirstRange) && (eta1InSecondRange && !eta2InSecondRange) && ch1<ch2)
1058 MuScleFitEvent((*evtRunIt).first, (*evtRunIt).second, 0, 0, 0, 0))
1090 if(
debug_>0 )
std::cout <<
"About to start lik par correction and histo filling; ResFound is "
1103 <<
recMu1.Pt() <<
" Pt2 = " <<
recMu2.Pt() << std::endl;
1115 <<
recMu1.Pt() <<
" Pt2 = " <<
recMu2.Pt() << std::endl;
1129 mapHisto_[
"hRecBestRes"]->Fill(bestRecRes,+1, weight);
1130 mapHisto_[
"hRecBestResAllEvents"]->Fill(bestRecRes,+1, 1.);
1152 mapHisto_[
"hRecBestResVSRes"]->Fill (bestRecRes, bestRecRes, +1, weight);
1159 std::vector<double> * parval;
1160 std::vector<double> initpar;
1208 if(
debug_ > 0 )
std::cout <<
"mass = " << bestRecRes.mass() << std::endl;
1214 std::vector<double> initpar;
1242 if(
debug_ > 0 )
std::cout <<
"inside weight: mass = " << bestRecRes.mass() <<
", prob = " << prob << std::endl;
1244 if(
debug_ > 0 )
std::cout <<
"inside prob: mass = " << bestRecRes.mass() <<
", prob = " << prob << std::endl;
1253 if( recoMass != 0 ) {
1257 mapHisto_[
"hFunctionResolMassVSMu"]->Fill(
recMu1, massResol/recoMass, -1);
1258 mapHisto_[
"hFunctionResolMassVSMu"]->Fill(
recMu2, massResol/recoMass, +1);
1273 if( genMass != 0 ) {
1276 double diffMass = (recoMass - genMass)/genMass;
1279 double pt1 =
recMu1.pt();
1280 double eta1 =
recMu1.eta();
1281 double pt2 =
recMu2.pt();
1282 double eta2 =
recMu2.eta();
1284 if( diffMass == diffMass ) {
1286 mapHisto_[
"hDeltaMassOverGenMassVsPt"]->Fill(pt1, diffMass);
1287 mapHisto_[
"hDeltaMassOverGenMassVsPt"]->Fill(pt2, diffMass);
1288 mapHisto_[
"hDeltaMassOverGenMassVsEta"]->Fill(eta1, diffMass);
1289 mapHisto_[
"hDeltaMassOverGenMassVsEta"]->Fill(eta2, diffMass);
1291 mapHisto_[
"hMassResolutionVsPtEta"]->Fill(pt1, eta1, diffMass, diffMass);
1292 mapHisto_[
"hMassResolutionVsPtEta"]->Fill(pt2, eta2, diffMass, diffMass);
1295 std::cout <<
"Error, there is a nan: recoMass = " << recoMass <<
", genMass = " << genMass << std::endl;
1304 mapHisto_[
"hMass_P"]->Fill(bestRecRes.mass(), prob);
1305 if(
debug_ > 0 )
std::cout <<
"mass = " << bestRecRes.mass() <<
", prob = " << prob << std::endl;
1306 mapHisto_[
"hMass_fine_P"]->Fill(bestRecRes.mass(), prob);
1308 mapHisto_[
"hMassProbVsRes"]->Fill(bestRecRes, bestRecRes, +1, prob);
1311 mapHisto_[
"hMassProbVsRes_fine"]->Fill(bestRecRes, bestRecRes, +1, prob);
1321 if (
debug_>0)
std::cout <<
"[MuScleFit]: filling the pair" << std::endl;
1334 ((recMu.Eta()-genMu.Eta()) * (recMu.Eta()-genMu.Eta())));
1338 std::cout<<
"Reco muon "<<recMu<<
" with eta "<<recMu.Eta()<<
" and phi "<<recMu.Phi()<<std::endl
1339 <<
" DOES NOT MATCH with generated muon from resonance: "<<std::endl
1340 <<genMu<<
" with eta "<<genMu.Eta()<<
" and phi "<<genMu.Phi()<<std::endl;
1350 mapHisto_[
"hResolTheta"+
name]->Fill(recMu, (-genMu.Theta()+recMu.Theta()), charge);
1353 mapHisto_[
"hResolEta"+
name]->Fill(recMu, (-genMu.Eta()+recMu.Eta()),charge);
1357 if( (genMu.Pt() != 0) && (recMu.Pt() != 0) ) {
1358 mapHisto_[
"hPtRecoVsPt"+inputName]->Fill(genMu.Pt(), recMu.Pt());
1367 <<
": after smearing Pt = " << mu.Pt() << std::endl;
1376 <<
": after bias Pt = " << mu.Pt() << std::endl;
1387 std::cout <<
"it must have as many values as the number of loops, which is = " <<
maxLoopNumber << std::endl;
1392 std::cout <<
"it must have as many values as the number of loops, which is = " <<
maxLoopNumber << std::endl;
1397 std::cout <<
"it must have as many values as the number of loops, which is = " <<
maxLoopNumber << std::endl;
1402 std::cout <<
"it must have as many values as the number of loops, which is = " <<
maxLoopNumber << std::endl;
1421 MuScleFitUtils::BiasType<0 || MuScleFitUtils::BiasType>13) {
1422 std::cout <<
"[MuScleFit-Constructor]: Wrong bias type or number of parameters: aborting!" << std::endl;
1434 MuScleFitUtils::SmearType<0 || MuScleFitUtils::SmearType>7) {
1435 std::cout <<
"[MuScleFit-Constructor]: Wrong smear type or number of parameters: aborting!" << std::endl;
1442 std::cout <<
"[MuScleFit-Constructor]: Mismatch in number of parameters for Resol: aborting!" << std::endl;
1447 std::cout <<
"[MuScleFit-Constructor]: Mismatch in number of parameters for Scale: aborting!" << std::endl;
1452 std::cout <<
"[MuScleFit-Constructor]: Mismatch in number of parameters for Bgr: aborting!" << std::endl;
1457 std::cout <<
"[MuScleFit-Constructor]: Mismatch in number of parameters for Bgr: aborting!" << std::endl;
1464 std::cout <<
"[MuScleFit-Constructor]: resfind must have 6 elements (1 Z, 3 Y, 2 Psi): aborting!" << std::endl;
1478 iTrack->found() > 11 &&
1479 gTrack->chi2()/gTrack->ndof() < 20.0 &&
1481 iTrack->chi2()/iTrack->ndof() < 4.0 &&
1482 aMuon->
muonID(
"TrackerMuonArbitrated") &&
1483 aMuon->
muonID(
"TMLastStationAngTight") &&
1485 fabs(iTrack->dxy()) < 3.0 &&
1486 fabs(iTrack->dz()) < 15.0 );
1496 iTrack->found() > 11 &&
1497 iTrack->chi2()/iTrack->ndof() < 4.0 &&
1498 aMuon->
muonID(
"TrackerMuonArbitrated") &&
1499 aMuon->
muonID(
"TMLastStationAngTight") &&
1501 fabs(iTrack->dxy()) < 3.0 &&
1502 fabs(iTrack->dz()) < 15.0 );
static double deltaPhiNoFabs(const double &phi1, const double &phi2)
Without fabs at the end, used to have a symmetric distribution for the resolution fits and variance c...
static std::vector< std::pair< lorentzVector, lorentzVector > > simPair
static std::vector< int > doScaleFit
static std::vector< int > doResolFit
T getParameter(std::string const &) const
scaleFunctionBase< double * > * scaleFunctionService(const int identifier)
Service to build the scale functor corresponding to the passed identifier.
T getUntrackedParameter(std::string const &, T const &) const
static std::vector< double > parBias
void selectMuons(const edm::Event &event)
static std::vector< int > parCrossSectionOrder
std::vector< GenMuonPair > genMuonPairs_
Stores the genMuon pairs and the motherId prior to the creation of the internal tree.
reco::TrackRef innerTrack() const
reference to Track reconstructed in the tracker only (reimplemented from reco::Muon) ...
static smearFunctionBase * smearFunction
static std::vector< int > parScaleOrder
edm::InputTag theMuonLabel_
static std::vector< int > doCrossSectionFit
static void minimizeLikelihood()
static double maxMuonEtaSecondRange_
std::vector< MuScleFitMuon > fillMuonCollection(const std::vector< T > &tracks)
static std::vector< int > parBgrOrder
bool selGlobalMuon(const pat::Muon *aMuon)
Function for onia selections.
static unsigned int loopCounter
static double deltaPhiMaxCut_
static std::vector< double > parResolMax
static std::vector< std::pair< MuScleFitMuon, MuScleFitMuon > > SavedPairMuScleFitMuons
static std::vector< std::pair< MuScleFitMuon, MuScleFitMuon > > genMuscleFitPair
static bool startWithSimplex_
std::string triggerResultsProcess_
static std::vector< int > doBackgroundFit
static std::vector< double > parResol
static bool debugMassResol_
virtual void duringFastLoop()
Sin< T >::type sin(const T &t)
static BackgroundHandler * backgroundHandler
static double x[7][10000]
static double massWindowHalfWidth[3][6]
#define DEFINE_FWK_LOOPER(type)
bool muonID(const std::string &name) const
Run const & getRun() const
std::map< std::string, Histograms * > mapHisto_
The map of histograms.
void fillTreeRec(const std::vector< std::pair< reco::Particle::LorentzVector, reco::Particle::LorentzVector > > &savedPairs)
Used when running on the root tree containing preselected muon pairs.
static scaleFunctionBase< std::vector< double > > * biasFunction
bool selTrackerMuon(const pat::Muon *aMuon)
virtual void startingNewLoop(unsigned int iLoop) override
Strings::size_type size() const
static std::vector< int > parBgrFix
static std::vector< double > parResolMin
static bool minimumShapePlots_
int pixelLayersWithMeasurement() const
edm::InputTag simTracksCollection_
static int MuonTypeForCheckMassWindow
static double minMuonEtaFirstRange_
static double massProb(const double &mass, const double &rapidity, const int ires, const double &massResol)
void fillComparisonHistograms(const reco::Particle::LorentzVector &genMu, const reco::Particle::LorentzVector &recoMu, const std::string &inputName, const int charge)
Fill the reco vs gen and reco vs sim comparison histograms.
static struct MuScleFitUtils::massResolComponentsStruct massResolComponents
Strings const & triggerNames() const
std::vector< std::string > triggerPath_
static std::vector< int > parScaleFix
static bool computeMinosErrors_
MuScleFitMuon recMuScleMu1
reco::Particle::LorentzVector lorentzVector
static scaleFunctionBase< std::vector< double > > * scaleFunctionForVec
static std::vector< std::vector< double > > parvalue
unsigned int triggerIndex(const std::string &triggerName) const
slot position of trigger path in trigger table (0 to size-1)
U second(std::pair< T, U > const &p)
static std::pair< MuScleFitMuon, MuScleFitMuon > findBestRecoRes(const std::vector< MuScleFitMuon > &muons)
static std::vector< std::pair< lorentzVector, lorentzVector > > genPair
std::string outputRootTreeFileName_
std::string theGenInfoRootFileName_
resolutionFunctionBase< std::vector< double > > * resolutionFunctionVecService(const int identifier)
Service to build the resolution functor corresponding to the passed identifier when receiving a std::...
static double massResolution(const lorentzVector &mu1, const lorentzVector &mu2)
reco::Particle::LorentzVector recMu2
static std::vector< double > parScaleMin
std::vector< double > vec1
reco::Particle::LorentzVector recMu1
static lorentzVector applyBias(const lorentzVector &muon, const int charge)
static std::vector< double > parBgr
unsigned int maxLoopNumber
MuonServiceProxy * theService
std::string genParticlesName_
Cos< T >::type cos(const T &t)
void clearHistoMap()
Clean the histograms map.
MuScleFitMuon recMuScleMu2
static double computeWeight(const double &mass, const int iev, const bool doUseBkgrWindow=false)
static std::vector< double > parScaleStep
static std::vector< std::pair< lorentzVector, lorentzVector > > SavedPair
MuScleFit(const edm::ParameterSet &pset)
static std::string const triggerResults
static lorentzVector applyScale(const lorentzVector &muon, const std::vector< double > &parval, const int charge)
static std::vector< int > parResolFix
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
static std::vector< double > parSmear
void beginOfJobInConstructor()
smearFunctionBase * smearFunctionService(const int identifier)
Service to build the smearing functor corresponding to the passed identifier.
reco::TrackRef globalTrack() const
reference to Track reconstructed in both tracked and muon detector (reimplemented from reco::Muon) ...
static std::vector< int > parResolOrder
std::auto_ptr< MuScleFitMuonSelector > muonSelector_
virtual void endOfJob() override
virtual edm::EDLooper::Status duringLoop(const edm::Event &event, const edm::EventSetup &eventSetup) override
double deltaR(double eta1, double eta2, double phi1, double phi2)
void writeTree(const TString &fileName, const std::vector< MuonPair > *savedPair, const int muonType=0, const std::vector< GenMuonPair > *genPair=0, const bool saveAll=false)
static std::vector< double > parScaleMax
scaleFunctionBase< std::vector< double > > * scaleFunctionVecService(const int identifier)
Service to build the scale functor corresponding to the passed identifier when receiving a std::vecto...
void writeHistoMap(const unsigned int iLoop)
Save the histograms map to file.
static std::vector< double > parScale
static double oldNormalization_
void applySmearing(reco::Particle::LorentzVector &mu)
Apply the smearing if needed using the function in MuScleFitUtils.
std::string const & triggerName(unsigned int index) const
std::string theRootFileName_
void fillTreeGen(const std::vector< std::pair< reco::Particle::LorentzVector, reco::Particle::LorentzVector > > &genPairs)
bool init(const edm::Run &iRun, const edm::EventSetup &iSetup, const std::string &processName, bool &changed)
d'tor
static double deltaPhiMinCut_
std::string triggerResultsLabel_
static bool rapidityBinsForZ_
MuScleFitPlotter * plotter
void fillHistoMap(TFile *outputFile, unsigned int iLoop)
Create the histograms map.
std::vector< TFile * > theFiles_
The files were the histograms are saved.
double minResMass_hwindow[6]
static bool separateRanges_
static double minMuonEtaSecondRange_
static std::vector< double > parCrossSection
static lorentzVector applySmearing(const lorentzVector &muon)
static bool normalizeLikelihoodByEventNumber_
std::string inputRootTreeFileName_
bool checkDeltaR(reco::Particle::LorentzVector &genMu, reco::Particle::LorentzVector &recMu)
Check if two lorentzVector are near in deltaR.
resolutionFunctionBase< double * > * resolutionFunctionService(const int identifier)
Service to build the resolution functor corresponding to the passed identifier.
int maxEventsFromRootTree_
double maxResMass_hwindow[6]
std::vector< MuonPair > muonPairs_
Used to store the muon pairs plus run and event number prior to the creation of the internal tree...
static double deltaPhi(const double &phi1, const double &phi2)
static scaleFunctionBase< double * > * scaleFunction
int numberOfValidMuonHits() const
static bool useProbsFile_
static std::vector< int > resfind
void readProbabilityDistributionsFromFile()
Read probability distributions from a local root file.
void takeSelectedMuonType(const T &muon, std::vector< reco::Track > &tracks)
Template method used to fill the track collection starting from reco::muons or pat::muons.
static int counter_resprob
static resolutionFunctionBase< std::vector< double > > * resolutionFunctionForVec
math::XYZTLorentzVector LorentzVector
Lorentz vector.
Analysis-level muon class.
static double maxMuonEtaFirstRange_
tuple size
Write out results.
Power< A, B >::type pow(const A &a, const B &b)
void applyBias(reco::Particle::LorentzVector &mu, const int charge)
Apply the bias if needed using the function in MuScleFitUtils.
static CrossSectionHandler * crossSectionHandler
virtual edm::EDLooper::Status endOfLoop(const edm::EventSetup &eventSetup, unsigned int iLoop) override
static std::vector< double > parResolStep
static std::vector< int > parCrossSectionFix
static resolutionFunctionBase< double * > * resolutionFunction
void readTree(const int maxEvents, const TString &fileName, MuonPairVector *savedPair, const int muonType, std::vector< std::pair< unsigned int, unsigned long long > > *evtRun, MuonPairVector *genPair=0)
void addParameters(std::vector< double > &initpar)
Inputs the vars in a vector.
virtual void endOfFastLoop(const unsigned int iLoop)