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 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, SiStripPI::max, and lumiCalc2::stopT.

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

529  {
530 
531  double T0 = 0; // max Tc for beta=0
532  // estimate critical temperature from beta=0 (T=inf)
533  const unsigned int nt = tks.getSize();
534  const unsigned int nv = y.getSize();
535 
536  for (unsigned int k = 0; k < nv; k++) {
537 
538  // vertex fit at T=inf
539  double sumwz = 0;
540  double sumwt = 0;
541  double sumw_z = 0;
542  double sumw_t = 0;
543  for (unsigned int i = 0; i < nt; i++) {
544  double w_z = tks.pi_[i] * tks.dz2_[i];
545  double w_t = tks.pi_[i] * tks.dt2_[i];
546  sumwz += w_z * tks.z_[i];
547  sumwt += w_t * tks.t_[i];
548  sumw_z += w_z;
549  sumw_t += w_t;
550  }
551  y.z_[k] = sumwz / sumw_z;
552  y.t_[k] = sumwt / sumw_t;
553 
554  // estimate Tc, eventually do this in the same loop
555  double szz = 0, stt = 0, szt = 0;
556  double nuz = 0, nut = 0;
557  for (unsigned int i = 0; i < nt; i++) {
558  double dz = (tks.z_[i] - y.z_[k]) * tks.dz2_[i];
559  double dt = (tks.t_[i] - y.t_[k]) * tks.dt2_[i];
560  double w = tks.pi_[i];
561  szz += w * dz * dz;
562  stt += w * dt * dt;
563  szt += w * dz * dt;
564  nuz += w * tks.dz2_[i];
565  nut += w * tks.dt2_[i];
566  }
567  double Tz = szz/nuz;
568  double Tt = stt/nut;
569  double Tc = Tz + Tt + sqrt( pow(Tz - Tt, 2) + 4 * szt * szt / nuz / nut);
570 
571  if (Tc > T0) T0 = Tc;
572  }// vertex loop (normally there should be only one vertex at beta=0)
573 
574 #ifdef VI_DEBUG
575  if(verbose_){
576  std::cout << "DAClustrizerInZT_vect.beta0: Tc = " << T0 << std::endl;
577  int coolingsteps = 1 - int(std::log(T0 * betamax) / std::log(coolingFactor_));
578  std::cout << "DAClustrizerInZT_vect.beta0: nstep = " << coolingsteps << std::endl;
579  }
580 #endif
581 
582 
583  if (T0 > 1. / betamax) {
584  return betamax / std::pow(coolingFactor_, int(std::log(T0 * betamax) / std::log(coolingFactor_)) - 1);
585  } else {
586  // ensure at least one annealing step
587  return betamax * coolingFactor_;
588  }
589 }
float dt
Definition: AMPTWrapper.h:126
const double w
Definition: UKUtility.cc:23
T sqrt(T t)
Definition: SSEVec.h:18
int nt
Definition: AMPTWrapper.h:32
int k[5][pyjets_maxn]
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40
vector< vector< reco::TransientTrack > > DAClusterizerInZT_vect::clusterize ( const std::vector< reco::TransientTrack > &  tracks) const
overridevirtual

Implements TrackClusterizerInZ.

Definition at line 1027 of file DAClusterizerInZT_vect.cc.

References fastPrimaryVertexProducer_cfi::clusters, gather_cfg::cout, gen::k, MetAnalyzer::pv(), and electrons_cff::vertices.

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

Definition at line 1095 of file DAClusterizerInZT_vect.cc.

References a, b, pfBoostedDoubleSVAK8TagInfos_cfi::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, cmsBatch::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_.

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

Definition at line 107 of file DAClusterizerInZT_vect.cc.

References DAClusterizerInZT_vect::track_t::addItem(), TSGForRoadSearchIOpxl_cfi::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().

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

Definition at line 358 of file DAClusterizerInZT_vect.cc.

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

358  {
359  // find the cluster nearest to (z,t)
360  // distance measure is delta = (delta_z / dz )**2 + (delta_t/ d_t)**2
361  // assumes that clusters are ordered n z
362  // return value is false if o neighbour with distance < 1 is found
363 
364  unsigned int nv = y.getSize();
365 
366  // find nearest in z, binary search later
367  unsigned int k = 0;
368  for(unsigned int k0 = 1; k0 < nv; k0++){
369  if (std::abs( y.z_[k0]-z ) < std::abs( y.z_[k]-z )){
370  k = k0;
371  }
372  }
373 
374  double delta_min = 1.;
375 
376  //search left
377  unsigned int k1 = k;
378  while( ( k1 > 0) && ((y.z[k] - y.z[--k1]) < dz ) ){
379  auto delta = std::pow( (y.z_[k] - y.z_[k1]) / dz, 2)
380  +std::pow( (y.t_[k] - y.t_[k1]) / dt, 2);
381  if (delta < delta_min){
382  k_min = k1;
383  delta_min = delta;
384  }
385  }
386 
387  //search right
388  k1 = k;
389  while( ((++k1) < nv) && ((y.z[k1] - y.z[k]) < dz ) ){
390  auto delta = std::pow( (y.z_[k1] - y.z_[k]) / dz, 2)
391  +std::pow( (y.t_[k1] - y.t_[k]) / dt, 2);
392  if (delta < delta_min){
393  k_min = k1;
394  delta_min = delta;
395  }
396  }
397 
398  return (delta_min < 1.);
399 }
dbl * delta
Definition: mlp_gen.cc:36
float dt
Definition: AMPTWrapper.h:126
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
int k[5][pyjets_maxn]
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40
double DAClusterizerInZT_vect::get_Tc ( const vertex_t y,
int  k 
) const

Definition at line 591 of file DAClusterizerInZT_vect.cc.

References gen::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_.

591  {
592  double Tz = y.szz_[k]/y.nuz_[k]; // actually 0.5*Tc(z)
593  double Tt = y.stt_[k]/y.nut_[k];
594  double mx = y.szt_[k]/y.nuz_[k]*y.szt_[k]/y.nut_[k];
595  return Tz + Tt + sqrt(pow(Tz - Tt, 2) + 4 * mx);
596 }
T sqrt(T t)
Definition: SSEVec.h:18
int k[5][pyjets_maxn]
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40
bool DAClusterizerInZT_vect::merge ( vertex_t y,
double &  beta 
) const

Definition at line 404 of file DAClusterizerInZT_vect.cc.

References gather_cfg::cout, 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_.

404  {
405  // merge clusters that collapsed or never separated,
406  // return true if vertices were merged, false otherwise
407  const unsigned int nv = y.getSize();
408 
409  if (nv < 2)
410  return false;
411 
412  // merge the smallest distance clusters first
413  unsigned int k1_min = 0, k2_min = 0;
414  double delta_min = 0;
415 
416  for (unsigned int k1 = 0; (k1 + 1) < nv; k1++) {
417  unsigned int k2 = k1;
418  while( (++k2 < nv) && ( std::fabs(y.z[k2] - y.z_[k1] ) < zmerge_ ) ){
419  auto delta = std::pow( (y.z_[k2] - y.z_[k1]) / zmerge_, 2)
420  +std::pow( (y.t_[k2] - y.t_[k1]) / tmerge_, 2);
421  if ( (delta < delta_min) || (k1_min == k2_min) ){
422  k1_min = k1;
423  k2_min = k2;
424  delta_min = delta;
425  }
426  }
427  }
428 
429  if( (k1_min == k2_min) || (delta_min > 1) ){
430  return false;
431  }
432 
433 
434  double rho = y.pk_[k1_min] + y.pk_[k2_min];
435 #ifdef VI_DEBUG
436  if(verbose_){ std::cout << "merging (" << setw(8) << fixed << setprecision(4) << y.z_[k1_min] << ',' << y.t_[k1_min] << ") and (" << y.z_[k2_min] << ',' << y.t_[k2_min] << ")" << " idx=" << k1_min << "," << k2_min << std::endl;}
437 #endif
438  if(rho > 0){
439  y.z_[k1_min] = (y.pk_[k1_min] * y.z_[k1_min] + y.pk_[k2_min] * y.z_[k2_min])/rho;
440  y.t_[k1_min] = (y.pk_[k1_min] * y.t_[k1_min] + y.pk_[k2_min] * y.t_[k2_min])/rho;
441  }else{
442  y.z_[k1_min] = 0.5 * (y.z_[k1_min] + y.z_[k2_min]);
443  y.t_[k1_min] = 0.5 * (y.t_[k1_min] + y.t_[k2_min]);
444  }
445  y.pk_[k1_min] = rho;
446  y.removeItem(k2_min);
447  y.extractRaw();
448  return true;
449 }
dbl * delta
Definition: mlp_gen.cc:36
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40
bool DAClusterizerInZT_vect::purge ( vertex_t y,
track_t tks,
double &  rho0,
const double  beta 
) const

Definition at line 452 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, gen::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_.

452  {
453  constexpr double eps = 1.e-100;
454  // eliminate clusters with only one significant/unique track
455  const unsigned int nv = y.getSize();
456  const unsigned int nt = tks.getSize();
457 
458  if (nv < 2)
459  return false;
460 
461  double sumpmin = nt;
462  unsigned int k0 = nv;
463 
464  int nUnique = 0;
465  double sump = 0;
466 
467  std::vector<double> inverse_zsums(nt), arg_cache(nt), eik_cache(nt);
468  double * pinverse_zsums;
469  double * parg_cache;
470  double * peik_cache;
471  pinverse_zsums = inverse_zsums.data();
472  parg_cache = arg_cache.data();
473  peik_cache = eik_cache.data();
474  for(unsigned i = 0; i < nt; ++i) {
475  inverse_zsums[i] = tks.Z_sum_[i] > eps ? 1./tks.Z_sum_[i] : 0.0;
476  }
477 
478  for (unsigned int k = 0; k < nv; ++k) {
479 
480  nUnique = 0;
481  sump = 0;
482 
483  const double pmax = y.pk_[k] / (y.pk_[k] + rho0 * local_exp(-beta * dzCutOff_* dzCutOff_));
484  const double pcut = uniquetrkweight_ * pmax;
485  for(unsigned i = 0; i < nt; ++i) {
486  const auto track_z = tks.z_[i];
487  const auto track_t = tks.t_[i];
488  const auto botrack_dz2 = -beta*tks.dz2_[i];
489  const auto botrack_dt2 = -beta*tks.dt2_[i];
490 
491  const auto mult_resz = track_z - y.z_[k];
492  const auto mult_rest = track_t - y.t_[k];
493  parg_cache[i] = botrack_dz2 * ( mult_resz * mult_resz ) + botrack_dt2 * ( mult_rest * mult_rest );
494  }
495  local_exp_list(parg_cache, peik_cache, nt);
496  for (unsigned int i = 0; i < nt; ++i) {
497  const double p = y.pk_[k] * peik_cache[i] * pinverse_zsums[i];
498  sump += p;
499  nUnique += ( ( p > pcut ) & ( tks.pi_[i] > 0 ) );
500  }
501 
502  if ((nUnique < 2) && (sump < sumpmin)) {
503  sumpmin = sump;
504  k0 = k;
505  }
506 
507  }
508 
509  if (k0 != nv) {
510 #ifdef VI_DEBUG
511  if (verbose_) {
512  std::cout << "eliminating prototype at " << std::setw(10) << std::setprecision(4) << y.z_[k0] << "," << y.t_[k0]
513  << " with sump=" << sumpmin
514  << " rho*nt =" << y.pk_[k0]*nt
515  << endl;
516  }
517 #endif
518  y.removeItem(k0);
519  return true;
520  } else {
521  return false;
522  }
523 }
#define constexpr
int nt
Definition: AMPTWrapper.h:32
int k[5][pyjets_maxn]
bool DAClusterizerInZT_vect::split ( const double  beta,
track_t t,
vertex_t y,
double  threshold = 1. 
) const

Definition at line 599 of file DAClusterizerInZT_vect.cc.

References funct::abs(), pfBoostedDoubleSVAK8TagInfos_cfi::beta, constexpr, funct::cos(), gather_cfg::cout, 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(), gen::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(), split, mathSSE::sqrt(), DAClusterizerInZT_vect::vertex_t::stt_, DAClusterizerInZT_vect::vertex_t::szt_, DAClusterizerInZT_vect::vertex_t::szz_, lumiQTWidget::t, DAClusterizerInZT_vect::track_t::t, 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_.

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

Definition at line 755 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(), gen::k, DAClusterizerInZT_vect::vertex_t::pk, DAClusterizerInZT_vect::vertex_t::pk_, DAClusterizerInZT_vect::vertex_t::t, DAClusterizerInZT_vect::vertex_t::t_, DAClusterizerInZT_vect::vertex_t::z, and DAClusterizerInZT_vect::vertex_t::z_.

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

Definition at line 165 of file DAClusterizerInZT_vect.cc.

References pfBoostedDoubleSVAK8TagInfos_cfi::beta, gather_cfg::cout, delta, DAClusterizerInZT_vect::vertex_t::ei_, DAClusterizerInZT_vect::vertex_t::ei_cache_, DAClusterizerInZT_vect::track_t::getSize(), DAClusterizerInZT_vect::vertex_t::getSize(), edm::isNotFinite(), gen::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_, l1t::tracks, mitigatedMETSequence_cff::U, electrons_cff::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().

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

Definition at line 819 of file DAClusterizerInZT_vect.cc.

References a, DAClusterizerInZT_vect::vertex_t::addItem(), pfBoostedDoubleSVAK8TagInfos_cfi::beta, fastPrimaryVertexProducer_cfi::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(), lumiContext::fill, DAClusterizerInZT_vect::track_t::getSize(), DAClusterizerInZT_vect::vertex_t::getSize(), mps_fire::i, edm::isNotFinite(), gen::k, MatrixUtil::merge(), min(), nt, AlCaHLTBitMon_ParallelJobs::p, DAClusterizerInZT_vect::track_t::pi_, DAClusterizerInZT_vect::vertex_t::pk_, split, mathSSE::sqrt(), DAClusterizerInZT_vect::track_t::t_, DAClusterizerInZT_vect::vertex_t::t_, electronIdCutBased_cfi::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_.

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

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

331  {
332  const unsigned int nv = y.getSize();
333 
334  if (nv < 2) return;
335 
336 
337  bool reordering = true;
338  bool modified = false;
339 
340  while(reordering){
341  reordering = false;
342  for (unsigned int k = 0; (k + 1) < nv; k++) {
343  if ( y.z[k + 1] < y.z[k] ) {
344  auto ztemp = y.z[k]; y.z[k] = y.z[k+1]; y.z[k+1] = ztemp;
345  auto ttemp = y.t[k]; y.t[k] = y.t[k+1]; y.t[k+1] = ttemp;
346  auto ptemp = y.pk[k]; y.pk[k] = y.pk[k+1]; y.pk[k+1] = ptemp;
347  reordering = true;
348  }
349  }
350  modified |= reordering;
351  }
352 
353  if( modified ) y.extractRaw();
354 }
int k[5][pyjets_maxn]

Member Data Documentation

double DAClusterizerInZT_vect::betamax_
private

Definition at line 255 of file DAClusterizerInZT_vect.h.

double DAClusterizerInZT_vect::betapurge_
private

Definition at line 266 of file DAClusterizerInZT_vect.h.

double DAClusterizerInZT_vect::betastop_
private

Definition at line 256 of file DAClusterizerInZT_vect.h.

double DAClusterizerInZT_vect::coolingFactor_
private

Definition at line 254 of file DAClusterizerInZT_vect.h.

double DAClusterizerInZT_vect::d0CutOff_
private

Definition at line 258 of file DAClusterizerInZT_vect.h.

double DAClusterizerInZT_vect::dtCutOff_
private

Definition at line 259 of file DAClusterizerInZT_vect.h.

double DAClusterizerInZT_vect::dzCutOff_
private

Definition at line 257 of file DAClusterizerInZT_vect.h.

int DAClusterizerInZT_vect::maxIterations_
private

Definition at line 253 of file DAClusterizerInZT_vect.h.

double DAClusterizerInZT_vect::mintrkweight_
private

Definition at line 262 of file DAClusterizerInZT_vect.h.

double DAClusterizerInZT_vect::tmerge_
private

Definition at line 265 of file DAClusterizerInZT_vect.h.

double DAClusterizerInZT_vect::uniquetrkweight_
private

Definition at line 263 of file DAClusterizerInZT_vect.h.

bool DAClusterizerInZT_vect::useTc_
private

Definition at line 260 of file DAClusterizerInZT_vect.h.

bool DAClusterizerInZT_vect::verbose_
private

Definition at line 247 of file DAClusterizerInZT_vect.h.

double DAClusterizerInZT_vect::vertexSize_
private

Definition at line 251 of file DAClusterizerInZT_vect.h.

double DAClusterizerInZT_vect::vertexSizeTime_
private

Definition at line 252 of file DAClusterizerInZT_vect.h.

double DAClusterizerInZT_vect::zdumpcenter_
private

Definition at line 248 of file DAClusterizerInZT_vect.h.

double DAClusterizerInZT_vect::zdumpwidth_
private

Definition at line 249 of file DAClusterizerInZT_vect.h.

double DAClusterizerInZT_vect::zmerge_
private

Definition at line 264 of file DAClusterizerInZT_vect.h.