11 #include "vdt/vdtMath.h" 32 vertexSizeTime_ = conf.
getParameter<
double> (
"vertexSizeTime");
33 coolingFactor_ = conf.
getParameter<
double> (
"coolingFactor");
36 coolingFactor_=-coolingFactor_;
39 coolingFactor_ =
std::sqrt(coolingFactor_);
43 uniquetrkweight_ = conf.
getParameter<
double>(
"uniquetrkweight");
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;
67 edm::LogWarning(
"DAClusterizerinZT_vectorized") <<
"DAClusterizerInZT: invalid Tmin" << minT
68 <<
" reset do default " << 1. / betamax_;
74 if ((purgeT > minT) || (purgeT == 0)) {
75 edm::LogWarning(
"DAClusterizerinZT_vectorized") <<
"DAClusterizerInZT: invalid Tpurge" << purgeT
76 <<
" set to " << minT;
79 betapurge_ = 1./purgeT;
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) ;
93 inline double local_exp(
double const& inp) {
94 return vdt::fast_exp( inp );
97 inline void local_exp_list(
double const *arg_inp,
99 const unsigned arg_arr_size) {
100 for(
unsigned i=0;
i!=arg_arr_size; ++
i ) arg_out[
i]=vdt::fast_exp(arg_inp[
i]);
111 for(
const auto& tk : tracks ) {
112 if (!tk.isValid())
continue;
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();
131 tk.stateAtBeamLine().transverseImpactParameter();
135 LogTrace(
"DAClusterizerinZT_vectorized") << t_z <<
' ' << t_t <<
' '<< t_dz2 <<
' ' << t_dt2 <<
' '<< t_pi;
136 tks.
addItem(t_z, t_t, t_dz2, t_dt2, &tk, t_pi);
152 double Eik(
double t_z,
double k_z,
double t_dz2,
double t_t,
double k_t,
double t_dt2) {
158 vertex_t & gvertices,
bool useRho0,
const double & rho0)
const {
164 const unsigned int nt = gtracks.
getSize();
165 const unsigned int nv = gvertices.
getSize();
179 Z_init = rho0 * local_exp(-beta * dzCutOff_ * dzCutOff_);
183 auto kernel_calc_exp_arg = [
beta, nv ] (
const unsigned int itrack,
187 const auto track_z = tracks.z_[itrack];
189 const auto botrack_dz2 = -beta*tracks.dz2_[itrack];
190 const auto botrack_dt2 = -beta*tracks.dt2_[itrack];
193 for (
unsigned int ivertex = 0; ivertex < nv; ++ivertex) {
194 const auto mult_resz = track_z -
vertices.z_[ivertex];
196 vertices.ei_cache_[ivertex] = botrack_dz2 * ( mult_resz * mult_resz ) + botrack_dt2 * ( mult_rest * mult_rest );
202 double ZTemp = Z_init;
203 for (
unsigned int ivertex = 0; ivertex < nv; ++ivertex) {
209 auto kernel_calc_normalization = [
beta, nv ] (
const unsigned int track_num,
212 auto tmp_trk_pi = tks_vec.pi_[track_num];
213 auto o_trk_Z_sum = 1./tks_vec.Z_sum_[track_num];
214 auto o_trk_err_sum = tks_vec.errsum_[track_num];
215 auto tmp_trk_z = tks_vec.z_[track_num];
216 auto tmp_trk_t = tks_vec.t_[track_num];
217 auto obeta = -1./
beta;
220 for (
unsigned int k = 0;
k < nv; ++
k) {
222 y_vec.se_[
k] += tmp_trk_pi*( y_vec.ei_[
k] * o_trk_Z_sum );
223 const auto w = tmp_trk_pi * (y_vec.pk_[
k] * y_vec.ei_[
k] * o_trk_Z_sum) * o_trk_err_sum;
225 y_vec.swz_[
k] += w * tmp_trk_z;
226 y_vec.swt_[
k] += w * tmp_trk_t;
227 y_vec.swE_[
k] += w * y_vec.ei_cache_[
k]*obeta;
232 for (
auto ivertex = 0
U; ivertex < nv; ++ivertex) {
233 gvertices.
se_[ivertex] = 0.0;
234 gvertices.
sw_[ivertex] = 0.0;
235 gvertices.
swz_[ivertex] = 0.0;
236 gvertices.
swt_[ivertex] = 0.0;
237 gvertices.
swE_[ivertex] = 0.0;
242 for (
auto itrack = 0
U; itrack <
nt; ++itrack) {
243 kernel_calc_exp_arg(itrack, gtracks, gvertices);
246 gtracks.
Z_sum_[itrack] = kernel_add_Z(gvertices);
249 sumpi += gtracks.
pi_[itrack];
251 if (gtracks.
Z_sum_[itrack] > 1.e-100){
252 kernel_calc_normalization(itrack, gtracks, gvertices);
257 auto kernel_calc_zt = [ sumpi, nv,
this, useRho0 ] (
vertex_t &
vertices ) ->
double {
261 for (
unsigned int ivertex = 0; ivertex < nv; ++ ivertex ) {
275 if (this->verbose_) {
276 std::cout <<
" a cluster melted away ? pk=" <<
vertices.pk_[ ivertex ] <<
" sumw=" 283 auto osumpi = 1./sumpi;
284 for (
unsigned int ivertex = 0; ivertex < nv; ++ivertex )
290 delta += kernel_calc_zt(gvertices);
304 const unsigned int nv = y.
getSize();
310 std::vector<std::pair<double, unsigned int> > critical;
311 for (
unsigned int k = 0; (
k + 1) < nv;
k++) {
312 if ( std::fabs(y.
z_[
k + 1] - y.
z_[
k]) < zmerge_ &&
313 std::fabs(y.
t_[
k + 1] - y.
t_[
k]) < tmerge_ ) {
316 critical.push_back( make_pair( dz2 + dt2,
k ) );
319 if (critical.empty())
return false;
321 std::stable_sort(critical.begin(), critical.end(), std::less<std::pair<double, unsigned int> >() );
324 for (
unsigned int ik=0; ik < critical.size(); ik++){
325 unsigned int k = critical[ik].second;
326 double rho = y.
pk_[
k]+y.
pk_[k+1];
328 double Tc = 2*swE / (y.
sw_[
k]+y.
sw_[k+1]);
332 if(verbose_){
std::cout <<
"merging (" << y.
z_[k + 1] <<
',' << y.
t_[k + 1] <<
") and (" << y.
z_[
k] <<
',' << y.
t_[
k] <<
") Tc = " << Tc <<
" sw = " << y.
sw_[
k]+y.
sw_[k+1] <<std::endl;}
338 y.
z_[
k] = 0.5 * (y.
z_[
k] + y.
z_[k + 1]);
339 y.
t_[
k] = 0.5 * (y.
t_[
k] + y.
t_[k + 1]);
359 const unsigned int nv = y.
getSize();
366 unsigned int k0 = nv;
371 std::vector<double> inverse_zsums(nt), arg_cache(nt), eik_cache(nt);
372 double * pinverse_zsums;
375 pinverse_zsums = inverse_zsums.data();
376 parg_cache = arg_cache.data();
377 peik_cache = eik_cache.data();
378 for(
unsigned i = 0;
i <
nt; ++
i) {
382 for (
unsigned int k = 0;
k < nv; ++
k) {
387 const double pmax = y.
pk_[
k] / (y.
pk_[
k] + rho0 * local_exp(-beta * dzCutOff_* dzCutOff_));
388 const double pcut = uniquetrkweight_ * pmax;
389 for(
unsigned i = 0;
i <
nt; ++
i) {
390 const auto track_z = tks.
z_[
i];
392 const auto botrack_dz2 = -beta*tks.
dz2_[
i];
393 const auto botrack_dt2 = -beta*tks.
dt2_[
i];
395 const auto mult_resz = track_z - y.
z_[
k];
397 parg_cache[
i] = botrack_dz2 * ( mult_resz * mult_resz ) + botrack_dt2 * ( mult_rest * mult_rest );
399 local_exp_list(parg_cache, peik_cache, nt);
400 for (
unsigned int i = 0;
i <
nt; ++
i) {
401 const double p = y.
pk_[
k] * peik_cache[
i] * pinverse_zsums[
i];
403 nUnique += ( ( p > pcut ) & ( tks.
pi_[
i] > 0 ) );
406 if ((nUnique < 2) && (sump < sumpmin)) {
416 std::cout <<
"eliminating prototype at " << std::setw(10) << std::setprecision(4) << y.
z_[
k0]
417 <<
" with sump=" << sumpmin
418 <<
" rho*nt =" << y.
pk_[
k0]*nt
438 const unsigned int nv = y.
getSize();
440 for (
unsigned int k = 0;
k < nv;
k++) {
446 for (
unsigned int i = 0;
i <
nt;
i++) {
448 sumwz += w * tks.
z_[
i];
449 sumwt += w * tks.
t_[
i];
452 y.
z_[
k] = sumwz / sumw;
453 y.
t_[
k] = sumwt / sumw;
457 for (
unsigned int i = 0;
i <
nt;
i++) {
464 double Tc = 2. * a /
b;
465 if (Tc > T0) T0 = Tc;
470 std::cout <<
"DAClustrizerInZT_vect.beta0: Tc = " << T0 << std::endl;
472 std::cout <<
"DAClustrizerInZT_vect.beta0: nstep = " << coolingsteps << std::endl;
477 if (T0 > 1. / betamax) {
481 return betamax * coolingFactor_;
499 std::vector<std::pair<double, unsigned int> > critical;
500 for(
unsigned int k=0;
k<nv;
k++){
502 if (beta*Tc > threshold){
503 critical.push_back( make_pair(Tc,
k));
506 if (critical.empty())
return false;
509 std::stable_sort(critical.begin(), critical.end(), std::greater<std::pair<double, unsigned int> >() );
515 for(
unsigned int ic=0; ic<critical.size(); ic++){
516 unsigned int k=critical[ic].second;
519 double p1=0, z1=0, t1=0, w1=0;
520 double p2=0, z2=0,
t2=0,
w2=0;
521 for(
unsigned int i=0;
i<
nt; ++
i){
524 double tl = tks.
z_[
i] < y.
z_[
k] ? 1.: 0.;
541 p1 += p*tl; z1 += w*tl*tks.
z_[
i]; t1 += w*tl*tks.
t_[
i]; w1 += w*tl;
542 p2 += p*tr; z2 += w*tr*tks.
z_[
i];
t2 += w*tr*tks.
t_[
i];
w2 += w*tr;
546 if(w1>0){z1 = z1/w1; t1 = t1/w1;}
else {z1=y.
z_[
k]-epsilonz; t1=y.
t_[
k]-epsilont;}
550 if( ( k > 0 ) && ( z1 < (0.6*y.
z_[k] + 0.4*y.
z_[k-1])) ){
551 z1 = 0.5*y.
z_[
k] + 0.5*y.
z_[k-1];
552 t1 = 0.5*y.
t_[
k] + 0.5*y.
t_[k-1];
554 if( ( k+1 < nv) && ( z2 > (0.6*y.
z_[k] + 0.4*y.
z_[k+1])) ){
555 z2 = 0.5*y.
z_[
k] + 0.5*y.
z_[k+1];
556 t2 = 0.5*y.
t_[
k] + 0.5*y.
t_[k+1];
561 if (std::fabs(y.
z_[k] - zdumpcenter_) < zdumpwidth_){
562 std::cout <<
" T= " << std::setw(8) << 1./beta
563 <<
" Tc= " << critical[ic].first
564 <<
" splitting " <<
std::fixed << std::setprecision(4) << y.
z_[
k]
565 <<
" --> (" << z1 <<
',' << t1<<
"),(" << z2 <<
',' <<
t2 566 <<
") [" << p1 <<
"," << p2 <<
"]" ;
567 if (std::fabs(z2-z1) > epsilonz || std::fabs(
t2-t1) > epsilont){
577 if( std::fabs(z2-z1) > epsilonz || std::fabs(
t2-t1) > epsilont){
579 double pk1 = p1*y.
pk_[
k]/(p1+
p2);
580 double pk2 = p2*y.
pk_[
k]/(p1+
p2);
588 for(
unsigned int jc=ic; jc < critical.size(); jc++){
589 if (critical[jc].
second > k) {critical[jc].second++;}
600 const unsigned int nv = y.
getSize();
610 std::cout <<
"Before Split "<< std::endl;
615 for (
unsigned int k = 0;
k < nv;
k++) {
617 ( ( (
k == 0) || ( y.
z_[
k - 1] < (y.
z_[
k] - zsep)) ) &&
618 ( ((
k + 1) == nv) || ( y.
z_[
k + 1] > (y.
z_[
k] + zsep)) ) ) )
621 double new_z = y.
z[
k] - epsilonz;
622 double new_t = y.
t[
k] - epsilont;
623 y.
z[
k] = y.
z[
k] + epsilonz;
624 y.
t[
k] = y.
t[
k] + epsilont;
626 double new_pk = 0.5 * y.
pk[
k];
629 y1.
addItem(new_z, new_t, new_pk);
632 else if ( (y1.
getSize() == 0 ) ||
642 y.
z_[
k] = y.
z_[
k] + epsilonz;
643 y.
t_[
k] = y.
t_[
k] + epsilont;
653 std::cout <<
"After split " << std::endl;
661 vector<TransientVertex>
670 if (tks.
getSize() == 0)
return clusters;
681 double beta = beta0(betamax_, tks, y);
683 if ( verbose_)
std::cout <<
"Beta0 is " << beta << std::endl;
687 while ((
update(beta, tks, y,
false, rho0) > 1.
e-6) &&
688 (niter++ < maxIterations_)) {}
692 double betafreeze = betamax_ *
sqrt(coolingFactor_);
694 while (beta < betafreeze) {
696 update(beta, tks,y,
false, rho0);
697 while(
merge(y, beta)){
update(beta, tks, y,
false, rho0);}
699 beta=beta/coolingFactor_;
701 beta=beta/coolingFactor_;
707 while ((
update(beta, tks, y,
false, rho0) > 1.
e-6) &&
708 (niter++ < maxIterations_)) {}
710 if(verbose_){
dump( beta, y, tks, 0); }
717 if(verbose_){
std::cout <<
"last spliting at " << 1./beta << std::endl; }
719 update(beta, tks,y,
false, rho0);
720 while(
merge(y,beta)){
update(beta, tks,y,
false, rho0);}
723 while(
split(beta, tks, y, threshold) && (ntry++<10) ){
725 while((
update(beta, tks,y,
false, rho0)>1.
e-6) && (niter++ < maxIterations_)){}
726 while(
merge(y,beta)){
update(beta, tks,y,
false, rho0);}
729 std::cout <<
"after final splitting, try " << ntry << std::endl;
730 dump(beta, y, tks, 2);
738 while(
merge(y,beta)){
update(beta, tks,y,
false, rho0);}
743 update(beta, tks,y,
false, rho0);
744 std::cout <<
"dump after 1st merging " << endl;
745 dump(beta, y, tks, 2);
753 for(
unsigned int a=0;
a<10;
a++){
update(beta, tks, y,
true,
a*rho0/10);}
757 while ((
update(beta, tks, y,
true, rho0) > 1.
e-8) && (niter++ < maxIterations_)) {};
760 std::cout <<
"dump after noise-suppression, rho0=" << rho0 <<
" niter = " << niter << endl;
761 dump(beta, y, tks, 2);
766 while (
merge(y, beta)) {
update(beta, tks, y,
true, rho0); }
769 std::cout <<
"dump after merging " << endl;
770 dump(beta, y, tks, 2);
775 while( beta < betapurge_ ){
776 beta =
min( beta/coolingFactor_, betapurge_);
778 while ((
update(beta, tks, y,
false, rho0) > 1.
e-8) && (niter++ < maxIterations_)) {}
783 while (purge(y, tks, rho0, beta)) {
785 while ((
update(beta, tks, y,
true, rho0) > 2.5
e-7 * y.
getSize() ) && (niter++ < maxIterations_)) {
791 update(beta, tks,y,
true, rho0);
792 std::cout <<
" after purging " << std:: endl;
793 dump(beta, y, tks, 2);
798 while( beta < betastop_ ){
799 beta =
min( beta/coolingFactor_, betastop_);
801 while ((
update(beta, tks, y,
true, rho0) > 1.
e-8) && (niter++ < maxIterations_)) {}
806 std::cout <<
"Final result, rho0=" << std::scientific << rho0 << endl;
807 dump(beta, y, tks, 2);
812 GlobalError dummyError(0.01, 0, 0.01, 0., 0., 0.01);
815 const unsigned int nv = y.
getSize();
816 for (
unsigned int k = 0;
k < nv;
k++)
819 for (
unsigned int i = 0;
i <
nt;
i++)
820 tks.
Z_sum_[
i] = rho0 * local_exp(-beta * dzCutOff_ * dzCutOff_);
823 for (
unsigned int k = 0;
k < nv;
k++) {
824 for (
unsigned int i = 0;
i <
nt;
i++)
829 for (
unsigned int k = 0;
k < nv;
k++) {
832 vector<reco::TransientTrack> vertexTracks;
833 for (
unsigned int i = 0;
i <
nt;
i++) {
836 double p = y.
pk_[
k] * local_exp(-beta * Eik(tks.
z_[
i], y.
z_[
k], tks.
dz2_[
i],
838 if ((tks.
pi_[
i] > 0) && (p > mintrkweight_)) {
839 vertexTracks.push_back(*(tks.
tt[
i]));
845 clusters.push_back(v);
853 const vector<reco::TransientTrack> &
tracks)
const {
857 std::cout <<
"###################################################" << endl;
858 std::cout <<
"# vectorized DAClusterizerInZT_vect::clusterize nt=" << tracks.size() << endl;
859 std::cout <<
"###################################################" << endl;
863 vector<vector<reco::TransientTrack> >
clusters;
864 vector<TransientVertex> &&
pv =
vertices(tracks);
868 std::cout <<
"# DAClusterizerInZT::clusterize pv.size=" << pv.size()
878 vector<reco::TransientTrack> aCluster = pv.begin()->originalTracks();
880 for (
auto k = pv.begin() + 1;
k != pv.end();
k++) {
883 if (aCluster.size()>1){
884 clusters.push_back(aCluster);
888 std::cout <<
" one track cluster at " <<
k->position().z() <<
" suppressed" << std::endl;
894 for (
unsigned int i = 0;
i <
k->originalTracks().size();
i++) {
895 aCluster.push_back(
k->originalTracks()[
i]);
899 clusters.emplace_back(
std::move(aCluster));
910 const unsigned int nv = y.
getSize();
913 std::vector< unsigned int > iz;
914 for(
unsigned int j=0; j<
nt; j++){ iz.push_back(j); }
915 std::sort(iz.begin(), iz.end(), [tks](
unsigned int a,
unsigned int b){
return tks.
z_[
a]<tks.
z_[
b];} );
917 std::cout <<
"-----DAClusterizerInZT::dump ----" << nv <<
" clusters " << std::endl;
920 for (
unsigned int ivertex = 0; ivertex < nv; ++ ivertex) {
921 if (std::fabs(y.
z_[ivertex]-zdumpcenter_) < zdumpwidth_){
925 std::cout << endl <<
"T=" << setw(15) << 1. / beta
926 <<
" Tmin =" << setw(10) << 1./betamax_
928 for (
unsigned int ivertex = 0; ivertex < nv; ++ ivertex) {
929 if (std::fabs(y.
z_[ivertex]-zdumpcenter_) < zdumpwidth_){
930 double Tc = 2*y.
swE_[ivertex]/y.
sw_[ivertex];
938 for (
unsigned int ivertex = 0; ivertex < nv; ++ ivertex) {
939 sumpk += y.
pk_[ivertex];
940 if (std::fabs(y.
z_[ivertex] - zdumpcenter_) > zdumpwidth_)
continue;
946 for (
unsigned int ivertex = 0; ivertex < nv; ++ ivertex) {
947 sumpk += y.
pk_[ivertex];
948 if (std::fabs(y.
z_[ivertex] - zdumpcenter_) > zdumpwidth_)
continue;
957 <<
"---- z +/- dz ip +/-dip pt phi eta weights ----" 960 for (
unsigned int i0 = 0; i0 <
nt; i0++) {
961 unsigned int i = iz[i0];
965 double tz = tks.
z_[
i];
967 if( std::fabs(tz - zdumpcenter_) > zdumpwidth_)
continue;
968 std::cout << setw(4) << i <<
")" << setw(8) <<
fixed << setprecision(4)
969 << tz <<
" +/-" << setw(6) <<
sqrt(1./tks.
dz2_[i]);
982 << tks.
tt[
i]->track().hitPattern().pixelBarrelLayersWithMeasurement();
984 << tks.
tt[
i]->track().hitPattern().pixelEndcapLayersWithMeasurement();
986 << tks.
tt[
i]->track().hitPattern().trackerLayersWithMeasurement()
987 - tks.
tt[
i]->track().hitPattern().pixelLayersWithMeasurement()
994 tks.
tt[
i]->stateAtBeamLine().transverseImpactParameter();
996 std::cout <<
" " << setw(6) << setprecision(2)
997 << tks.
tt[
i]->track().pt() * tks.
tt[
i]->track().charge();
998 std::cout <<
" " << setw(5) << setprecision(2)
999 << tks.
tt[
i]->track().phi() <<
" " << setw(5)
1000 << setprecision(2) << tks.
tt[
i]->track().eta();
1003 for (
unsigned int ivertex = 0; ivertex < nv; ++ ivertex) {
1004 if (std::fabs(y.
z_[ivertex]-zdumpcenter_) > zdumpwidth_)
continue;
1006 if ((tks.
pi_[i] > 0) && (tks.
Z_sum_[i] > 0)) {
1008 double p = y.
pk_[ivertex] *
exp(-beta * Eik(tks.
z_[i], y.
z_[ivertex], tks.
dz2_[i],
1011 std::cout << setw(8) << setprecision(3) <<
p;
1015 E += p * Eik(tks.
z_[i], y.
z_[ivertex], tks.
dz2_[i],
1016 tks.
t_[i], y.
t_[ivertex], tks.
dt2_[i] );
1024 std::cout << endl <<
"T=" << 1 / beta <<
" E=" << E <<
" n=" << y.
getSize()
1025 <<
" F= " <<
F << endl <<
"----------" << endl;
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
common ppss p3p6s2 common epss epspn46 common const1 w2
std::vector< std::vector< reco::TransientTrack > > clusterize(const std::vector< reco::TransientTrack > &tracks) const override
bool split(const double beta, track_t &t, vertex_t &y, double threshold=1.) const
void splitAll(vertex_t &y) const
DAClusterizerInZT_vect(const edm::ParameterSet &conf)
bool merge(vertex_t &y, double &beta) const
void addItem(double new_z, double new_t, double new_dz2, double new_dt2, const reco::TransientTrack *new_tt, double new_pi)
std::vector< TransientVertex > vertices(const std::vector< reco::TransientTrack > &tracks, const int verbosity=0) const
U second(std::pair< T, U > const &p)
void insertItem(unsigned int i, double new_z, double new_t, double new_pk)
bool purge(vertex_t &, track_t &, double &, const double) const
auto const T2 &decltype(t1.eta()) t2
Abs< T >::type abs(const T &t)
double BeamWidthX() const
beam width X
void removeItem(unsigned int i)
double update(double beta, track_t >racks, vertex_t &gvertices, bool useRho0, const double &rho0) const
unsigned int getSize() const
void addItem(double new_z, double new_t, double new_pk)
double BeamWidthY() const
beam width Y
track_t fill(const std::vector< reco::TransientTrack > &tracks) const
static int position[264][3]
unsigned int getSize() const
double beta0(const double betamax, track_t const &tks, vertex_t const &y) const
std::vector< const reco::TransientTrack * > tt
static uInt32 F(BLOWFISH_CTX *ctx, uInt32 x)
void dump(const double beta, const vertex_t &y, const track_t &tks, const int verbosity=0) const
Power< A, B >::type pow(const A &a, const B &b)
def merge(dictlist, TELL=False)