CMS 3D CMS Logo

List of all members | Classes | Public Member Functions | Private Attributes
DAClusterizerInZ_vect Class Referencefinal

#include <DAClusterizerInZ_vect.h>

Inheritance diagram for DAClusterizerInZ_vect:
TrackClusterizerInZ

Classes

struct  track_t
 
struct  vertex_t
 

Public Member Functions

double beta0 (const double betamax, track_t const &tks, vertex_t const &y) const
 
std::vector< std::vector< reco::TransientTrack > > clusterize (const std::vector< reco::TransientTrack > &tracks) const override
 
 DAClusterizerInZ_vect (const edm::ParameterSet &conf)
 
void dump (const double beta, const vertex_t &y, const track_t &tks, const int verbosity=0) const
 
track_t fill (const std::vector< reco::TransientTrack > &tracks) const
 
bool merge (vertex_t &y, double &beta) const
 
bool purge (vertex_t &, track_t &, double &, const double) const
 
bool split (const double beta, track_t &t, vertex_t &y, double threshold=1.) const
 
void splitAll (vertex_t &y) const
 
double update (double beta, track_t &gtracks, vertex_t &gvertices, bool useRho0, const double &rho0) const
 
std::vector< TransientVertexvertices (const std::vector< reco::TransientTrack > &tracks, const int verbosity=0) const
 
- Public Member Functions inherited from TrackClusterizerInZ
 TrackClusterizerInZ ()
 
 TrackClusterizerInZ (const edm::ParameterSet &conf)
 
virtual ~TrackClusterizerInZ ()
 

Private Attributes

double betamax_
 
double betapurge_
 
double betastop_
 
double coolingFactor_
 
double d0CutOff_
 
double dzCutOff_
 
int maxIterations_
 
double mintrkweight_
 
double uniquetrkweight_
 
bool useTc_
 
bool verbose_
 
double vertexSize_
 
double zdumpcenter_
 
double zdumpwidth_
 
double zmerge_
 

Detailed Description

Description: separates event tracks into clusters along the beam line

Version which auto-vectorizes with gcc 4.6 or newer

Definition at line 20 of file DAClusterizerInZ_vect.h.

Constructor & Destructor Documentation

DAClusterizerInZ_vect::DAClusterizerInZ_vect ( const edm::ParameterSet conf)

Definition at line 15 of file DAClusterizerInZ_vect.cc.

References gather_cfg::cout, edm::ParameterSet::getParameter(), edm::ParameterSet::getUntrackedParameter(), mps_fire::i, SiStripPI::max, HLT_2018_cff::Tmin, HLT_2018_cff::Tpurge, and HLT_2018_cff::Tstop.

15  {
16  // hardcoded parameters
17  maxIterations_ = 100;
18  mintrkweight_ = 0.5; // conf.getParameter<double>("mintrkweight");
19 
20  // configurable debug outptut debug output
21  verbose_ = conf.getUntrackedParameter<bool>("verbose", false);
22  zdumpcenter_ = conf.getUntrackedParameter<double>("zdumpcenter", 0.);
23  zdumpwidth_ = conf.getUntrackedParameter<double>("zdumpwidth", 20.);
24 
25  // configurable parameters
26  double Tmin = conf.getParameter<double>("Tmin");
27  double Tpurge = conf.getParameter<double>("Tpurge");
28  double Tstop = conf.getParameter<double>("Tstop");
29  vertexSize_ = conf.getParameter<double>("vertexSize");
30  coolingFactor_ = conf.getParameter<double>("coolingFactor");
31  useTc_ = true;
32  if (coolingFactor_ < 0) {
34  useTc_ = false;
35  }
36  d0CutOff_ = conf.getParameter<double>("d0CutOff");
37  dzCutOff_ = conf.getParameter<double>("dzCutOff");
38  uniquetrkweight_ = conf.getParameter<double>("uniquetrkweight");
39  zmerge_ = conf.getParameter<double>("zmerge");
40 
41  if (verbose_) {
42  std::cout << "DAClusterizerinZ_vect: mintrkweight = " << mintrkweight_ << std::endl;
43  std::cout << "DAClusterizerinZ_vect: uniquetrkweight = " << uniquetrkweight_ << std::endl;
44  std::cout << "DAClusterizerinZ_vect: zmerge = " << zmerge_ << std::endl;
45  std::cout << "DAClusterizerinZ_vect: Tmin = " << Tmin << std::endl;
46  std::cout << "DAClusterizerinZ_vect: Tpurge = " << Tpurge << std::endl;
47  std::cout << "DAClusterizerinZ_vect: Tstop = " << Tstop << std::endl;
48  std::cout << "DAClusterizerinZ_vect: vertexSize = " << vertexSize_ << std::endl;
49  std::cout << "DAClusterizerinZ_vect: coolingFactor = " << coolingFactor_ << std::endl;
50  std::cout << "DAClusterizerinZ_vect: d0CutOff = " << d0CutOff_ << std::endl;
51  std::cout << "DAClusterizerinZ_vect: dzCutOff = " << dzCutOff_ << std::endl;
52  }
53 
54  if (Tmin == 0) {
55  edm::LogWarning("DAClusterizerinZ_vectorized")
56  << "DAClusterizerInZ: invalid Tmin" << Tmin << " reset do default " << 1. / betamax_;
57  } else {
58  betamax_ = 1. / Tmin;
59  }
60 
61  if ((Tpurge > Tmin) || (Tpurge == 0)) {
62  edm::LogWarning("DAClusterizerinZ_vectorized")
63  << "DAClusterizerInZ: invalid Tpurge" << Tpurge << " set to " << Tmin;
64  Tpurge = Tmin;
65  }
66  betapurge_ = 1. / Tpurge;
67 
68  if ((Tstop > Tpurge) || (Tstop == 0)) {
69  edm::LogWarning("DAClusterizerinZ_vectorized")
70  << "DAClusterizerInZ: invalid Tstop" << Tstop << " set to " << max(1., Tpurge);
71  Tstop = max(1., Tpurge);
72  }
73  betastop_ = 1. / Tstop;
74 }
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const

Member Function Documentation

double DAClusterizerInZ_vect::beta0 ( const double  betamax,
track_t const &  tks,
vertex_t const &  y 
) const

Definition at line 345 of file DAClusterizerInZ_vect.cc.

References DAClusterizerInZ_vect::track_t::_dz2, DAClusterizerInZ_vect::track_t::_pi, DAClusterizerInZ_vect::track_t::_z, DAClusterizerInZ_vect::vertex_t::_z, a, b, gather_cfg::cout, PVValHelper::dx, DAClusterizerInZ_vect::track_t::GetSize(), DAClusterizerInZ_vect::vertex_t::GetSize(), mps_fire::i, createfilelist::int, dqmdumpme::k, dqm-mbProfile::log, nt, funct::pow(), and w.

345  {
346  double T0 = 0; // max Tc for beta=0
347  // estimate critical temperature from beta=0 (T=inf)
348  const unsigned int nt = tks.GetSize();
349  const unsigned int nv = y.GetSize();
350 
351  for (unsigned int k = 0; k < nv; k++) {
352  // vertex fit at T=inf
353  double sumwz = 0;
354  double sumw = 0;
355  for (unsigned int i = 0; i < nt; i++) {
356  double w = tks._pi[i] * tks._dz2[i];
357  sumwz += w * tks._z[i];
358  sumw += w;
359  }
360  y._z[k] = sumwz / sumw;
361 
362  // estimate Tcrit, eventually do this in the same loop
363  double a = 0, b = 0;
364  for (unsigned int i = 0; i < nt; i++) {
365  double dx = tks._z[i] - y._z[k];
366  double w = tks._pi[i] * tks._dz2[i];
367  a += w * std::pow(dx, 2) * tks._dz2[i];
368  b += w;
369  }
370  double Tc = 2. * a / b; // the critical temperature of this vertex
371  if (Tc > T0)
372  T0 = Tc;
373  } // vertex loop (normally there should be only one vertex at beta=0)
374 
375  if (verbose_) {
376  std::cout << "DAClustrizerInZ_vect.beta0: Tc = " << T0 << std::endl;
377  int coolingsteps = 1 - int(std::log(T0 * betamax) / std::log(coolingFactor_));
378  std::cout << "DAClustrizerInZ_vect.beta0: nstep = " << coolingsteps << std::endl;
379  }
380 
381  if (T0 > 1. / betamax) {
382  return betamax / std::pow(coolingFactor_, int(std::log(T0 * betamax) / std::log(coolingFactor_)) - 1);
383  } else {
384  // ensure at least one annealing step
385  return betamax * coolingFactor_;
386  }
387 }
const double w
Definition: UKUtility.cc:23
int nt
Definition: AMPTWrapper.h:42
double b
Definition: hdecay.h:118
double a
Definition: hdecay.h:119
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:30
vector< vector< reco::TransientTrack > > DAClusterizerInZ_vect::clusterize ( const std::vector< reco::TransientTrack > &  tracks) const
overridevirtual

Implements TrackClusterizerInZ.

Definition at line 731 of file DAClusterizerInZ_vect.cc.

References funct::abs(), bsc_activity_cfg::clusters, gather_cfg::cout, mps_fire::i, dqmdumpme::k, eostools::move(), position, MetAnalyzer::pv(), and pwdgSkimBPark_cfi::vertices.

732  {
733  if (verbose_) {
734  std::cout << "###################################################" << endl;
735  std::cout << "# vectorized DAClusterizerInZ_vect::clusterize nt=" << tracks.size() << endl;
736  std::cout << "###################################################" << endl;
737  }
738 
739  vector<vector<reco::TransientTrack> > clusters;
740  vector<TransientVertex>&& pv = vertices(tracks);
741 
742  if (verbose_) {
743  std::cout << "# DAClusterizerInZ::clusterize pv.size=" << pv.size() << endl;
744  }
745  if (pv.empty()) {
746  return clusters;
747  }
748 
749  // fill into clusters and merge
750  vector<reco::TransientTrack> aCluster = pv.begin()->originalTracks();
751 
752  for (auto k = pv.begin() + 1; k != pv.end(); k++) {
753  if (std::abs(k->position().z() - (k - 1)->position().z()) > (2 * vertexSize_)) {
754  // close a cluster
755  if (aCluster.size() > 1) {
756  clusters.push_back(aCluster);
757  } else {
758  if (verbose_) {
759  std::cout << " one track cluster at " << k->position().z() << " suppressed" << std::endl;
760  }
761  }
762  aCluster.clear();
763  }
764  for (unsigned int i = 0; i < k->originalTracks().size(); i++) {
765  aCluster.push_back(k->originalTracks()[i]);
766  }
767  }
768  clusters.emplace_back(std::move(aCluster));
769 
770  return clusters;
771 }
def pv(vc)
Definition: MetAnalyzer.py:7
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
std::vector< TransientVertex > vertices(const std::vector< reco::TransientTrack > &tracks, const int verbosity=0) const
static int position[264][3]
Definition: ReadPGInfo.cc:289
def move(src, dest)
Definition: eostools.py:511
void DAClusterizerInZ_vect::dump ( const double  beta,
const vertex_t y,
const track_t tks,
const int  verbosity = 0 
) const

Definition at line 773 of file DAClusterizerInZ_vect.cc.

References DAClusterizerInZ_vect::track_t::_dz2, DAClusterizerInZ_vect::track_t::_pi, DAClusterizerInZ_vect::vertex_t::_pk, DAClusterizerInZ_vect::vertex_t::_sw, DAClusterizerInZ_vect::vertex_t::_swE, DAClusterizerInZ_vect::track_t::_z, DAClusterizerInZ_vect::vertex_t::_z, DAClusterizerInZ_vect::track_t::_Z_sum, a, b, zMuMuMuonUserData::beta, gather_cfg::cout, TauDecayModes::dec, Measurement1D::error(), JetChargeProducer_cfi::exp, F(), alignBH_cfg::fixed, DAClusterizerInZ_vect::track_t::GetSize(), DAClusterizerInZ_vect::vertex_t::GetSize(), reco::TrackBase::highPurity, mps_fire::i, listHistos::IP, dqmiolumiharvest::j, dqm-mbProfile::log, reco::HitPattern::MISSING_OUTER_HITS, nt, AlCaHLTBitMon_ParallelJobs::p, GeomDetEnumerators::PixelBarrel, mathSSE::sqrt(), DAClusterizerInZ_vect::track_t::tt, and Measurement1D::value().

773  {
774  const unsigned int nv = y.GetSize();
775  const unsigned int nt = tks.GetSize();
776 
777  std::vector<unsigned int> iz;
778  for (unsigned int j = 0; j < nt; j++) {
779  iz.push_back(j);
780  }
781  std::sort(iz.begin(), iz.end(), [tks](unsigned int a, unsigned int b) { return tks._z[a] < tks._z[b]; });
782  std::cout << std::endl;
783  std::cout << "-----DAClusterizerInZ::dump ----" << nv << " clusters " << std::endl;
784  std::cout << " z= ";
785  std::cout << setprecision(4);
786  for (unsigned int ivertex = 0; ivertex < nv; ++ivertex) {
787  if (std::fabs(y._z[ivertex] - zdumpcenter_) < zdumpwidth_) {
788  std::cout << setw(8) << fixed << y._z[ivertex];
789  }
790  }
791  std::cout << endl
792  << "T=" << setw(15) << 1. / beta << " Tmin =" << setw(10) << 1. / betamax_
793  << " Tc= ";
794  for (unsigned int ivertex = 0; ivertex < nv; ++ivertex) {
795  if (std::fabs(y._z[ivertex] - zdumpcenter_) < zdumpwidth_) {
796  double Tc = 2 * y._swE[ivertex] / y._sw[ivertex];
797  std::cout << setw(8) << fixed << setprecision(1) << Tc;
798  }
799  }
800  std::cout << endl;
801 
802  std::cout << " pk= ";
803  double sumpk = 0;
804  for (unsigned int ivertex = 0; ivertex < nv; ++ivertex) {
805  sumpk += y._pk[ivertex];
806  if (std::fabs(y._z[ivertex] - zdumpcenter_) > zdumpwidth_)
807  continue;
808  std::cout << setw(8) << setprecision(4) << fixed << y._pk[ivertex];
809  }
810  std::cout << endl;
811 
812  std::cout << " nt= ";
813  for (unsigned int ivertex = 0; ivertex < nv; ++ivertex) {
814  sumpk += y._pk[ivertex];
815  if (std::fabs(y._z[ivertex] - zdumpcenter_) > zdumpwidth_)
816  continue;
817  std::cout << setw(8) << setprecision(1) << fixed << y._pk[ivertex] * nt;
818  }
819  std::cout << endl;
820 
821  if (verbosity > 0) {
822  double E = 0, F = 0;
823  std::cout << endl;
824  std::cout << "---- z +/- dz ip +/-dip pt phi eta weights ----" << endl;
825  std::cout << setprecision(4);
826  for (unsigned int i0 = 0; i0 < nt; i0++) {
827  unsigned int i = iz[i0];
828  if (tks._Z_sum[i] > 0) {
829  F -= std::log(tks._Z_sum[i]) / beta;
830  }
831  double tz = tks._z[i];
832 
833  if (std::fabs(tz - zdumpcenter_) > zdumpwidth_)
834  continue;
835  std::cout << setw(4) << i << ")" << setw(8) << fixed << setprecision(4) << tz << " +/-" << setw(6)
836  << sqrt(1. / tks._dz2[i]);
837 
838  if (tks.tt[i]->track().quality(reco::TrackBase::highPurity)) {
839  std::cout << " *";
840  } else {
841  std::cout << " ";
842  }
843  if (tks.tt[i]->track().hitPattern().hasValidHitInPixelLayer(PixelSubdetector::SubDetector::PixelBarrel, 1)) {
844  std::cout << "+";
845  } else {
846  std::cout << "-";
847  }
848  std::cout << setw(1)
849  << tks.tt[i]
850  ->track()
851  .hitPattern()
852  .pixelBarrelLayersWithMeasurement(); // see DataFormats/TrackReco/interface/HitPattern.h
853  std::cout << setw(1) << tks.tt[i]->track().hitPattern().pixelEndcapLayersWithMeasurement();
854  std::cout << setw(1) << hex
855  << tks.tt[i]->track().hitPattern().trackerLayersWithMeasurement() -
856  tks.tt[i]->track().hitPattern().pixelLayersWithMeasurement()
857  << dec;
858  std::cout << "=" << setw(1) << hex
859  << tks.tt[i]->track().hitPattern().numberOfLostHits(reco::HitPattern::MISSING_OUTER_HITS) << dec;
860 
861  Measurement1D IP = tks.tt[i]->stateAtBeamLine().transverseImpactParameter();
862  std::cout << setw(8) << IP.value() << "+/-" << setw(6) << IP.error();
863  std::cout << " " << setw(6) << setprecision(2) << tks.tt[i]->track().pt() * tks.tt[i]->track().charge();
864  std::cout << " " << setw(5) << setprecision(2) << tks.tt[i]->track().phi() << " " << setw(5) << setprecision(2)
865  << tks.tt[i]->track().eta();
866 
867  double sump = 0.;
868  for (unsigned int ivertex = 0; ivertex < nv; ++ivertex) {
869  if (std::fabs(y._z[ivertex] - zdumpcenter_) > zdumpwidth_)
870  continue;
871 
872  if ((tks._pi[i] > 0) && (tks._Z_sum[i] > 0)) {
873  //double p=pik(beta,tks[i],*k);
874  double p = y._pk[ivertex] * exp(-beta * Eik(tks._z[i], y._z[ivertex], tks._dz2[i])) / tks._Z_sum[i];
875  if (p > 0.0001) {
876  std::cout << setw(8) << setprecision(3) << p;
877  } else {
878  std::cout << " . ";
879  }
880  E += p * Eik(tks._z[i], y._z[ivertex], tks._dz2[i]);
881  sump += p;
882  } else {
883  std::cout << " ";
884  }
885  }
886  std::cout << endl;
887  }
888  std::cout << endl
889  << "T=" << 1 / beta << " E=" << E << " n=" << y.GetSize() << " F= " << F << endl
890  << "----------" << endl;
891  }
892 }
double error() const
Definition: Measurement1D.h:27
T sqrt(T t)
Definition: SSEVec.h:19
int nt
Definition: AMPTWrapper.h:42
double b
Definition: hdecay.h:118
double value() const
Definition: Measurement1D.h:25
double a
Definition: hdecay.h:119
static uInt32 F(BLOWFISH_CTX *ctx, uInt32 x)
Definition: blowfish.cc:163
DAClusterizerInZ_vect::track_t DAClusterizerInZ_vect::fill ( const std::vector< reco::TransientTrack > &  tracks) const

Definition at line 87 of file DAClusterizerInZ_vect.cc.

References DAClusterizerInZ_vect::track_t::AddItem(), HLT_2018_cff::atIP, pwdgSkimBPark_cfi::beamSpot, reco::BeamSpot::BeamWidthX(), reco::BeamSpot::BeamWidthY(), gather_cfg::cout, geometryDiff::epsilon, Measurement1D::error(), DAClusterizerInZ_vect::track_t::ExtractRaw(), DAClusterizerInZ_vect::track_t::GetSize(), edm::isNotFinite(), LogTrace, min(), position, funct::pow(), AlignmentPI::t_z, and Measurement1D::value().

87  {
88  // prepare track data for clustering
89  track_t tks;
90  for (auto it = tracks.begin(); it != tracks.end(); it++) {
91  if (!(*it).isValid())
92  continue;
93  double t_pi = 1.;
94  double t_z = ((*it).stateAtBeamLine().trackStateAtPCA()).position().z();
95  if (std::fabs(t_z) > 1000.)
96  continue;
97  auto const& t_mom = (*it).stateAtBeamLine().trackStateAtPCA().momentum();
98  // get the beam-spot
99  reco::BeamSpot beamspot = (it->stateAtBeamLine()).beamSpot();
100  double t_dz2 = std::pow((*it).track().dzError(), 2) // track errror
101  + (std::pow(beamspot.BeamWidthX() * t_mom.x(), 2) + std::pow(beamspot.BeamWidthY() * t_mom.y(), 2)) *
102  std::pow(t_mom.z(), 2) / std::pow(t_mom.perp2(), 2) // beam spot width
103  + std::pow(vertexSize_, 2); // intrinsic vertex size, safer for outliers and short lived decays
104  t_dz2 = 1. / t_dz2;
105  if (edm::isNotFinite(t_dz2) || t_dz2 < std::numeric_limits<double>::min())
106  continue;
107  if (d0CutOff_ > 0) {
108  Measurement1D atIP = (*it).stateAtBeamLine().transverseImpactParameter(); // error contains beamspot
109  t_pi = 1. / (1. + local_exp(std::pow(atIP.value() / atIP.error(), 2) -
110  std::pow(d0CutOff_, 2))); // reduce weight for high ip tracks
112  continue; // usually is > 0.99
113  }
114  LogTrace("DAClusterizerinZ_vectorized") << t_z << ' ' << t_dz2 << ' ' << t_pi;
115  tks.AddItem(t_z, t_dz2, &(*it), t_pi);
116  }
117  tks.ExtractRaw();
118 
119  if (verbose_) {
120  std::cout << "Track count " << tks.GetSize() << std::endl;
121  }
122 
123  return tks;
124 }
constexpr bool isNotFinite(T x)
Definition: isFinite.h:9
double error() const
Definition: Measurement1D.h:27
double BeamWidthX() const
beam width X
Definition: BeamSpot.h:82
T min(T a, T b)
Definition: MathUtil.h:58
#define LogTrace(id)
double BeamWidthY() const
beam width Y
Definition: BeamSpot.h:84
double value() const
Definition: Measurement1D.h:25
static int position[264][3]
Definition: ReadPGInfo.cc:289
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:30
bool DAClusterizerInZ_vect::merge ( vertex_t y,
double &  beta 
) const

Definition at line 253 of file DAClusterizerInZ_vect.cc.

References DAClusterizerInZ_vect::vertex_t::_pk, DAClusterizerInZ_vect::vertex_t::_sw, DAClusterizerInZ_vect::vertex_t::_swE, DAClusterizerInZ_vect::vertex_t::_z, gather_cfg::cout, hlt_jetmet_dqm_QT_fromfile_cfg::critical, DAClusterizerInZ_vect::vertex_t::GetSize(), dqmdumpme::k, funct::pow(), and DAClusterizerInZ_vect::vertex_t::RemoveItem().

253  {
254  // merge clusters that collapsed or never separated,
255  // only merge if the estimated critical temperature of the merged vertex is below the current temperature
256  // return true if vertices were merged, false otherwise
257  const unsigned int nv = y.GetSize();
258 
259  if (nv < 2)
260  return false;
261 
262  // merge the smallest distance clusters first
263  std::vector<std::pair<double, unsigned int> > critical;
264  for (unsigned int k = 0; (k + 1) < nv; k++) {
265  if (std::fabs(y._z[k + 1] - y._z[k]) < zmerge_) {
266  critical.push_back(make_pair(std::fabs(y._z[k + 1] - y._z[k]), k));
267  }
268  }
269  if (critical.empty())
270  return false;
271 
272  std::stable_sort(critical.begin(), critical.end(), std::less<std::pair<double, unsigned int> >());
273 
274  for (unsigned int ik = 0; ik < critical.size(); ik++) {
275  unsigned int k = critical[ik].second;
276  double rho = y._pk[k] + y._pk[k + 1];
277  double swE = y._swE[k] + y._swE[k + 1] - y._pk[k] * y._pk[k + 1] / rho * std::pow(y._z[k + 1] - y._z[k], 2);
278  double Tc = 2 * swE / (y._sw[k] + y._sw[k + 1]);
279 
280  if (Tc * beta < 1) {
281  if (verbose_) {
282  std::cout << "merging " << y._z[k + 1] << " and " << y._z[k] << " Tc = " << Tc
283  << " sw = " << y._sw[k] + y._sw[k + 1] << std::endl;
284  }
285  if (rho > 0) {
286  y._z[k] = (y._pk[k] * y._z[k] + y._pk[k + 1] * y._z[k + 1]) / rho;
287  } else {
288  y._z[k] = 0.5 * (y._z[k] + y._z[k + 1]);
289  }
290  y._pk[k] = rho;
291  y._sw[k] += y._sw[k + 1];
292  y._swE[k] = swE;
293  y.RemoveItem(k + 1);
294  return true;
295  }
296  }
297 
298  return false;
299 }
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:30
bool DAClusterizerInZ_vect::purge ( vertex_t y,
track_t tks,
double &  rho0,
const double  beta 
) const

Definition at line 301 of file DAClusterizerInZ_vect.cc.

References DAClusterizerInZ_vect::track_t::_dz2, DAClusterizerInZ_vect::track_t::_pi, DAClusterizerInZ_vect::vertex_t::_pk, DAClusterizerInZ_vect::track_t::_z, DAClusterizerInZ_vect::vertex_t::_z, DAClusterizerInZ_vect::track_t::_Z_sum, gather_cfg::cout, DAClusterizerInZ_vect::track_t::GetSize(), DAClusterizerInZ_vect::vertex_t::GetSize(), mps_fire::i, dqmdumpme::k, reco::ParticleMasses::k0, nt, AlCaHLTBitMon_ParallelJobs::p, and DAClusterizerInZ_vect::vertex_t::RemoveItem().

301  {
302  // eliminate clusters with only one significant/unique track
303  const unsigned int nv = y.GetSize();
304  const unsigned int nt = tks.GetSize();
305 
306  if (nv < 2)
307  return false;
308 
309  double sumpmin = nt;
310  unsigned int k0 = nv;
311 
312  for (unsigned int k = 0; k < nv; k++) {
313  int nUnique = 0;
314  double sump = 0;
315 
316  double pmax = y._pk[k] / (y._pk[k] + rho0 * local_exp(-beta * dzCutOff_ * dzCutOff_));
317  for (unsigned int i = 0; i < nt; i++) {
318  if (tks._Z_sum[i] > 1.e-100) {
319  double p = y._pk[k] * local_exp(-beta * Eik(tks._z[i], y._z[k], tks._dz2[i])) / tks._Z_sum[i];
320  sump += p;
321  if ((p > uniquetrkweight_ * pmax) && (tks._pi[i] > 0)) {
322  nUnique++;
323  }
324  }
325  }
326 
327  if ((nUnique < 2) && (sump < sumpmin)) {
328  sumpmin = sump;
329  k0 = k;
330  }
331  }
332 
333  if (k0 != nv) {
334  if (verbose_) {
335  std::cout << "eliminating prototype at " << std::setw(10) << std::setprecision(4) << y._z[k0]
336  << " with sump=" << sumpmin << " rho*nt =" << y._pk[k0] * nt << endl;
337  }
338  y.RemoveItem(k0);
339  return true;
340  } else {
341  return false;
342  }
343 }
int nt
Definition: AMPTWrapper.h:42
bool DAClusterizerInZ_vect::split ( const double  beta,
track_t t,
vertex_t y,
double  threshold = 1. 
) const

Definition at line 389 of file DAClusterizerInZ_vect.cc.

References DAClusterizerInZ_vect::track_t::_dz2, DAClusterizerInZ_vect::track_t::_pi, DAClusterizerInZ_vect::vertex_t::_pk, DAClusterizerInZ_vect::vertex_t::_sw, DAClusterizerInZ_vect::vertex_t::_swE, DAClusterizerInZ_vect::track_t::_z, DAClusterizerInZ_vect::vertex_t::_z, DAClusterizerInZ_vect::track_t::_Z_sum, gather_cfg::cout, hlt_jetmet_dqm_QT_fromfile_cfg::critical, MillePedeFileConverter_cfg::e, geometryDiff::epsilon, alignBH_cfg::fixed, DAClusterizerInZ_vect::track_t::GetSize(), DAClusterizerInZ_vect::vertex_t::GetSize(), mps_fire::i, DAClusterizerInZ_vect::vertex_t::InsertItem(), dqmdumpme::k, nt, AlCaHLTBitMon_ParallelJobs::p, p1, p2, edm::second(), cms::dd::split(), mathSSE::sqrt(), OrderedSet::t, w, w2, and testProducerWithPsetDescEmpty_cfi::z2.

389  {
390  // split only critical vertices (Tc >~ T=1/beta <==> beta*Tc>~1)
391  // an update must have been made just before doing this (same beta, no merging)
392  // returns true if at least one cluster was split
393 
394  double epsilon = 1e-3; // minimum split size
395  unsigned int nv = y.GetSize();
396 
397  // avoid left-right biases by splitting highest Tc first
398 
399  std::vector<std::pair<double, unsigned int> > critical;
400  for (unsigned int k = 0; k < nv; k++) {
401  double Tc = 2 * y._swE[k] / y._sw[k];
402  if (beta * Tc > threshold) {
403  critical.push_back(make_pair(Tc, k));
404  }
405  }
406  if (critical.empty())
407  return false;
408 
409  std::stable_sort(critical.begin(), critical.end(), std::greater<std::pair<double, unsigned int> >());
410 
411  bool split = false;
412  const unsigned int nt = tks.GetSize();
413 
414  for (unsigned int ic = 0; ic < critical.size(); ic++) {
415  unsigned int k = critical[ic].second;
416 
417  // estimate subcluster positions and weight
418  double p1 = 0, z1 = 0, w1 = 0;
419  double p2 = 0, z2 = 0, w2 = 0;
420  for (unsigned int i = 0; i < nt; i++) {
421  if (tks._Z_sum[i] > 1.e-100) {
422  // winner-takes-all, usually overestimates splitting
423  double tl = tks._z[i] < y._z[k] ? 1. : 0.;
424  double tr = 1. - tl;
425 
426  // soften it, especially at low T
427  double arg = (tks._z[i] - y._z[k]) * sqrt(beta * tks._dz2[i]);
428  if (std::fabs(arg) < 20) {
429  double t = local_exp(-arg);
430  tl = t / (t + 1.);
431  tr = 1 / (t + 1.);
432  }
433 
434  double p = y._pk[k] * tks._pi[i] * local_exp(-beta * Eik(tks._z[i], y._z[k], tks._dz2[i])) / tks._Z_sum[i];
435  double w = p * tks._dz2[i];
436  p1 += p * tl;
437  z1 += w * tl * tks._z[i];
438  w1 += w * tl;
439  p2 += p * tr;
440  z2 += w * tr * tks._z[i];
441  w2 += w * tr;
442  }
443  }
444 
445  if (w1 > 0) {
446  z1 = z1 / w1;
447  } else {
448  z1 = y._z[k] - epsilon;
449  }
450  if (w2 > 0) {
451  z2 = z2 / w2;
452  } else {
453  z2 = y._z[k] + epsilon;
454  }
455 
456  // reduce split size if there is not enough room
457  if ((k > 0) && (z1 < (0.6 * y._z[k] + 0.4 * y._z[k - 1]))) {
458  z1 = 0.6 * y._z[k] + 0.4 * y._z[k - 1];
459  }
460  if ((k + 1 < nv) && (z2 > (0.6 * y._z[k] + 0.4 * y._z[k + 1]))) {
461  z2 = 0.6 * y._z[k] + 0.4 * y._z[k + 1];
462  }
463 
464  if (verbose_) {
465  if (std::fabs(y._z[k] - zdumpcenter_) < zdumpwidth_) {
466  std::cout << " T= " << std::setw(8) << 1. / beta << " Tc= " << critical[ic].first << " splitting "
467  << std::fixed << std::setprecision(4) << y._z[k] << " --> " << z1 << "," << z2 << " [" << p1
468  << "," << p2 << "]";
469  if (std::fabs(z2 - z1) > epsilon) {
470  std::cout << std::endl;
471  } else {
472  std::cout << " rejected " << std::endl;
473  }
474  }
475  }
476 
477  // split if the new subclusters are significantly separated
478  if ((z2 - z1) > epsilon) {
479  split = true;
480  double pk1 = p1 * y._pk[k] / (p1 + p2);
481  double pk2 = p2 * y._pk[k] / (p1 + p2);
482  y._z[k] = z2;
483  y._pk[k] = pk2;
484  y.InsertItem(k, z1, pk1);
485  nv++;
486 
487  // adjust remaining pointers
488  for (unsigned int jc = ic; jc < critical.size(); jc++) {
489  if (critical[jc].second > k) {
490  critical[jc].second++;
491  }
492  }
493  }
494  }
495  return split;
496 }
common ppss p3p6s2 common epss epspn46 common const1 w2
Definition: inclppp.h:1
const double w
Definition: UKUtility.cc:23
bool split(const double beta, track_t &t, vertex_t &y, double threshold=1.) const
A arg
Definition: Factorize.h:36
U second(std::pair< T, U > const &p)
T sqrt(T t)
Definition: SSEVec.h:19
double p2[4]
Definition: TauolaWrapper.h:90
int nt
Definition: AMPTWrapper.h:42
double p1[4]
Definition: TauolaWrapper.h:89
void DAClusterizerInZ_vect::splitAll ( vertex_t y) const

Definition at line 498 of file DAClusterizerInZ_vect.cc.

References DAClusterizerInZ_vect::vertex_t::_pk, DAClusterizerInZ_vect::vertex_t::_z, DAClusterizerInZ_vect::vertex_t::AddItem(), gather_cfg::cout, DAClusterizerInZ_vect::vertex_t::DebugOut(), MillePedeFileConverter_cfg::e, geometryDiff::epsilon, DAClusterizerInZ_vect::vertex_t::ExtractRaw(), DAClusterizerInZ_vect::vertex_t::GetSize(), dqmdumpme::k, DAClusterizerInZ_vect::vertex_t::pk, testProducerWithPsetDescEmpty_cfi::y1, and DAClusterizerInZ_vect::vertex_t::z.

498  {
499  const unsigned int nv = y.GetSize();
500 
501  double epsilon = 1e-3; // split all single vertices by 10 um
502  double zsep = 2 * epsilon; // split vertices that are isolated by at least zsep (vertices that haven't collapsed)
503  vertex_t y1;
504 
505  if (verbose_) {
506  std::cout << "Before Split " << std::endl;
507  y.DebugOut();
508  }
509 
510  for (unsigned int k = 0; k < nv; k++) {
511  if (((k == 0) || (y._z[k - 1] < (y._z[k] - zsep))) && (((k + 1) == nv) || (y._z[k + 1] > (y._z[k] + zsep)))) {
512  // isolated prototype, split
513  double new_z = y.z[k] - epsilon;
514  y.z[k] = y.z[k] + epsilon;
515 
516  double new_pk = 0.5 * y.pk[k];
517  y.pk[k] = 0.5 * y.pk[k];
518 
519  y1.AddItem(new_z, new_pk);
520  y1.AddItem(y._z[k], y._pk[k]);
521  } else if ((y1.GetSize() == 0) || (y1._z[y1.GetSize() - 1] < (y._z[k] - zsep))) {
522  y1.AddItem(y._z[k], y._pk[k]);
523  } else {
524  y1._z[y1.GetSize() - 1] = y1._z[y1.GetSize() - 1] - epsilon;
525  y._z[k] = y._z[k] + epsilon;
526  y1.AddItem(y._z[k], y._pk[k]);
527  }
528  } // vertex loop
529 
530  y = y1;
531  y.ExtractRaw();
532 
533  if (verbose_) {
534  std::cout << "After split " << std::endl;
535  y.DebugOut();
536  }
537 }
double DAClusterizerInZ_vect::update ( double  beta,
track_t gtracks,
vertex_t gvertices,
bool  useRho0,
const double &  rho0 
) const

Definition at line 130 of file DAClusterizerInZ_vect.cc.

References DAClusterizerInZ_vect::vertex_t::_ei, DAClusterizerInZ_vect::vertex_t::_ei_cache, DAClusterizerInZ_vect::track_t::_pi, DAClusterizerInZ_vect::vertex_t::_se, DAClusterizerInZ_vect::vertex_t::_sw, DAClusterizerInZ_vect::vertex_t::_swE, DAClusterizerInZ_vect::vertex_t::_swz, DAClusterizerInZ_vect::track_t::_Z_sum, zMuMuMuonUserData::beta, gather_cfg::cout, dumpMFGeometry_cfg::delta, DAClusterizerInZ_vect::track_t::GetSize(), DAClusterizerInZ_vect::vertex_t::GetSize(), edm::isNotFinite(), dqmdumpme::k, nt, funct::pow(), PDWG_EXOHSCP_cff::tracks, mitigatedMETSequence_cff::U, pwdgSkimBPark_cfi::vertices, and w.

Referenced by progressbar.ProgressBar::__next__(), MatrixUtil.Matrix::__setitem__(), MatrixUtil.Steps::__setitem__(), Vispa.Gui.VispaWidget.VispaWidget::autosize(), Vispa.Views.LineDecayView.LineDecayContainer::createObject(), Vispa.Views.LineDecayView.LineDecayContainer::deselectAllObjects(), Vispa.Gui.VispaWidgetOwner.VispaWidgetOwner::deselectAllWidgets(), Vispa.Gui.VispaWidget.VispaWidget::enableAutosizing(), progressbar.ProgressBar::finish(), Vispa.Gui.MenuWidget.MenuWidget::leaveEvent(), Vispa.Gui.VispaWidgetOwner.VispaWidgetOwner::mouseMoveEvent(), Vispa.Gui.MenuWidget.MenuWidget::mouseMoveEvent(), Vispa.Views.LineDecayView.LineDecayContainer::mouseMoveEvent(), Vispa.Gui.VispaWidgetOwner.VispaWidgetOwner::mouseReleaseEvent(), Vispa.Views.LineDecayView.LineDecayContainer::objectMoved(), MatrixUtil.Steps::overwrite(), Vispa.Views.LineDecayView.LineDecayContainer::removeObject(), Vispa.Gui.ConnectableWidget.ConnectableWidget::removePorts(), Vispa.Gui.FindDialog.FindDialog::reset(), Vispa.Gui.PortConnection.PointToPointConnection::select(), Vispa.Gui.VispaWidget.VispaWidget::select(), Vispa.Views.LineDecayView.LineDecayContainer::select(), Vispa.Gui.VispaWidget.VispaWidget::setText(), Vispa.Gui.VispaWidget.VispaWidget::setTitle(), Vispa.Gui.ZoomableWidget.ZoomableWidget::setZoom(), Vispa.Views.LineDecayView.LineDecayContainer::setZoom(), and Vispa.Gui.PortConnection.PointToPointConnection::updateConnection().

131  {
132  //update weights and vertex positions
133  // mass constrained annealing without noise
134  // returns the squared sum of changes of vertex positions
135 
136  const unsigned int nt = gtracks.GetSize();
137  const unsigned int nv = gvertices.GetSize();
138 
139  //initialize sums
140  double sumpi = 0;
141 
142  // to return how much the prototype moved
143  double delta = 0;
144 
145  // intial value of a sum
146  double Z_init = 0;
147  // independpent of loop
148  if (useRho0) {
149  Z_init = rho0 * local_exp(-beta * dzCutOff_ * dzCutOff_); // cut-off
150  }
151 
152  // define kernels
153  auto kernel_calc_exp_arg = [beta, nv](const unsigned int itrack, track_t const& tracks, vertex_t const& vertices) {
154  const double track_z = tracks._z[itrack];
155  const double botrack_dz2 = -beta * tracks._dz2[itrack];
156 
157  // auto-vectorized
158  for (unsigned int ivertex = 0; ivertex < nv; ++ivertex) {
159  auto mult_res = track_z - vertices._z[ivertex];
160  vertices._ei_cache[ivertex] = botrack_dz2 * (mult_res * mult_res);
161  }
162  };
163 
164  auto kernel_add_Z = [nv, Z_init](vertex_t const& vertices) -> double {
165  double ZTemp = Z_init;
166  for (unsigned int ivertex = 0; ivertex < nv; ++ivertex) {
167  ZTemp += vertices._pk[ivertex] * vertices._ei[ivertex];
168  }
169  return ZTemp;
170  };
171 
172  auto kernel_calc_normalization = [beta, nv](const unsigned int track_num, track_t& tks_vec, vertex_t& y_vec) {
173  auto tmp_trk_pi = tks_vec._pi[track_num];
174  auto o_trk_Z_sum = 1. / tks_vec._Z_sum[track_num];
175  auto o_trk_dz2 = tks_vec._dz2[track_num];
176  auto tmp_trk_z = tks_vec._z[track_num];
177  auto obeta = -1. / beta;
178 
179  // auto-vectorized
180  for (unsigned int k = 0; k < nv; ++k) {
181  y_vec._se[k] += y_vec._ei[k] * (tmp_trk_pi * o_trk_Z_sum);
182  auto w = y_vec._pk[k] * y_vec._ei[k] * (tmp_trk_pi * o_trk_Z_sum * o_trk_dz2);
183  y_vec._sw[k] += w;
184  y_vec._swz[k] += w * tmp_trk_z;
185  y_vec._swE[k] += w * y_vec._ei_cache[k] * obeta;
186  }
187  };
188 
189  for (auto ivertex = 0U; ivertex < nv; ++ivertex) {
190  gvertices._se[ivertex] = 0.0;
191  gvertices._sw[ivertex] = 0.0;
192  gvertices._swz[ivertex] = 0.0;
193  gvertices._swE[ivertex] = 0.0;
194  }
195 
196  // loop over tracks
197  for (auto itrack = 0U; itrack < nt; ++itrack) {
198  kernel_calc_exp_arg(itrack, gtracks, gvertices);
199  local_exp_list(gvertices._ei_cache, gvertices._ei, nv);
200 
201  gtracks._Z_sum[itrack] = kernel_add_Z(gvertices);
202  if (edm::isNotFinite(gtracks._Z_sum[itrack]))
203  gtracks._Z_sum[itrack] = 0.0;
204  // used in the next major loop to follow
205  sumpi += gtracks._pi[itrack];
206 
207  if (gtracks._Z_sum[itrack] > 1.e-100) {
208  kernel_calc_normalization(itrack, gtracks, gvertices);
209  }
210  }
211 
212  // now update z and pk
213  auto kernel_calc_z = [sumpi,
214  nv
215 #ifdef VI_DEBUG
216  ,
217  this
218 #endif
219  ](vertex_t& vertices) -> double {
220  double delta = 0;
221  // does not vectorizes
222  for (unsigned int ivertex = 0; ivertex < nv; ++ivertex) {
223  if (vertices._sw[ivertex] > 0) {
224  auto znew = vertices._swz[ivertex] / vertices._sw[ivertex];
225  // prevents from vectorizing if
226  delta += std::pow(vertices._z[ivertex] - znew, 2);
227  vertices._z[ivertex] = znew;
228  }
229 #ifdef VI_DEBUG
230  else {
231  edm::LogInfo("sumw") << "invalid sum of weights in fit: " << vertices._sw[ivertex] << endl;
232  if (this->verbose_) {
233  std::cout << " a cluster melted away ? pk=" << vertices._pk[ivertex] << " sumw=" << vertices._sw[ivertex]
234  << endl;
235  }
236  }
237 #endif
238  }
239 
240  auto osumpi = 1. / sumpi;
241  for (unsigned int ivertex = 0; ivertex < nv; ++ivertex)
242  vertices._pk[ivertex] = vertices._pk[ivertex] * vertices._se[ivertex] * osumpi;
243 
244  return delta;
245  };
246 
247  delta += kernel_calc_z(gvertices);
248 
249  // return how much the prototypes moved
250  return delta;
251 }
const double w
Definition: UKUtility.cc:23
constexpr bool isNotFinite(T x)
Definition: isFinite.h:9
int nt
Definition: AMPTWrapper.h:42
std::vector< TransientVertex > vertices(const std::vector< reco::TransientTrack > &tracks, const int verbosity=0) const
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:30
vector< TransientVertex > DAClusterizerInZ_vect::vertices ( const std::vector< reco::TransientTrack > &  tracks,
const int  verbosity = 0 
) const

Definition at line 539 of file DAClusterizerInZ_vect.cc.

References DAClusterizerInZ_vect::track_t::_dz2, DAClusterizerInZ_vect::track_t::_pi, DAClusterizerInZ_vect::vertex_t::_pk, DAClusterizerInZ_vect::track_t::_z, DAClusterizerInZ_vect::vertex_t::_z, DAClusterizerInZ_vect::track_t::_Z_sum, a, DAClusterizerInZ_vect::vertex_t::AddItem(), zMuMuMuonUserData::beta, bsc_activity_cfg::clusters, gather_cfg::cout, FrontierConditions_GlobalTag_cff::dump, MillePedeFileConverter_cfg::e, DAClusterizerInZ_vect::track_t::ExtractRaw(), ntuplemaker::fill, DAClusterizerInZ_vect::track_t::GetSize(), DAClusterizerInZ_vect::vertex_t::GetSize(), mps_fire::i, edm::isNotFinite(), dqmdumpme::k, MatrixUtil::merge(), min(), nt, AlCaHLTBitMon_ParallelJobs::p, cms::dd::split(), mathSSE::sqrt(), MessageLogger_cff::threshold, DAClusterizerInZ_vect::track_t::tt, update, and findQualityFiles::v.

540  {
541  track_t&& tks = fill(tracks);
542  tks.ExtractRaw();
543 
544  unsigned int nt = tks.GetSize();
545  double rho0 = 0.0; // start with no outlier rejection
546 
547  vector<TransientVertex> clusters;
548  if (tks.GetSize() == 0)
549  return clusters;
550 
551  vertex_t y; // the vertex prototypes
552 
553  // initialize:single vertex at infinite temperature
554  y.AddItem(0, 1.0);
555 
556  int niter = 0; // number of iterations
557 
558  // estimate first critical temperature
559  double beta = beta0(betamax_, tks, y);
560  if (verbose_)
561  std::cout << "Beta0 is " << beta << std::endl;
562 
563  niter = 0;
564  while ((update(beta, tks, y, false, rho0) > 1.e-6) && (niter++ < maxIterations_)) {
565  }
566 
567  // annealing loop, stop when T<Tmin (i.e. beta>1/Tmin)
568 
569  double betafreeze = betamax_ * sqrt(coolingFactor_);
570 
571  while (beta < betafreeze) {
572  if (useTc_) {
573  update(beta, tks, y, false, rho0);
574  while (merge(y, beta)) {
575  update(beta, tks, y, false, rho0);
576  }
577  split(beta, tks, y);
578  beta = beta / coolingFactor_;
579  } else {
580  beta = beta / coolingFactor_;
581  splitAll(y);
582  }
583 
584  // make sure we are not too far from equilibrium before cooling further
585  niter = 0;
586  while ((update(beta, tks, y, false, rho0) > 1.e-6) && (niter++ < maxIterations_)) {
587  }
588 
589  if (verbose_) {
590  dump(beta, y, tks, 0);
591  }
592  }
593 
594  if (useTc_) {
595  //last round of splitting, make sure no critical clusters are left
596  if (verbose_) {
597  std::cout << "last spliting at " << 1. / beta << std::endl;
598  }
599  update(beta, tks, y, false, rho0); // make sure Tc is up-to-date
600  while (merge(y, beta)) {
601  update(beta, tks, y, false, rho0);
602  }
603  unsigned int ntry = 0;
604  double threshold = 1.0;
605  while (split(beta, tks, y, threshold) && (ntry++ < 10)) {
606  niter = 0;
607  while ((update(beta, tks, y, false, rho0) > 1.e-6) && (niter++ < maxIterations_)) {
608  }
609  while (merge(y, beta)) {
610  update(beta, tks, y, false, rho0);
611  }
612  if (verbose_) {
613  std::cout << "after final splitting, try " << ntry << std::endl;
614  dump(beta, y, tks, 2);
615  }
616  // relax splitting a bit to reduce multiple split-merge cycles of the same cluster
617  threshold *= 1.1;
618  }
619  } else {
620  // merge collapsed clusters
621  while (merge(y, beta)) {
622  update(beta, tks, y, false, rho0);
623  }
624  }
625 
626  if (verbose_) {
627  update(beta, tks, y, false, rho0);
628  std::cout << "dump after 1st merging " << endl;
629  dump(beta, y, tks, 2);
630  }
631 
632  // switch on outlier rejection at T=Tmin
633  if (dzCutOff_ > 0) {
634  rho0 = 1. / nt;
635  for (unsigned int a = 0; a < 10; a++) {
636  update(beta, tks, y, true, a * rho0 / 10);
637  } // adiabatic turn-on
638  }
639 
640  niter = 0;
641  while ((update(beta, tks, y, true, rho0) > 1.e-8) && (niter++ < maxIterations_)) {
642  };
643  if (verbose_) {
644  std::cout << "dump after noise-suppression, rho0=" << rho0 << " niter = " << niter << endl;
645  dump(beta, y, tks, 2);
646  }
647 
648  // merge again (some cluster split by outliers collapse here)
649  while (merge(y, beta)) {
650  update(beta, tks, y, true, rho0);
651  }
652  if (verbose_) {
653  std::cout << "dump after merging " << endl;
654  dump(beta, y, tks, 2);
655  }
656 
657  // go down to the purging temperature (if it is lower than tmin)
658  while (beta < betapurge_) {
659  beta = min(beta / coolingFactor_, betapurge_);
660  niter = 0;
661  while ((update(beta, tks, y, false, rho0) > 1.e-8) && (niter++ < maxIterations_)) {
662  }
663  }
664 
665  // eliminate insigificant vertices, this is more restrictive at higher T
666  while (purge(y, tks, rho0, beta)) {
667  niter = 0;
668  while ((update(beta, tks, y, true, rho0) > 1.e-6) && (niter++ < maxIterations_)) {
669  }
670  }
671 
672  if (verbose_) {
673  update(beta, tks, y, true, rho0);
674  std::cout << " after purging " << std::endl;
675  dump(beta, y, tks, 2);
676  }
677 
678  // optionally cool some more without doing anything, to make the assignment harder
679  while (beta < betastop_) {
680  beta = min(beta / coolingFactor_, betastop_);
681  niter = 0;
682  while ((update(beta, tks, y, true, rho0) > 1.e-8) && (niter++ < maxIterations_)) {
683  }
684  }
685 
686  if (verbose_) {
687  std::cout << "Final result, rho0=" << std::scientific << rho0 << endl;
688  dump(beta, y, tks, 2);
689  }
690 
691  // select significant tracks and use a TransientVertex as a container
692  GlobalError dummyError(0.01, 0, 0.01, 0., 0., 0.01);
693 
694  // ensure correct normalization of probabilities, should makes double assignment reasonably impossible
695  const unsigned int nv = y.GetSize();
696  for (unsigned int k = 0; k < nv; k++)
697  if (edm::isNotFinite(y._pk[k]) || edm::isNotFinite(y._z[k])) {
698  y._pk[k] = 0;
699  y._z[k] = 0;
700  }
701 
702  for (unsigned int i = 0; i < nt; i++) // initialize
703  tks._Z_sum[i] = rho0 * local_exp(-beta * dzCutOff_ * dzCutOff_);
704 
705  // improve vectorization (does not require reduction ....)
706  for (unsigned int k = 0; k < nv; k++) {
707  for (unsigned int i = 0; i < nt; i++)
708  tks._Z_sum[i] += y._pk[k] * local_exp(-beta * Eik(tks._z[i], y._z[k], tks._dz2[i]));
709  }
710 
711  for (unsigned int k = 0; k < nv; k++) {
712  GlobalPoint pos(0, 0, y._z[k]);
713 
714  vector<reco::TransientTrack> vertexTracks;
715  for (unsigned int i = 0; i < nt; i++) {
716  if (tks._Z_sum[i] > 1e-100) {
717  double p = y._pk[k] * local_exp(-beta * Eik(tks._z[i], y._z[k], tks._dz2[i])) / tks._Z_sum[i];
718  if ((tks._pi[i] > 0) && (p > mintrkweight_)) {
719  vertexTracks.push_back(*(tks.tt[i]));
720  tks._Z_sum[i] = 0; // setting Z=0 excludes double assignment
721  }
722  }
723  }
724  TransientVertex v(pos, dummyError, vertexTracks, 0);
725  clusters.push_back(v);
726  }
727 
728  return clusters;
729 }
bool split(const double beta, track_t &t, vertex_t &y, double threshold=1.) const
void splitAll(vertex_t &y) const
constexpr bool isNotFinite(T x)
Definition: isFinite.h:9
track_t fill(const std::vector< reco::TransientTrack > &tracks) const
T sqrt(T t)
Definition: SSEVec.h:19
T min(T a, T b)
Definition: MathUtil.h:58
double beta0(const double betamax, track_t const &tks, vertex_t const &y) const
int nt
Definition: AMPTWrapper.h:42
double update(double beta, track_t &gtracks, vertex_t &gvertices, bool useRho0, const double &rho0) const
bool merge(vertex_t &y, double &beta) const
void dump(const double beta, const vertex_t &y, const track_t &tks, const int verbosity=0) const
double a
Definition: hdecay.h:119
bool purge(vertex_t &, track_t &, double &, const double) const

Member Data Documentation

double DAClusterizerInZ_vect::betamax_
private

Definition at line 172 of file DAClusterizerInZ_vect.h.

double DAClusterizerInZ_vect::betapurge_
private

Definition at line 181 of file DAClusterizerInZ_vect.h.

double DAClusterizerInZ_vect::betastop_
private

Definition at line 173 of file DAClusterizerInZ_vect.h.

double DAClusterizerInZ_vect::coolingFactor_
private

Definition at line 171 of file DAClusterizerInZ_vect.h.

double DAClusterizerInZ_vect::d0CutOff_
private

Definition at line 175 of file DAClusterizerInZ_vect.h.

double DAClusterizerInZ_vect::dzCutOff_
private

Definition at line 174 of file DAClusterizerInZ_vect.h.

int DAClusterizerInZ_vect::maxIterations_
private

Definition at line 170 of file DAClusterizerInZ_vect.h.

double DAClusterizerInZ_vect::mintrkweight_
private

Definition at line 178 of file DAClusterizerInZ_vect.h.

double DAClusterizerInZ_vect::uniquetrkweight_
private

Definition at line 179 of file DAClusterizerInZ_vect.h.

bool DAClusterizerInZ_vect::useTc_
private

Definition at line 176 of file DAClusterizerInZ_vect.h.

bool DAClusterizerInZ_vect::verbose_
private

Definition at line 165 of file DAClusterizerInZ_vect.h.

double DAClusterizerInZ_vect::vertexSize_
private

Definition at line 169 of file DAClusterizerInZ_vect.h.

double DAClusterizerInZ_vect::zdumpcenter_
private

Definition at line 166 of file DAClusterizerInZ_vect.h.

double DAClusterizerInZ_vect::zdumpwidth_
private

Definition at line 167 of file DAClusterizerInZ_vect.h.

double DAClusterizerInZ_vect::zmerge_
private

Definition at line 180 of file DAClusterizerInZ_vect.h.