20 double sqr(
double f) {
return f*
f; }
24 vector<DAClusterizerInZT::track_t>
28 tks.reserve(tracks.size());
29 for(vector<reco::TransientTrack>::const_iterator it=tracks.begin(); it!=tracks.end(); it++){
32 auto tsPCA = (*it).stateAtBeamLine().trackStateAtPCA();
33 t.
z = tsPCA.position().z();
37 auto const & t_mom = tsPCA.momentum();
41 sqr((*it).track().dzError())
47 t.
dt2 =
sqr((*it).dtErrorExt()) +
sqr(vertexSizeTime);
80 vector<track_t> & tks,
82 const double rho0 )
const {
86 unsigned int nt=tks.size();
90 for(vector<vertex_t>::iterator
k=y.begin();
k!=y.end();
k++){
91 k->sw = 0.;
k->swz = 0.;
k->swt = 0.;
k->se = 0.;
92 k->swE = 0.;
k->tC=0.;
97 for(
unsigned int i=0;
i<
nt;
i++){
100 double Zi = rho0*
std::exp(-beta*(dzCutOff_*dzCutOff_));
102 for(vector<vertex_t>::iterator
k=y.begin();
k!=y.end();
k++){
112 for(vector<vertex_t>::iterator
k=y.begin();
k!=y.end();
k++){
113 k->se += tks[
i].pi*
k->ei / Zi;
114 double w =
k->pk * tks[
i].pi *
k->ei /( Zi * ( tks[
i].dz2 * tks[
i].dt2 ) );
116 k->swz += w * tks[
i].z;
117 k->swt += w * tks[
i].t;
118 k->swE += w * e_ik(tks[
i],*
k);
126 for(vector<vertex_t>::iterator
k=y.begin();
k!=y.end();
k++){
128 const double znew=
k->swz/
k->sw;
129 const double tnew=
k->swt/
k->sw;
130 delta +=
sqr(
k->z-znew) +
sqr(
k->t-tnew);
133 k->tC = 2*
k->swE/
k->sw;
135 edm::LogInfo(
"sumw") <<
"invalid sum of weights in fit: " <<
k->sw << endl;
136 if(verbose_){
cout <<
" a cluster melted away ? pk=" <<
k->pk <<
" sumw=" <<
k->sw << endl;}
137 k->tC = (rho0 == 0. ? -1 : 0);
139 if(rho0 == 0.)
k->pk =
k->pk *
k->se / sumpi;
149 if(y.size()<2)
return false;
151 for(vector<vertex_t>::iterator
k=y.begin(); (
k+1)!=y.end();
k++){
154 double rho =
k->pk + (
k+1)->pk;
156 k->z = (
k->pk *
k->z + (
k+1)->z * (
k+1)->pk)/rho;
157 k->t = (
k->pk *
k->t + (
k+1)->
t * (
k+1)->pk)/rho;
159 k->z = 0.5*(
k->z + (
k+1)->z);
160 k->t = 0.5*(
k->t + (
k+1)->
t);
176 if(y.size()<2)
return false;
178 for(vector<vertex_t>::iterator
k=y.begin(); (
k+1)!=y.end();
k++){
181 double rho=
k->pk + (
k+1)->pk;
182 double swE=
k->swE+(
k+1)->swE -
k->pk * (
k+1)->pk / rho * (
sqr((
k+1)->z -
k->z) +
184 double Tc=2*swE/(
k->sw+(
k+1)->sw);
188 k->z = (
k->pk *
k->z + (
k+1)->z * (
k+1)->pk)/rho;
189 k->t = (
k->pk *
k->t + (
k+1)->
t * (
k+1)->pk)/rho;
191 k->z = 0.5*(
k->z + (
k+1)->z);
192 k->t = 0.5*(
k->t + (
k+1)->
t);
209 if(y.size()<2)
return false;
211 unsigned int nt=tks.size();
213 vector<vertex_t>::iterator
k0=y.end();
214 for(vector<vertex_t>::iterator
k=y.begin();
k!=y.end();
k++){
217 double pmax=
k->pk/(
k->pk+rho0*
exp(-beta*dzCutOff_*dzCutOff_));
218 for(
unsigned int i=0;
i<
nt;
i++){
220 double p =
k->pk *
std::exp(-beta*e_ik(tks[
i],*
k)) / tks[
i].zi ;
222 if( (p > 0.9*pmax) && (tks[i].
pi>0) ){ nUnique++; }
226 if((nUnique<2)&&(sump<sumpmin)){
233 if(verbose_){
cout <<
"eliminating prototype at " << k0->z <<
"," << k0->t
234 <<
" with sump=" << sumpmin << endl;}
243 vector<track_t> & tks,
244 vector<vertex_t> & y )
const {
248 unsigned int nt=tks.size();
250 for(vector<vertex_t>::iterator
k=y.begin();
k!=y.end();
k++){
256 for(
unsigned int i=0;
i<
nt;
i++){
257 double w = tks[
i].pi/(tks[
i].dz2 * tks[
i].dt2);
267 for(
unsigned int i=0;
i<
nt;
i++){
268 double dx = tks[
i].z-(
k->z);
269 double dt = tks[
i].t-(
k->t);
270 double w = tks[
i].pi/(tks[
i].dz2 * tks[
i].dt2);
271 a += w*(
sqr(dx)/tks[
i].dz2 +
sqr(dt)/tks[
i].dt2);
279 return betamax/
pow(coolingFactor_,
int(
std::log(T0*betamax)*logCoolingFactor_)-1 );
282 return betamax/coolingFactor_;
287 vector<track_t> & tks,
288 vector<vertex_t> & y,
297 std::vector<std::pair<double, unsigned int> >
critical;
298 for(
unsigned int ik=0; ik<y.size(); ik++){
299 if (beta*y[ik].tC > 1.){
300 critical.push_back( make_pair(y[ik].tC, ik));
303 std::stable_sort(critical.begin(), critical.end(), std::greater<std::pair<double, unsigned int> >() );
305 for(
unsigned int ic=0; ic<critical.size(); ic++){
306 unsigned int ik=critical[ic].second;
308 double p1=0, z1=0, t1=0, w1=0;
309 double p2=0, z2=0,
t2=0,
w2=0;
311 for(
unsigned int i=0;
i<tks.size();
i++){
314 double p=y[ik].pk *
exp(-beta*e_ik(tks[
i],y[ik])) / tks[
i].zi*tks[
i].pi;
315 double w=p/(tks[
i].dz2 * tks[
i].dt2);
316 if(tks[i].z < y[ik].z){
317 p1+=
p; z1+=w*tks[
i].z; t1+=w*tks[
i].t; w1+=
w;
319 p2+=
p; z2+=w*tks[
i].z;
t2+=w*tks[
i].t;
w2+=
w;
323 if(w1>0){ z1=z1/w1; t1=t1/w1;}
else{ z1=y[ik].z-
epsilon; t1=y[ik].t-
epsilon; }
327 if( ( ik > 0 ) && ( y[ik-1].z>=z1 ) ){ z1=0.5*(y[ik].z+y[ik-1].z); t1=0.5*(y[ik].t+y[ik-1].t); }
328 if( ( ik+1 < y.size()) && ( y[ik+1].z<=z2 ) ){ z2=0.5*(y[ik].z+y[ik+1].z);
t2=0.5*(y[ik].t+y[ik+1].t); }
334 vnew.
pk = p1*y[ik].pk/(p1+
p2);
335 y[ik].pk= p2*y[ik].pk/(p1+
p2);
340 y.insert(y.begin()+ik, vnew);
343 for(
unsigned int jc=ic; jc<critical.size(); jc++){
344 if (critical[jc].
second>ik) {critical[jc].second++;}
364 for(vector<vertex_t>::iterator
k=y.begin();
k!=y.end();
k++){
365 if ( ( (
k==y.begin())|| (
k-1)->z <
k->z - zsep) && (((
k+1)==y.end() )|| (
k+1)->z >
k->z + zsep)) {
372 vnew.
pk= 0.5* (*k).pk;
373 (*k).pk= 0.5* (*k).pk;
377 }
else if( y1.empty() || (y1.back().z <
k->z -zsep) || (y1.back().t <
k->t - tsep) ){
393 verbose_(conf.getUntrackedParameter<bool>(
"verbose",
false)),
395 vertexSize_(conf.getParameter<double>(
"vertexSize")),
397 coolingFactor_(std::
sqrt(conf.getParameter<double>(
"coolingFactor"))),
400 dzCutOff_(conf.getParameter<double>(
"dzCutOff")),
401 d0CutOff_(conf.getParameter<double>(
"d0CutOff")),
407 edm::LogWarning(
"DAClusterizerInZT") <<
"DAClusterizerInZT: invalid Tmin" << Tmin <<
" reset do default " << 1./
betamax_ << endl;
425 for(vector<track_t>::const_iterator
t=tks0.begin();
t!=tks0.end();
t++){tks.push_back(*
t); }
426 std::stable_sort(tks.begin(), tks.end(), recTrackLessZ1);
428 cout <<
"-----DAClusterizerInZT::dump ----" << endl;
429 cout <<
" beta=" << beta <<
" betamax= " <<
betamax_ << endl;
432 for(vector<vertex_t>::const_iterator
k=y.begin();
k!=y.end();
k++){
433 cout << setw(8) << fixed <<
k->z;
435 cout << endl <<
" t= ";
436 for(vector<vertex_t>::const_iterator
k=y.begin();
k!=y.end();
k++){
437 cout << setw(8) << fixed <<
k->t;
439 cout << endl <<
"T=" << setw(15) << 1./beta <<
" Tc= ";
440 for(vector<vertex_t>::const_iterator
k=y.begin();
k!=y.end();
k++){
441 cout << setw(8) << fixed <<
k->tC ;
444 cout << endl <<
" pk=";
446 for(vector<vertex_t>::const_iterator
k=y.begin();
k!=y.end();
k++){
447 cout << setw(8) << setprecision(3) << fixed <<
k->pk;
455 cout <<
"---- z +/- dz t +/- dt ip +/-dip pt phi eta weights ----" << endl;
457 for(
unsigned int i=0;
i<tks.size();
i++){
461 cout << setw (3)<<
i <<
")" << setw (8) << fixed << setprecision(4)<< tz <<
" +/-" << setw (6)<<
sqrt(tks[
i].dz2)
462 << setw(8) << fixed << setprecision(4) << tt <<
" +/-" << setw(6) <<
std::sqrt(tks[
i].dt2) ;
467 cout << setw(1) << tks[
i].tt->track().hitPattern().pixelBarrelLayersWithMeasurement();
468 cout << setw(1) << tks[
i].tt->track().hitPattern().pixelEndcapLayersWithMeasurement();
469 cout << setw(1) << hex << tks[
i].tt->track().hitPattern().trackerLayersWithMeasurement()-tks[
i].tt->track().hitPattern().pixelLayersWithMeasurement() <<
dec;
473 cout << setw (8) << IP.
value() <<
"+/-" << setw (6) << IP.
error();
474 cout <<
" " << setw(6) << setprecision(2) << tks[
i].tt->track().pt()*tks[
i].tt->track().charge();
475 cout <<
" " << setw(5) << setprecision(2) << tks[
i].tt->track().phi()
476 <<
" " << setw(5) << setprecision(2) << tks[
i].tt->track().eta() ;
479 for(vector<vertex_t>::const_iterator
k=y.begin();
k!=y.end();
k++){
480 if((tks[
i].
pi>0)&&(tks[
i].zi>0)){
484 cout << setw (8) << setprecision(3) <<
p;
488 E+=p*
e_ik(tks[i],*
k);
496 cout << endl <<
"T=" << 1/beta <<
" E=" << E <<
" n="<< y.size() <<
" F= " <<
F << endl <<
"----------" << endl;
504 vector< TransientVertex >
509 vector<track_t> tks=
fill(tracks);
510 unsigned int nt=tks.size();
514 if (tks.empty())
return clusters;
538 split(beta, tks,y, 1.);
557 while(
split(beta, tks,y,1.) && (ntry++<10) ){
566 if(
verbose_ ){
cout <<
"dump after 1st merging " << endl;
dump(beta,y,tks,2);}
574 for(vector<vertex_t>::iterator
k=y.begin();
k!=y.end();
k++){
k->pk =1.; }
577 if(
verbose_ ){
cout <<
"rho0=" << rho0 <<
" niter=" << niter << endl;
dump(beta,y,tks,2);}
581 while(
merge(y,tks.size())){}
582 if(
verbose_ ){
cout <<
"dump after 2nd merging " << endl;
dump(beta,y,tks,2);}
587 while(
purge(y,tks,rho0, beta)){
597 cout <<
"Final result, rho0=" << rho0 << endl;
602 for(
unsigned int i=0;
i<
nt;
i++){
604 for(vector<vertex_t>::iterator
k=y.begin();
k!=y.end();
k++){
610 for(vector<vertex_t>::iterator
k=y.begin();
k!=y.end();
k++){
613 vector< reco::TransientTrack > vertexTracks;
618 for(
unsigned int i=0;
i<
nt;
i++){
619 const double invdt = 1.0/
std::sqrt(tks[
i].dt2);
621 double p =
k->pk *
exp(-beta*
e_ik(tks[
i],*
k)) / tks[
i].zi;
622 if( (tks[i].
pi>0) && ( p > 0.5 ) ){
624 vertexTracks.push_back(*(tks[i].
tt)); tks[
i].zi=0;
625 mean += tks[
i].t*invdt*
p;
626 expv_x2 += tks[
i].t*tks[
i].t*invdt*
p;
632 expv_x2 = expv_x2/normw;
633 const double time_var = expv_x2 - mean*
mean;
634 const double crappy_error_guess =
std::sqrt(time_var);
638 0,0,0,crappy_error_guess);
640 clusters.push_back(v);
652 vector< vector<reco::TransientTrack> >
657 cout <<
"###################################################" << endl;
658 cout <<
"# DAClusterizerInZT::clusterize nt="<<tracks.size() << endl;
659 cout <<
"###################################################" << endl;
662 vector< vector<reco::TransientTrack> >
clusters;
663 vector< TransientVertex >
pv=
vertices(tracks);
665 if(
verbose_){
cout <<
"# DAClusterizerInZT::clusterize pv.size="<<pv.size() << endl; }
666 if (pv.size()==0){
return clusters;}
670 vector< reco::TransientTrack> aCluster=pv.begin()->originalTracks();
674 std::cout <<
' ' << pv.begin()->position() <<
' ' << pv.begin()->time() << std::endl;
677 for(vector<TransientVertex>::iterator
k=pv.begin()+1;
k!=pv.end();
k++){
680 std::cout <<
' ' <<
k->position() <<
' ' <<
k->time() << std::endl;
683 std::abs(
k->time() - (
k-1)->time()) > 2*vertexSizeTime ) {
685 clusters.push_back(aCluster);
688 for(
unsigned int i=0;
i<
k->originalTracks().size();
i++){
689 aCluster.push_back(
k->originalTracks().at(
i));
693 clusters.push_back(aCluster);
695 if(
verbose_) {
std::cout <<
"# DAClusterizerInZT::clusterize clusters.size="<<clusters.size() << std::endl; }
std::vector< std::vector< reco::TransientTrack > > clusterize(const std::vector< reco::TransientTrack > &tracks) const
T getParameter(std::string const &) const
common ppss p3p6s2 common epss epspn46 common const1 w2
const reco::TransientTrack * tt
double update(double beta, std::vector< track_t > &tks, std::vector< vertex_t > &y, const double rho0=0.0) const
std::vector< TransientVertex > vertices(const std::vector< reco::TransientTrack > &tracks, const int verbosity=0) const
double e_ik(const track_t &t, const vertex_t &k) const
void dump(const double beta, const std::vector< vertex_t > &y, const std::vector< track_t > &tks, const int verbosity=0) const
U second(std::pair< T, U > const &p)
auto const T2 &decltype(t1.eta()) t2
void splitAll(std::vector< vertex_t > &y) const
Abs< T >::type abs(const T &t)
bool split(double beta, std::vector< track_t > &tks, std::vector< vertex_t > &y, double threshold) const
double BeamWidthX() const
beam width X
std::vector< track_t > fill(const std::vector< reco::TransientTrack > &tracks) const
bool merge(std::vector< vertex_t > &, int) const
double BeamWidthY() const
beam width Y
Square< F >::type sqr(const F &f)
static int position[264][3]
DAClusterizerInZT(const edm::ParameterSet &conf)
volatile std::atomic< bool > shutdown_flag false
static uInt32 F(BLOWFISH_CTX *ctx, uInt32 x)
double beta0(const double betamax, std::vector< track_t > &tks, std::vector< vertex_t > &y) const
Power< A, B >::type pow(const A &a, const B &b)
bool purge(std::vector< vertex_t > &, std::vector< track_t > &, double &, const double) const