21 const vector<reco::TransientTrack> &
tracks
25 for(vector<reco::TransientTrack>::const_iterator it=tracks.begin(); it!=tracks.end(); it++){
27 t.
z=((*it).stateAtBeamLine().trackStateAtPCA()).
position().z();
28 double tantheta=
tan(((*it).stateAtBeamLine().trackStateAtPCA()).momentum().theta());
31 t.
dz2=
pow((*it).track().dzError(),2)
32 + (
pow(beamspot.BeamWidthX(),2)+
pow(beamspot.BeamWidthY(),2))/
pow(tantheta,2)
35 Measurement1D IP=(*it).stateAtBeamLine().transverseImpactParameter();
72 vector<track_t> & tks,
80 unsigned int nt=tks.size();
84 for(vector<vertex_t>::iterator
k=y.begin();
k!=y.end();
k++){
85 k->se=0;
k->sw=0;
k->swz=0;
90 for(
unsigned int i=0;
i<
nt;
i++){
94 for(vector<vertex_t>::iterator
k=y.begin();
k!=y.end();
k++){
95 k->ei=
exp(-beta*Eik(tks[
i],*
k));
104 for(vector<vertex_t>::iterator
k=y.begin();
k!=y.end();
k++){
105 k->se += tks[
i].pi*
k->ei / Zi;
106 double w =
k->pk * tks[
i].pi*
k->ei / Zi / tks[
i].dz2;
108 k->swz += w * tks[
i].z;
120 for(vector<vertex_t>::iterator
k=y.begin();
k!=y.end();
k++){
122 double znew=
k->swz/
k->sw;
123 delta+=
pow(
k->z-znew,2);
126 edm::LogInfo(
"sumw") <<
"invalid sum of weights in fit: " <<
k->sw << endl;
127 if(verbose_){
cout <<
" a cluster melted away ? pk=" <<
k->pk <<
" sumw=" <<
k->sw << endl;}
130 k->pk =
k->pk *
k->se / sumpi;
143 vector<track_t> & tks,
144 vector<vertex_t> &
y,
150 unsigned int nt=tks.size();
153 for(vector<vertex_t>::iterator
k=y.begin();
k!=y.end();
k++){
154 k->se=0;
k->sw=0;
k->swz=0;
159 for(
unsigned int i=0;
i<
nt;
i++){
162 double Zi=rho0*
exp(-beta*dzCutOff_*dzCutOff_);
163 for(vector<vertex_t>::iterator
k=y.begin();
k!=y.end();
k++){
164 k->ei=
exp(-beta*Eik(tks[
i],*
k));
174 for(vector<vertex_t>::iterator
k=y.begin();
k!=y.end();
k++){
175 k->se += tks[
i].pi*
k->ei / Zi;
176 double w =
k->pk * tks[
i].pi*
k->ei / Zi / tks[
i].dz2;
178 k->swz += w * tks[
i].z;
189 for(vector<vertex_t>::iterator
k=y.begin();
k!=y.end();
k++){
191 double znew=
k->swz/
k->sw;
192 delta+=
pow(
k->z-znew,2);
195 edm::LogInfo(
"sumw") <<
"invalid sum of weights in fit: " <<
k->sw << endl;
196 if(verbose_){
cout <<
" a cluster melted away ? pk=" <<
k->pk <<
" sumw=" <<
k->sw << endl;}
213 if(y.size()<2)
return false;
215 for(vector<vertex_t>::iterator
k=y.begin(); (
k+1)!=y.end();
k++){
217 if (fabs((
k+1)->
z -
k->z)<1.e-2){
219 k->z=0.5*(
k->z+(
k+1)->
z);
232 if(y.size()<2)
return false;
234 unsigned int nt=tks.size();
236 vector<vertex_t>::iterator
k0=y.end();
237 for(vector<vertex_t>::iterator
k=y.begin();
k!=y.end();
k++){
240 double pmax=
k->pk/(
k->pk+rho0*
exp(-beta*dzCutOff_*dzCutOff_));
241 for(
unsigned int i=0;
i<
nt;
i++){
244 double p=
k->pk *
exp(-beta*Eik(tks[
i],*
k)) / tks[
i].Z;
246 if( (p > 0.9*pmax) && (tks[i].
pi>0) ){ nUnique++; }
250 if((nUnique<2)&&(sump<sumpmin)){
257 if(verbose_){
cout <<
"eliminating prototype at " << k0->z <<
" with sump=" << sumpmin << endl;}
271 vector<track_t> & tks,
277 unsigned int nt=tks.size();
279 for(vector<vertex_t>::iterator
k=y.begin();
k!=y.end();
k++){
284 for(
unsigned int i=0;
i<
nt;
i++){
285 double w=tks[
i].pi/tks[
i].dz2;
293 for(
unsigned int i=0;
i<
nt;
i++){
294 double dx=tks[
i].z-(
k->z);
295 double w=tks[
i].pi/tks[
i].dz2;
296 a+=w*
pow(dx,2)/tks[
i].dz2;
304 return betamax/
pow(coolingFactor_,
int(
log(T0*betamax)/
log(coolingFactor_))-1 );
307 return betamax/coolingFactor_;
315 vector<track_t> & tks,
324 for(vector<vertex_t>::iterator
k=y.begin();
k!=y.end();
k++){
325 if ( ( (
k==y.begin())|| (
k-1)->z <
k->z - zsep) && (((
k+1)==y.end() )|| (
k+1)->z >
k->z + zsep)) {
330 vnew.
pk= 0.5* (*k).pk;
331 (*k).pk= 0.5* (*k).pk;
335 }
else if( y1.empty() || (y1.back().z <
k->z -zsep)){
363 coolingFactor_ = conf.
getParameter<
double>(
"coolingFactor");
368 cout <<
"DAClusterizerInZ: invalid Tmin" << Tmin <<
" reset do default " << 1./betamax_ << endl;
380 for(vector<track_t>::const_iterator
t=tks0.begin();
t!=tks0.end();
t++){tks.push_back(*
t); }
381 stable_sort(tks.begin(), tks.end(), recTrackLessZ1);
383 cout <<
"-----DAClusterizerInZ::dump ----" << endl;
384 cout <<
"beta=" << beta <<
" betamax= " << betamax_ << endl;
387 for(vector<vertex_t>::const_iterator
k=y.begin();
k!=y.end();
k++){
388 cout << setw(8) << fixed <<
k->z ;
390 cout << endl <<
"T=" << setw(15) << 1./beta <<
" Tc= ";
391 cout << endl <<
" pk=";
393 for(vector<vertex_t>::const_iterator
k=y.begin();
k!=y.end();
k++){
394 cout << setw(8) << setprecision(3) << fixed <<
k->pk;
402 cout <<
"---- z +/- dz ip +/-dip pt phi eta weights ----" << endl;
404 for(
unsigned int i=0;
i<tks.size();
i++){
407 cout << setw (3)<<
i <<
")" << setw (8) << fixed << setprecision(4)<< tz <<
" +/-" << setw (6)<<
sqrt(tks[
i].dz2);
410 if(tks[
i].tt->track().hitPattern().hasValidHitInFirstPixelBarrel()){
cout <<
"+";}
else{
cout <<
"-";}
411 cout << setw(1) << tks[
i].tt->track().hitPattern().pixelBarrelLayersWithMeasurement();
412 cout << setw(1) << tks[
i].tt->track().hitPattern().pixelEndcapLayersWithMeasurement();
413 cout << setw(1) << hex << tks[
i].tt->track().hitPattern().trackerLayersWithMeasurement()-tks[
i].tt->track().hitPattern().pixelLayersWithMeasurement() <<dec;
414 cout <<
"=" << setw(1)<<hex <<tks[
i].tt->track().trackerExpectedHitsOuter().numberOfHits() << dec;
416 Measurement1D IP=tks[
i].tt->stateAtBeamLine().transverseImpactParameter();
417 cout << setw (8) << IP.
value() <<
"+/-" << setw (6) << IP.
error();
418 cout <<
" " << setw(6) << setprecision(2) << tks[
i].tt->track().pt()*tks[
i].tt->track().charge();
419 cout <<
" " << setw(5) << setprecision(2) << tks[
i].tt->track().phi()
420 <<
" " << setw(5) << setprecision(2) << tks[
i].tt->track().eta() ;
423 for(vector<vertex_t>::const_iterator
k=y.begin();
k!=y.end();
k++){
424 if((tks[
i].
pi>0)&&(tks[
i].Z>0)){
426 double p=
k->pk *
exp(-beta*Eik(tks[
i],*
k)) / tks[
i].Z;
428 cout << setw (8) << setprecision(3) <<
p;
440 cout << endl <<
"T=" << 1/beta <<
" E=" << E <<
" n="<< y.size() <<
" F= " << F << endl <<
"----------" << endl;
448 vector< TransientVertex >
453 vector<track_t> tks=fill(tracks);
454 unsigned int nt=tracks.size();
457 vector< TransientVertex > clusters;
458 if (tks.empty())
return clusters;
471 double beta=beta0(betamax_, tks, y);
472 niter=0;
while((
update(beta, tks,y)>1.e-6) && (niter++ < maxIterations_)){ }
476 while(beta<betamax_){
478 beta=beta/coolingFactor_;
482 niter=0;
while((
update(beta, tks,y)>1.e-6) && (niter++ < maxIterations_)){ }
488 while(
merge(y,tks.size())){}
489 if(verbose_ ){
cout <<
"dump after 1st merging " << endl;
dump(beta,y,tks,2);}
495 rho0=1./
nt;
for(vector<vertex_t>::iterator
k=y.begin();
k!=y.end();
k++){
k->pk =1.; }
496 niter=0;
while((
update(beta, tks,y,rho0) > 1.e-8) && (niter++ < maxIterations_)){ }
497 if(verbose_ ){
cout <<
"rho0=" << rho0 <<
" niter=" << niter << endl;
dump(beta,y,tks,2);}
501 while(
merge(y,tks.size())){}
502 if(verbose_ ){
cout <<
"dump after 2nd merging " << endl;
dump(beta,y,tks,2);}
506 while(beta<=betastop_){
507 while(purge(y,tks,rho0, beta)){
508 niter=0;
while((
update(beta, tks,y,rho0) > 1.e-6) && (niter++ < maxIterations_)){ }
510 beta/=coolingFactor_;
511 niter=0;
while((
update(beta, tks,y,rho0) > 1.e-6) && (niter++ < maxIterations_)){ }
515 cout <<
"Final result, rho0=" << rho0 << endl;
525 for(
unsigned int i=0;
i<
nt;
i++){
526 tks[
i].Z=rho0*
exp(-beta*dzCutOff_*dzCutOff_);
527 for(vector<vertex_t>::iterator
k=y.begin();
k!=y.end();
k++){
528 tks[
i].Z+=
k->pk *
exp(-beta*Eik(tks[
i],*
k));
533 for(vector<vertex_t>::iterator
k=y.begin();
k!=y.end();
k++){
535 vector< reco::TransientTrack > vertexTracks;
536 for(
unsigned int i=0;
i<
nt;
i++){
538 double p=
k->pk *
exp(-beta*Eik(tks[
i],*
k)) / tks[
i].Z;
539 if( (tks[i].
pi>0) && ( p > 0.5 ) ){ vertexTracks.push_back(*(tks[i].tt)); tks[
i].Z=0; }
543 clusters.push_back(v);
555 vector< vector<reco::TransientTrack> >
560 cout <<
"###################################################" << endl;
561 cout <<
"# DAClusterizerInZ::clusterize nt="<<tracks.size() << endl;
562 cout <<
"###################################################" << endl;
565 vector< vector<reco::TransientTrack> > clusters;
566 vector< TransientVertex > pv=vertices(tracks);
568 if(verbose_){
cout <<
"# DAClusterizerInZ::clusterize pv.size="<<pv.size() << endl; }
569 if (pv.size()==0){
return clusters;}
573 vector< reco::TransientTrack> aCluster=pv.begin()->originalTracks();
575 for(vector<TransientVertex>::iterator
k=pv.begin()+1;
k!=pv.end();
k++){
576 if (
k->position().z() - (
k-1)->
position().z()> (2*vertexSize_) ){
578 clusters.push_back(aCluster);
581 for(
unsigned int i=0;
i<
k->originalTracks().size();
i++){ aCluster.push_back(
k->originalTracks().at(
i)); }
584 clusters.push_back(aCluster);
const double Z[kNumberCalorimeter]
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
std::vector< track_t > fill(const std::vector< reco::TransientTrack > &tracks) const
Exp< T >::type exp(const T &t)
static int position[TOTALCHAMBERS][3]
bool merge(std::vector< vertex_t > &, int) const
void splitAll(std::vector< track_t > &tks, std::vector< vertex_t > &y) const
std::vector< std::vector< reco::TransientTrack > > clusterize(const std::vector< reco::TransientTrack > &tracks) const
Tan< T >::type tan(const T &t)
Log< T >::type log(const T &t)
DAClusterizerInZ(const edm::ParameterSet &conf)
const reco::TransientTrack * tt
void dump(const double beta, const std::vector< vertex_t > &y, const std::vector< track_t > &tks, const int verbosity=0) const
double update(double beta, std::vector< track_t > &tks, std::vector< vertex_t > &y) const
double Eik(const track_t &t, const vertex_t &k) const
double beta0(const double betamax, std::vector< track_t > &tks, std::vector< vertex_t > &y) const
bool purge(std::vector< vertex_t > &, std::vector< track_t > &, double &, const double) const
Power< A, B >::type pow(const A &a, const B &b)
std::vector< TransientVertex > vertices(const std::vector< reco::TransientTrack > &tracks, const int verbosity=0) const