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)
34 Measurement1D IP=(*it).stateAtBeamLine().transverseImpactParameter();
68 vector<track_t> & tks,
76 unsigned int nt=tks.size();
80 for(vector<vertex_t>::iterator
k=y.begin();
k!=y.end();
k++){
81 k->se=0;
k->sw=0;
k->swz=0;
86 for(
unsigned int i=0;
i<
nt;
i++){
90 for(vector<vertex_t>::iterator
k=y.begin();
k!=y.end();
k++){
91 k->ei=
exp(-beta*Eik(tks[
i],*
k));
100 for(vector<vertex_t>::iterator
k=y.begin();
k!=y.end();
k++){
101 k->se += tks[
i].pi*
k->ei / Zi;
102 double w =
k->pk * tks[
i].pi*
k->ei / Zi / tks[
i].dz2;
104 k->swz += w * tks[
i].z;
116 for(vector<vertex_t>::iterator
k=y.begin();
k!=y.end();
k++){
118 double znew=
k->swz/
k->sw;
119 delta+=
pow(
k->z-znew,2);
122 edm::LogInfo(
"sumw") <<
"invalid sum of weights in fit: " <<
k->sw << endl;
123 if(verbose_){
cout <<
" a cluster melted away ? pk=" <<
k->pk <<
" sumw=" <<
k->sw << endl;}
126 k->pk =
k->pk *
k->se / sumpi;
139 vector<track_t> & tks,
140 vector<vertex_t> &
y,
146 unsigned int nt=tks.size();
149 for(vector<vertex_t>::iterator
k=y.begin();
k!=y.end();
k++){
150 k->se=0;
k->sw=0;
k->swz=0;
155 for(
unsigned int i=0;
i<
nt;
i++){
158 double Zi=rho0*
exp(-beta*mu0_*mu0_);
159 for(vector<vertex_t>::iterator
k=y.begin();
k!=y.end();
k++){
160 k->ei=
exp(-beta*Eik(tks[
i],*
k));
170 for(vector<vertex_t>::iterator
k=y.begin();
k!=y.end();
k++){
171 k->se += tks[
i].pi*
k->ei / Zi;
172 double w =
k->pk * tks[
i].pi*
k->ei / Zi / tks[
i].dz2;
174 k->swz += w * tks[
i].z;
185 for(vector<vertex_t>::iterator
k=y.begin();
k!=y.end();
k++){
187 double znew=
k->swz/
k->sw;
188 delta+=
pow(
k->z-znew,2);
191 edm::LogInfo(
"sumw") <<
"invalid sum of weights in fit: " <<
k->sw << endl;
192 if(verbose_){
cout <<
" a cluster melted away ? pk=" <<
k->pk <<
" sumw=" <<
k->sw << endl;}
209 if(y.size()<2)
return false;
211 for(vector<vertex_t>::iterator
k=y.begin(); (
k+1)!=y.end();
k++){
213 if (fabs((
k+1)->
z -
k->z)<1.e-2){
215 k->z=0.5*(
k->z+(
k+1)->
z);
228 if(y.size()<2)
return false;
230 unsigned int nt=tks.size();
232 vector<vertex_t>::iterator
k0=y.end();
233 for(vector<vertex_t>::iterator
k=y.begin();
k!=y.end();
k++){
236 double pmax=
k->pk/(
k->pk+rho0*
exp(-beta*mu0_*mu0_));
237 for(
unsigned int i=0;
i<
nt;
i++){
240 double p=
k->pk *
exp(-beta*Eik(tks[
i],*
k)) / tks[
i].Z;
242 if( (p > 0.9*pmax) && (tks[i].
pi>0) ){ nUnique++; }
246 if((nUnique<2)&&(sump<sumpmin)){
253 if(verbose_){
cout <<
"eliminating prototype at " << k0->z <<
" with sump=" << sumpmin << endl;}
267 vector<track_t> & tks,
273 unsigned int nt=tks.size();
275 for(vector<vertex_t>::iterator
k=y.begin();
k!=y.end();
k++){
280 for(
unsigned int i=0;
i<
nt;
i++){
281 double w=tks[
i].pi/tks[
i].dz2;
289 for(
unsigned int i=0;
i<
nt;
i++){
290 double dx=tks[
i].z-(
k->z);
291 double w=tks[
i].pi/tks[
i].dz2;
292 a+=w*
pow(dx,2)/tks[
i].dz2;
300 return betamax/
pow(coolingFactor_,
int(
log(T0*betamax)/
log(coolingFactor_))-1 );
303 return betamax/coolingFactor_;
311 vector<track_t> & tks,
320 for(vector<vertex_t>::iterator
k=y.begin();
k!=y.end();
k++){
321 if ( ( (
k==y.begin())|| (
k-1)->z <
k->z - zsep) && (((
k+1)==y.end() )|| (
k+1)->z >
k->z + zsep)) {
326 vnew.
pk= 0.5* (*k).pk;
327 (*k).pk= 0.5* (*k).pk;
331 }
else if( y1.empty() || (y1.back().z <
k->z -zsep)){
359 coolingFactor_ = conf.
getParameter<
double>(
"coolingFactor");
362 cout <<
"DAClusterizerInZ: invalid Tmin" << Tmin <<
" reset do default " << 1./betamax_ << endl;
374 for(vector<track_t>::const_iterator
t=tks0.begin();
t!=tks0.end();
t++){tks.push_back(*
t); }
375 stable_sort(tks.begin(), tks.end(), recTrackLessZ1);
377 cout <<
"-----DAClusterizerInZ::dump ----" << endl;
378 cout <<
"beta=" << beta <<
" betamax= " << betamax_ << endl;
381 for(vector<vertex_t>::const_iterator
k=y.begin();
k!=y.end();
k++){
382 cout << setw(8) << fixed <<
k->z ;
384 cout << endl <<
"T=" << setw(15) << 1./beta <<
" Tc= ";
385 cout << endl <<
" pk=";
387 for(vector<vertex_t>::const_iterator
k=y.begin();
k!=y.end();
k++){
388 cout << setw(8) << setprecision(3) << fixed <<
k->pk;
396 cout <<
"---- z +/- dz ip +/-dip pt phi eta weights ----" << endl;
398 for(
unsigned int i=0;
i<tks.size();
i++){
401 cout << setw (3)<<
i <<
")" << setw (8) << fixed << setprecision(4)<< tz <<
" +/-" << setw (6)<<
sqrt(tks[
i].dz2);
404 if(tks[
i].tt->track().hitPattern().hasValidHitInFirstPixelBarrel()){
cout <<
"+";}
else{
cout <<
"-";}
405 cout << setw(1) << tks[
i].tt->track().hitPattern().pixelBarrelLayersWithMeasurement();
406 cout << setw(1) << tks[
i].tt->track().hitPattern().pixelEndcapLayersWithMeasurement();
407 cout << setw(1) << hex << tks[
i].tt->track().hitPattern().trackerLayersWithMeasurement()-tks[
i].tt->track().hitPattern().pixelLayersWithMeasurement() <<dec;
408 cout <<
"=" << setw(1)<<hex <<tks[
i].tt->track().trackerExpectedHitsOuter().numberOfHits() << dec;
410 Measurement1D IP=tks[
i].tt->stateAtBeamLine().transverseImpactParameter();
411 cout << setw (8) << IP.
value() <<
"+/-" << setw (6) << IP.
error();
412 cout <<
" " << setw(6) << setprecision(2) << tks[
i].tt->track().pt()*tks[
i].tt->track().charge();
413 cout <<
" " << setw(5) << setprecision(2) << tks[
i].tt->track().phi()
414 <<
" " << setw(5) << setprecision(2) << tks[
i].tt->track().eta() ;
417 for(vector<vertex_t>::const_iterator
k=y.begin();
k!=y.end();
k++){
418 if((tks[
i].
pi>0)&&(tks[
i].Z>0)){
420 double p=
k->pk *
exp(-beta*Eik(tks[
i],*
k)) / tks[
i].Z;
422 cout << setw (8) << setprecision(3) <<
p;
434 cout << endl <<
"T=" << 1/beta <<
" E=" << E <<
" n="<< y.size() <<
" F= " << F << endl <<
"----------" << endl;
442 vector< TransientVertex >
447 vector<track_t> tks=fill(tracks);
448 unsigned int nt=tracks.size();
451 vector< TransientVertex > clusters;
452 if (tks.empty())
return clusters;
465 double beta=beta0(betamax_, tks, y);
466 niter=0;
while((
update(beta, tks,y)>1.
e-6) && (niter++ < maxIterations_)){ }
470 while(beta<betamax_){
472 beta=beta/coolingFactor_;
476 niter=0;
while((
update(beta, tks,y)>1.
e-6) && (niter++ < maxIterations_)){ }
482 while(
merge(y,tks.size())){}
483 if(verbose_ ){
cout <<
"dump after 1st merging " << endl;
dump(beta,y,tks,2);}
489 rho0=1./
nt;
for(vector<vertex_t>::iterator
k=y.begin();
k!=y.end();
k++){
k->pk =1.; }
490 niter=0;
while((
update(beta, tks,y,rho0) > 1.
e-8) && (niter++ < maxIterations_)){ }
491 if(verbose_ ){
cout <<
"rho0=" << rho0 <<
" niter=" << niter << endl;
dump(beta,y,tks,2);}
495 while(
merge(y,tks.size())){}
496 if(verbose_ ){
cout <<
"dump after 2nd merging " << endl;
dump(beta,y,tks,2);}
500 while(beta<=betastop_){
501 while(purge(y,tks,rho0, beta)){
502 niter=0;
while((
update(beta, tks,y,rho0) > 1.
e-6) && (niter++ < maxIterations_)){ }
504 beta/=coolingFactor_;
505 niter=0;
while((
update(beta, tks,y,rho0) > 1.
e-6) && (niter++ < maxIterations_)){ }
509 cout <<
"Final result, rho0=" << rho0 << endl;
516 for(vector<vertex_t>::iterator
k=y.begin();
k!=y.end();
k++){
518 vector< reco::TransientTrack > vertexTracks;
519 for(
unsigned int i=0;
i<
nt;
i++){
521 double p=
k->pk *
exp(-beta*Eik(tks[
i],*
k)) / tks[
i].Z;
522 if( (tks[i].
pi>0) && ( p > 0.5 ) ){ vertexTracks.push_back(*(tks[i].tt));}
526 clusters.push_back(v);
537 vector< vector<reco::TransientTrack> >
542 cout <<
"###################################################" << endl;
543 cout <<
"# DAClusterizerInZ::clusterize nt="<<tracks.size() << endl;
544 cout <<
"###################################################" << endl;
547 vector< vector<reco::TransientTrack> > clusters;
548 vector< TransientVertex > pv=
vertices(tracks);
550 if(verbose_){
cout <<
"# DAClusterizerInZ::clusterize pv.size="<<pv.size() << endl; }
551 if (pv.size()==0){
return clusters;}
555 vector< reco::TransientTrack> aCluster=pv.begin()->originalTracks();
557 for(vector<TransientVertex>::iterator
k=pv.begin()+1;
k!=pv.end();
k++){
558 if (
k->position().z() - (
k-1)->
position().z()> (2*vertexSize_) ){
560 clusters.push_back(aCluster);
563 for(
unsigned int i=0;
i<
k->originalTracks().size();
i++){ aCluster.push_back(
k->originalTracks().at(
i)); }
566 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)
bool merge(LuminosityBlockRange &lh, LuminosityBlockRange &rh)
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