1 /***************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 //-----------------------------------------------------//
20 // Source File : PMDClusteringV2.cxx //
22 // clustering code for alice pmd //
24 //-----------------------------------------------------//
26 /* --------------------------------------------------------------------
27 Code developed by S. C. Phatak, Institute of Physics,
28 Bhubaneswar 751 005 ( phatak@iopb.res.in ) Given the energy deposited
29 ( or ADC value ) in each cell of supermodule ( pmd or cpv ), the code
30 builds up superclusters and breaks them into clusters. The input is
31 in TObjarray and cluster information is in TObjArray.
32 integer clno gives total number of clusters in the supermodule.
33 fClusters is the global ( public ) variables.
34 Others are local ( private ) to the code.
35 At the moment, the data is read for whole detector ( all supermodules
36 and pmd as well as cpv. This will have to be modify later )
37 LAST UPDATE : October 23, 2002
38 -----------------------------------------------------------------------*/
40 #include <Riostream.h>
42 #include <TObjArray.h>
45 #include "AliPMDcludata.h"
46 #include "AliPMDcluster.h"
47 #include "AliPMDClustering.h"
48 #include "AliPMDClusteringV2.h"
51 ClassImp(AliPMDClusteringV2)
53 const Double_t AliPMDClusteringV2::fgkSqroot3by2=0.8660254; // sqrt(3.)/2.
55 AliPMDClusteringV2::AliPMDClusteringV2():
56 fPMDclucont(new TObjArray()),
59 for(int i = 0; i < kNDIMX; i++)
61 for(int j = 0; j < kNDIMY; j++)
63 fCoord[0][i][j] = i+j/2.;
64 fCoord[1][i][j] = fgkSqroot3by2*j;
68 // ------------------------------------------------------------------------ //
71 AliPMDClusteringV2::AliPMDClusteringV2(const AliPMDClusteringV2& pmdclv2):
72 AliPMDClustering(pmdclv2),
77 AliError("Copy constructor not allowed ");
80 // ------------------------------------------------------------------------ //
81 AliPMDClusteringV2 &AliPMDClusteringV2::operator=(const AliPMDClusteringV2& /*pmdclv2*/)
84 AliError("Assignment operator not allowed ");
87 // ------------------------------------------------------------------------ //
88 AliPMDClusteringV2::~AliPMDClusteringV2()
92 // ------------------------------------------------------------------------ //
94 void AliPMDClusteringV2::DoClust(Int_t idet, Int_t ismn,
95 Int_t celltrack[48][96],
96 Int_t cellpid[48][96],
97 Double_t celladc[48][96],
98 TObjArray *pmdisocell, TObjArray *pmdcont)
100 // main function to call other necessary functions to do clustering
102 AliPMDcluster *pmdcl = 0;
104 const Float_t ktwobysqrt3 = 1.1547; // 2./sqrt(3.)
105 const Int_t kNmaxCell = 19; // # of cells surrounding a cluster center
106 Int_t i, j, nmx1, incr, id, jd;
109 Int_t celldataX[kNmaxCell], celldataY[kNmaxCell];
110 Int_t celldataTr[kNmaxCell], celldataPid[kNmaxCell];
112 Double_t cutoff, ave;
113 Double_t edepcell[kNMX];
121 else if (ismn >= 12 && ismn <= 23)
127 for (i =0; i < kNMX; i++)
132 for (id = 0; id < ndimXr; id++)
134 for (jd = 0; jd < ndimYr; jd++)
137 i = id + (ndimYr/2-1) - (jd/2);
138 Int_t ij = i + j*kNDIMX;
141 edepcell[ij] = celladc[jd][id];
143 else if (ismn >= 12 && ismn <= 23)
145 edepcell[ij] = celladc[id][jd];
152 TMath::Sort((Int_t)kNMX,edepcell,iord1);// order the data
153 cutoff = fCutoff; // cutoff used to discard cells having ener. dep.
157 for(i = 0;i < kNMX; i++)
163 if(edepcell[i] > cutoff )
169 AliDebug(1,Form("Number of cells having energy >= %f are %d",cutoff,nmx1));
177 AliDebug(1,Form("Number of cells in a SuperM = %d and Average = %f",
180 incr = CrClust(ave, cutoff, nmx1,iord1, edepcell);
181 RefClust(incr,edepcell );
183 Int_t nentries1 = fPMDclucont->GetEntries();
184 AliDebug(1,Form("Detector Plane = %d Serial Module No = %d Number of clusters = %d",idet, ismn, nentries1));
185 AliDebug(1,Form("Total number of clusters/module = %d",nentries1));
186 for (Int_t ient1 = 0; ient1 < nentries1; ient1++)
188 AliPMDcludata *pmdcludata =
189 (AliPMDcludata*)fPMDclucont->UncheckedAt(ient1);
190 Float_t cluXC = pmdcludata->GetClusX();
191 Float_t cluYC = pmdcludata->GetClusY();
192 Float_t cluADC = pmdcludata->GetClusADC();
193 Float_t cluCELLS = pmdcludata->GetClusCells();
194 Float_t cluSIGX = pmdcludata->GetClusSigmaX();
195 Float_t cluSIGY = pmdcludata->GetClusSigmaY();
197 Float_t cluY0 = ktwobysqrt3*cluYC;
198 Float_t cluX0 = cluXC - cluY0/2.;
201 // Cluster X centroid is back transformed
205 clusdata[0] = cluX0 - (24-1) + cluY0/2.;
207 else if (ismn >= 12 && ismn <= 23)
209 clusdata[0] = cluX0 - (48-1) + cluY0/2.;
213 clusdata[2] = cluADC;
214 clusdata[3] = cluCELLS;
215 clusdata[4] = cluSIGX;
216 clusdata[5] = cluSIGY;
218 // Cells associated with a cluster
220 for (Int_t ihit = 0; ihit < kNmaxCell; ihit++)
222 Int_t dummyXY = pmdcludata->GetCellXY(ihit);
224 Int_t celldumY = dummyXY%10000;
225 Int_t celldumX = dummyXY/10000;
226 Float_t cellY = (Float_t) celldumY/10;
227 Float_t cellX = (Float_t) celldumX/10;
230 // Cell X centroid is back transformed
234 celldataX[ihit] = (Int_t) ((cellX - (24-1) + cellY/2.) + 0.5);
236 else if (ismn >= 12 && ismn <= 23)
238 celldataX[ihit] = (Int_t) ((cellX - (48-1) + cellY/2.) + 0.5 );
240 celldataY[ihit] = (Int_t) (cellY + 0.5);
241 celldataTr[ihit] = -1;
242 celldataPid[ihit] = -1;
245 pmdcl = new AliPMDcluster(idet, ismn, clusdata, celldataX, celldataY,
246 celldataTr, celldataPid);
249 fPMDclucont->Delete();
251 // ------------------------------------------------------------------------ //
252 Int_t AliPMDClusteringV2::CrClust(Double_t ave, Double_t cutoff, Int_t nmx1,
253 Int_t iord1[], Double_t edepcell[])
255 // Does crude clustering
256 // Finds out only the big patch by just searching the
260 Int_t i,j,k,id1,id2,icl, numcell;
261 Int_t jd1,jd2, icell, cellcount;
262 Int_t clust[2][5000];
263 static Int_t neibx[6] = {1,0,-1,-1,0,1}, neiby[6] = {0,1,1,0,-1,-1};
265 // neibx and neiby define ( incremental ) (i,j) for the neighbours of a
266 // cell. There are six neighbours.
267 // cellcount --- total number of cells having nonzero ener dep
268 // numcell --- number of cells in a given supercluster
270 AliDebug(1,Form("kNMX = %d nmx1 = %d kNDIMX = %d kNDIMY = %d ave = %f cutoff = %f",kNMX,nmx1,kNDIMX,kNDIMY,ave,cutoff));
272 for (j=0; j < kNDIMX; j++)
274 for(k=0; k < kNDIMY; k++)
276 fInfocl[0][j][k] = 0;
277 fInfocl[1][j][k] = 0;
281 for(i=0; i < kNMX; i++)
289 if(edepcell[j] <= cutoff)
291 fInfocl[0][id1][id2] = -1;
294 // ---------------------------------------------------------------
295 // crude clustering begins. Start with cell having largest adc
296 // count and loop over the cells in descending order of adc count
297 // ---------------------------------------------------------------
300 for(icell=0; icell <= nmx1; icell++)
305 if(fInfocl[0][id1][id2] == 0 )
307 // ---------------------------------------------------------------
308 // icl -- cluster #, numcell -- # of cells in it, clust -- stores
309 // coordinates of the cells in a cluster, fInfocl[0][i1][i2] is 1 for
310 // primary and 2 for secondary cells,
311 // fInfocl[1][i1][i2] stores cluster #
312 // ---------------------------------------------------------------
316 fInfocl[0][id1][id2] = 1;
317 fInfocl[1][id1][id2] = icl;
318 fInfcl[0][cellcount] = icl;
319 fInfcl[1][cellcount] = id1;
320 fInfcl[2][cellcount] = id2;
322 clust[0][numcell] = id1;
323 clust[1][numcell] = id2;
324 for(i = 1; i < 5000; i++)
328 // ---------------------------------------------------------------
329 // check for adc count in neib. cells. If ne 0 put it in this clust
330 // ---------------------------------------------------------------
331 for(i = 0; i < 6; i++)
333 jd1 = id1 + neibx[i];
334 jd2 = id2 + neiby[i];
335 if( (jd1 >= 0 && jd1 < kNDIMX) && (jd2 >= 0 && jd2 < kNDIMY) &&
336 fInfocl[0][jd1][jd2] == 0)
339 fInfocl[0][jd1][jd2] = 2;
340 fInfocl[1][jd1][jd2] = icl;
341 clust[0][numcell] = jd1;
342 clust[1][numcell] = jd2;
344 fInfcl[0][cellcount] = icl;
345 fInfcl[1][cellcount] = jd1;
346 fInfcl[2][cellcount] = jd2;
349 // ---------------------------------------------------------------
350 // check adc count for neighbour's neighbours recursively and
351 // if nonzero, add these to the cluster.
352 // ---------------------------------------------------------------
353 for(i = 1;i < 5000; i++)
355 if(clust[0][i] != -1)
359 for(j = 0; j < 6 ; j++)
361 jd1 = id1 + neibx[j];
362 jd2 = id2 + neiby[j];
363 if( (jd1 >= 0 && jd1 < kNDIMX) &&
364 (jd2 >= 0 && jd2 < kNDIMY)
365 && fInfocl[0][jd1][jd2] == 0 )
367 fInfocl[0][jd1][jd2] = 2;
368 fInfocl[1][jd1][jd2] = icl;
370 clust[0][numcell] = jd1;
371 clust[1][numcell] = jd2;
373 fInfcl[0][cellcount] = icl;
374 fInfcl[1][cellcount] = jd1;
375 fInfcl[2][cellcount] = jd2;
384 // ------------------------------------------------------------------------ //
385 void AliPMDClusteringV2::RefClust(Int_t incr, Double_t edepcell[])
387 // Does the refining of clusters
388 // Takes the big patch and does gaussian fitting and
389 // finds out the more refined clusters
391 const Float_t ktwobysqrt3 = 1.1547;
392 const Int_t kNmaxCell = 19;
394 AliPMDcludata *pmdcludata = 0;
397 Int_t i, j, k, i1, i2, id, icl, itest, ihld;
398 Int_t ig, nsupcl, clno, clX,clY;
399 Int_t clxy[kNmaxCell];
402 Double_t x1, y1, z1, x2, y2, z2, rr;
404 Int_t kndim = incr + 1;
411 Double_t *x, *y, *z, *xc, *yc, *zc, *cells, *rcl, *rcs;
413 ncl = new Int_t [kndim];
414 iord = new Int_t [kndim];
415 x = new Double_t [kndim];
416 y = new Double_t [kndim];
417 z = new Double_t [kndim];
418 xc = new Double_t [kndim];
419 yc = new Double_t [kndim];
420 zc = new Double_t [kndim];
421 cells = new Double_t [kndim];
422 rcl = new Double_t [kndim];
423 rcs = new Double_t [kndim];
425 for(Int_t kk = 0; kk < 15; kk++)
427 if( kk < 6 )clusdata[kk] = 0.;
430 // nsupcl = # of superclusters; ncl[i]= # of cells in supercluster i
431 // x, y and z store (x,y) coordinates of and energy deposited in a cell
432 // xc, yc store (x,y) coordinates of the cluster center
433 // zc stores the energy deposited in a cluster, rc is cluster radius
438 for(i = 0; i < kndim; i++)
442 for(i = 0; i <= incr; i++)
444 if(fInfcl[0][i] != nsupcl)
450 AliWarning("RefClust: Too many superclusters!");
457 AliDebug(1,Form("Number of cells = %d Number of Superclusters = %d",
462 for(i = 0; i <= nsupcl; i++)
468 // one cell super-clusters --> single cluster
469 // cluster center at the centyer of the cell
470 // cluster radius = half cell dimension
473 AliWarning("RefClust: Too many clusters! more than 5000");
479 i12 = i1 + i2*kNDIMX;
480 clusdata[0] = fCoord[0][i1][i2];
481 clusdata[1] = fCoord[1][i1][i2];
482 clusdata[2] = edepcell[i12];
489 clY = (Int_t)((ktwobysqrt3*fCoord[1][i1][i2])*10);
490 clX = (Int_t)((fCoord[0][i1][i2] - clY/20.)*10);
491 clxy[0] = clX*10000 + clY ;
493 for(Int_t icltr = 1; icltr < kNmaxCell; icltr++)
497 pmdcludata = new AliPMDcludata(clusdata,clxy);
498 fPMDclucont->Add(pmdcludata);
504 // two cell super-cluster --> single cluster
505 // cluster center is at ener. dep.-weighted mean of two cells
506 // cluster radius == half cell dimension
511 AliWarning("RefClust: Too many clusters! more than 5000");
517 i12 = i1 + i2*kNDIMX;
519 x1 = fCoord[0][i1][i2];
520 y1 = fCoord[1][i1][i2];
526 i12 = i1 + i2*kNDIMX;
528 x2 = fCoord[0][i1][i2];
529 y2 = fCoord[1][i1][i2];
532 clusdata[0] = (x1*z1+x2*z2)/(z1+z2);
533 clusdata[1] = (y1*z1+y2*z2)/(z1+z2);
536 clusdata[4] = (TMath::Sqrt(z1*z2))/(z1+z2);
539 clY = (Int_t)((ktwobysqrt3*y1)*10);
540 clX = (Int_t)((x1 - clY/20.)*10);
541 clxy[0] = clX*10000 + clY ;
543 clY = (Int_t)((ktwobysqrt3*y2)*10);
544 clX = (Int_t)((x2 - clY/20.)*10);
545 clxy[1] = clX*10000 + clY ;
547 for(Int_t icltr = 2; icltr < kNmaxCell; icltr++)
551 pmdcludata = new AliPMDcludata(clusdata, clxy);
552 fPMDclucont->Add(pmdcludata);
557 // super-cluster of more than two cells - broken up into smaller
558 // clusters gaussian centers computed. (peaks separated by > 1 cell)
559 // Begin from cell having largest energy deposited This is first
561 // *****************************************************************
562 // NOTE --- POSSIBLE MODIFICATION: ONE MAY NOT BREAKING SUPERCLUSTERS
563 // IF NO. OF CELLS IS NOT TOO LARGE ( SAY 5 OR 6 )
564 // SINCE WE EXPECT THE SUPERCLUSTER
565 // TO BE A SINGLE CLUSTER
566 //*******************************************************************
570 i12 = i1 + i2*kNDIMX;
572 x[0] = fCoord[0][i1][i2];
573 y[0] = fCoord[1][i1][i2];
574 z[0] = edepcell[i12];
577 for(j = 1; j <= ncl[i]; j++)
583 i12 = i1 + i2*kNDIMX;
585 x[j] = fCoord[0][i1][i2];
586 y[j] = fCoord[1][i1][i2];
587 z[j] = edepcell[i12];
590 // arranging cells within supercluster in decreasing order
591 for(j = 1; j <= ncl[i];j++)
595 for(i1 = 0; i1 < j; i1++)
597 if(itest == 0 && z[iord[i1]] < z[ihld])
600 for(i2 = j-1;i2 >= i1;i2--)
602 iord[i2+1] = iord[i2];
610 // compute the number of clusters and their centers ( first
612 // centers must be separated by cells having smaller ener. dep.
613 // neighbouring centers should be either strong or well-separated
618 for(j = 1; j <= ncl[i]; j++)
623 for(k = 0; k <= ig; k++)
627 rr = Distance(x1,y1,x2,y2);
628 //************************************************************
629 // finetuning cluster splitting
630 // the numbers zc/4 and zc/10 may need to be changed.
631 // Also one may need to add one more layer because our
632 // cells are smaller in absolute scale
633 //************************************************************
636 if( rr >= 1.1 && rr < 1.8 && z[iord[j]] > zc[k]/4.) itest++;
637 if( rr >= 1.8 && rr < 2.1 && z[iord[j]] > zc[k]/10.) itest++;
638 if( rr >= 2.1)itest++;
649 ClustDetails(ncl[i], ig, x, y ,z, xc, yc, zc, rcl, rcs, cells,
653 for(j = 0; j <= ig; j++)
658 AliWarning("RefClust: Too many clusters! more than 5000");
664 clusdata[4] = rcl[j];
665 clusdata[5] = rcs[j];
668 clusdata[3] = ncl[i] + 1;
672 clusdata[3] = cells[j];
675 Int_t ncellcls = testncl[j];
676 if( ncellcls < kNmaxCell )
678 for(Int_t kk = 1; kk <= ncellcls; kk++)
680 Int_t ll = testindex[pp];
681 clY = (Int_t)((ktwobysqrt3*y[ll])*10);
682 clX = (Int_t)((x[ll] - clY/20.)*10);
683 clxy[kk-1] = clX*10000 + clY ;
687 for(Int_t icltr = ncellcls ; icltr < kNmaxCell; icltr++)
692 pmdcludata = new AliPMDcludata(clusdata, clxy);
693 fPMDclucont->Add(pmdcludata);
711 // ------------------------------------------------------------------------ //
712 void AliPMDClusteringV2::ClustDetails(Int_t ncell, Int_t nclust, Double_t x[],
713 Double_t y[], Double_t z[],Double_t xc[],
714 Double_t yc[], Double_t zc[],
715 Double_t rcl[], Double_t rcs[],
716 Double_t cells[], TArrayI &testncl,
722 Int_t kndim1 = ncell + 1;//ncell
724 Int_t kndim3 = nclust + 1;//nclust
726 Int_t i, j, k, i1, i2;
727 Double_t x1, y1, x2, y2, rr, b, c, r1, r2;
728 Double_t sumx, sumy, sumxy, sumxx, sum, sum1, sumyy;
730 Double_t *str, *str1, *xcl, *ycl, *cln;
733 Double_t **clustcell;
734 str = new Double_t [kndim3];
735 str1 = new Double_t [kndim3];
736 xcl = new Double_t [kndim3];
737 ycl = new Double_t [kndim3];
738 cln = new Double_t [kndim3];
740 clustcell = new Double_t *[kndim3];
741 cell = new Int_t *[kndim3];
742 cluster = new Int_t *[kndim1];
743 for(i = 0; i < kndim1; i++)
745 cluster[i] = new Int_t [kndim2];
748 for(i = 0; i < kndim3; i++)
756 cell[i] = new Int_t [kndim2];
757 clustcell[i] = new Double_t [kndim1];
758 for(j = 0; j < kndim1; j++)
762 for(j = 0; j < kndim2; j++)
771 // more than one cluster
772 // checking cells shared between several clusters.
773 // First check if the cell is within
774 // one cell unit ( nearest neighbour). Else,
775 // if it is within 1.74 cell units ( next nearest )
776 // Else if it is upto 2 cell units etc.
778 for (i = 0; i <= ncell; i++)
784 // distance <= 1 cell unit
786 for(j = 0; j <= nclust; j++)
790 rr = Distance(x1, y1, x2, y2);
798 // next nearest neighbour
799 if(cluster[i][0] == 0)
801 for(j=0; j<=nclust; j++)
805 rr = Distance(x1, y1, x2, y2);
806 if(rr <= TMath::Sqrt(3.))
814 // next-to-next nearest neighbour
815 if(cluster[i][0] == 0)
817 for(j=0; j<=nclust; j++)
821 rr = Distance(x1, y1, x2, y2);
831 if(cluster[i][0] == 0)
833 for(j = 0; j <= nclust; j++)
837 rr = Distance(x1, y1, x2, y2);
848 // computing cluster strength. Some cells are shared.
849 for(i = 0; i <= ncell; i++)
851 if(cluster[i][0] != 0)
854 for(j = 1; j <= i1; j++)
862 for(k = 0; k < 5; k++)
864 for(i = 0; i <= ncell; i++)
866 if(cluster[i][0] != 0)
870 for(j = 1; j <= i1; j++)
872 sum += str[cluster[i][j]];
875 for(j = 1; j <= i1; j++)
878 str1[i2] += z[i]*str[i2]/sum;
879 clustcell[i2][i] = z[i]*str[i2]/sum;
885 for(j = 0; j <= nclust; j++)
892 for(i = 0; i <= nclust; i++)
898 for(j = 0; j <= ncell; j++)
900 if(clustcell[i][j] != 0)
902 sumx += clustcell[i][j]*x[j];
903 sumy += clustcell[i][j]*y[j];
904 sum += clustcell[i][j];
905 sum1 += clustcell[i][j]/z[j];
908 //** xcl and ycl are cluster centroid positions ( center of gravity )
916 for(j = 0; j <= ncell; j++)
918 sumxx += clustcell[i][j]*(x[j]-xcl[i])*(x[j]-xcl[i])/sum;
919 sumyy += clustcell[i][j]*(y[j]-ycl[i])*(y[j]-ycl[i])/sum;
920 sumxy += clustcell[i][j]*(x[j]-xcl[i])*(y[j]-ycl[i])/sum;
923 c = sumxx*sumyy-sumxy*sumxy;
924 // ******************r1 and r2 are major and minor axes ( r1 > r2 ).
925 r1 = b/2.+TMath::Sqrt(b*b/4.-c);
926 r2 = b/2.-TMath::Sqrt(b*b/4.-c);
927 // final assignments to proper external variables
937 //To get the cell position in a cluster
939 for(Int_t ii=0; ii<= ncell; ii++)
941 Int_t jj = cluster[ii][0];
942 for(Int_t kk=1; kk<= jj; kk++)
944 Int_t ll = cluster[ii][kk];
946 cell[ll][cell[ll][0]] = ii;
950 testncl.Set(nclust+1);
953 for(Int_t ii=0; ii <= nclust; ii++)
955 testncl[ii] = cell[ii][0];
956 counter += testncl[ii];
958 testindex.Set(counter);
960 for(Int_t ii=0; ii<= nclust; ii++)
962 for(Int_t jj = 1; jj<= testncl[ii]; jj++)
964 Int_t kk = cell[ii][jj];
978 for(j = 0; j <= ncell; j++)
991 for(j = 0; j <= ncell; j++)
993 sumxx += clustcell[i][j]*(x[j]-xcl[i])*(x[j]-xcl[i])/sum;
994 sumyy += clustcell[i][j]*(y[j]-ycl[i])*(y[j]-ycl[i])/sum;
995 sumxy += clustcell[i][j]*(x[j]-xcl[i])*(y[j]-ycl[i])/sum;
998 c = sumxx*sumyy-sumxy*sumxy;
999 r1 = b/2.+ TMath::Sqrt(b*b/4.-c);
1000 r2 = b/2.- TMath::Sqrt(b*b/4.-c);
1002 // To get the cell position in a cluster
1003 testncl.Set(nclust+1);
1004 testindex.Set(ncell+1);
1005 cell[0][0] = ncell + 1;
1006 testncl[0] = cell[0][0];
1008 for(Int_t ii = 1; ii <= ncell; ii++)
1011 Int_t kk = cell[0][ii];
1015 // final assignments
1023 for(i = 0; i < kndim3; i++)
1025 delete [] clustcell[i];
1028 delete [] clustcell;
1030 for(i = 0; i <kndim1 ; i++)
1032 delete [] cluster[i];
1042 // ------------------------------------------------------------------------ //
1043 Double_t AliPMDClusteringV2::Distance(Double_t x1, Double_t y1,
1044 Double_t x2, Double_t y2)
1046 return TMath::Sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
1048 // ------------------------------------------------------------------------ //
1049 void AliPMDClusteringV2::SetEdepCut(Float_t decut)
1053 // ------------------------------------------------------------------------ //