7 void CreateAllShits2(LCCollection* colt,CellIDDecoder<CalorimeterHit>&
id,vector<Superhit2*>* calo)
10 unsigned int nelem=colt->getNumberOfElements();
13 for(
unsigned int ll=0;ll<nelem;ll++)
15 CalorimeterHit* ch=
dynamic_cast<CalorimeterHit*
>(colt->getElementAt(ll));
16 unsigned int layer =(
unsigned int)
id(ch)[
"K-1"];
19 if( layer<=PGDB[PGdb::ECAL1_BAR].max_lay)
20 stmp=
new Superhit2(PGDB[PGdb::ECAL1_BAR].mip_whole,ch);
22 stmp=
new Superhit2(PGDB[PGdb::ECAL2_BAR].mip_whole,ch);
24 calo[0].push_back(stmp);
29 void TotalPrecalc2(vector<Superhit2*>* calo,CellIDDecoder<CalorimeterHit>&
id,
30 unsigned int nelem,
int Ncut)
33 vector<Superhit2*> tmpsh[9];
35 for(
unsigned int ll=0;ll<nelem;ll++)
37 CalorimeterHit* chh=(calo[0])[ll]->chit;
38 int stove =id(chh)[
"S-1"];
39 int module =id(chh)[
"M"];
40 int layer =id(chh)[
"K-1"];
42 (calo[0])[ll]->S=stove;
43 (calo[0])[ll]->M=module;
44 (calo[0])[ll]->
K=layer;
47 if( module !=0 && module!=6)
51 tmpsh[stove].push_back((calo[0])[ll]);
54 double fi=atan2(-(calo[0])[ll]->chit->getPosition()[0],(calo[0])[ll]->chit->getPosition()[1]);
63 double diff=fi-M_PI_4*stove;
64 tmpsh[stove].push_back((calo[0])[ll]);
65 if ( fabs(diff)<M_PI_4/2.0)
67 tmpsh[stove].push_back((calo[0])[ll]);
70 (calo[0])[ll]->connect=
true;
72 tmpsh[stove].push_back((calo[0])[ll]);
77 tmpsh[stovem1].push_back((calo[0])[ll]);
79 tmpsh[7].push_back((calo[0])[ll]);
83 tmpsh[8].push_back((calo[0])[ll]);
89 double celx=PGDB[PGdb::ECAL1_BAR].cell_size;
90 double distcut=0.98*(2.0*celx)*(2.0*celx);
92 for(
unsigned int ll=0;ll<8;ll++)
94 if(tmpsh[ll].size()!=0)
95 Precalc2(tmpsh[ll],PGDB[PGdb::ECAL1_BAR].r_inner,
96 PGDB[PGdb::ECAL1_CAP].z_inner,
97 PGDB[PGdb::ECAL1_BAR].cell_size,distcut,
true,ll,1,
id);
101 if(tmpsh[8].size()!=0)
102 Precalc2(tmpsh[8],PGDB[PGdb::ECAL1_BAR].r_inner,
103 PGDB[PGdb::ECAL1_CAP].z_inner,
104 PGDB[PGdb::ECAL1_BAR].cell_size,distcut,
false,1,1,
id);
108 for(
unsigned int ii=0;ii<calo[0].size();ii++)
109 calo[0][ii]->top=calo[0][ii]->neighbours.size();
112 for(
unsigned int ii=0;ii<(calo[0]).size();ii++)
114 if ((calo[0])[ii]->top !=0)
116 if((calo[0])[ii]->top >= 1 && (calo[0])[ii]->top <Ncut)
118 (calo[2]).push_back((calo[0])[ii]);
120 (calo[4]).push_back((calo[0])[ii]);
123 (calo[6]).push_back((calo[0])[ii]);
140 void Precalc2(vector< Superhit2* >& shvec,
double r,
double z,
double cell,
double dist,
bool tip,
int stove,
int module,CellIDDecoder<CalorimeterHit>&
id){
142 unsigned int nPts=shvec.size();
143 ANNpointArray dataPts;
149 queryPt=annAllocPt(3);
150 dataPts=annAllocPts(nPts,3);
151 nnIdx=
new ANNidx[36];
152 dists=
new ANNdist[36];
156 float Ecalcellsize=cell;
158 for (
unsigned int ii=0; ii<nPts;ii++)
160 GridTransform2(shvec[ii]->chit,Ecalradius,Ecalhalfz,Ecalcellsize,xxx,tip,stove,module,
id);
161 dataPts[ii][0]=xxx[0];
162 dataPts[ii][1]=xxx[1];
163 dataPts[ii][2]=xxx[2];
164 shvec[ii]->point[0]=xxx[0];
165 shvec[ii]->point[1]=xxx[1];
166 shvec[ii]->point[2]=xxx[2];
170 kdTree=
new ANNkd_tree(dataPts,nPts,3);
173 for (
unsigned int ii=0; ii<nPts;ii++)
175 unsigned int koliko = (
unsigned int)kdTree->annkFRSearch(dataPts[ii],trd,26,nnIdx,dists,0.0);
180 if( shvec[ii]->connect )
183 for(
unsigned int ij=0;ij<koliko;ij++)
185 if( shvec[ii]->neighbours.end() ==
186 find(shvec[ii]->neighbours.begin(),shvec[ii]->neighbours.end(), shvec[nnIdx[ij]]))
188 shvec[ii]->neighbours.push_back(shvec[nnIdx[ij]]);
192 if( shvec[nnIdx[ij]]->neighbours.end() ==
193 find(shvec[nnIdx[ij]]->neighbours.begin(),shvec[nnIdx[ij]]->neighbours.end(), shvec[ii]))
195 shvec[nnIdx[ij]]->neighbours.push_back(shvec[ii]);
196 shvec[nnIdx[ij]]->top++;
204 shvec[ii]->top=koliko;
205 for(
unsigned int ij=0;ij<koliko ;ij++)
206 shvec[ii]->neighbours.push_back( shvec[nnIdx[ij]]);
212 shvec[ii]->top=koliko;
213 for(
unsigned int ij=0;ij<koliko;ij++)
214 shvec[ii]->neighbours.push_back( shvec[nnIdx[ij]]);
220 annDeallocPts(dataPts);
228 void GridTransform2( CalorimeterHit* clh,
float& radius,
float& halfz,
float& cellsize,
float*X,
229 bool tip,
int stove,
int module,CellIDDecoder<CalorimeterHit>&
id)
238 stove = id(clh)[
"S-1"];
239 module = id(clh)[
"M"];
240 layer = id(clh)[
"K-1"];
243 int stove2= id(clh)[
"S-1"];
247 coss= cos(M_PI_4*stove);
248 sinn= sin(M_PI_4*stove);
249 float tmp_y=coss*clh->getPosition()[1]-sinn*clh->getPosition()[0];
250 layer=(
unsigned int) ((tmp_y-radius)/PGDB[PGdb::ECAL1_BAR].sampling);
252 if ( layer> PGDB[PGdb::ECAL1_BAR].n_sampl-1 )
254 layer=PGDB[PGdb::ECAL1_BAR].n_sampl-1+
255 (
unsigned int)(( tmp_y-radius- PGDB[PGdb::ECAL1_BAR].n_sampl*
256 PGDB[PGdb::ECAL1_BAR].sampling)/PGDB[PGdb::ECAL2_BAR].sampling);
260 layer = id(clh)[
"K-1"];
265 coss= cos(M_PI_4*stove);
266 sinn= sin(M_PI_4*stove);
268 if( module !=0 && module!=6)
270 float tmp_x=coss*clh->getPosition()[0]+sinn*clh->getPosition()[1];
271 float tmp_y=radius+(layer+1)*cellsize;
273 X[0]= coss*tmp_x-sinn*tmp_y;
274 X[1]= coss*tmp_y+sinn*tmp_x;
275 X[2]=clh->getPosition()[2];
278 X[0]=clh->getPosition()[0];
279 X[1]=clh->getPosition()[1];
280 X[2]= (-1+module/3)*(halfz+layer*cellsize);
287 unsigned int N, vector<float> miipstep,
CoreCut2 Ccut)
289 typedef pair<int,int> test;
290 int psl_plun_global=0;
292 double Diagby2=PGDB[PGdb::ECAL1_BAR].cell_size*sqrt(2.0)/2.0;
293 double d=PGDB[PGdb::ECAL1_BAR].r_inner;
294 double z=PGDB[PGdb::ECAL1_CAP].z_inner;
296 vector< vector<Superhit2*> > blk(N) ;
298 for(
unsigned int iim=0;iim<secal1->size();iim++)
302 for(
unsigned int ib=0;ib<N;ib++)
304 if( (*secal1)[iim]->mip > miipstep[ib])
309 for(
int im=koji;im>=0 ;im--)
310 blk[im].push_back((*secal1)[iim]);
313 vector<Tmpcl2*> testvektor;
315 for(
unsigned int iim=0;iim<N;iim++)
320 for(
unsigned int iim=0;iim<N;iim++)
323 if(bbb[iim].size()!=0)
325 for(
unsigned int im=0;im<bbb[iim].size();im++)
327 bbb[iim][im]->calcCenter();
328 bbb[iim][im]->findInertia();
334 int poslednjipun=N-1;
335 for(
unsigned int im=0;im<N;im++)
337 if(bbb[im].size()==0)
344 psl_plun_global=poslednjipun;
346 vector < PROTSEED2 > prs;
348 for(
unsigned int im=0;im<bbb[0].size();im++)
350 if(bbb[0][im]->hits.size()>Ccut.
MinHit0)
364 for(
unsigned int iim=0;iim<prs.size();iim++)
372 prs[iim].X[0]=Xatf[0];
373 prs[iim].X[1]=Xatf[1];
374 prs[iim].X[2]=Xatf[2];
375 prs2->push_back(prs[iim]);
379 for(
int i=1;i<=poslednjipun;i++)
382 for(
unsigned int im=0;im<prs2->size();im++)
384 if( (*prs2)[im].active)
395 vector < int > gssfa;
396 for(
unsigned int imj=0;imj<izv.size();imj++)
399 for(
unsigned int imm=0;imm<izv.size();imm++)
408 XIP[0]=0.0; XIP[1]=0.0; XIP[2]=0.0;
416 if(find(gssf.begin(),gssf.end(),(int)imm)==gssf.end())
418 if(find(gssf.begin(),gssf.end(),(int)imj)==gssf.end())
422 if(find(gssfa.begin(),gssfa.end(),(int)imm)==gssfa.end())
423 gssfa.push_back(imm);
424 if(find(gssfa.begin(),gssfa.end(),(int)imj)==gssfa.end())
425 gssfa.push_back(imj);
437 int nh3=(*prs2)[im].cl->hits.size();
438 for(
unsigned int j=0;j<gssf.size();j++)
439 nh1+=izv[gssf[j]]->hits.size();
441 double ratio = ((double)nh1)/((double)nh3);
442 (*prs2)[im].active=
false;
444 if( ratio > Ccut.
Rcut )
446 for(
unsigned int j=0;j<gssfa.size();j++)
457 izv[gssfa[j]]->direction,d,z,Xatf);
463 for(
unsigned int im=0;im<prs2->size();im++)
465 if((*prs2)[im].active)
467 if( (*prs2)[im].cl==a.
cl)
478 for(
unsigned int j=0;j<gssf.size();j++)
490 izv[gssf[j]]->direction,d,z,Xatf);
497 for(
unsigned int im=0;im<prs2->size();im++)
499 if((*prs2)[im].active)
501 if( (*prs2)[im].cl==a.
cl)
521 for(
unsigned int im=0;im<prs2->size();im++)
523 if((*prs2)[im].active)
530 for(
unsigned int ij=0;ij<prs2->size();ij++)
532 if( ij!=im && (*prs2)[ij].active)
536 dircc[0]=(*prs2)[im].cl->center[0]-(*prs2)[ij].cl->center[0];
537 dircc[1]=(*prs2)[im].cl->center[1]-(*prs2)[ij].cl->center[1];
538 dircc[2]=(*prs2)[im].cl->center[2]-(*prs2)[ij].cl->center[2];
542 && fabs(
Dot2((*prs2)[ij].cl->center,dircc))>Ccut.
Coscut)
549 if(find(kojsv.begin(),kojsv.end(),a)==kojsv.end() &&
550 find(kojsv.begin(),kojsv.end(),b)==kojsv.end())
566 int iskoristio[kojsv.size()];
567 for(
unsigned int i=0;i<kojsv.size();i++)
571 for(
unsigned int i=0;i<kojsv.size();i++)
573 if( iskoristio[i]==0)
576 trojka.push_back(kojsv[i].first);
577 trojka.push_back(kojsv[i].second);
579 for(
unsigned int j=0;j<kojsv.size();j++)
583 (find(trojka.begin(),trojka.end(),kojsv[j].first)!=trojka.end() &&
584 find(trojka.begin(),trojka.end(),kojsv[j].second)==trojka.end() ) ||
585 (find(trojka.begin(),trojka.end(),kojsv[j].second)!=trojka.end() &&
586 find(trojka.begin(),trojka.end(),kojsv[j].first)==trojka.end() ))
589 if(find(trojka.begin(),trojka.end(),kojsv[j].first)==trojka.end())
595 if( (*prs2)[kojsv[j].first].active)
596 trojka.push_back(kojsv[j].first);
602 if( (*prs2)[kojsv[j].second].active)
603 trojka.push_back(kojsv[j].second);
612 for(
unsigned int j=1;j<trojka.size();j++)
614 if((*prs2)[trojka[0]].level!=(*prs2)[trojka[j]].level)
622 for(
unsigned int j=0;j<trojka.size();j++)
624 if( (*prs2)[trojka[j]].active)
626 for(
unsigned int jj=0;jj<(*prs2)[trojka[j]].cl->hits.size();jj++)
628 cl->
hits.push_back((*prs2)[trojka[j]].cl->
hits[jj]);
630 (*prs2)[trojka[j]].active=
false;
633 if( cl->
hits.size()!=0)
638 bbb[(*prs2)[trojka[0]].level].push_back(cl);
646 a.
level=(*prs2)[trojka[0]].level;
655 for(
unsigned int im=0;im<prs2->size();im++)
657 if((*prs2)[im].active)
659 if( (*prs2)[im].cl==a.
cl)
673 for(
unsigned int j=0;j<trojka.size();j++)
675 if( find(nivoi.begin(),nivoi.end(),(*prs2)[trojka[j]].level)==nivoi.end())
676 nivoi.push_back((*prs2)[trojka[j]].level);
681 if( (*prs2)[trojka[0]].cl->getEnergy() >=(*prs2)[trojka[1]].cl->getEnergy())
683 (*prs2)[trojka[1]].active=
false;
685 (*prs2)[trojka[0]].active=
false;
689 vector <int> izabrani;
690 int isko[trojka.size()];
691 for(
unsigned int jj=0;jj<trojka.size();jj++)
695 for(
unsigned int j=0;j<nivoi.size();j++)
698 for(
unsigned int jj=0;jj<trojka.size();jj++)
702 if( nivoi[j]==(*prs2)[trojka[jj]].level)
704 sabr.push_back(trojka[jj]);
714 for(
unsigned int jk=0;jk<sabr.size();jk++)
716 (*prs2)[sabr[jk]].active=
false;
717 for(
unsigned int jj=0;jj<(*prs2)[sabr[jk]].cl->hits.size();jj++)
718 cl->
hits.push_back((*prs2)[sabr[jk]].cl->hits[jj]);
723 bbb[nivoi[j]].push_back(cl);
732 a.
level=(*prs2)[nivoi[j]].level;
741 for(
unsigned int im=0;im<prs2->size();im++)
743 if((*prs2)[im].active)
745 if( (*prs2)[im].cl==a.
cl)
752 izabrani.push_back(prs2->size()-1);
757 izabrani.push_back(sabr[0]);
760 if( izabrani.size()>1)
762 typedef pair <double,int> DpI;
764 for(
unsigned int j=0;j<izabrani.size();j++)
767 tmp.first=(*prs2)[izabrani[j]].cl->getEnergy();
768 tmp.second=izabrani[j];
772 sort(bfjl.begin(),bfjl.end());
774 for(
unsigned int j=0;j<izabrani.size()-1;j++)
776 (*prs2)[bfjl[j].second].active=
false;
792 void cluster5( vector<Superhit2*>* shv, vector<Tmpcl2*>* clv)
795 if( (*shv).size()!=0)
798 for(
unsigned int i=0;i<(*shv).size();i++)
800 (*shv)[i]->is_assigned=
false;
803 unsigned int shvsz=(*shv).size();
805 for(
unsigned int i=0;i<shvsz;i++)
808 if( (*shv)[i]->top==0 )
811 cl->
hits.push_back((*shv)[i]);
812 (*shv)[i]->is_assigned=
true;
817 if( (*shv)[i]->is_assigned==
false)
819 vector<Superhit2*> sshv;
820 stack <Superhit2*> shstack;
821 sshv.push_back((*shv)[i]);
823 for(
unsigned int j=0;j<(*shv)[i]->neighbours.size();j++)
825 if( !((*shv)[i]->neighbours[j]->is_assigned) &&
826 shv->end() !=find(shv->begin(),shv->end(), (*shv)[i]->neighbours[j]))
828 sshv.push_back((*shv)[i]->neighbours[j]);
829 (*shv)[i]->neighbours[j]->is_assigned=
true;
830 shstack.push((*shv)[i]->neighbours[j]);
834 while(!shstack.empty())
840 for(
unsigned int j=0;j<sh->
neighbours.size();j++)
845 shv->end() !=find(shv->begin(),shv->end(), sh->
neighbours[j]))
847 if(sshv.end()==find(sshv.begin(),sshv.end(),sh->
neighbours[j]))
861 for(
unsigned int im=0;im<sshv.size();im++)
863 cl->
hits.push_back(sshv[im]);
872 for(
unsigned int i=0;i<shv->size();i++)
873 if((*shv)[i]->is_assigned==
false)
876 cl->
hits.push_back((*shv)[i]);
888 for(
unsigned int i=0;i<3;i++)
891 pointt[i]=chitin->getPosition()[i];
919 for(
unsigned int i=0; i<
hits.size();i++)
932 for(
unsigned int i=0; i<
hits.size();i++)
934 en=
hits[i]->chit->getEnergy();
951 for (
int i(0); i < 3; ++i) {
952 for (
int j(0); j < 3; ++j) {
958 for(
unsigned int i=0; i<
hits.size();i++)
963 double eneh=
hits[i]->chit->getEnergy();
965 aIne[0][0] += eneh*(dY*dY+dZ*dZ);
966 aIne[1][1] += eneh*(dX*dX+dZ*dZ);
967 aIne[2][2] += eneh*(dX*dX+dY*dY);
968 aIne[0][1] -= eneh*dX*dY;
969 aIne[0][2] -= eneh*dX*dZ;
970 aIne[1][2] -= eneh*dY*dZ;
973 for (
int i(0); i < 2; ++i) {
974 for (
int j = i+1; j < 3; ++j) {
975 aIne[j][i] = aIne[i][j];
980 gsl_matrix_view aMatrix = gsl_matrix_view_array((
double*)aIne,3,3);
981 gsl_vector* aVector = gsl_vector_alloc(3);
982 gsl_matrix* aEigenVec = gsl_matrix_alloc(3,3);
983 gsl_eigen_symmv_workspace* wa = gsl_eigen_symmv_alloc(3);
984 gsl_eigen_symmv(&aMatrix.matrix,aVector,aEigenVec,wa);
985 gsl_eigen_symmv_free(wa);
986 gsl_eigen_symmv_sort(aVector,aEigenVec,GSL_EIGEN_SORT_ABS_ASC);
988 for (
int i(0); i < 3; i++) {
989 inteigen[i] = gsl_vector_get(aVector,i);
991 for (
int j(0); j < 3; j++) {
992 inteigenvec[i+3*j] = gsl_matrix_get(aEigenVec,i,j);
998 for (
int i(0); i < 3; i++)
1005 gsl_vector_free(aVector);
1006 gsl_matrix_free(aEigenVec);
1015 X2[0]=X1[0]+dir[0]*400.0;
1016 X2[1]=X1[1]+dir[1]*400.0;
1017 X2[2]=X1[2]+dir[2]*400.0;
1024 X2[0]=X1[0]-dir[0]*400.0;
1025 X2[1]=X1[1]-dir[1]*400.0;
1026 X2[2]=X1[2]-dir[2]*400.0;
1037 double koren2=M_SQRT2/2.0;
1082 if ( abs(X2[2])<zmax)
1086 vector < vector <double> > test;
1087 for (
unsigned int i=0; i<8;i++)
1089 double tmp=-(n[i][0]*n[i][0]+n[i][1]*n[i][1]+n[i][2]*n[i][2])*d
1090 +n[i][0]*X1[0]+n[i][1]*X1[1]+n[i][2]*X1[2];
1092 double tmp2=n[i][0]*(X1[0]-X2[0])+n[i][1]*(X1[1]-X2[1])+n[i][2]*(X1[2]-X2[2]);
1101 if (t>0.0 && t<=1.0)
1103 vector <double> tmpi;
1104 tmpi.push_back(X1[0]+(X2[0]-X1[0])*t);
1105 tmpi.push_back(X1[1]+(X2[1]-X1[1])*t);
1106 tmpi.push_back(X1[2]+(X2[2]-X1[2])*t);
1107 test.push_back(tmpi);
1118 double rts=sqrt(X[0]*X[0]+X[1]*X[1]);
1119 if( rts< ((d+2.0)*1.0823922002924))
1131 unsigned int imin=999;
1133 for(
unsigned int i=0; i<test.size();i++)
1136 Xa[0]=test[i][0]; Xa[1]=test[i][1]; Xa[2]=test[i][2];
1138 double tmpr=sqrt(Xa[0]*Xa[0]+Xa[1]*Xa[1]);
1146 if ( imin< test.size())
1174 double tmp=-(n[0][0]*n[0][0]+n[0][1]*n[0][1]+n[0][2]*n[0][2])*zmax
1175 +n[0][0]*X1[0]+n[0][1]*X1[1]+n[0][2]*X1[2];
1176 double tmp2=n[0][0]*(X1[0]-X2[0])+n[0][1]*(X1[1]-X2[1])+n[0][2]*(X1[2]-X2[2]);
1185 X[0]=X1[0]+(X2[0]-X1[0])*t ;
1186 X[1]=X1[1]+(X2[1]-X1[1])*t ;
1187 X[2]=X1[2]+(X2[2]-X1[2])*t ;
1202 sort(cl->
hits.begin(),cl->
hits.end());
1204 for(
unsigned int i=0;i<clv.size();i++)
1206 sort(clv[i]->hits.begin(),clv[i]->hits.end());
1207 if( includes(cl->
hits.begin(),cl->
hits.end(),clv[i]->hits.begin(),clv[i]->hits.end()))
1210 clv[i]->parents.push_back(cl);
1218 double tmp1=X1[1]*X2[0]-X1[0]*X2[1]-X1[1]*X0[0]+X2[1]*X0[0]+X1[0]*X0[1]-X2[0]*X0[1];
1219 double tmp2=X1[2]*X2[0]-X1[0]*X2[2]-X1[2]*X0[0]+X2[2]*X0[0]+X1[0]*X0[2]-X2[0]*X0[2];
1220 double tmp3=X1[2]*X2[1]-X1[1]*X2[2]-X1[2]*X0[1]+X2[2]*X0[1]+X1[1]*X0[2]-X2[1]*X0[2];
1221 double tmp4=(X1[0]-X2[0])*(X1[0]-X2[0])+(X1[1]-X2[1])*(X1[1]-X2[1])+(X1[2]-X2[2])*(X1[2]-X2[2]);
1223 double tmp5=tmp1*tmp1+tmp2*tmp2+tmp3*tmp3;
1233 if ( abs(X1[2])<zmax)
1236 double fi=atan2(X1[0],X1[1]);
1237 double fi0=M_PI_4/2.0;
1241 i=(int)((fi+fi0)/M_PI_4);
1243 i=(int)((fi-fi0)/M_PI_4);
1246 double fip=i*M_PI_4;
1275 vector <double> dist;
1278 for(
unsigned int i=0; i<cl1->
hits.size();i++)
1280 double x1=cl1->
hits[i]->pointt[0];
1281 double y1=cl1->
hits[i]->pointt[1];
1282 double z1=cl1->
hits[i]->pointt[2];
1284 for(
unsigned int j=0; j<cl2->
hits.size();j++)
1287 double tmp=((x1-cl2->
hits[j]->pointt[0])*(x1-cl2->
hits[j]->pointt[0])+
1288 (y1-cl2->
hits[j]->pointt[1])*(y1-cl2->
hits[j]->pointt[1])+
1289 (z1-cl2->
hits[j]->pointt[2])*(z1-cl2->
hits[j]->pointt[2]) ) ;
1290 dist.push_back(tmp);
1293 sort(dist.begin(),dist.end());
1294 return sqrt(dist[0]);
1297 inline double Dot2(
double* X1,
double* X2)
1299 double n1=sqrt(X1[0]*X1[0]+X1[1]*X1[1]+X1[2]*X1[2]);
1300 double n2=sqrt(X2[0]*X2[0]+X2[1]*X2[1]+X2[2]*X2[2]);
1302 return (X1[0]*X2[0]+X1[1]*X2[1]+X1[2]*X2[2])/(n1*n2);
1308 sort(cl->
hits.begin(),cl->
hits.end());
1310 for(
unsigned int i=0;i<clv.size();i++)
1312 sort(clv[i]->hits.begin(),clv[i]->hits.end());
1313 if( includes(cl->
hits.begin(),cl->
hits.end(),clv[i]->hits.begin(),clv[i]->hits.end()))
1314 clout.push_back(clv[i]);
1325 start[0]=pocetak[0];
1326 start[1]=pocetak[1];
1327 start[2]=pocetak[2];
1330 zons=PGdb::ECAL1_BAR;
1333 x0eff =PGDB[zons].x0eff;
1335 Eceff =PGDB[zons].Eceff;
1336 eprime =PGDB[zons].eprime;
1337 Rm =PGDB[zons].Rmeff;
1339 z1=0.0251+0.00319*log(
Ee*1000.0);
1340 z2=0.1162-0.000381*
Z;
1344 k4=0.3585+0.0421*log(
Ee*1000.0);
1347 p3=1.313-0.0686*log(
Ee*1000.0);
1367 double TP[3]; TP[0]=ch->getPosition()[0]-
start[0];
1368 TP[1]=ch->getPosition()[1]-
start[1];
1369 TP[2]=ch->getPosition()[2]-
start[2];
1378 double t=sqrt( (
start[0]-X[0])*(
start[0]-X[0])+
1382 double pos[3]; pos[0]=ch->getPosition()[0];pos[1]=ch->getPosition()[1];pos[2]=ch->getPosition()[2];
1387 double RChom=
z1+
z2*tau;
1388 double RThom=
k1*(exp(
k3*(tau-
k2))+exp(
k4*(tau-
k2)));
1389 double phom=
p1*exp((
p2-tau)/
p3-exp((
p2-tau)/
p3));
1392 double RCsam=RChom-0.0203*(1.0-
eprime)+0.0397*exp(-tau)/
Fs;
1393 double RTsam=RThom-0.14*(1.0-
eprime)-0.495*exp(-tau)/
Fs;
1394 double psam =phom+(1.0-
eprime)*(0.348-0.642*exp(-pow(tau-1.0,2.0))/
Fs);
1398 if ( rb < 20.0 && t< 35.0)
1401 tmp=
Ee*tmp*(psam*2.0*rb*RCsam*RCsam/pow(rb*rb+RCsam*RCsam,2.0) +
1402 (1-psam)*(2.0*rb*RTsam*RTsam/pow(rb*rb+RTsam*RTsam,2.0)))/rb;
1421 void PointOnLine3(
const double* X1,
const double* X2,
const float* X0,
double* Xline)
1424 double tmp1=(X1[0]-X0[0])*(X2[0]-X1[0])+(X1[1]-X0[1])*(X2[1]-X1[1])+(X1[2]-X0[2])*(X2[2]-X1[2]);
1425 double tmp4=(X1[0]-X2[0])*(X1[0]-X2[0])+(X1[1]-X2[1])*(X1[1]-X2[1])+(X1[2]-X2[2])*(X1[2]-X2[2]);
1426 double t=-tmp1/tmp4;
1429 Xline[0]=X1[0]+(X2[0]-X1[0])*t;
1430 Xline[1]=X1[1]+(X2[1]-X1[1])*t;
1431 Xline[2]=X1[2]+(X2[2]-X1[2])*t;
1434 void PointOnLine22(
const double* Xstart,
const double* dir,
const float* X0,
double* Xline)
1438 X1[0]=Xstart[0]-dir[0]*100.0;
1439 X1[1]=Xstart[1]-dir[1]*100.0;
1440 X1[2]=Xstart[2]-dir[2]*100.0;
1441 X2[0]=Xstart[0]+dir[0]*100.0;
1442 X2[1]=Xstart[1]+dir[1]*100.0;
1443 X2[2]=Xstart[2]+dir[2]*100.0;
1452 for(
unsigned int i=0;i<cc.size();i++)
1454 if( cc[i].level==nivo && cc[i].Emax>Ecore)
1456 return cc[i].a+cc[i].b*Ecore;
1467 double aEnom[9]={0.5,1.0,2.0,3.0,5.0,8.0,12.0,20.0,40.0};
1468 double aa[9][10]={{0.283,0.357,0.337,0.398,0.000,0.000,0.000,0.000,0.000,0.000},
1469 {0.703,0.346,0.814,0.785,0.939,0.000,0.000,0.000,0.000,0.000},
1470 {0.505,0.821,1.000,1.112,1.527,1.860,0.000,0.000,0.000,0.000},
1471 {0.809,0.892,1.999,1.554,2.170,2.870,0.000,0.000,0.000,0.000},
1472 {1.075,0.827,1.290,2.350,2.123,3.958,4.814,0.000,0.000,0.000},
1473 {1.140,1.310,1.765,3.652,4.030,5.600,6.670,0.000,0.000,0.000},
1474 {0.760,1.845,3.444,2.850,5.150,6.760,10.72,0.000,0.000,0.000},
1475 {3.770,4.460,2.270,5.930,8.730,11.00,17.40,17.77,0.000,0.000},
1476 {1.890,3.560,5.120,7.320,9.650,11.71,21.74,0.000,0.000,0.000}};
1478 double bb[9][10]={{0.730,0.595,0.772,0.683,0.000,0.000,0.000,0.000,0.000,0.000},
1479 {0.493,1.079,0.458,0.592,0.447,0.000,0.000,0.000,0.000,0.000},
1480 {0.941,0.813,0.766,0.782,0.559,0.405,0.000,0.000,0.000,0.000},
1481 {0.892,0.910,0.550,0.809,0.593,0.347,0.000,0.000,0.000,0.000},
1482 {0.918,1.015,0.967,0.800,0.954,0.510,0.356,0.000,0.000,0.000},
1483 {0.974,0.986,0.970,0.778,0.784,0.593,0.509,0.000,0.000,0.000},
1484 {1.032,0.971,0.869,0.986,0.835,0.742,0.339,0.000,0.000,0.000},
1485 {0.891,0.888,1.025,0.884,0.782,0.620,0.314,0.361,0.000,0.000},
1486 {1.020,0.992,0.977,0.962,0.945,0.943,0.724,0.000,0.000,0.000}};
1488 double aEmin[9][10]={{0.250,0.200,0.150,0.060,0.000,0.000,0.000,0.000,0.000,0.000},
1489 {0.600,0.500,0.350,0.200,0.100,0.000,0.000,0.000,0.000,0.000},
1490 {1.500,1.200,1.100,0.900,0.650,0.300,0.000,0.000,0.000,0.000},
1491 {2.400,2.100,1.900,1.600,1.300,0.600,0.000,0.000,0.000,0.000},
1492 {4.000,4.100,3.900,3.200,2.900,2.400,1.100,0.000,0.000,0.000},
1493 {7.000,6.800,6.200,5.500,5.000,4.200,2.600,0.000,0.000,0.000},
1494 {10.50,10.00,9.500,8.600,8.400,8.300,5.200,0.000,0.000,0.000},
1495 {18.50,18.20,17.40,16.00,15.50,13.00,11.50,9.000,0.000,0.000},
1496 {36.00,35.00,34.00,33.50,32.50,31.00,28.00,0.000,0.000,0.000}};
1498 double aEmax[9][10]={{0.600,0.500,0.350,0.300,0.000,0.000,0.000,0.000,0.000,0.000},
1499 {1.200,1.100,1.000,0.900,0.700,0.000,0.000,0.000,0.000,0.000},
1500 {2.500,2.200,1.900,1.800,1.400,1.200,0.000,0.000,0.000,0.000},
1501 {3.300,3.100,3.000,2.700,2.400,2.000,0.000,0.000,0.000,0.000},
1502 {5.600,5.500,5.200,4.800,4.300,3.900,2.900,0.000,0.000,0.000},
1503 {9.000,8.800,8.300,7.600,7.200,6.400,5.200,0.000,0.000,0.000},
1504 {13.50,13.00,12.50,11.70,11.10,11.00,8.300,0.000,0.000,0.000},
1505 {22.20,22.80,21.50,20.50,19.00,16.30,15.50,13.50,0.000,0.000},
1506 {44.00,43.50,42.50,41.50,39.20,37.50,33.50,0.000,0.000,0.000}};
1508 for(
unsigned int ibl=0;ibl<10;ibl++)
1510 for(
unsigned int ibk=0;ibk<9;ibk++)
1512 if( aEmin[ibk][ibl]!=0.0 && aEmax[ibk][ibl]!=0.0)
1516 cck.
Enom=aEnom[ibk];
1519 cck.
Emin=aEmin[ibk][ibl];
1520 cck.
Emax=aEmax[ibk][ibl];
Photon2(double Ein, double *pravac, double *pocetak)
Constructor.
void Prob(CalorimeterHit *ch, double cut, double *out)
double LinePointDistance2(double *X1, double *X2, double *X0)
container for keeping the parameters of the core fineder together
void LineCaloIntersectD2(double *X1, double *dir, double &d, double &zmax, double *X)
vector< Superhit2 * > hits
hit in the cluster
unsigned int MinHitSplit
minimal number of hits in i-th level cluster to be accepted for splitting of the core ...
void findInertia()
calculates eigenvalues and eigenvectors of inertia tensor
double D_cl_cl2(Tmpcl2 *cl1, Tmpcl2 *cl2)
double b
Eestimate = a+b*Ecore , b parameter of this funcition.
void cluster5(vector< Superhit2 * > *shv, vector< Tmpcl2 * > *clv)
NN clustering.
void PointOnLine22(const double *Xstart, const double *dir, const float *X0, double *Xline)
void ModuleNormal2(double *X1, double &zmax, double *X0)
unsigned int MinHit0
minimal number of hits needed for 0-th level cluster to be accepted as a core candidate ...
void ClusterInCluster2(Tmpcl2 *cl, vector< Tmpcl2 * > &clv)
float mipE
MIP value [GeV].
int top
Number of neighbours.
double direction[3]
principal axes of inertia tensor , calculated in calcInertia
vector< Tmpcl2 * > Tmpclvec2
void FindCores2(Shitvec2 *secal1, vector< Tmpclvec2 > &bbb, vector< PROTSEED2 > *prs2, unsigned int N, vector< float > miipstep, CoreCut2 Ccut)
Global EM core finding function , iput is vector of superhits, array of Tmpcl vectors bbb for interna...
float mip
Energy of hit i terms of MIP.
double Distcut
distance cut for core merging
CalorimeterHit * chit
Pointer to the LCIO calorimeter hit.
float point[3]
Transformed position of the hit.
void GridTransform2(CalorimeterHit *clh, float &radius, float &halfz, float &cellsize, float *X, bool tip, int stove, int module, CellIDDecoder< CalorimeterHit > &id)
Basic function for transformation of hit coordinates.
double * getCenter()
returnes double[3] for the center as calculated with calcCenter method
double center[3]
position of cluster center (x,y,z)
void TotalPrecalc2(vector< Superhit2 * > *calo, CellIDDecoder< CalorimeterHit > &id, unsigned int nelem, int Ncut)
Global precalculation function , iput is vector of superhits, ECAL decoder, number of hits...
Basic cluster class for reconstruction.
bool is_assigned
Is hit assigned to a cluster or not.
double inteigenvec[9]
eigenvectors of inertia tensor
int level
level of cluster
float pointt[3]
Real coordinate of the hit, copy of calorimeter hit data for direct access.
double Emax
upper validity range of energy estimation funciton in GeV
int S
stove as coded by Mokka
void PointOnLine3(const double *X1, const double *X2, const float *X0, double *Xline)
double Emin
lower validity range of energy estimation funciton in GeV
double getEnergy()
returnes energy of cluster in GeV.
double Coscut
angular cut for core merging (value of the cosine is stored not the angle!)
double Dot2(double *X1, double *X2)
container for storing the EM shower core candidates
double a
Eestimate = a+b*Ecore , a parameter of this funcition.
vector< Superhit2 * > Shitvec2
Superhit2(const Superhit2 &)=delete
int M
module as coded by Mokka
void calcCenter()
Calculates center of inerta for the objects in hits vector.
void LineCaloIntersect2(double *X1, double *X2, double &d, double &zmax, double *X)
void Precalc2(vector< Superhit2 * > &shvec, double r, double z, double cell, double dist, bool tip, int stove, int module, CellIDDecoder< CalorimeterHit > &id)
Precalculation function used internaly by TotalPrecalc.
double Rcut
fluctuation suppresion cut
double giveMeEEstimate2(int nivo, double Ecore, vector< CoreCalib2 > cc)
returns energy estimate for a given core , input int level, double core energy in GeV...
double X[3]
center of the candidate
int level
level of the cluster
vector< Tmpcl2 * > daughters
pointers to clusters that are contained in this cluster
double energy
energy in GeV (sum over hits in cluster)
Tmpcl2 * cl
pointer to the cluster
int K
layer as coded by Mokka
double inteigen[3]
normalized eigenvalues of inertia tensor
vector< Superhit2 * > neighbours
Vector of pointers to the neighbouring hits of Superhit2 type.
Basic hit class for reconstruction, contains the calorimeter hit plus additional parameters.
Tmpcl2 * cl
Pointer to the cluster to wich hit belong.
int tip
0 by constructor 1 for ecal 2 for hcal
void CreateCalibrationLDC00(vector< CoreCalib2 > *cc)
Example function for creation of the energy estimaiton table.
container for holding the numbers needed for energy estimation
bool active
flag to activate deactivate
void CreateAllShits2(LCCollection *colt, CellIDDecoder< CalorimeterHit > &id, vector< Superhit2 * > *calo)
Creation of superhits, input is ECAL collection ,it's decoded and pointer to resulting container for ...