CMS 3D CMS Logo

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

#include <DAClusterizerInZT_vect.h>

Inheritance diagram for DAClusterizerInZT_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
 
 DAClusterizerInZT_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 find_nearest (double z, double t, vertex_t &y, unsigned int &k_min, double dz, double dt) const
 
double get_Tc (const vertex_t &y, int k) 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
 
void zorder (vertex_t &y) 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 dtCutOff_
 
double dzCutOff_
 
int maxIterations_
 
double mintrkweight_
 
double t0Max_
 
double tmerge_
 
double uniquetrkweight_
 
bool useTc_
 
bool verbose_
 
double vertexSize_
 
double vertexSizeTime_
 
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 22 of file DAClusterizerInZT_vect.h.

Constructor & Destructor Documentation

DAClusterizerInZT_vect::DAClusterizerInZT_vect ( const edm::ParameterSet conf)

Definition at line 16 of file DAClusterizerInZT_vect.cc.

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

16  {
17  // hardcoded parameters
18  maxIterations_ = 100;
19  mintrkweight_ = 0.5; // conf.getParameter<double>("mintrkweight");
20 
21  // configurable debug outptut debug output
22  verbose_ = conf.getUntrackedParameter<bool>("verbose", false);
23  zdumpcenter_ = conf.getUntrackedParameter<double>("zdumpcenter", 0.);
24  zdumpwidth_ = conf.getUntrackedParameter<double>("zdumpwidth", 20.);
25 
26  // configurable parameters
27  double minT = conf.getParameter<double>("Tmin");
28  double purgeT = conf.getParameter<double>("Tpurge");
29  double stopT = conf.getParameter<double>("Tstop");
30  vertexSize_ = conf.getParameter<double>("vertexSize");
31  vertexSizeTime_ = conf.getParameter<double>("vertexSizeTime");
32  coolingFactor_ = conf.getParameter<double>("coolingFactor");
33  useTc_ = true;
34  if (coolingFactor_ < 0) {
36  useTc_ = false;
37  }
38  d0CutOff_ = conf.getParameter<double>("d0CutOff");
39  dzCutOff_ = conf.getParameter<double>("dzCutOff");
40  dtCutOff_ = conf.getParameter<double>("dtCutOff");
41  t0Max_ = conf.getParameter<double>("t0Max");
42  uniquetrkweight_ = conf.getParameter<double>("uniquetrkweight");
43  zmerge_ = conf.getParameter<double>("zmerge");
44  tmerge_ = conf.getParameter<double>("tmerge");
45 
46 #ifdef VI_DEBUG
47  if (verbose_) {
48  std::cout << "DAClusterizerinZT_vect: mintrkweight = " << mintrkweight_ << std::endl;
49  std::cout << "DAClusterizerinZT_vect: uniquetrkweight = " << uniquetrkweight_ << std::endl;
50  std::cout << "DAClusterizerinZT_vect: zmerge = " << zmerge_ << std::endl;
51  std::cout << "DAClusterizerinZT_vect: tmerge = " << tmerge_ << std::endl;
52  std::cout << "DAClusterizerinZT_vect: Tmin = " << minT << std::endl;
53  std::cout << "DAClusterizerinZT_vect: Tpurge = " << purgeT << std::endl;
54  std::cout << "DAClusterizerinZT_vect: Tstop = " << stopT << std::endl;
55  std::cout << "DAClusterizerinZT_vect: vertexSize = " << vertexSize_ << std::endl;
56  std::cout << "DAClusterizerinZT_vect: vertexSizeTime = " << vertexSizeTime_ << std::endl;
57  std::cout << "DAClusterizerinZT_vect: coolingFactor = " << coolingFactor_ << std::endl;
58  std::cout << "DAClusterizerinZT_vect: d0CutOff = " << d0CutOff_ << std::endl;
59  std::cout << "DAClusterizerinZT_vect: dzCutOff = " << dzCutOff_ << std::endl;
60  std::cout << "DAClusterizerinZT_vect: dtCutoff = " << dtCutOff_ << std::endl;
61  }
62 #endif
63 
64  if (minT == 0) {
65  edm::LogWarning("DAClusterizerinZT_vectorized")
66  << "DAClusterizerInZT: invalid Tmin" << minT << " reset do default " << 1. / betamax_;
67  } else {
68  betamax_ = 1. / minT;
69  }
70 
71  if ((purgeT > minT) || (purgeT == 0)) {
72  edm::LogWarning("DAClusterizerinZT_vectorized")
73  << "DAClusterizerInZT: invalid Tpurge" << purgeT << " set to " << minT;
74  purgeT = minT;
75  }
76  betapurge_ = 1. / purgeT;
77 
78  if ((stopT > purgeT) || (stopT == 0)) {
79  edm::LogWarning("DAClusterizerinZT_vectorized")
80  << "DAClusterizerInZT: invalid Tstop" << stopT << " set to " << max(1., purgeT);
81  stopT = max(1., purgeT);
82  }
83  betastop_ = 1. / stopT;
84 }
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const

Member Function Documentation

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

Definition at line 501 of file DAClusterizerInZT_vect.cc.

References gather_cfg::cout, dt, DAClusterizerInZT_vect::track_t::dt2_, PVValHelper::dz, DAClusterizerInZT_vect::track_t::dz2_, DAClusterizerInZT_vect::track_t::getSize(), DAClusterizerInZT_vect::vertex_t::getSize(), mps_fire::i, createfilelist::int, dqmdumpme::k, dqm-mbProfile::log, nt, DAClusterizerInZT_vect::track_t::pi_, funct::pow(), mathSSE::sqrt(), DAClusterizerInZT_vect::track_t::t_, DAClusterizerInZT_vect::vertex_t::t_, w, DAClusterizerInZT_vect::track_t::z_, and DAClusterizerInZT_vect::vertex_t::z_.

501  {
502  double T0 = 0; // max Tc for beta=0
503  // estimate critical temperature from beta=0 (T=inf)
504  const unsigned int nt = tks.getSize();
505  const unsigned int nv = y.getSize();
506 
507  for (unsigned int k = 0; k < nv; k++) {
508  // vertex fit at T=inf
509  double sumwz = 0;
510  double sumwt = 0;
511  double sumw_z = 0;
512  double sumw_t = 0;
513  for (unsigned int i = 0; i < nt; i++) {
514  double w_z = tks.pi_[i] * tks.dz2_[i];
515  double w_t = tks.pi_[i] * tks.dt2_[i];
516  sumwz += w_z * tks.z_[i];
517  sumwt += w_t * tks.t_[i];
518  sumw_z += w_z;
519  sumw_t += w_t;
520  }
521  y.z_[k] = sumwz / sumw_z;
522  y.t_[k] = sumwt / sumw_t;
523 
524  // estimate Tc, eventually do this in the same loop
525  double szz = 0, stt = 0, szt = 0;
526  double nuz = 0, nut = 0;
527  for (unsigned int i = 0; i < nt; i++) {
528  double dz = (tks.z_[i] - y.z_[k]) * tks.dz2_[i];
529  double dt = (tks.t_[i] - y.t_[k]) * tks.dt2_[i];
530  double w = tks.pi_[i];
531  szz += w * dz * dz;
532  stt += w * dt * dt;
533  szt += w * dz * dt;
534  nuz += w * tks.dz2_[i];
535  nut += w * tks.dt2_[i];
536  }
537  double Tz = szz / nuz;
538  double Tt = stt / nut;
539  double Tc = Tz + Tt + sqrt(pow(Tz - Tt, 2) + 4 * szt * szt / nuz / nut);
540 
541  if (Tc > T0)
542  T0 = Tc;
543  } // vertex loop (normally there should be only one vertex at beta=0)
544 
545 #ifdef VI_DEBUG
546  if (verbose_) {
547  std::cout << "DAClustrizerInZT_vect.beta0: Tc = " << T0 << std::endl;
548  int coolingsteps = 1 - int(std::log(T0 * betamax) / std::log(coolingFactor_));
549  std::cout << "DAClustrizerInZT_vect.beta0: nstep = " << coolingsteps << std::endl;
550  }
551 #endif
552 
553  if (T0 > 1. / betamax) {
554  return betamax / std::pow(coolingFactor_, int(std::log(T0 * betamax) / std::log(coolingFactor_)) - 1);
555  } else {
556  // ensure at least one annealing step
557  return betamax * coolingFactor_;
558  }
559 }
float dt
Definition: AMPTWrapper.h:136
const double w
Definition: UKUtility.cc:23
T sqrt(T t)
Definition: SSEVec.h:19
int nt
Definition: AMPTWrapper.h:42
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:30
vector< vector< reco::TransientTrack > > DAClusterizerInZT_vect::clusterize ( const std::vector< reco::TransientTrack > &  tracks) const
overridevirtual

Implements TrackClusterizerInZ.

Definition at line 1046 of file DAClusterizerInZT_vect.cc.

References bsc_activity_cfg::clusters, gather_cfg::cout, dqmdumpme::k, MetAnalyzer::pv(), and pwdgSkimBPark_cfi::vertices.

1047  {
1048 #ifdef VI_DEBUG
1049  if (verbose_) {
1050  std::cout << "###################################################" << endl;
1051  std::cout << "# vectorized DAClusterizerInZT_vect::clusterize nt=" << tracks.size() << endl;
1052  std::cout << "###################################################" << endl;
1053  }
1054 #endif
1055 
1056  vector<vector<reco::TransientTrack> > clusters;
1057  vector<TransientVertex>&& pv = vertices(tracks);
1058 
1059 #ifdef VI_DEBUG
1060  if (verbose_) {
1061  std::cout << "# DAClusterizerInZT::clusterize pv.size=" << pv.size() << endl;
1062  }
1063 #endif
1064 
1065  if (pv.empty()) {
1066  return clusters;
1067  }
1068 
1069  // fill into clusters, don't merge
1070  for (auto k = pv.begin(); k != pv.end(); k++) {
1071  vector<reco::TransientTrack> aCluster = k->originalTracks();
1072  if (aCluster.size() > 1) {
1073  clusters.push_back(aCluster);
1074  }
1075  }
1076 
1077  return clusters;
1078 
1079  /*
1080  //leaving the merging version here in case we want to turn it back on the future
1081  // needs optimization and validation
1082  // fill into clusters and merge
1083  vector<reco::TransientTrack> aCluster = pv.begin()->originalTracks();
1084 
1085  for (auto k = pv.begin() + 1; k != pv.end(); k++) {
1086  if ( (std::abs(k->position().z() - (k - 1)->position().z()) > (2 * vertexSize_))
1087  ||(std::abs(k->time() - (k - 1)->time() ) > (2 * vertexSizeTime_)) ){ // still not perfect
1088  // close a cluster
1089  if (aCluster.size()>1){
1090  clusters.push_back(aCluster);
1091  }else{
1092  #ifdef VI_DEBUG
1093  if(verbose_){
1094  std::cout << " one track cluster at " << k->position().z() << " suppressed" << std::endl;
1095  }
1096  #endif
1097  }
1098  aCluster.clear();
1099  }
1100  for (unsigned int i = 0; i < k->originalTracks().size(); i++) {
1101  aCluster.push_back(k->originalTracks()[i]);
1102  }
1103 
1104  }
1105  clusters.emplace_back(std::move(aCluster));
1106 
1107  return clusters;
1108  */
1109 }
std::vector< TransientVertex > vertices(const std::vector< reco::TransientTrack > &tracks, const int verbosity=0) const
def pv(vc)
Definition: MetAnalyzer.py:7
void DAClusterizerInZT_vect::dump ( const double  beta,
const vertex_t y,
const track_t tks,
const int  verbosity = 0 
) const

Definition at line 1111 of file DAClusterizerInZT_vect.cc.

References a, b, zMuMuMuonUserData::beta, gather_cfg::cout, TauDecayModes::dec, DAClusterizerInZT_vect::track_t::dt2_, DAClusterizerInZT_vect::track_t::dz2_, Measurement1D::error(), JetChargeProducer_cfi::exp, F(), alignBH_cfg::fixed, DAClusterizerInZT_vect::track_t::getSize(), DAClusterizerInZT_vect::vertex_t::getSize(), h, reco::TrackBase::highPurity, mps_fire::i, listHistos::IP, dqmiolumiharvest::j, dqm-mbProfile::log, reco::HitPattern::MISSING_OUTER_HITS, nt, AlCaHLTBitMon_ParallelJobs::p, DAClusterizerInZT_vect::track_t::pi_, GeomDetEnumerators::PixelBarrel, DAClusterizerInZT_vect::vertex_t::pk_, mathSSE::sqrt(), DAClusterizerInZT_vect::track_t::t_, DAClusterizerInZT_vect::vertex_t::t_, DAClusterizerInZT_vect::track_t::tt, Measurement1D::value(), DAClusterizerInZT_vect::track_t::z_, DAClusterizerInZT_vect::vertex_t::z_, and DAClusterizerInZT_vect::track_t::Z_sum_.

1111  {
1112 #ifdef VI_DEBUG
1113  const unsigned int nv = y.getSize();
1114  const unsigned int nt = tks.getSize();
1115 
1116  std::vector<unsigned int> iz;
1117  for (unsigned int j = 0; j < nt; j++) {
1118  iz.push_back(j);
1119  }
1120  std::sort(iz.begin(), iz.end(), [tks](unsigned int a, unsigned int b) { return tks.z_[a] < tks.z_[b]; });
1121  std::cout << std::endl;
1122  std::cout << "-----DAClusterizerInZT::dump ----" << nv << " clusters " << std::endl;
1123  string h = " ";
1124  std::cout << h << " k= ";
1125  for (unsigned int ivertex = 0; ivertex < nv; ++ivertex) {
1126  if (std::fabs(y.z_[ivertex] - zdumpcenter_) < zdumpwidth_) {
1127  std::cout << setw(8) << fixed << ivertex;
1128  }
1129  }
1130  std::cout << endl;
1131 
1132  std::cout << h << " z= ";
1133  std::cout << setprecision(4);
1134  for (unsigned int ivertex = 0; ivertex < nv; ++ivertex) {
1135  if (std::fabs(y.z_[ivertex] - zdumpcenter_) < zdumpwidth_) {
1136  std::cout << setw(8) << fixed << y.z_[ivertex];
1137  }
1138  }
1139  std::cout << endl;
1140 
1141  std::cout << h << " t= ";
1142  std::cout << setprecision(4);
1143  for (unsigned int ivertex = 0; ivertex < nv; ++ivertex) {
1144  if (std::fabs(y.z_[ivertex] - zdumpcenter_) < zdumpwidth_) {
1145  std::cout << setw(8) << fixed << y.t_[ivertex];
1146  }
1147  }
1148  std::cout << endl;
1149 
1150  std::cout << "T=" << setw(15) << 1. / beta << " Tmin =" << setw(10) << 1. / betamax_
1151  << " Tc= ";
1152  for (unsigned int ivertex = 0; ivertex < nv; ++ivertex) {
1153  if (std::fabs(y.z_[ivertex] - zdumpcenter_) < zdumpwidth_) {
1154  double Tc = get_Tc(y, ivertex);
1155  std::cout << setw(8) << fixed << setprecision(1) << Tc;
1156  }
1157  }
1158  std::cout << endl;
1159 
1160  std::cout << h << "pk= ";
1161  double sumpk = 0;
1162  for (unsigned int ivertex = 0; ivertex < nv; ++ivertex) {
1163  sumpk += y.pk_[ivertex];
1164  if (std::fabs(y.z_[ivertex] - zdumpcenter_) > zdumpwidth_)
1165  continue;
1166  std::cout << setw(8) << setprecision(4) << fixed << y.pk_[ivertex];
1167  }
1168  std::cout << endl;
1169 
1170  std::cout << h << "nt= ";
1171  for (unsigned int ivertex = 0; ivertex < nv; ++ivertex) {
1172  sumpk += y.pk_[ivertex];
1173  if (std::fabs(y.z_[ivertex] - zdumpcenter_) > zdumpwidth_)
1174  continue;
1175  std::cout << setw(8) << setprecision(1) << fixed << y.pk_[ivertex] * nt;
1176  }
1177  std::cout << endl;
1178 
1179  if (verbosity > 0) {
1180  double E = 0, F = 0;
1181  std::cout << endl;
1182  std::cout << "---- z +/- dz t +/- dt ip +/-dip pt phi eta weights ----"
1183  << endl;
1184  std::cout << setprecision(4);
1185  for (unsigned int i0 = 0; i0 < nt; i0++) {
1186  unsigned int i = iz[i0];
1187  if (tks.Z_sum_[i] > 0) {
1188  F -= std::log(tks.Z_sum_[i]) / beta;
1189  }
1190  double tz = tks.z_[i];
1191 
1192  if (std::fabs(tz - zdumpcenter_) > zdumpwidth_)
1193  continue;
1194  std::cout << setw(4) << i << ")" << setw(8) << fixed << setprecision(4) << tz << " +/-" << setw(6)
1195  << sqrt(1. / tks.dz2_[i]);
1196 
1197  if (tks.dt2_[i] > 0) {
1198  std::cout << setw(8) << fixed << setprecision(4) << tks.t_[i] << " +/-" << setw(6) << sqrt(1. / tks.dt2_[i]);
1199  } else {
1200  std::cout << " ";
1201  }
1202 
1203  if (tks.tt[i]->track().quality(reco::TrackBase::highPurity)) {
1204  std::cout << " *";
1205  } else {
1206  std::cout << " ";
1207  }
1208  if (tks.tt[i]->track().hitPattern().hasValidHitInPixelLayer(PixelSubdetector::SubDetector::PixelBarrel, 1)) {
1209  std::cout << "+";
1210  } else {
1211  std::cout << "-";
1212  }
1213  std::cout << setw(1)
1214  << tks.tt[i]
1215  ->track()
1216  .hitPattern()
1217  .pixelBarrelLayersWithMeasurement(); // see DataFormats/TrackReco/interface/HitPattern.h
1218  std::cout << setw(1) << tks.tt[i]->track().hitPattern().pixelEndcapLayersWithMeasurement();
1219  std::cout << setw(1) << hex
1220  << tks.tt[i]->track().hitPattern().trackerLayersWithMeasurement() -
1221  tks.tt[i]->track().hitPattern().pixelLayersWithMeasurement()
1222  << dec;
1223  std::cout << "=" << setw(1) << hex
1224  << tks.tt[i]->track().hitPattern().numberOfLostHits(reco::HitPattern::MISSING_OUTER_HITS) << dec;
1225 
1226  Measurement1D IP = tks.tt[i]->stateAtBeamLine().transverseImpactParameter();
1227  std::cout << setw(8) << IP.value() << "+/-" << setw(6) << IP.error();
1228  std::cout << " " << setw(6) << setprecision(2) << tks.tt[i]->track().pt() * tks.tt[i]->track().charge();
1229  std::cout << " " << setw(5) << setprecision(2) << tks.tt[i]->track().phi() << " " << setw(5) << setprecision(2)
1230  << tks.tt[i]->track().eta();
1231 
1232  double sump = 0.;
1233  for (unsigned int ivertex = 0; ivertex < nv; ++ivertex) {
1234  if (std::fabs(y.z_[ivertex] - zdumpcenter_) > zdumpwidth_)
1235  continue;
1236 
1237  if ((tks.pi_[i] > 0) && (tks.Z_sum_[i] > 0)) {
1238  //double p=pik(beta,tks[i],*k);
1239  double p = y.pk_[ivertex] *
1240  exp(-beta * Eik(tks.z_[i], y.z_[ivertex], tks.dz2_[i], tks.t_[i], y.t_[ivertex], tks.dt2_[i])) /
1241  tks.Z_sum_[i];
1242  if (p > 0.0001) {
1243  std::cout << setw(8) << setprecision(3) << p;
1244  } else {
1245  std::cout << " . ";
1246  }
1247  E += p * Eik(tks.z_[i], y.z_[ivertex], tks.dz2_[i], tks.t_[i], y.t_[ivertex], tks.dt2_[i]);
1248  sump += p;
1249  } else {
1250  std::cout << " ";
1251  }
1252  }
1253  std::cout << endl;
1254  }
1255  std::cout << endl
1256  << "T=" << 1 / beta << " E=" << E << " n=" << y.getSize() << " F= " << F << endl
1257  << "----------" << endl;
1258  }
1259 #endif
1260 }
FWCore Framework interface EventSetupRecordImplementation h
Helper function to determine trigger accepts.
double error() const
Definition: Measurement1D.h:27
double get_Tc(const vertex_t &y, int k) const
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
DAClusterizerInZT_vect::track_t DAClusterizerInZT_vect::fill ( const std::vector< reco::TransientTrack > &  tracks) const

Definition at line 97 of file DAClusterizerInZT_vect.cc.

References funct::abs(), DAClusterizerInZT_vect::track_t::addItem(), HLT_2018_cff::atIP, reco::BeamSpot::BeamWidthX(), reco::BeamSpot::BeamWidthY(), gather_cfg::cout, geometryDiff::epsilon, Measurement1D::error(), DAClusterizerInZT_vect::track_t::extractRaw(), DAClusterizerInZT_vect::track_t::getSize(), edm::isNotFinite(), LogTrace, min(), funct::pow(), AlignmentPI::t_z, and Measurement1D::value().

97  {
98  // prepare track data for clustering
99  track_t tks;
100  for (const auto& tk : tracks) {
101  if (!tk.isValid())
102  continue;
103  double t_pi = 1.;
104  double t_z = tk.stateAtBeamLine().trackStateAtPCA().position().z();
105  double t_t = tk.timeExt();
106  if (std::fabs(t_z) > 1000.)
107  continue;
108  if (std::abs(t_t) > t0Max_)
109  continue;
110  auto const& t_mom = tk.stateAtBeamLine().trackStateAtPCA().momentum();
111  // get the beam-spot
112  reco::BeamSpot beamspot = tk.stateAtBeamLine().beamSpot();
113  double t_dz2 = std::pow(tk.track().dzError(), 2) // track errror
114  + (std::pow(beamspot.BeamWidthX() * t_mom.x(), 2) + std::pow(beamspot.BeamWidthY() * t_mom.y(), 2)) *
115  std::pow(t_mom.z(), 2) / std::pow(t_mom.perp2(), 2) // beam spot width
116  + std::pow(vertexSize_, 2); // intrinsic vertex size, safer for outliers and short lived decays
117  t_dz2 = 1. / t_dz2;
118  if (edm::isNotFinite(t_dz2) || t_dz2 < std::numeric_limits<double>::min())
119  continue;
120 
121  double t_dt2 =
122  std::pow(tk.dtErrorExt(), 2.) +
123  std::pow(vertexSizeTime_, 2.); // the ~injected~ timing error, need to add a small minimum vertex size in time
124  if (tk.dtErrorExt() > 0.3) {
125  t_dt2 = 0; // tracks with no time measurement
126  } else {
127  t_dt2 = 1. / t_dt2;
129  continue;
130  }
131 
132  if (d0CutOff_ > 0) {
133  Measurement1D atIP = tk.stateAtBeamLine().transverseImpactParameter(); // error contains beamspot
134  t_pi = 1. / (1. + local_exp(std::pow(atIP.value() / atIP.error(), 2) -
135  std::pow(d0CutOff_, 2))); // reduce weight for high ip tracks
137  continue; // usually is > 0.99
138  }
139  LogTrace("DAClusterizerinZT_vectorized") << t_z << ' ' << t_t << ' ' << t_dz2 << ' ' << t_dt2 << ' ' << t_pi;
140  tks.addItem(t_z, t_t, t_dz2, t_dt2, &tk, t_pi);
141  }
142  tks.extractRaw();
143 
144 #ifdef VI_DEBUG
145  if (verbose_) {
146  std::cout << "Track count " << tks.getSize() << std::endl;
147  }
148 #endif
149 
150  return tks;
151 }
constexpr bool isNotFinite(T x)
Definition: isFinite.h:9
double error() const
Definition: Measurement1D.h:27
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
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
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:30
bool DAClusterizerInZT_vect::find_nearest ( double  z,
double  t,
vertex_t y,
unsigned int &  k_min,
double  dz,
double  dt 
) const

Definition at line 341 of file DAClusterizerInZT_vect.cc.

References funct::abs(), dumpMFGeometry_cfg::delta, DAClusterizerInZT_vect::vertex_t::getSize(), dqmdumpme::k, reco::ParticleMasses::k0, funct::pow(), DAClusterizerInZT_vect::vertex_t::t_, DAClusterizerInZT_vect::vertex_t::z, and DAClusterizerInZT_vect::vertex_t::z_.

342  {
343  // find the cluster nearest to (z,t)
344  // distance measure is delta = (delta_z / dz )**2 + (delta_t/ d_t)**2
345  // assumes that clusters are ordered n z
346  // return value is false if o neighbour with distance < 1 is found
347 
348  unsigned int nv = y.getSize();
349 
350  // find nearest in z, binary search later
351  unsigned int k = 0;
352  for (unsigned int k0 = 1; k0 < nv; k0++) {
353  if (std::abs(y.z_[k0] - z) < std::abs(y.z_[k] - z)) {
354  k = k0;
355  }
356  }
357 
358  double delta_min = 1.;
359 
360  //search left
361  unsigned int k1 = k;
362  while ((k1 > 0) && ((y.z[k] - y.z[--k1]) < dz)) {
363  auto delta = std::pow((y.z_[k] - y.z_[k1]) / dz, 2) + std::pow((y.t_[k] - y.t_[k1]) / dt, 2);
364  if (delta < delta_min) {
365  k_min = k1;
366  delta_min = delta;
367  }
368  }
369 
370  //search right
371  k1 = k;
372  while (((++k1) < nv) && ((y.z[k1] - y.z[k]) < dz)) {
373  auto delta = std::pow((y.z_[k1] - y.z_[k]) / dz, 2) + std::pow((y.t_[k1] - y.t_[k]) / dt, 2);
374  if (delta < delta_min) {
375  k_min = k1;
376  delta_min = delta;
377  }
378  }
379 
380  return (delta_min < 1.);
381 }
float dt
Definition: AMPTWrapper.h:136
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:30
double DAClusterizerInZT_vect::get_Tc ( const vertex_t y,
int  k 
) const

Definition at line 561 of file DAClusterizerInZT_vect.cc.

References dqmdumpme::k, DAClusterizerInZT_vect::vertex_t::nut_, DAClusterizerInZT_vect::vertex_t::nuz_, funct::pow(), mathSSE::sqrt(), DAClusterizerInZT_vect::vertex_t::stt_, DAClusterizerInZT_vect::vertex_t::szt_, and DAClusterizerInZT_vect::vertex_t::szz_.

561  {
562  double Tz = y.szz_[k] / y.nuz_[k]; // actually 0.5*Tc(z)
563  double Tt = y.stt_[k] / y.nut_[k];
564  double mx = y.szt_[k] / y.nuz_[k] * y.szt_[k] / y.nut_[k];
565  return Tz + Tt + sqrt(pow(Tz - Tt, 2) + 4 * mx);
566 }
T sqrt(T t)
Definition: SSEVec.h:19
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:30
bool DAClusterizerInZT_vect::merge ( vertex_t y,
double &  beta 
) const

Definition at line 383 of file DAClusterizerInZT_vect.cc.

References gather_cfg::cout, dumpMFGeometry_cfg::delta, DAClusterizerInZT_vect::vertex_t::extractRaw(), alignBH_cfg::fixed, DAClusterizerInZT_vect::vertex_t::getSize(), DAClusterizerInZT_vect::vertex_t::pk_, funct::pow(), DAClusterizerInZT_vect::vertex_t::removeItem(), DAClusterizerInZT_vect::vertex_t::t_, DAClusterizerInZT_vect::vertex_t::z, and DAClusterizerInZT_vect::vertex_t::z_.

383  {
384  // merge clusters that collapsed or never separated,
385  // return true if vertices were merged, false otherwise
386  const unsigned int nv = y.getSize();
387 
388  if (nv < 2)
389  return false;
390 
391  // merge the smallest distance clusters first
392  unsigned int k1_min = 0, k2_min = 0;
393  double delta_min = 0;
394 
395  for (unsigned int k1 = 0; (k1 + 1) < nv; k1++) {
396  unsigned int k2 = k1;
397  while ((++k2 < nv) && (std::fabs(y.z[k2] - y.z_[k1]) < zmerge_)) {
398  auto delta = std::pow((y.z_[k2] - y.z_[k1]) / zmerge_, 2) + std::pow((y.t_[k2] - y.t_[k1]) / tmerge_, 2);
399  if ((delta < delta_min) || (k1_min == k2_min)) {
400  k1_min = k1;
401  k2_min = k2;
402  delta_min = delta;
403  }
404  }
405  }
406 
407  if ((k1_min == k2_min) || (delta_min > 1)) {
408  return false;
409  }
410 
411  double rho = y.pk_[k1_min] + y.pk_[k2_min];
412 #ifdef VI_DEBUG
413  if (verbose_) {
414  std::cout << "merging (" << setw(8) << fixed << setprecision(4) << y.z_[k1_min] << ',' << y.t_[k1_min] << ") and ("
415  << y.z_[k2_min] << ',' << y.t_[k2_min] << ")"
416  << " idx=" << k1_min << "," << k2_min << std::endl;
417  }
418 #endif
419  if (rho > 0) {
420  y.z_[k1_min] = (y.pk_[k1_min] * y.z_[k1_min] + y.pk_[k2_min] * y.z_[k2_min]) / rho;
421  y.t_[k1_min] = (y.pk_[k1_min] * y.t_[k1_min] + y.pk_[k2_min] * y.t_[k2_min]) / rho;
422  } else {
423  y.z_[k1_min] = 0.5 * (y.z_[k1_min] + y.z_[k2_min]);
424  y.t_[k1_min] = 0.5 * (y.t_[k1_min] + y.t_[k2_min]);
425  }
426  y.pk_[k1_min] = rho;
427  y.removeItem(k2_min);
428  y.extractRaw();
429  return true;
430 }
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:30
bool DAClusterizerInZT_vect::purge ( vertex_t y,
track_t tks,
double &  rho0,
const double  beta 
) const

Definition at line 432 of file DAClusterizerInZT_vect.cc.

References constexpr, gather_cfg::cout, DAClusterizerInZT_vect::track_t::dt2_, DAClusterizerInZT_vect::track_t::dz2_, DAClusterizerInZT_vect::track_t::getSize(), DAClusterizerInZT_vect::vertex_t::getSize(), mps_fire::i, dqmdumpme::k, reco::ParticleMasses::k0, nt, AlCaHLTBitMon_ParallelJobs::p, DAClusterizerInZT_vect::track_t::pi_, DAClusterizerInZT_vect::vertex_t::pk_, DAClusterizerInZT_vect::vertex_t::removeItem(), DAClusterizerInZT_vect::track_t::t_, DAClusterizerInZT_vect::vertex_t::t_, DAClusterizerInZT_vect::track_t::z_, DAClusterizerInZT_vect::vertex_t::z_, and DAClusterizerInZT_vect::track_t::Z_sum_.

432  {
433  constexpr double eps = 1.e-100;
434  // eliminate clusters with only one significant/unique track
435  const unsigned int nv = y.getSize();
436  const unsigned int nt = tks.getSize();
437 
438  if (nv < 2)
439  return false;
440 
441  double sumpmin = nt;
442  unsigned int k0 = nv;
443 
444  int nUnique = 0;
445  double sump = 0;
446 
447  std::vector<double> inverse_zsums(nt), arg_cache(nt), eik_cache(nt);
448  double* pinverse_zsums;
449  double* parg_cache;
450  double* peik_cache;
451  pinverse_zsums = inverse_zsums.data();
452  parg_cache = arg_cache.data();
453  peik_cache = eik_cache.data();
454  for (unsigned i = 0; i < nt; ++i) {
455  inverse_zsums[i] = tks.Z_sum_[i] > eps ? 1. / tks.Z_sum_[i] : 0.0;
456  }
457 
458  for (unsigned int k = 0; k < nv; ++k) {
459  nUnique = 0;
460  sump = 0;
461 
462  const double pmax = y.pk_[k] / (y.pk_[k] + rho0 * local_exp(-beta * dzCutOff_ * dzCutOff_));
463  const double pcut = uniquetrkweight_ * pmax;
464  for (unsigned i = 0; i < nt; ++i) {
465  const auto track_z = tks.z_[i];
466  const auto track_t = tks.t_[i];
467  const auto botrack_dz2 = -beta * tks.dz2_[i];
468  const auto botrack_dt2 = -beta * tks.dt2_[i];
469 
470  const auto mult_resz = track_z - y.z_[k];
471  const auto mult_rest = track_t - y.t_[k];
472  parg_cache[i] = botrack_dz2 * (mult_resz * mult_resz) + botrack_dt2 * (mult_rest * mult_rest);
473  }
474  local_exp_list(parg_cache, peik_cache, nt);
475  for (unsigned int i = 0; i < nt; ++i) {
476  const double p = y.pk_[k] * peik_cache[i] * pinverse_zsums[i];
477  sump += p;
478  nUnique += ((p > pcut) & (tks.pi_[i] > 0));
479  }
480 
481  if ((nUnique < 2) && (sump < sumpmin)) {
482  sumpmin = sump;
483  k0 = k;
484  }
485  }
486 
487  if (k0 != nv) {
488 #ifdef VI_DEBUG
489  if (verbose_) {
490  std::cout << "eliminating prototype at " << std::setw(10) << std::setprecision(4) << y.z_[k0] << "," << y.t_[k0]
491  << " with sump=" << sumpmin << " rho*nt =" << y.pk_[k0] * nt << endl;
492  }
493 #endif
494  y.removeItem(k0);
495  return true;
496  } else {
497  return false;
498  }
499 }
int nt
Definition: AMPTWrapper.h:42
#define constexpr
bool DAClusterizerInZT_vect::split ( const double  beta,
track_t t,
vertex_t y,
double  threshold = 1. 
) const

Definition at line 568 of file DAClusterizerInZT_vect.cc.

References funct::abs(), zMuMuMuonUserData::beta, constexpr, funct::cos(), gather_cfg::cout, hlt_jetmet_dqm_QT_fromfile_cfg::critical, DAClusterizerInZT_vect::track_t::dt2_, DAClusterizerInZT_vect::track_t::dz2_, MillePedeFileConverter_cfg::e, alignBH_cfg::fixed, DAClusterizerInZT_vect::track_t::getSize(), DAClusterizerInZT_vect::vertex_t::getSize(), mps_fire::i, DAClusterizerInZT_vect::vertex_t::insertOrdered(), dqmdumpme::k, nt, DAClusterizerInZT_vect::vertex_t::nut_, DAClusterizerInZT_vect::vertex_t::nuz_, AlCaHLTBitMon_ParallelJobs::p, p1, p2, DAClusterizerInZT_vect::track_t::pi_, DAClusterizerInZT_vect::vertex_t::pk_, funct::pow(), q1, DAClusterizerInZT_vect::vertex_t::removeItem(), edm::second(), funct::sin(), cms::dd::split(), mathSSE::sqrt(), DAClusterizerInZT_vect::vertex_t::stt_, DAClusterizerInZT_vect::vertex_t::szt_, DAClusterizerInZT_vect::vertex_t::szz_, DAClusterizerInZT_vect::track_t::t, OrderedSet::t, RandomServiceHelper::t1, RandomServiceHelper::t2, DAClusterizerInZT_vect::track_t::t_, DAClusterizerInZT_vect::vertex_t::t_, testProducerWithPsetDescEmpty_cfi::z2, DAClusterizerInZT_vect::track_t::z_, DAClusterizerInZT_vect::vertex_t::z_, and DAClusterizerInZT_vect::track_t::Z_sum_.

568  {
569  // split only critical vertices (Tc >~ T=1/beta <==> beta*Tc>~1)
570  // an update must have been made just before doing this (same beta, no merging)
571  // returns true if at least one cluster was split
572 
573  constexpr double epsilonz = 1e-3; // minimum split size z
574  constexpr double epsilont = 1e-2; // minimum split size t
575  unsigned int nv = y.getSize();
576  const double twoBeta = 2.0 * beta;
577 
578  // avoid left-right biases by splitting highest Tc first
579 
580  std::vector<std::pair<double, unsigned int> > critical;
581  for (unsigned int k = 0; k < nv; k++) {
582  double Tc = get_Tc(y, k);
583  if (beta * Tc > threshold) {
584  critical.push_back(make_pair(Tc, k));
585  }
586  }
587  if (critical.empty())
588  return false;
589 
590  std::stable_sort(critical.begin(), critical.end(), std::greater<std::pair<double, unsigned int> >());
591 
592  bool split = false;
593  const unsigned int nt = tks.getSize();
594 
595  for (unsigned int ic = 0; ic < critical.size(); ic++) {
596  unsigned int k = critical[ic].second;
597 
598  // split direction in the (z,t)-plane
599 
600  double Mzz = y.nuz_[k] - twoBeta * y.szz_[k];
601  double Mtt = y.nut_[k] - twoBeta * y.stt_[k];
602  double Mzt = -twoBeta * y.szt_[k];
603  const double twoMzt = 2.0 * Mzt;
604  double D = sqrt(pow(Mtt - Mzz, 2) + twoMzt * twoMzt);
605  double q1 = atan2(-Mtt + Mzz + D, -twoMzt);
606  double l1 = 0.5 * (-Mzz - Mtt + D);
607  double l2 = 0.5 * (-Mzz - Mtt - D);
608  if ((std::abs(l1) < 1e-4) && (std::abs(l2) < 1e-4)) {
609  edm::LogWarning("DAClusterizerInZT_vect") << "warning, bad eigenvalues! idx=" << k << " z= " << y.z_[k]
610  << " Mzz=" << Mzz << " Mtt=" << Mtt << " Mzt=" << Mzt << endl;
611  }
612 
613  double qsplit = q1;
614  double cq = cos(qsplit);
615  double sq = sin(qsplit);
616  if (cq < 0) {
617  cq = -cq;
618  sq = -sq;
619  } // prefer cq>0 to keep z-ordering
620 
621  // estimate subcluster positions and weight
622  double p1 = 0, z1 = 0, t1 = 0, wz1 = 0, wt1 = 0;
623  double p2 = 0, z2 = 0, t2 = 0, wz2 = 0, wt2 = 0;
624  for (unsigned int i = 0; i < nt; ++i) {
625  if (tks.Z_sum_[i] > 1.e-100) {
626  double lr = (tks.z_[i] - y.z_[k]) * cq + (tks.t[i] - y.t_[k]) * sq;
627  // winner-takes-all, usually overestimates splitting
628  double tl = lr < 0 ? 1. : 0.;
629  double tr = 1. - tl;
630 
631  // soften it, especially at low T
632  double arg = lr * std::sqrt(beta * (cq * cq * tks.dz2_[i] + sq * sq * tks.dt2_[i]));
633  if (std::abs(arg) < 20) {
634  double t = local_exp(-arg);
635  tl = t / (t + 1.);
636  tr = 1 / (t + 1.);
637  }
638 
639  double p = y.pk_[k] * tks.pi_[i] *
640  local_exp(-beta * Eik(tks.z_[i], y.z_[k], tks.dz2_[i], tks.t_[i], y.t_[k], tks.dt2_[i])) /
641  tks.Z_sum_[i];
642  double wz = p * tks.dz2_[i];
643  double wt = p * tks.dt2_[i];
644  p1 += p * tl;
645  z1 += wz * tl * tks.z_[i];
646  t1 += wt * tl * tks.t_[i];
647  wz1 += wz * tl;
648  wt1 += wt * tl;
649  p2 += p * tr;
650  z2 += wz * tr * tks.z_[i];
651  t2 += wt * tr * tks.t_[i];
652  wz2 += wz * tr;
653  wt2 += wt * tr;
654  }
655  }
656 
657  if (wz1 > 0) {
658  z1 /= wz1;
659  } else {
660  z1 = y.z_[k] - epsilonz * cq;
661  edm::LogWarning("DAClusterizerInZT_vect") << "warning, wz1 = " << scientific << wz1 << endl;
662  }
663  if (wt1 > 0) {
664  t1 /= wt1;
665  } else {
666  t1 = y.t_[k] - epsilont * sq;
667  edm::LogWarning("DAClusterizerInZT_vect") << "warning, w11 = " << scientific << wt1 << endl;
668  }
669  if (wz2 > 0) {
670  z2 /= wz2;
671  } else {
672  z2 = y.z_[k] + epsilonz * cq;
673  edm::LogWarning("DAClusterizerInZT_vect") << "warning, wz2 = " << scientific << wz2 << endl;
674  }
675  if (wt2 > 0) {
676  t2 /= wt2;
677  } else {
678  t2 = y.t_[k] + epsilont * sq;
679  edm::LogWarning("DAClusterizerInZT_vect") << "warning, wt2 = " << scientific << wt2 << endl;
680  }
681 
682  unsigned int k_min1 = k, k_min2 = k;
683  constexpr double spliteps = 1e-8;
684  while (((find_nearest(z1, t1, y, k_min1, epsilonz, epsilont) && (k_min1 != k)) ||
685  (find_nearest(z2, t2, y, k_min2, epsilonz, epsilont) && (k_min2 != k))) &&
686  (std::abs(z2 - z1) > spliteps || std::abs(t2 - t1) > spliteps)) {
687  z1 = 0.5 * (z1 + y.z_[k]);
688  t1 = 0.5 * (t1 + y.t_[k]);
689  z2 = 0.5 * (z2 + y.z_[k]);
690  t2 = 0.5 * (t2 + y.t_[k]);
691  }
692 
693 #ifdef VI_DEBUG
694  if (verbose_) {
695  if (std::fabs(y.z_[k] - zdumpcenter_) < zdumpwidth_) {
696  std::cout << " T= " << std::setw(10) << std::setprecision(1) << 1. / beta << " Tc= " << critical[ic].first
697  << " direction =" << std::setprecision(4) << qsplit << " splitting (" << std::setw(8) << std::fixed
698  << std::setprecision(4) << y.z_[k] << "," << y.t_[k] << ")"
699  << " --> (" << z1 << ',' << t1 << "),(" << z2 << ',' << t2 << ") [" << p1 << "," << p2 << "]";
700  if (std::fabs(z2 - z1) > epsilonz || std::fabs(t2 - t1) > epsilont) {
701  std::cout << std::endl;
702  } else {
703  std::cout << " rejected " << std::endl;
704  }
705  }
706  }
707 #endif
708 
709  if (z1 > z2) {
710  edm::LogInfo("DAClusterizerInZT") << "warning swapping z in split qsplit=" << qsplit << " cq=" << cq
711  << " sq=" << sq << endl;
712  auto ztemp = z1;
713  auto ttemp = t1;
714  auto ptemp = p1;
715  z1 = z2;
716  t1 = t2;
717  p1 = p2;
718  z2 = ztemp;
719  t2 = ttemp;
720  p2 = ptemp;
721  }
722 
723  // split if the new subclusters are significantly separated
724  if (std::fabs(z2 - z1) > epsilonz || std::fabs(t2 - t1) > epsilont) {
725  split = true;
726  double pk1 = p1 * y.pk_[k] / (p1 + p2);
727  double pk2 = p2 * y.pk_[k] / (p1 + p2);
728 
729  // replace the original by (z2,t2)
730  y.removeItem(k);
731  unsigned int k2 = y.insertOrdered(z2, t2, pk2);
732  // adjust pointers if necessary
733  if (!(k == k2)) {
734  for (unsigned int jc = ic; jc < critical.size(); jc++) {
735  if (critical[jc].second > k) {
736  critical[jc].second--;
737  }
738  if (critical[jc].second >= k2) {
739  critical[jc].second++;
740  }
741  }
742  }
743 
744  // insert (z1,t1) where it belongs
745  unsigned int k1 = y.insertOrdered(z1, t1, pk1);
746  nv++;
747 
748  // adjust remaining pointers
749  for (unsigned int jc = ic; jc < critical.size(); jc++) {
750  if (critical[jc].second >= k1) {
751  critical[jc].second++;
752  } // need to backport the ">-"?
753  }
754 
755  } else {
756 #ifdef VI_DEBUG
757  std::cout << "warning ! split rejected, too small." << endl;
758 #endif
759  }
760  }
761  return split;
762 }
bool split(const double beta, track_t &t, vertex_t &y, double threshold=1.) const
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
A arg
Definition: Factorize.h:36
U second(std::pair< T, U > const &p)
double get_Tc(const vertex_t &y, int k) const
T sqrt(T t)
Definition: SSEVec.h:19
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
bool find_nearest(double z, double t, vertex_t &y, unsigned int &k_min, double dz, double dt) const
double p2[4]
Definition: TauolaWrapper.h:90
int nt
Definition: AMPTWrapper.h:42
DecomposeProduct< arg, typename Div::arg > D
Definition: Factorize.h:141
double q1[4]
Definition: TauolaWrapper.h:87
double p1[4]
Definition: TauolaWrapper.h:89
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:30
#define constexpr
void DAClusterizerInZT_vect::splitAll ( vertex_t y) const

Definition at line 764 of file DAClusterizerInZT_vect.cc.

References DAClusterizerInZT_vect::vertex_t::addItem(), constexpr, gather_cfg::cout, DAClusterizerInZT_vect::vertex_t::debugOut(), MillePedeFileConverter_cfg::e, DAClusterizerInZT_vect::vertex_t::extractRaw(), DAClusterizerInZT_vect::vertex_t::getSize(), dqmdumpme::k, DAClusterizerInZT_vect::vertex_t::pk, DAClusterizerInZT_vect::vertex_t::pk_, DAClusterizerInZT_vect::vertex_t::t, DAClusterizerInZT_vect::vertex_t::t_, testProducerWithPsetDescEmpty_cfi::y1, DAClusterizerInZT_vect::vertex_t::z, and DAClusterizerInZT_vect::vertex_t::z_.

764  {
765  const unsigned int nv = y.getSize();
766 
767  constexpr double epsilonz = 1e-3; // split all single vertices by 10 um
768  constexpr double epsilont = 1e-2; // split all single vertices by 10 ps
769  constexpr double zsep =
770  2 * epsilonz; // split vertices that are isolated by at least zsep (vertices that haven't collapsed)
771  constexpr double tsep = 2 * epsilont;
772  vertex_t y1;
773 
774 #ifdef VI_DEBUG
775  if (verbose_) {
776  std::cout << "Before Split " << std::endl;
777  y.debugOut();
778  }
779 #endif
780 
781  for (unsigned int k = 0; k < nv; k++) {
782  if ((((k == 0) || (y.z_[k - 1] < (y.z_[k] - zsep))) && (((k + 1) == nv) || (y.z_[k + 1] > (y.z_[k] + zsep))))) {
783  // isolated prototype, split
784  double new_z = y.z[k] - epsilonz;
785  double new_t = y.t[k] - epsilont;
786  y.z[k] = y.z[k] + epsilonz;
787  y.t[k] = y.t[k] + epsilont;
788 
789  double new_pk = 0.5 * y.pk[k];
790  y.pk[k] = 0.5 * y.pk[k];
791 
792  y1.addItem(new_z, new_t, new_pk);
793  y1.addItem(y.z_[k], y.t_[k], y.pk_[k]);
794  } else if ((y1.getSize() == 0) || (y1.z_[y1.getSize() - 1] < (y.z_[k] - zsep)) ||
795  (y1.t_[y1.getSize() - 1] < (y.t_[k] - tsep))) {
796  y1.addItem(y.z_[k], y.t_[k], y.pk_[k]);
797  } else {
798  y1.z_[y1.getSize() - 1] = y1.z_[y1.getSize() - 1] - epsilonz;
799  y1.t_[y1.getSize() - 1] = y1.t_[y1.getSize() - 1] - epsilont;
800  y.z_[k] = y.z_[k] + epsilonz;
801  y.t_[k] = y.t_[k] + epsilont;
802  y1.addItem(y.z_[k], y.t_[k], y.pk_[k]);
803  }
804  } // vertex loop
805 
806  y = y1;
807  y.extractRaw();
808 
809 #ifdef VI_DEBUG
810  if (verbose_) {
811  std::cout << "After split " << std::endl;
812  y.debugOut();
813  }
814 #endif
815 }
#define constexpr
double DAClusterizerInZT_vect::update ( double  beta,
track_t gtracks,
vertex_t gvertices,
bool  useRho0,
const double &  rho0 
) const

Definition at line 159 of file DAClusterizerInZT_vect.cc.

References zMuMuMuonUserData::beta, gather_cfg::cout, dumpMFGeometry_cfg::delta, DAClusterizerInZT_vect::vertex_t::ei_, DAClusterizerInZT_vect::vertex_t::ei_cache_, DAClusterizerInZT_vect::track_t::getSize(), DAClusterizerInZT_vect::vertex_t::getSize(), edm::isNotFinite(), dqmdumpme::k, nt, DAClusterizerInZT_vect::vertex_t::nut_, DAClusterizerInZT_vect::vertex_t::nuz_, DAClusterizerInZT_vect::track_t::pi_, funct::pow(), DAClusterizerInZT_vect::vertex_t::se_, DAClusterizerInZT_vect::vertex_t::stt_, DAClusterizerInZT_vect::vertex_t::swt_, DAClusterizerInZT_vect::vertex_t::swz_, DAClusterizerInZT_vect::vertex_t::szt_, DAClusterizerInZT_vect::vertex_t::szz_, DAClusterizerInZT_vect::track_t::t_, PDWG_EXOHSCP_cff::tracks, mitigatedMETSequence_cff::U, pwdgSkimBPark_cfi::vertices, w, and DAClusterizerInZT_vect::track_t::Z_sum_.

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().

160  {
161  //update weights and vertex positions
162  // mass constrained annealing without noise
163  // returns the squared sum of changes of vertex positions
164 
165  const unsigned int nt = gtracks.getSize();
166  const unsigned int nv = gvertices.getSize();
167 
168  //initialize sums
169  double sumpi = 0.;
170 
171  // to return how much the prototype moved
172  double delta = 0.;
173 
174  // intial value of a sum
175  double Z_init = 0;
176  // independpent of loop
177  if (useRho0) {
178  Z_init = rho0 * local_exp(-beta * dzCutOff_ * dzCutOff_); // cut-off
179  }
180 
181  // define kernels
182  auto kernel_calc_exp_arg = [beta, nv](const unsigned int itrack, track_t const& tracks, vertex_t const& vertices) {
183  const auto track_z = tracks.z_[itrack];
184  const auto track_t = tracks.t_[itrack];
185  const auto botrack_dz2 = -beta * tracks.dz2_[itrack];
186  const auto botrack_dt2 = -beta * tracks.dt2_[itrack];
187 
188  // auto-vectorized
189  for (unsigned int ivertex = 0; ivertex < nv; ++ivertex) {
190  const auto mult_resz = track_z - vertices.z_[ivertex];
191  const auto mult_rest = track_t - vertices.t_[ivertex];
192  vertices.ei_cache_[ivertex] = botrack_dz2 * (mult_resz * mult_resz) + botrack_dt2 * (mult_rest * mult_rest);
193  }
194  };
195 
196  auto kernel_add_Z = [nv, Z_init](vertex_t const& vertices) -> double {
197  double ZTemp = Z_init;
198  for (unsigned int ivertex = 0; ivertex < nv; ++ivertex) {
199  ZTemp += vertices.pk_[ivertex] * vertices.ei_[ivertex];
200  }
201  return ZTemp;
202  };
203 
204  auto kernel_calc_normalization = [nv](const unsigned int track_num, track_t& tks_vec, vertex_t& y_vec) {
205  auto tmp_trk_pi = tks_vec.pi_[track_num];
206  auto o_trk_Z_sum = 1. / tks_vec.Z_sum_[track_num];
207  auto o_trk_err_z = tks_vec.dz2_[track_num];
208  auto o_trk_err_t = tks_vec.dt2_[track_num];
209  auto tmp_trk_z = tks_vec.z_[track_num];
210  auto tmp_trk_t = tks_vec.t_[track_num];
211 
212  // auto-vectorized
213  for (unsigned int k = 0; k < nv; ++k) {
214  // parens are important for numerical stability
215  y_vec.se_[k] += tmp_trk_pi * (y_vec.ei_[k] * o_trk_Z_sum);
216  const auto w = tmp_trk_pi * (y_vec.pk_[k] * y_vec.ei_[k] * o_trk_Z_sum); // p_{ik}
217  const auto wz = w * o_trk_err_z;
218  const auto wt = w * o_trk_err_t;
219  y_vec.nuz_[k] += wz;
220  y_vec.nut_[k] += wt;
221  y_vec.swz_[k] += wz * tmp_trk_z;
222  y_vec.swt_[k] += wt * tmp_trk_t;
223  /* this is really only needed when we want to get Tc too, mayb better to do it elsewhere? */
224  const auto dsz = (tmp_trk_z - y_vec.z[k]) * o_trk_err_z;
225  const auto dst = (tmp_trk_t - y_vec.t[k]) * o_trk_err_t;
226  y_vec.szz_[k] += w * dsz * dsz;
227  y_vec.stt_[k] += w * dst * dst;
228  y_vec.szt_[k] += w * dsz * dst;
229  }
230  };
231 
232  for (auto ivertex = 0U; ivertex < nv; ++ivertex) {
233  gvertices.se_[ivertex] = 0.0;
234  gvertices.nuz_[ivertex] = 0.0;
235  gvertices.nut_[ivertex] = 0.0;
236  gvertices.swz_[ivertex] = 0.0;
237  gvertices.swt_[ivertex] = 0.0;
238  gvertices.szz_[ivertex] = 0.0;
239  gvertices.stt_[ivertex] = 0.0;
240  gvertices.szt_[ivertex] = 0.0;
241  }
242 
243  // loop over tracks
244  for (auto itrack = 0U; itrack < nt; ++itrack) {
245  kernel_calc_exp_arg(itrack, gtracks, gvertices);
246  local_exp_list(gvertices.ei_cache_, gvertices.ei_, nv);
247 
248  gtracks.Z_sum_[itrack] = kernel_add_Z(gvertices);
249  if (edm::isNotFinite(gtracks.Z_sum_[itrack]))
250  gtracks.Z_sum_[itrack] = 0.0;
251  // used in the next major loop to follow
252  sumpi += gtracks.pi_[itrack];
253 
254  if (gtracks.Z_sum_[itrack] > 1.e-100) {
255  kernel_calc_normalization(itrack, gtracks, gvertices);
256  }
257  }
258 
259  // now update z, t, and pk
260  auto kernel_calc_zt = [sumpi,
261  nv
262 #ifdef VI_DEBUG
263  ,
264  this
265 #endif
266  ](vertex_t& vertices) -> double {
267  double delta = 0;
268 
269  // does not vectorizes
270  for (unsigned int ivertex = 0; ivertex < nv; ++ivertex) {
271  if (vertices.nuz_[ivertex] > 0.) {
272  auto znew = vertices.swz_[ivertex] / vertices.nuz_[ivertex];
273  // prevents from vectorizing if
274  delta += std::pow(vertices.z_[ivertex] - znew, 2);
275  vertices.z_[ivertex] = znew;
276  }
277 
278  if (vertices.nut_[ivertex] > 0.) {
279  auto tnew = vertices.swt_[ivertex] / vertices.nut_[ivertex];
280  // prevents from vectorizing if
281  delta += std::pow(vertices.t_[ivertex] - tnew, 2);
282  vertices.t_[ivertex] = tnew;
283  }
284 
285 #ifdef VI_DEBUG
286  else {
287  edm::LogInfo("sumw") << "invalid sum of weights in fit: " << endl; //vertices.sw_[ivertex] << endl;
288  if (this->verbose_) {
289  std::cout << " a cluster melted away ? pk=" << vertices.pk_[ivertex]
290  << " sumw=" << /*vertices.sw_[ivertex] << */ endl;
291  }
292  }
293 #endif
294  }
295 
296  auto osumpi = 1. / sumpi;
297  for (unsigned int ivertex = 0; ivertex < nv; ++ivertex)
298  vertices.pk_[ivertex] = vertices.pk_[ivertex] * vertices.se_[ivertex] * osumpi;
299 
300  return delta;
301  };
302 
303  delta += kernel_calc_zt(gvertices);
304 
305  // return how much the prototypes moved
306  return delta;
307 }
const double w
Definition: UKUtility.cc:23
constexpr bool isNotFinite(T x)
Definition: isFinite.h:9
std::vector< TransientVertex > vertices(const std::vector< reco::TransientTrack > &tracks, const int verbosity=0) const
int nt
Definition: AMPTWrapper.h:42
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:30
vector< TransientVertex > DAClusterizerInZT_vect::vertices ( const std::vector< reco::TransientTrack > &  tracks,
const int  verbosity = 0 
) const

Definition at line 817 of file DAClusterizerInZT_vect.cc.

References a, DAClusterizerInZT_vect::vertex_t::addItem(), zMuMuMuonUserData::beta, bsc_activity_cfg::clusters, gather_cfg::cout, DAClusterizerInZT_vect::track_t::dt2_, FrontierConditions_GlobalTag_cff::dump, DAClusterizerInZT_vect::track_t::dz2_, MillePedeFileConverter_cfg::e, DAClusterizerInZT_vect::track_t::extractRaw(), ntuplemaker::fill, DAClusterizerInZT_vect::track_t::getSize(), DAClusterizerInZT_vect::vertex_t::getSize(), mps_fire::i, edm::isNotFinite(), dqmdumpme::k, MatrixUtil::merge(), min(), nt, AlCaHLTBitMon_ParallelJobs::p, DAClusterizerInZT_vect::track_t::pi_, DAClusterizerInZT_vect::vertex_t::pk_, cms::dd::split(), mathSSE::sqrt(), DAClusterizerInZT_vect::track_t::t_, DAClusterizerInZT_vect::vertex_t::t_, MessageLogger_cff::threshold, DAClusterizerInZT_vect::track_t::tt, update, findQualityFiles::v, DAClusterizerInZT_vect::track_t::z_, DAClusterizerInZT_vect::vertex_t::z_, and DAClusterizerInZT_vect::track_t::Z_sum_.

818  {
819  track_t&& tks = fill(tracks);
820  tks.extractRaw();
821 
822  unsigned int nt = tks.getSize();
823  double rho0 = 0.0; // start with no outlier rejection
824 
825  vector<TransientVertex> clusters;
826  if (tks.getSize() == 0)
827  return clusters;
828 
829  vertex_t y; // the vertex prototypes
830 
831  // initialize:single vertex at infinite temperature
832  y.addItem(0, 0, 1.0);
833 
834  int niter = 0; // number of iterations
835 
836  // estimate first critical temperature
837  double beta = beta0(betamax_, tks, y);
838 #ifdef VI_DEBUG
839  if (verbose_)
840  std::cout << "Beta0 is " << beta << std::endl;
841 #endif
842 
843  niter = 0;
844  while ((update(beta, tks, y, false, rho0) > 1.e-6) && (niter++ < maxIterations_)) {
845  }
846 
847  // annealing loop, stop when T<minT (i.e. beta>1/minT)
848 
849  double betafreeze = betamax_ * sqrt(coolingFactor_);
850 
851  while (beta < betafreeze) {
852  if (useTc_) {
853  update(beta, tks, y, false, rho0);
854  zorder(y);
855  while (merge(y, beta)) {
856  update(beta, tks, y, false, rho0);
857  }
858  split(beta, tks, y);
859  beta = beta / coolingFactor_;
860  } else {
861  beta = beta / coolingFactor_;
862  splitAll(y);
863  }
864 
865  // make sure we are not too far from equilibrium before cooling further
866  niter = 0;
867  while ((update(beta, tks, y, false, rho0) > 1.e-6) && (niter++ < maxIterations_)) {
868  }
869 
870 #ifdef VI_DEBUG
871  if (verbose_) {
872  dump(beta, y, tks, 0);
873  }
874 #endif
875  }
876 
877  if (useTc_) {
878  //last round of splitting, make sure no critical clusters are left
879 #ifdef VI_DEBUG
880  if (verbose_) {
881  std::cout << "last spliting at " << 1. / beta << std::endl;
882  }
883 #endif
884  update(beta, tks, y, false, rho0); // make sure Tc is up-to-date
885  zorder(y);
886  while (merge(y, beta)) {
887  update(beta, tks, y, false, rho0);
888  }
889  unsigned int ntry = 0;
890  double threshold = 1.0;
891  while (split(beta, tks, y, threshold) && (ntry++ < 10)) {
892  niter = 0;
893  while ((update(beta, tks, y, false, rho0) > 1.e-6) && (niter++ < maxIterations_)) {
894  }
895  zorder(y);
896 #ifdef VI_DEBUG
897  if (verbose_)
898  dump(beta, y, tks, 2);
899 #endif
900 
901  while (merge(y, beta)) {
902  update(beta, tks, y, false, rho0);
903  }
904 #ifdef VI_DEBUG
905  if (verbose_) {
906  std::cout << "after final splitting, try " << ntry << std::endl;
907  dump(beta, y, tks, 2);
908  }
909 #endif
910  // relax splitting a bit to reduce multiple split-merge cycles of the same cluster
911  threshold *= 1.1;
912  }
913  } else {
914  // merge collapsed clusters
915  while (merge(y, beta)) {
916  update(beta, tks, y, false, rho0);
917  }
918  }
919 
920 #ifdef VI_DEBUG
921  if (verbose_) {
922  update(beta, tks, y, false, rho0);
923  std::cout << "dump after 1st merging " << endl;
924  dump(beta, y, tks, 2);
925  }
926 #endif
927 
928  // switch on outlier rejection at T=minT
929  if (dzCutOff_ > 0) {
930  rho0 = 1. / nt;
931  for (unsigned int a = 0; a < 10; a++) {
932  update(beta, tks, y, true, a * rho0 / 10);
933  } // adiabatic turn-on
934  }
935 
936  niter = 0;
937  while ((update(beta, tks, y, true, rho0) > 1.e-8) && (niter++ < maxIterations_)) {
938  };
939 #ifdef VI_DEBUG
940  if (verbose_) {
941  std::cout << "dump after noise-suppression, rho0=" << rho0 << " niter = " << niter << endl;
942  dump(beta, y, tks, 2);
943  }
944 #endif
945 
946  // merge again (some cluster split by outliers collapse here)
947  zorder(y);
948  while (merge(y, beta)) {
949  update(beta, tks, y, true, rho0);
950  }
951 #ifdef VI_DEBUG
952  if (verbose_) {
953  std::cout << "dump after merging " << endl;
954  dump(beta, y, tks, 2);
955  }
956 #endif
957 
958  // go down to the purging temperature (if it is lower than tmin)
959  while (beta < betapurge_) {
960  beta = min(beta / coolingFactor_, betapurge_);
961  niter = 0;
962  while ((update(beta, tks, y, false, rho0) > 1.e-8) && (niter++ < maxIterations_)) {
963  }
964  }
965 
966  // eliminate insigificant vertices, this is more restrictive at higher T
967  while (purge(y, tks, rho0, beta)) {
968  niter = 0;
969  while ((update(beta, tks, y, true, rho0) > 1.e-6) && (niter++ < maxIterations_)) {
970  zorder(y);
971  }
972  }
973 
974 #ifdef VI_DEBUG
975  if (verbose_) {
976  update(beta, tks, y, true, rho0);
977  std::cout << " after purging " << std::endl;
978  dump(beta, y, tks, 2);
979  }
980 #endif
981 
982  // optionally cool some more without doing anything, to make the assignment harder
983  while (beta < betastop_) {
984  beta = min(beta / coolingFactor_, betastop_);
985  niter = 0;
986  while ((update(beta, tks, y, true, rho0) > 1.e-8) && (niter++ < maxIterations_)) {
987  }
988  zorder(y);
989  }
990 
991 #ifdef VI_DEBUG
992  if (verbose_) {
993  std::cout << "Final result, rho0=" << std::scientific << rho0 << endl;
994  dump(beta, y, tks, 2);
995  }
996 #endif
997 
998  // new, merge here and not in "clusterize"
999  // final merging step
1000  double betadummy = 1;
1001  while (merge(y, betadummy))
1002  ;
1003 
1004  // select significant tracks and use a TransientVertex as a container
1005  GlobalError dummyError(0.01, 0, 0.01, 0., 0., 0.01);
1006 
1007  // ensure correct normalization of probabilities, should makes double assignment reasonably impossible
1008  const unsigned int nv = y.getSize();
1009  for (unsigned int k = 0; k < nv; k++)
1010  if (edm::isNotFinite(y.pk_[k]) || edm::isNotFinite(y.z_[k])) {
1011  y.pk_[k] = 0;
1012  y.z_[k] = 0;
1013  }
1014 
1015  for (unsigned int i = 0; i < nt; i++) // initialize
1016  tks.Z_sum_[i] = rho0 * local_exp(-beta * dzCutOff_ * dzCutOff_);
1017 
1018  // improve vectorization (does not require reduction ....)
1019  for (unsigned int k = 0; k < nv; k++) {
1020  for (unsigned int i = 0; i < nt; i++)
1021  tks.Z_sum_[i] +=
1022  y.pk_[k] * local_exp(-beta * Eik(tks.z_[i], y.z_[k], tks.dz2_[i], tks.t_[i], y.t_[k], tks.dt2_[i]));
1023  }
1024 
1025  for (unsigned int k = 0; k < nv; k++) {
1026  GlobalPoint pos(0, 0, y.z_[k]);
1027 
1028  vector<reco::TransientTrack> vertexTracks;
1029  for (unsigned int i = 0; i < nt; i++) {
1030  if (tks.Z_sum_[i] > 1e-100) {
1031  double p = y.pk_[k] * local_exp(-beta * Eik(tks.z_[i], y.z_[k], tks.dz2_[i], tks.t_[i], y.t_[k], tks.dt2_[i])) /
1032  tks.Z_sum_[i];
1033  if ((tks.pi_[i] > 0) && (p > mintrkweight_)) {
1034  vertexTracks.push_back(*(tks.tt[i]));
1035  tks.Z_sum_[i] = 0; // setting Z=0 excludes double assignment
1036  }
1037  }
1038  }
1039  TransientVertex v(pos, y.t_[k], dummyError, vertexTracks, 0);
1040  clusters.push_back(v);
1041  }
1042 
1043  return clusters;
1044 }
constexpr bool isNotFinite(T x)
Definition: isFinite.h:9
bool split(const double beta, track_t &t, vertex_t &y, double threshold=1.) const
void splitAll(vertex_t &y) const
bool merge(vertex_t &y, double &beta) const
void zorder(vertex_t &y) const
bool purge(vertex_t &, track_t &, double &, const double) const
T sqrt(T t)
Definition: SSEVec.h:19
T min(T a, T b)
Definition: MathUtil.h:58
int nt
Definition: AMPTWrapper.h:42
double update(double beta, track_t &gtracks, vertex_t &gvertices, bool useRho0, const double &rho0) const
track_t fill(const std::vector< reco::TransientTrack > &tracks) const
double a
Definition: hdecay.h:119
double beta0(const double betamax, track_t const &tks, vertex_t const &y) const
void dump(const double beta, const vertex_t &y, const track_t &tks, const int verbosity=0) const
void DAClusterizerInZT_vect::zorder ( vertex_t y) const

Definition at line 309 of file DAClusterizerInZT_vect.cc.

References DAClusterizerInZT_vect::vertex_t::extractRaw(), DAClusterizerInZT_vect::vertex_t::getSize(), dqmdumpme::k, DAClusterizerInZT_vect::vertex_t::pk, DAClusterizerInZT_vect::vertex_t::t, and DAClusterizerInZT_vect::vertex_t::z.

309  {
310  const unsigned int nv = y.getSize();
311 
312  if (nv < 2)
313  return;
314 
315  bool reordering = true;
316  bool modified = false;
317 
318  while (reordering) {
319  reordering = false;
320  for (unsigned int k = 0; (k + 1) < nv; k++) {
321  if (y.z[k + 1] < y.z[k]) {
322  auto ztemp = y.z[k];
323  y.z[k] = y.z[k + 1];
324  y.z[k + 1] = ztemp;
325  auto ttemp = y.t[k];
326  y.t[k] = y.t[k + 1];
327  y.t[k + 1] = ttemp;
328  auto ptemp = y.pk[k];
329  y.pk[k] = y.pk[k + 1];
330  y.pk[k + 1] = ptemp;
331  reordering = true;
332  }
333  }
334  modified |= reordering;
335  }
336 
337  if (modified)
338  y.extractRaw();
339 }

Member Data Documentation

double DAClusterizerInZT_vect::betamax_
private

Definition at line 231 of file DAClusterizerInZT_vect.h.

double DAClusterizerInZT_vect::betapurge_
private

Definition at line 243 of file DAClusterizerInZT_vect.h.

double DAClusterizerInZT_vect::betastop_
private

Definition at line 232 of file DAClusterizerInZT_vect.h.

double DAClusterizerInZT_vect::coolingFactor_
private

Definition at line 230 of file DAClusterizerInZT_vect.h.

double DAClusterizerInZT_vect::d0CutOff_
private

Definition at line 234 of file DAClusterizerInZT_vect.h.

double DAClusterizerInZT_vect::dtCutOff_
private

Definition at line 235 of file DAClusterizerInZT_vect.h.

double DAClusterizerInZT_vect::dzCutOff_
private

Definition at line 233 of file DAClusterizerInZT_vect.h.

int DAClusterizerInZT_vect::maxIterations_
private

Definition at line 229 of file DAClusterizerInZT_vect.h.

double DAClusterizerInZT_vect::mintrkweight_
private

Definition at line 239 of file DAClusterizerInZT_vect.h.

double DAClusterizerInZT_vect::t0Max_
private

Definition at line 236 of file DAClusterizerInZT_vect.h.

double DAClusterizerInZT_vect::tmerge_
private

Definition at line 242 of file DAClusterizerInZT_vect.h.

double DAClusterizerInZT_vect::uniquetrkweight_
private

Definition at line 240 of file DAClusterizerInZT_vect.h.

bool DAClusterizerInZT_vect::useTc_
private

Definition at line 237 of file DAClusterizerInZT_vect.h.

bool DAClusterizerInZT_vect::verbose_
private

Definition at line 223 of file DAClusterizerInZT_vect.h.

double DAClusterizerInZT_vect::vertexSize_
private

Definition at line 227 of file DAClusterizerInZT_vect.h.

double DAClusterizerInZT_vect::vertexSizeTime_
private

Definition at line 228 of file DAClusterizerInZT_vect.h.

double DAClusterizerInZT_vect::zdumpcenter_
private

Definition at line 224 of file DAClusterizerInZT_vect.h.

double DAClusterizerInZT_vect::zdumpwidth_
private

Definition at line 225 of file DAClusterizerInZT_vect.h.

double DAClusterizerInZT_vect::zmerge_
private

Definition at line 241 of file DAClusterizerInZT_vect.h.