CMS 3D CMS Logo

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Member Functions | Private Attributes
PVFitter Class Reference

#include <PVFitter.h>

Public Member Functions

void compressStore ()
 reduce size of primary vertex cache by increasing quality limit More...
 
void dumpTxtFile ()
 
void FitPerBunchCrossing ()
 
reco::BeamSpot getBeamSpot ()
 
std::map< int, reco::BeamSpotgetBeamSpotMap ()
 
int * getFitLSRange ()
 
int getNPVs ()
 
const std::map< int, int > & getNPVsperBX ()
 
std::vector< BeamSpotFitPVDatagetpvStore ()
 
time_t * getRefTime ()
 
double getWidthX ()
 
double getWidthXerr ()
 
double getWidthY ()
 
double getWidthYerr ()
 
double getWidthZ ()
 
double getWidthZerr ()
 
void initialize (const edm::ParameterSet &iConfig, edm::ConsumesCollector &iColl)
 
bool IsFitPerBunchCrossing ()
 
 PVFitter ()
 
 PVFitter (const edm::ParameterSet &iConfig, edm::ConsumesCollector &&iColl)
 
 PVFitter (const edm::ParameterSet &iConfig, edm::ConsumesCollector &iColl)
 
double pvQuality (const reco::Vertex &pv) const
 vertex quality measure More...
 
double pvQuality (const BeamSpotFitPVData &pv) const
 vertex quality measure More...
 
void readEvent (const edm::Event &iEvent)
 
void resetAll ()
 
void resetLSRange ()
 
void resetRefTime ()
 
void resizepvStore (unsigned int rmSize)
 
bool runBXFitter ()
 
bool runFitter ()
 
void setFitLSRange (int ls0, int ls1)
 
void setRefTime (std::time_t t0, std::time_t t1)
 
void setTree (TTree *tree)
 
virtual ~PVFitter ()
 

Private Attributes

std::map< int, std::vector< BeamSpotFitPVData > > bxMap_
 
bool debug_
 
bool do3DFit_
 
double dynamicQualityCut_
 
double errorScale_
 
std::ofstream fasciiFile
 
reco::BeamSpot fbeamspot
 
int fbeginLumiOfFit
 
std::map< int, reco::BeamSpotfbspotMap
 
int fendLumiOfFit
 
bool fFitPerBunchCrossing
 
std::time_t freftime [2]
 
TTree * ftree_
 
double fwidthX
 
double fwidthXerr
 
double fwidthY
 
double fwidthYerr
 
double fwidthZ
 
double fwidthZerr
 
TH2F * hPVx
 
TH2F * hPVy
 
unsigned int maxNrVertices_
 
double maxVtxNormChi2_
 
double maxVtxR_
 
double maxVtxZ_
 
unsigned int minNrVertices_
 
double minSumPt_
 
double minVtxNdf_
 
unsigned int minVtxTracks_
 
double minVtxWgt_
 
std::map< int, int > npvsmap_
 
std::string outputTxt_
 
std::vector< double > pvQualities_
 
std::vector< BeamSpotFitPVDatapvStore_
 
double sigmaCut_
 
BeamSpotTreeData theBeamSpotTreeData_
 
bool useOnlyFirstPV_
 
edm::EDGetTokenT< reco::VertexCollectionvertexToken_
 

Detailed Description

Definition at line 44 of file PVFitter.h.

Constructor & Destructor Documentation

PVFitter::PVFitter ( )
inline

Definition at line 46 of file PVFitter.h.

References iEvent, initialize(), and AlcaBeamMonitor_cfi::PVFitter.

46 {}
PVFitter::PVFitter ( const edm::ParameterSet iConfig,
edm::ConsumesCollector &&  iColl 
)

Definition at line 46 of file PVFitter.cc.

References initialize().

46  : ftree_(nullptr) {
47  initialize(iConfig, iColl);
48 }
void initialize(const edm::ParameterSet &iConfig, edm::ConsumesCollector &iColl)
Definition: PVFitter.cc:54
TTree * ftree_
Definition: PVFitter.h:161
PVFitter::PVFitter ( const edm::ParameterSet iConfig,
edm::ConsumesCollector iColl 
)

Definition at line 50 of file PVFitter.cc.

References initialize().

50  : ftree_(nullptr) {
51  initialize(iConfig, iColl);
52 }
void initialize(const edm::ParameterSet &iConfig, edm::ConsumesCollector &iColl)
Definition: PVFitter.cc:54
TTree * ftree_
Definition: PVFitter.h:161
PVFitter::~PVFitter ( )
virtual

Definition at line 91 of file PVFitter.cc.

91 {}

Member Function Documentation

void PVFitter::compressStore ( )

reduce size of primary vertex cache by increasing quality limit

Definition at line 461 of file PVFitter.cc.

References dynamicQualityCut_, mps_fire::i, pvQualities_, pvQuality(), and pvStore_.

Referenced by readEvent().

461  {
462  //
463  // fill vertex qualities
464  //
465  pvQualities_.resize(pvStore_.size());
466  for (unsigned int i = 0; i < pvStore_.size(); ++i)
468  sort(pvQualities_.begin(), pvQualities_.end());
469  //
470  // Set new quality cut to median. This cut will be used to reduce the
471  // number of vertices in the store and also apply to all new vertices
472  // until the next reset
473  //
475  //
476  // remove all vertices failing the cut from the store
477  // (to be moved to a more efficient memory management!)
478  //
479  unsigned int iwrite(0);
480  for (unsigned int i = 0; i < pvStore_.size(); ++i) {
482  continue;
483  if (i != iwrite)
484  pvStore_[iwrite] = pvStore_[i];
485  ++iwrite;
486  }
487  pvStore_.resize(iwrite);
488  edm::LogInfo("PVFitter") << "Reduced primary vertex store size to " << pvStore_.size()
489  << " ; new dynamic quality cut = " << dynamicQualityCut_ << std::endl;
490 }
std::vector< double > pvQualities_
Definition: PVFitter.h:176
double dynamicQualityCut_
Definition: PVFitter.h:175
std::vector< BeamSpotFitPVData > pvStore_
Definition: PVFitter.h:173
double pvQuality(const reco::Vertex &pv) const
vertex quality measure
Definition: PVFitter.cc:492
void PVFitter::dumpTxtFile ( )

Definition at line 459 of file PVFitter.cc.

459 {}
void PVFitter::FitPerBunchCrossing ( )
inline

Definition at line 64 of file PVFitter.h.

64 { fFitPerBunchCrossing = true; }
bool fFitPerBunchCrossing
Definition: PVFitter.h:134
reco::BeamSpot PVFitter::getBeamSpot ( )
inline

Definition at line 91 of file PVFitter.h.

Referenced by AlcaBeamMonitor::dqmEndLuminosityBlock(), and BeamFitter::runPVandTrkFitter().

91 { return fbeamspot; }
reco::BeamSpot fbeamspot
Definition: PVFitter.h:132
std::map<int, reco::BeamSpot> PVFitter::getBeamSpotMap ( )
inline

Definition at line 92 of file PVFitter.h.

Referenced by BeamFitter::runPVandTrkFitter().

92 { return fbspotMap; }
std::map< int, reco::BeamSpot > fbspotMap
Definition: PVFitter.h:133
int* PVFitter::getFitLSRange ( )
inline

Definition at line 94 of file PVFitter.h.

References createJobs::tmp.

94  {
95  int* tmp = new int[2];
96  tmp[0] = fbeginLumiOfFit;
97  tmp[1] = fendLumiOfFit;
98  return tmp;
99  }
int fbeginLumiOfFit
Definition: PVFitter.h:164
int fendLumiOfFit
Definition: PVFitter.h:165
tmp
align.sh
Definition: createJobs.py:716
int PVFitter::getNPVs ( )
inline

Definition at line 117 of file PVFitter.h.

117 { return pvStore_.size(); }
std::vector< BeamSpotFitPVData > pvStore_
Definition: PVFitter.h:173
const std::map<int, int>& PVFitter::getNPVsperBX ( )
inline

Definition at line 119 of file PVFitter.h.

References genParticles_cff::map, and findQualityFiles::size.

119  {
120  npvsmap_.clear();
121 
122  for (std::map<int, std::vector<BeamSpotFitPVData> >::const_iterator pvStore = bxMap_.begin();
123  pvStore != bxMap_.end();
124  ++pvStore) {
125  npvsmap_[pvStore->first] = (pvStore->second).size();
126  }
127  return npvsmap_;
128  }
size
Write out results.
std::map< int, std::vector< BeamSpotFitPVData > > bxMap_
Definition: PVFitter.h:174
std::map< int, int > npvsmap_
Definition: PVFitter.h:131
std::vector<BeamSpotFitPVData> PVFitter::getpvStore ( )
inline

Definition at line 62 of file PVFitter.h.

62 { return pvStore_; }
std::vector< BeamSpotFitPVData > pvStore_
Definition: PVFitter.h:173
time_t* PVFitter::getRefTime ( )
inline

Definition at line 101 of file PVFitter.h.

101  {
102  time_t* tmptime = new time_t[2];
103  tmptime[0] = freftime[0];
104  tmptime[1] = freftime[1];
105  return tmptime;
106  }
std::time_t freftime[2]
Definition: PVFitter.h:156
double PVFitter::getWidthX ( )
inline

Definition at line 55 of file PVFitter.h.

55 { return fwidthX; }
double fwidthX
Definition: PVFitter.h:166
double PVFitter::getWidthXerr ( )
inline

Definition at line 58 of file PVFitter.h.

Referenced by BeamFitter::runPVandTrkFitter().

58 { return fwidthXerr; }
double fwidthXerr
Definition: PVFitter.h:169
double PVFitter::getWidthY ( )
inline

Definition at line 56 of file PVFitter.h.

56 { return fwidthY; }
double fwidthY
Definition: PVFitter.h:167
double PVFitter::getWidthYerr ( )
inline

Definition at line 59 of file PVFitter.h.

59 { return fwidthYerr; }
double fwidthYerr
Definition: PVFitter.h:170
double PVFitter::getWidthZ ( )
inline

Definition at line 57 of file PVFitter.h.

57 { return fwidthZ; }
double fwidthZ
Definition: PVFitter.h:168
double PVFitter::getWidthZerr ( )
inline

Definition at line 60 of file PVFitter.h.

60 { return fwidthZerr; }
double fwidthZerr
Definition: PVFitter.h:171
void PVFitter::initialize ( const edm::ParameterSet iConfig,
edm::ConsumesCollector iColl 
)

Definition at line 54 of file PVFitter.cc.

References edm::ConsumesCollector::consumes(), debug_, do3DFit_, dynamicQualityCut_, errorScale_, fFitPerBunchCrossing, edm::ParameterSet::getParameter(), hPVx, hPVy, maxNrVertices_, maxVtxNormChi2_, maxVtxR_, maxVtxZ_, minNrVertices_, minSumPt_, minVtxNdf_, minVtxTracks_, minVtxWgt_, sigmaCut_, useOnlyFirstPV_, and vertexToken_.

Referenced by PVFitter().

54  {
55  //In order to make fitting ROOT histograms thread safe
56  // one must call this undocumented function
57  TMinuitMinimizer::UseStaticMinuit(false);
58  debug_ = iConfig.getParameter<edm::ParameterSet>("PVFitter").getUntrackedParameter<bool>("Debug");
60  iConfig.getParameter<edm::ParameterSet>("PVFitter")
61  .getUntrackedParameter<edm::InputTag>("VertexCollection", edm::InputTag("offlinePrimaryVertices")));
62  do3DFit_ = iConfig.getParameter<edm::ParameterSet>("PVFitter").getUntrackedParameter<bool>("Apply3DFit");
63  //writeTxt_ = iConfig.getParameter<edm::ParameterSet>("PVFitter").getUntrackedParameter<bool>("WriteAscii");
64  //outputTxt_ = iConfig.getParameter<edm::ParameterSet>("PVFitter").getUntrackedParameter<std::string>("AsciiFileName");
66  iConfig.getParameter<edm::ParameterSet>("PVFitter").getUntrackedParameter<unsigned int>("maxNrStoredVertices");
68  iConfig.getParameter<edm::ParameterSet>("PVFitter").getUntrackedParameter<unsigned int>("minNrVerticesForFit");
69  minVtxNdf_ = iConfig.getParameter<edm::ParameterSet>("PVFitter").getUntrackedParameter<double>("minVertexNdf");
71  iConfig.getParameter<edm::ParameterSet>("PVFitter").getUntrackedParameter<double>("maxVertexNormChi2");
73  iConfig.getParameter<edm::ParameterSet>("PVFitter").getUntrackedParameter<unsigned int>("minVertexNTracks");
74  minVtxWgt_ = iConfig.getParameter<edm::ParameterSet>("PVFitter").getUntrackedParameter<double>("minVertexMeanWeight");
75  maxVtxR_ = iConfig.getParameter<edm::ParameterSet>("PVFitter").getUntrackedParameter<double>("maxVertexR");
76  maxVtxZ_ = iConfig.getParameter<edm::ParameterSet>("PVFitter").getUntrackedParameter<double>("maxVertexZ");
77  errorScale_ = iConfig.getParameter<edm::ParameterSet>("PVFitter").getUntrackedParameter<double>("errorScale");
78  sigmaCut_ = iConfig.getParameter<edm::ParameterSet>("PVFitter").getUntrackedParameter<double>("nSigmaCut");
80  iConfig.getParameter<edm::ParameterSet>("PVFitter").getUntrackedParameter<bool>("FitPerBunchCrossing");
81  useOnlyFirstPV_ = iConfig.getParameter<edm::ParameterSet>("PVFitter").getUntrackedParameter<bool>("useOnlyFirstPV");
82  minSumPt_ = iConfig.getParameter<edm::ParameterSet>("PVFitter").getUntrackedParameter<double>("minSumPt");
83 
84  // preset quality cut to "infinite"
85  dynamicQualityCut_ = 1.e30;
86 
87  hPVx = new TH2F("hPVx", "PVx vs PVz distribution", 200, -maxVtxR_, maxVtxR_, 200, -maxVtxZ_, maxVtxZ_);
88  hPVy = new TH2F("hPVy", "PVy vs PVz distribution", 200, -maxVtxR_, maxVtxR_, 200, -maxVtxZ_, maxVtxZ_);
89 }
double minSumPt_
Definition: PVFitter.h:154
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
T getParameter(std::string const &) const
bool debug_
Definition: PVFitter.h:139
double maxVtxNormChi2_
Definition: PVFitter.h:147
double minVtxWgt_
Definition: PVFitter.h:149
bool useOnlyFirstPV_
Definition: PVFitter.h:135
double minVtxNdf_
Definition: PVFitter.h:146
std::vector< Vertex > VertexCollection
collection of Vertex objects
Definition: VertexFwd.h:9
double errorScale_
Definition: PVFitter.h:152
bool do3DFit_
Definition: PVFitter.h:140
double dynamicQualityCut_
Definition: PVFitter.h:175
bool fFitPerBunchCrossing
Definition: PVFitter.h:134
TH2F * hPVy
Definition: PVFitter.h:159
edm::EDGetTokenT< reco::VertexCollection > vertexToken_
Definition: PVFitter.h:141
double maxVtxR_
Definition: PVFitter.h:150
double maxVtxZ_
Definition: PVFitter.h:151
unsigned int maxNrVertices_
Definition: PVFitter.h:144
unsigned int minVtxTracks_
Definition: PVFitter.h:148
TH2F * hPVx
Definition: PVFitter.h:158
unsigned int minNrVertices_
Definition: PVFitter.h:145
double sigmaCut_
Definition: PVFitter.h:153
bool PVFitter::IsFitPerBunchCrossing ( )
inline

Definition at line 93 of file PVFitter.h.

Referenced by BeamFitter::dumpTxtFile(), and BeamFitter::runPVandTrkFitter().

93 { return fFitPerBunchCrossing; }
bool fFitPerBunchCrossing
Definition: PVFitter.h:134
double PVFitter::pvQuality ( const reco::Vertex pv) const

vertex quality measure

Definition at line 492 of file PVFitter.cc.

References reco::Vertex::covariance().

Referenced by compressStore(), and readEvent().

492  {
493  //
494  // determinant of the transverse part of the PV covariance matrix
495  //
496  return pv.covariance(0, 0) * pv.covariance(1, 1) - pv.covariance(0, 1) * pv.covariance(0, 1);
497 }
double covariance(int i, int j) const
(i, j)-th element of error matrix, i, j = 0, ... 2
Definition: Vertex.h:134
double PVFitter::pvQuality ( const BeamSpotFitPVData pv) const

vertex quality measure

Definition at line 499 of file PVFitter.cc.

References BeamSpotFitPVData::posCorr, and BeamSpotFitPVData::posError.

499  {
500  //
501  // determinant of the transverse part of the PV covariance matrix
502  //
503  double ex = pv.posError[0];
504  double ey = pv.posError[1];
505  return ex * ex * ey * ey * (1 - pv.posCorr[0] * pv.posCorr[0]);
506 }
void PVFitter::readEvent ( const edm::Event iEvent)

Definition at line 93 of file PVFitter.cc.

References BeamSpotFitPVData::bunchCrossing, BeamSpotTreeData::bunchCrossing(), edm::EventBase::bunchCrossing(), l1GtPatternGenerator_cfi::bx, bxMap_, compressStore(), dynamicQualityCut_, fFitPerBunchCrossing, ftree_, edm::Event::getByToken(), hPVx, hPVy, edm::EventBase::id(), BeamSpotTreeData::lumi(), edm::EventBase::luminosityBlock(), maxNrVertices_, minSumPt_, minVtxNdf_, minVtxTracks_, minVtxWgt_, BeamSpotFitPVData::posCorr, BeamSpotFitPVData::posError, BeamSpotFitPVData::position, DiDispStaMuonMonitor_cfi::pt, MetAnalyzer::pv(), L1TEGammaOffline_cfi::PVCollection, BeamSpotTreeData::pvData(), pvQuality(), pvStore_, BeamSpotTreeData::run(), edm::EventID::run(), TtFullHadEvtBuilder_cfi::sumPt, theBeamSpotTreeData_, useOnlyFirstPV_, and vertexToken_.

Referenced by AlcaBeamMonitor::analyze(), and BeamFitter::readEvent().

93  {
94  //------ Primary Vertices
96  bool hasPVs = false;
97 
98  if (iEvent.getByToken(vertexToken_, PVCollection)) {
99  hasPVs = true;
100  }
101  //------
102 
103  if (hasPVs) {
104  for (reco::VertexCollection::const_iterator pv = PVCollection->begin(); pv != PVCollection->end(); ++pv) {
105  if (useOnlyFirstPV_) {
106  if (pv != PVCollection->begin())
107  break;
108  }
109 
110  //--- vertex selection
111  if (pv->isFake() || pv->tracksSize() == 0)
112  continue;
113  if (pv->ndof() < minVtxNdf_ || (pv->ndof() + 3.) / pv->tracksSize() < 2 * minVtxWgt_)
114  continue;
115  //---
116 
117  if (pv->tracksSize() < minVtxTracks_)
118  continue;
119 
120  const auto& testTrack = pv->trackRefAt(0);
121  if (testTrack.isNull() || !testTrack.isAvailable()) {
122  edm::LogInfo("") << "Track collection not found. Skipping cut on sumPt.";
123  } else {
124  double sumPt = 0;
125  for (auto iTrack = pv->tracks_begin(); iTrack != pv->tracks_end(); ++iTrack) {
126  const auto pt = (*iTrack)->pt();
127  sumPt += pt;
128  }
129  if (sumPt < minSumPt_)
130  continue;
131  }
132 
133  hPVx->Fill(pv->x(), pv->z());
134  hPVy->Fill(pv->y(), pv->z());
135 
136  //
137  // 3D fit section
138  //
139  // apply additional quality cut
141  continue;
142  // if store exceeds max. size: reduce size and apply new quality cut
143  if (pvStore_.size() >= maxNrVertices_) {
144  compressStore();
146  continue;
147  }
148  //
149  // copy PV to store
150  //
151  int bx = iEvent.bunchCrossing();
152  BeamSpotFitPVData pvData;
153  pvData.bunchCrossing = bx;
154  pvData.position[0] = pv->x();
155  pvData.position[1] = pv->y();
156  pvData.position[2] = pv->z();
157  pvData.posError[0] = pv->xError();
158  pvData.posError[1] = pv->yError();
159  pvData.posError[2] = pv->zError();
160  pvData.posCorr[0] = pv->covariance(0, 1) / pv->xError() / pv->yError();
161  pvData.posCorr[1] = pv->covariance(0, 2) / pv->xError() / pv->zError();
162  pvData.posCorr[2] = pv->covariance(1, 2) / pv->yError() / pv->zError();
163  pvStore_.push_back(pvData);
164 
165  if (ftree_ != nullptr) {
166  theBeamSpotTreeData_.run(iEvent.id().run());
170  ftree_->Fill();
171  }
172 
174  bxMap_[bx].push_back(pvData);
175  }
176  }
177 }
RunNumber_t run() const
Definition: EventID.h:38
double minSumPt_
Definition: PVFitter.h:154
void run(unsigned int run)
std::map< int, std::vector< BeamSpotFitPVData > > bxMap_
Definition: PVFitter.h:174
void compressStore()
reduce size of primary vertex cache by increasing quality limit
Definition: PVFitter.cc:461
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
double minVtxWgt_
Definition: PVFitter.h:149
bool useOnlyFirstPV_
Definition: PVFitter.h:135
double minVtxNdf_
Definition: PVFitter.h:146
int bunchCrossing() const
Definition: EventBase.h:64
edm::LuminosityBlockNumber_t luminosityBlock() const
Definition: EventBase.h:61
double dynamicQualityCut_
Definition: PVFitter.h:175
void bunchCrossing(unsigned int bunchCrossing)
void lumi(unsigned int lumi)
std::vector< BeamSpotFitPVData > pvStore_
Definition: PVFitter.h:173
BeamSpotTreeData theBeamSpotTreeData_
Definition: PVFitter.h:178
bool fFitPerBunchCrossing
Definition: PVFitter.h:134
TH2F * hPVy
Definition: PVFitter.h:159
def pv(vc)
Definition: MetAnalyzer.py:7
void pvData(const BeamSpotFitPVData &pvData)
TTree * ftree_
Definition: PVFitter.h:161
edm::EDGetTokenT< reco::VertexCollection > vertexToken_
Definition: PVFitter.h:141
double pvQuality(const reco::Vertex &pv) const
vertex quality measure
Definition: PVFitter.cc:492
unsigned int maxNrVertices_
Definition: PVFitter.h:144
unsigned int minVtxTracks_
Definition: PVFitter.h:148
TH2F * hPVx
Definition: PVFitter.h:158
edm::EventID id() const
Definition: EventBase.h:59
void PVFitter::resetAll ( )
inline

Definition at line 80 of file PVFitter.h.

References align::BeamSpot.

Referenced by BeamFitter::BeamFitter(), and AlcaBeamMonitor::dqmEndLuminosityBlock().

80  {
81  resetLSRange();
82  resetRefTime();
83  pvStore_.clear();
84  bxMap_.clear();
85  dynamicQualityCut_ = 1.e30;
86  hPVx->Reset();
87  hPVy->Reset();
89  fbspotMap.clear();
90  };
std::map< int, std::vector< BeamSpotFitPVData > > bxMap_
Definition: PVFitter.h:174
double dynamicQualityCut_
Definition: PVFitter.h:175
reco::BeamSpot fbeamspot
Definition: PVFitter.h:132
std::vector< BeamSpotFitPVData > pvStore_
Definition: PVFitter.h:173
void resetLSRange()
Definition: PVFitter.h:67
TH2F * hPVy
Definition: PVFitter.h:159
std::map< int, reco::BeamSpot > fbspotMap
Definition: PVFitter.h:133
void resetRefTime()
Definition: PVFitter.h:68
TH2F * hPVx
Definition: PVFitter.h:158
void PVFitter::resetLSRange ( )
inline

Definition at line 67 of file PVFitter.h.

int fbeginLumiOfFit
Definition: PVFitter.h:164
int fendLumiOfFit
Definition: PVFitter.h:165
void PVFitter::resetRefTime ( )
inline

Definition at line 68 of file PVFitter.h.

68 { freftime[0] = freftime[1] = 0; }
std::time_t freftime[2]
Definition: PVFitter.h:156
void PVFitter::resizepvStore ( unsigned int  rmSize)
inline

Definition at line 109 of file PVFitter.h.

References MetAnalyzer::pv().

109 { pvStore_.erase(pvStore_.begin(), pvStore_.begin() + rmSize); }
std::vector< BeamSpotFitPVData > pvStore_
Definition: PVFitter.h:173
bool PVFitter::runBXFitter ( )

Definition at line 184 of file PVFitter.cc.

References align::BeamSpot, bxMap_, errorScale_, fbeamspot, fbspotMap, fcn(), fwidthX, fwidthXerr, fwidthY, fwidthYerr, fwidthZ, fwidthZerr, genParticles_cff::map, makeMuonMisalignmentScenario::matrix, minNrVertices_, funct::pow(), reco::BeamSpot::setBeamWidthX(), reco::BeamSpot::setBeamWidthY(), FcnBeamSpotFitPV::setLimits(), reco::BeamSpot::setType(), sigmaCut_, findQualityFiles::size, and reco::BeamSpot::Tracker.

Referenced by BeamFitter::runPVandTrkFitter().

184  {
185  using namespace ROOT::Minuit2;
186  edm::LogInfo("PVFitter") << " Number of bunch crossings: " << bxMap_.size() << std::endl;
187 
188  bool fit_ok = true;
189 
190  for (std::map<int, std::vector<BeamSpotFitPVData> >::const_iterator pvStore = bxMap_.begin(); pvStore != bxMap_.end();
191  ++pvStore) {
192  // first set null beam spot in case
193  // fit fails
194  fbspotMap[pvStore->first] = reco::BeamSpot();
195 
196  edm::LogInfo("PVFitter") << " Number of PVs collected for PVFitter: " << (pvStore->second).size()
197  << " in bx: " << pvStore->first << std::endl;
198 
199  if ((pvStore->second).size() <= minNrVertices_) {
200  edm::LogWarning("PVFitter") << " not enough PVs, continue" << std::endl;
201  fit_ok = false;
202  continue;
203  }
204 
205  edm::LogInfo("PVFitter") << "Calculating beam spot with PVs ..." << std::endl;
206 
207  //
208  // LL function and fitter
209  //
210  FcnBeamSpotFitPV* fcn = new FcnBeamSpotFitPV(pvStore->second);
211  //
212  // fit parameters: positions, widths, x-y correlations, tilts in xz and yz
213  //
214  MnUserParameters upar;
215  upar.Add("x", 0., 0.02, -10., 10.); // 0
216  upar.Add("y", 0., 0.02, -10., 10.); // 1
217  upar.Add("z", 0., 0.20, -30., 30.); // 2
218  upar.Add("ex", 0.015, 0.01, 0., 10.); // 3
219  upar.Add("corrxy", 0., 0.02, -1., 1.); // 4
220  upar.Add("ey", 0.015, 0.01, 0., 10.); // 5
221  upar.Add("dxdz", 0., 0.0002, -0.1, 0.1); // 6
222  upar.Add("dydz", 0., 0.0002, -0.1, 0.1); // 7
223  upar.Add("ez", 1., 0.1, 0., 30.); // 8
224  upar.Add("scale", errorScale_, errorScale_ / 10., errorScale_ / 2., errorScale_ * 2.); // 9
225  MnMigrad migrad(*fcn, upar);
226 
227  //
228  // first iteration without correlations
229  //
230  upar.Fix(4);
231  upar.Fix(6);
232  upar.Fix(7);
233  upar.Fix(9);
234  FunctionMinimum ierr = migrad(0, 1.);
235  if (!ierr.IsValid()) {
236  edm::LogInfo("PVFitter") << "3D beam spot fit failed in 1st iteration" << std::endl;
237  fit_ok = false;
238  continue;
239  }
240  //
241  // refit with harder selection on vertices
242  //
243  fcn->setLimits(upar.Value(0) - sigmaCut_ * upar.Value(3),
244  upar.Value(0) + sigmaCut_ * upar.Value(3),
245  upar.Value(1) - sigmaCut_ * upar.Value(5),
246  upar.Value(1) + sigmaCut_ * upar.Value(5),
247  upar.Value(2) - sigmaCut_ * upar.Value(8),
248  upar.Value(2) + sigmaCut_ * upar.Value(8));
249  ierr = migrad(0, 1.);
250  if (!ierr.IsValid()) {
251  edm::LogInfo("PVFitter") << "3D beam spot fit failed in 2nd iteration" << std::endl;
252  fit_ok = false;
253  continue;
254  }
255  //
256  // refit with correlations
257  //
258  upar.Release(4);
259  upar.Release(6);
260  upar.Release(7);
261  ierr = migrad(0, 1.);
262  if (!ierr.IsValid()) {
263  edm::LogInfo("PVFitter") << "3D beam spot fit failed in 3rd iteration" << std::endl;
264  fit_ok = false;
265  continue;
266  }
267 
268  fwidthX = upar.Value(3);
269  fwidthY = upar.Value(5);
270  fwidthZ = upar.Value(8);
271  fwidthXerr = upar.Error(3);
272  fwidthYerr = upar.Error(5);
273  fwidthZerr = upar.Error(8);
274 
276  // need to get the full cov matrix
277  matrix(0, 0) = pow(upar.Error(0), 2);
278  matrix(1, 1) = pow(upar.Error(1), 2);
279  matrix(2, 2) = pow(upar.Error(2), 2);
280  matrix(3, 3) = fwidthZerr * fwidthZerr;
281  matrix(4, 4) = pow(upar.Error(6), 2);
282  matrix(5, 5) = pow(upar.Error(7), 2);
283  matrix(6, 6) = fwidthXerr * fwidthXerr;
284 
285  fbeamspot = reco::BeamSpot(reco::BeamSpot::Point(upar.Value(0), upar.Value(1), upar.Value(2)),
286  fwidthZ,
287  upar.Value(6),
288  upar.Value(7),
289  fwidthX,
290  matrix);
294 
295  fbspotMap[pvStore->first] = fbeamspot;
296  edm::LogInfo("PVFitter") << "3D PV fit done for this bunch crossing." << std::endl;
297  //delete fcn;
298  fit_ok = fit_ok & true;
299  }
300 
301  return fit_ok;
302 }
size
Write out results.
math::Error< dimension >::type CovarianceMatrix
Definition: BeamSpot.h:29
std::map< int, std::vector< BeamSpotFitPVData > > bxMap_
Definition: PVFitter.h:174
math::XYZPoint Point
point in the space
Definition: BeamSpot.h:27
double fwidthY
Definition: PVFitter.h:167
double errorScale_
Definition: PVFitter.h:152
double fwidthYerr
Definition: PVFitter.h:170
double fwidthZ
Definition: PVFitter.h:168
double fwidthXerr
Definition: PVFitter.h:169
void setType(BeamType type)
set beam type
Definition: BeamSpot.h:124
reco::BeamSpot fbeamspot
Definition: PVFitter.h:132
void setBeamWidthY(double v)
Definition: BeamSpot.h:105
std::map< int, reco::BeamSpot > fbspotMap
Definition: PVFitter.h:133
double fwidthZerr
Definition: PVFitter.h:171
void fcn(int &, double *, double &, double *, int)
unsigned int minNrVertices_
Definition: PVFitter.h:145
void setLimits(float xmin, float xmax, float ymin, float ymax, float zmin, float zmax)
double sigmaCut_
Definition: PVFitter.h:153
void setBeamWidthX(double v)
Definition: BeamSpot.h:104
double fwidthX
Definition: PVFitter.h:166
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:30
bool PVFitter::runFitter ( )

Definition at line 304 of file PVFitter.cc.

References align::BeamSpot, do3DFit_, MessageLogger_cfi::errors, errorScale_, fftjetvertexadder_cfi::errX, fftjetvertexadder_cfi::errY, fftjetvertexadder_cfi::errZ, fbeamspot, fcn(), fwidthX, fwidthXerr, fwidthY, fwidthYerr, fwidthZ, fwidthZerr, hPVx, hPVy, edm::isNotFinite(), makeMuonMisalignmentScenario::matrix, minNrVertices_, funct::pow(), pvStore_, bookConverter::results, reco::BeamSpot::setBeamWidthX(), reco::BeamSpot::setBeamWidthY(), FcnBeamSpotFitPV::setLimits(), reco::BeamSpot::setType(), sigmaCut_, str, AlCaHLTBitMon_QueryRunRegistry::string, and reco::BeamSpot::Tracker.

Referenced by AlcaBeamMonitor::dqmEndLuminosityBlock(), and BeamFitter::runPVandTrkFitter().

304  {
305  using namespace ROOT::Minuit2;
306  edm::LogInfo("PVFitter") << " Number of PVs collected for PVFitter: " << pvStore_.size() << std::endl;
307 
308  if (pvStore_.size() <= minNrVertices_)
309  return false;
310 
311  //need to create a unique histogram name to avoid ROOT trying to re-use one
312  // also tell ROOT to hide its global state
313  TDirectory::TContext guard{nullptr};
314  std::ostringstream str;
315  str << this;
316  std::unique_ptr<TH1D> h1PVx{hPVx->ProjectionX((std::string("h1PVx") + str.str()).c_str(), 0, -1, "e")};
317  std::unique_ptr<TH1D> h1PVy{hPVy->ProjectionX((std::string("h1PVy") + str.str()).c_str(), 0, -1, "e")};
318  std::unique_ptr<TH1D> h1PVz{hPVx->ProjectionY((std::string("h1PVz") + str.str()).c_str(), 0, -1, "e")};
319 
320  //Use our own copy for thread safety
321  // also do not add to global list of functions
322  TF1 gausx("localGausX", "gaus", 0., 1., TF1::EAddToList::kNo);
323  TF1 gausy("localGausY", "gaus", 0., 1., TF1::EAddToList::kNo);
324  TF1 gausz("localGausZ", "gaus", 0., 1., TF1::EAddToList::kNo);
325 
326  h1PVx->Fit(&gausx, "QLMN0 SERIAL");
327  h1PVy->Fit(&gausy, "QLMN0 SERIAL");
328  h1PVz->Fit(&gausz, "QLMN0 SERIAL");
329 
330  fwidthX = gausx.GetParameter(2);
331  fwidthY = gausy.GetParameter(2);
332  fwidthZ = gausz.GetParameter(2);
333  fwidthXerr = gausx.GetParError(2);
334  fwidthYerr = gausy.GetParError(2);
335  fwidthZerr = gausz.GetParError(2);
336 
337  double estX = gausx.GetParameter(1);
338  double estY = gausy.GetParameter(1);
339  double estZ = gausz.GetParameter(1);
340  double errX = fwidthX * 3.;
341  double errY = fwidthY * 3.;
342  double errZ = fwidthZ * 3.;
343 
344  if (!do3DFit_) {
346  matrix(2, 2) = gausz.GetParError(1) * gausz.GetParError(1);
347  matrix(3, 3) = fwidthZerr * fwidthZerr;
348  matrix(6, 6) = fwidthXerr * fwidthXerr;
349 
350  fbeamspot =
351  reco::BeamSpot(reco::BeamSpot::Point(gausx.GetParameter(1), gausy.GetParameter(1), gausz.GetParameter(1)),
352  fwidthZ,
353  0.,
354  0.,
355  fwidthX,
356  matrix);
360 
361  } else { // do 3D fit
362  //
363  // LL function and fitter
364  //
366  //
367  // fit parameters: positions, widths, x-y correlations, tilts in xz and yz
368  //
369  MnUserParameters upar;
370  upar.Add("x", estX, errX, -10., 10.); // 0
371  upar.Add("y", estY, errY, -10., 10.); // 1
372  upar.Add("z", estZ, errZ, -30., 30.); // 2
373  upar.Add("ex", 0.015, 0.01, 0., 10.); // 3
374  upar.Add("corrxy", 0., 0.02, -1., 1.); // 4
375  upar.Add("ey", 0.015, 0.01, 0., 10.); // 5
376  upar.Add("dxdz", 0., 0.0002, -0.1, 0.1); // 6
377  upar.Add("dydz", 0., 0.0002, -0.1, 0.1); // 7
378  upar.Add("ez", 1., 0.1, 0., 30.); // 8
379  upar.Add("scale", errorScale_, errorScale_ / 10., errorScale_ / 2., errorScale_ * 2.); // 9
380  MnMigrad migrad(*fcn, upar);
381  //
382  // first iteration without correlations
383  //
384  migrad.Fix(4);
385  migrad.Fix(6);
386  migrad.Fix(7);
387  migrad.Fix(9);
388  FunctionMinimum ierr = migrad(0, 1.);
389  if (!ierr.IsValid()) {
390  edm::LogWarning("PVFitter") << "3D beam spot fit failed in 1st iteration" << std::endl;
391  return false;
392  }
393  //
394  // refit with harder selection on vertices
395  //
396 
397  vector<double> results;
398  vector<double> errors;
399  results = ierr.UserParameters().Params();
400  errors = ierr.UserParameters().Errors();
401 
402  fcn->setLimits(results[0] - sigmaCut_ * results[3],
403  results[0] + sigmaCut_ * results[3],
404  results[1] - sigmaCut_ * results[5],
405  results[1] + sigmaCut_ * results[5],
406  results[2] - sigmaCut_ * results[8],
407  results[2] + sigmaCut_ * results[8]);
408  ierr = migrad(0, 1.);
409  if (!ierr.IsValid()) {
410  edm::LogWarning("PVFitter") << "3D beam spot fit failed in 2nd iteration" << std::endl;
411  return false;
412  }
413  //
414  // refit with correlations
415  //
416  migrad.Release(4);
417  migrad.Release(6);
418  migrad.Release(7);
419  ierr = migrad(0, 1.);
420  if (!ierr.IsValid()) {
421  edm::LogWarning("PVFitter") << "3D beam spot fit failed in 3rd iteration" << std::endl;
422  return false;
423  }
424 
425  results = ierr.UserParameters().Params();
426  errors = ierr.UserParameters().Errors();
427 
428  fwidthX = results[3];
429  fwidthY = results[5];
430  fwidthZ = results[8];
431  fwidthXerr = errors[3];
432  fwidthYerr = errors[5];
433  fwidthZerr = errors[8];
434 
435  // check errors on widths and sigmaZ for nan
436  if (edm::isNotFinite(fwidthXerr) || edm::isNotFinite(fwidthYerr) || edm::isNotFinite(fwidthZerr)) {
437  edm::LogWarning("PVFitter") << "3D beam spot fit returns nan in 3rd iteration" << std::endl;
438  return false;
439  }
440 
442  // need to get the full cov matrix
443  matrix(0, 0) = pow(errors[0], 2);
444  matrix(1, 1) = pow(errors[1], 2);
445  matrix(2, 2) = pow(errors[2], 2);
446  matrix(3, 3) = fwidthZerr * fwidthZerr;
447  matrix(6, 6) = fwidthXerr * fwidthXerr;
448 
450  reco::BeamSpot::Point(results[0], results[1], results[2]), fwidthZ, results[6], results[7], fwidthX, matrix);
454  }
455 
456  return true;
457 }
math::Error< dimension >::type CovarianceMatrix
Definition: BeamSpot.h:29
constexpr bool isNotFinite(T x)
Definition: isFinite.h:9
math::XYZPoint Point
point in the space
Definition: BeamSpot.h:27
double fwidthY
Definition: PVFitter.h:167
double errorScale_
Definition: PVFitter.h:152
bool do3DFit_
Definition: PVFitter.h:140
double fwidthYerr
Definition: PVFitter.h:170
double fwidthZ
Definition: PVFitter.h:168
double fwidthXerr
Definition: PVFitter.h:169
void setType(BeamType type)
set beam type
Definition: BeamSpot.h:124
reco::BeamSpot fbeamspot
Definition: PVFitter.h:132
std::vector< BeamSpotFitPVData > pvStore_
Definition: PVFitter.h:173
void setBeamWidthY(double v)
Definition: BeamSpot.h:105
TH2F * hPVy
Definition: PVFitter.h:159
double fwidthZerr
Definition: PVFitter.h:171
void fcn(int &, double *, double &, double *, int)
TH2F * hPVx
Definition: PVFitter.h:158
unsigned int minNrVertices_
Definition: PVFitter.h:145
void setLimits(float xmin, float xmax, float ymin, float ymax, float zmin, float zmax)
double sigmaCut_
Definition: PVFitter.h:153
void setBeamWidthX(double v)
Definition: BeamSpot.h:104
double fwidthX
Definition: PVFitter.h:166
#define str(s)
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:30
void PVFitter::setFitLSRange ( int  ls0,
int  ls1 
)
inline

Definition at line 74 of file PVFitter.h.

74  {
75  fbeginLumiOfFit = ls0;
76  fendLumiOfFit = ls1;
77  }
int fbeginLumiOfFit
Definition: PVFitter.h:164
int fendLumiOfFit
Definition: PVFitter.h:165
void PVFitter::setRefTime ( std::time_t  t0,
std::time_t  t1 
)
inline
void PVFitter::setTree ( TTree *  tree)

Definition at line 179 of file PVFitter.cc.

References BeamSpotTreeData::branch(), ftree_, theBeamSpotTreeData_, and MainPageGenerator::tree.

Referenced by BeamFitter::BeamFitter().

179  {
180  ftree_ = tree;
182 }
BeamSpotTreeData theBeamSpotTreeData_
Definition: PVFitter.h:178
TTree * ftree_
Definition: PVFitter.h:161
void branch(TTree *tree)

Member Data Documentation

std::map<int, std::vector<BeamSpotFitPVData> > PVFitter::bxMap_
private

Definition at line 174 of file PVFitter.h.

Referenced by readEvent(), and runBXFitter().

bool PVFitter::debug_
private

Definition at line 139 of file PVFitter.h.

Referenced by initialize().

bool PVFitter::do3DFit_
private

Definition at line 140 of file PVFitter.h.

Referenced by initialize(), and runFitter().

double PVFitter::dynamicQualityCut_
private

Definition at line 175 of file PVFitter.h.

Referenced by compressStore(), initialize(), and readEvent().

double PVFitter::errorScale_
private

Definition at line 152 of file PVFitter.h.

Referenced by initialize(), runBXFitter(), and runFitter().

std::ofstream PVFitter::fasciiFile
private

Definition at line 137 of file PVFitter.h.

reco::BeamSpot PVFitter::fbeamspot
private

Definition at line 132 of file PVFitter.h.

Referenced by runBXFitter(), and runFitter().

int PVFitter::fbeginLumiOfFit
private

Definition at line 164 of file PVFitter.h.

std::map<int, reco::BeamSpot> PVFitter::fbspotMap
private

Definition at line 133 of file PVFitter.h.

Referenced by runBXFitter().

int PVFitter::fendLumiOfFit
private

Definition at line 165 of file PVFitter.h.

bool PVFitter::fFitPerBunchCrossing
private

Definition at line 134 of file PVFitter.h.

Referenced by initialize(), and readEvent().

std::time_t PVFitter::freftime[2]
private

Definition at line 156 of file PVFitter.h.

TTree* PVFitter::ftree_
private

Definition at line 161 of file PVFitter.h.

Referenced by readEvent(), and setTree().

double PVFitter::fwidthX
private

Definition at line 166 of file PVFitter.h.

Referenced by runBXFitter(), and runFitter().

double PVFitter::fwidthXerr
private

Definition at line 169 of file PVFitter.h.

Referenced by runBXFitter(), and runFitter().

double PVFitter::fwidthY
private

Definition at line 167 of file PVFitter.h.

Referenced by runBXFitter(), and runFitter().

double PVFitter::fwidthYerr
private

Definition at line 170 of file PVFitter.h.

Referenced by runBXFitter(), and runFitter().

double PVFitter::fwidthZ
private

Definition at line 168 of file PVFitter.h.

Referenced by runBXFitter(), and runFitter().

double PVFitter::fwidthZerr
private

Definition at line 171 of file PVFitter.h.

Referenced by runBXFitter(), and runFitter().

TH2F* PVFitter::hPVx
private

Definition at line 158 of file PVFitter.h.

Referenced by initialize(), readEvent(), and runFitter().

TH2F* PVFitter::hPVy
private

Definition at line 159 of file PVFitter.h.

Referenced by initialize(), readEvent(), and runFitter().

unsigned int PVFitter::maxNrVertices_
private

Definition at line 144 of file PVFitter.h.

Referenced by initialize(), and readEvent().

double PVFitter::maxVtxNormChi2_
private

Definition at line 147 of file PVFitter.h.

Referenced by initialize().

double PVFitter::maxVtxR_
private

Definition at line 150 of file PVFitter.h.

Referenced by initialize().

double PVFitter::maxVtxZ_
private

Definition at line 151 of file PVFitter.h.

Referenced by initialize().

unsigned int PVFitter::minNrVertices_
private

Definition at line 145 of file PVFitter.h.

Referenced by initialize(), runBXFitter(), and runFitter().

double PVFitter::minSumPt_
private

Definition at line 154 of file PVFitter.h.

Referenced by initialize(), and readEvent().

double PVFitter::minVtxNdf_
private

Definition at line 146 of file PVFitter.h.

Referenced by initialize(), and readEvent().

unsigned int PVFitter::minVtxTracks_
private

Definition at line 148 of file PVFitter.h.

Referenced by initialize(), and readEvent().

double PVFitter::minVtxWgt_
private

Definition at line 149 of file PVFitter.h.

Referenced by initialize(), and readEvent().

std::map<int, int> PVFitter::npvsmap_
private

Definition at line 131 of file PVFitter.h.

std::string PVFitter::outputTxt_
private

Definition at line 142 of file PVFitter.h.

std::vector<double> PVFitter::pvQualities_
private

Definition at line 176 of file PVFitter.h.

Referenced by compressStore().

std::vector<BeamSpotFitPVData> PVFitter::pvStore_
private

Definition at line 173 of file PVFitter.h.

Referenced by compressStore(), readEvent(), and runFitter().

double PVFitter::sigmaCut_
private

Definition at line 153 of file PVFitter.h.

Referenced by initialize(), runBXFitter(), and runFitter().

BeamSpotTreeData PVFitter::theBeamSpotTreeData_
private

Definition at line 178 of file PVFitter.h.

Referenced by readEvent(), and setTree().

bool PVFitter::useOnlyFirstPV_
private

Definition at line 135 of file PVFitter.h.

Referenced by initialize(), and readEvent().

edm::EDGetTokenT<reco::VertexCollection> PVFitter::vertexToken_
private

Definition at line 141 of file PVFitter.h.

Referenced by initialize(), and readEvent().