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];
111 Float_t celldataAdc[kNmaxCell];
113 Double_t cutoff, ave;
114 Double_t edepcell[kNMX];
122 else if (ismn >= 12 && ismn <= 23)
128 for (i =0; i < kNMX; i++)
133 for (id = 0; id < ndimXr; id++)
135 for (jd = 0; jd < ndimYr; jd++)
138 i = id + (ndimYr/2-1) - (jd/2);
139 Int_t ij = i + j*kNDIMX;
142 edepcell[ij] = celladc[jd][id];
144 else if (ismn >= 12 && ismn <= 23)
146 edepcell[ij] = celladc[id][jd];
153 TMath::Sort((Int_t)kNMX,edepcell,iord1);// order the data
154 cutoff = fCutoff; // cutoff used to discard cells having ener. dep.
158 for(i = 0;i < kNMX; i++)
164 if(edepcell[i] > cutoff )
170 AliDebug(1,Form("Number of cells having energy >= %f are %d",cutoff,nmx1));
178 AliDebug(1,Form("Number of cells in a SuperM = %d and Average = %f",
181 incr = CrClust(ave, cutoff, nmx1,iord1, edepcell);
182 RefClust(incr,edepcell );
184 Int_t nentries1 = fPMDclucont->GetEntries();
185 AliDebug(1,Form("Detector Plane = %d Serial Module No = %d Number of clusters = %d",idet, ismn, nentries1));
186 AliDebug(1,Form("Total number of clusters/module = %d",nentries1));
187 for (Int_t ient1 = 0; ient1 < nentries1; ient1++)
189 AliPMDcludata *pmdcludata =
190 (AliPMDcludata*)fPMDclucont->UncheckedAt(ient1);
191 Float_t cluXC = pmdcludata->GetClusX();
192 Float_t cluYC = pmdcludata->GetClusY();
193 Float_t cluADC = pmdcludata->GetClusADC();
194 Float_t cluCELLS = pmdcludata->GetClusCells();
195 Float_t cluSIGX = pmdcludata->GetClusSigmaX();
196 Float_t cluSIGY = pmdcludata->GetClusSigmaY();
198 Float_t cluY0 = ktwobysqrt3*cluYC;
199 Float_t cluX0 = cluXC - cluY0/2.;
202 // Cluster X centroid is back transformed
206 clusdata[0] = cluX0 - (24-1) + cluY0/2.;
208 else if (ismn >= 12 && ismn <= 23)
210 clusdata[0] = cluX0 - (48-1) + cluY0/2.;
214 clusdata[2] = cluADC;
215 clusdata[3] = cluCELLS;
216 clusdata[4] = cluSIGX;
217 clusdata[5] = cluSIGY;
219 // Cells associated with a cluster
221 for (Int_t ihit = 0; ihit < kNmaxCell; ihit++)
223 Int_t dummyXY = pmdcludata->GetCellXY(ihit);
225 Int_t celldumY = dummyXY%10000;
226 Int_t celldumX = dummyXY/10000;
227 Float_t cellY = (Float_t) celldumY/10;
228 Float_t cellX = (Float_t) celldumX/10;
231 // Cell X centroid is back transformed
235 celldataX[ihit] = (Int_t) ((cellX - (24-1) + cellY/2.) + 0.5);
237 else if (ismn >= 12 && ismn <= 23)
239 celldataX[ihit] = (Int_t) ((cellX - (48-1) + cellY/2.) + 0.5 );
241 celldataY[ihit] = (Int_t) (cellY + 0.5);
242 celldataTr[ihit] = -1;
243 celldataPid[ihit] = -1;
244 celldataAdc[ihit] = -1;
247 pmdcl = new AliPMDcluster(idet, ismn, clusdata, celldataX, celldataY,
248 celldataTr, celldataPid, celldataAdc);
251 fPMDclucont->Delete();
253 // ------------------------------------------------------------------------ //
254 Int_t AliPMDClusteringV2::CrClust(Double_t ave, Double_t cutoff, Int_t nmx1,
255 Int_t iord1[], Double_t edepcell[])
257 // Does crude clustering
258 // Finds out only the big patch by just searching the
262 Int_t i,j,k,id1,id2,icl, numcell;
263 Int_t jd1,jd2, icell, cellcount;
264 Int_t clust[2][5000];
265 static Int_t neibx[6] = {1,0,-1,-1,0,1}, neiby[6] = {0,1,1,0,-1,-1};
267 // neibx and neiby define ( incremental ) (i,j) for the neighbours of a
268 // cell. There are six neighbours.
269 // cellcount --- total number of cells having nonzero ener dep
270 // numcell --- number of cells in a given supercluster
272 AliDebug(1,Form("kNMX = %d nmx1 = %d kNDIMX = %d kNDIMY = %d ave = %f cutoff = %f",kNMX,nmx1,kNDIMX,kNDIMY,ave,cutoff));
274 for (j=0; j < kNDIMX; j++)
276 for(k=0; k < kNDIMY; k++)
278 fInfocl[0][j][k] = 0;
279 fInfocl[1][j][k] = 0;
283 for(i=0; i < kNMX; i++)
291 if(edepcell[j] <= cutoff)
293 fInfocl[0][id1][id2] = -1;
296 // ---------------------------------------------------------------
297 // crude clustering begins. Start with cell having largest adc
298 // count and loop over the cells in descending order of adc count
299 // ---------------------------------------------------------------
302 for(icell=0; icell <= nmx1; icell++)
307 if(fInfocl[0][id1][id2] == 0 )
309 // ---------------------------------------------------------------
310 // icl -- cluster #, numcell -- # of cells in it, clust -- stores
311 // coordinates of the cells in a cluster, fInfocl[0][i1][i2] is 1 for
312 // primary and 2 for secondary cells,
313 // fInfocl[1][i1][i2] stores cluster #
314 // ---------------------------------------------------------------
318 fInfocl[0][id1][id2] = 1;
319 fInfocl[1][id1][id2] = icl;
320 fInfcl[0][cellcount] = icl;
321 fInfcl[1][cellcount] = id1;
322 fInfcl[2][cellcount] = id2;
324 clust[0][numcell] = id1;
325 clust[1][numcell] = id2;
326 for(i = 1; i < 5000; i++)
330 // ---------------------------------------------------------------
331 // check for adc count in neib. cells. If ne 0 put it in this clust
332 // ---------------------------------------------------------------
333 for(i = 0; i < 6; i++)
335 jd1 = id1 + neibx[i];
336 jd2 = id2 + neiby[i];
337 if( (jd1 >= 0 && jd1 < kNDIMX) && (jd2 >= 0 && jd2 < kNDIMY) &&
338 fInfocl[0][jd1][jd2] == 0)
341 fInfocl[0][jd1][jd2] = 2;
342 fInfocl[1][jd1][jd2] = icl;
343 clust[0][numcell] = jd1;
344 clust[1][numcell] = jd2;
346 fInfcl[0][cellcount] = icl;
347 fInfcl[1][cellcount] = jd1;
348 fInfcl[2][cellcount] = jd2;
351 // ---------------------------------------------------------------
352 // check adc count for neighbour's neighbours recursively and
353 // if nonzero, add these to the cluster.
354 // ---------------------------------------------------------------
355 for(i = 1;i < 5000; i++)
357 if(clust[0][i] != -1)
361 for(j = 0; j < 6 ; j++)
363 jd1 = id1 + neibx[j];
364 jd2 = id2 + neiby[j];
365 if( (jd1 >= 0 && jd1 < kNDIMX) &&
366 (jd2 >= 0 && jd2 < kNDIMY)
367 && fInfocl[0][jd1][jd2] == 0 )
369 fInfocl[0][jd1][jd2] = 2;
370 fInfocl[1][jd1][jd2] = icl;
372 clust[0][numcell] = jd1;
373 clust[1][numcell] = jd2;
375 fInfcl[0][cellcount] = icl;
376 fInfcl[1][cellcount] = jd1;
377 fInfcl[2][cellcount] = jd2;
386 // ------------------------------------------------------------------------ //
387 void AliPMDClusteringV2::RefClust(Int_t incr, Double_t edepcell[])
389 // Does the refining of clusters
390 // Takes the big patch and does gaussian fitting and
391 // finds out the more refined clusters
393 const Float_t ktwobysqrt3 = 1.1547;
394 const Int_t kNmaxCell = 19;
396 AliPMDcludata *pmdcludata = 0;
399 Int_t i, j, k, i1, i2, id, icl, itest, ihld;
400 Int_t ig, nsupcl, clno, clX,clY;
401 Int_t clxy[kNmaxCell];
404 Double_t x1, y1, z1, x2, y2, z2, rr;
406 Int_t kndim = incr + 1;
413 Double_t *x, *y, *z, *xc, *yc, *zc, *cells, *rcl, *rcs;
415 ncl = new Int_t [kndim];
416 iord = new Int_t [kndim];
417 x = new Double_t [kndim];
418 y = new Double_t [kndim];
419 z = new Double_t [kndim];
420 xc = new Double_t [kndim];
421 yc = new Double_t [kndim];
422 zc = new Double_t [kndim];
423 cells = new Double_t [kndim];
424 rcl = new Double_t [kndim];
425 rcs = new Double_t [kndim];
427 for(Int_t kk = 0; kk < 15; kk++)
429 if( kk < 6 )clusdata[kk] = 0.;
432 // nsupcl = # of superclusters; ncl[i]= # of cells in supercluster i
433 // x, y and z store (x,y) coordinates of and energy deposited in a cell
434 // xc, yc store (x,y) coordinates of the cluster center
435 // zc stores the energy deposited in a cluster, rc is cluster radius
440 for(i = 0; i < kndim; i++)
444 for(i = 0; i <= incr; i++)
446 if(fInfcl[0][i] != nsupcl)
452 AliWarning("RefClust: Too many superclusters!");
459 AliDebug(1,Form("Number of cells = %d Number of Superclusters = %d",
464 for(i = 0; i <= nsupcl; i++)
470 // one cell super-clusters --> single cluster
471 // cluster center at the centyer of the cell
472 // cluster radius = half cell dimension
475 AliWarning("RefClust: Too many clusters! more than 5000");
481 i12 = i1 + i2*kNDIMX;
482 clusdata[0] = fCoord[0][i1][i2];
483 clusdata[1] = fCoord[1][i1][i2];
484 clusdata[2] = edepcell[i12];
491 clY = (Int_t)((ktwobysqrt3*fCoord[1][i1][i2])*10);
492 clX = (Int_t)((fCoord[0][i1][i2] - clY/20.)*10);
493 clxy[0] = clX*10000 + clY ;
495 for(Int_t icltr = 1; icltr < kNmaxCell; icltr++)
499 pmdcludata = new AliPMDcludata(clusdata,clxy);
500 fPMDclucont->Add(pmdcludata);
506 // two cell super-cluster --> single cluster
507 // cluster center is at ener. dep.-weighted mean of two cells
508 // cluster radius == half cell dimension
513 AliWarning("RefClust: Too many clusters! more than 5000");
519 i12 = i1 + i2*kNDIMX;
521 x1 = fCoord[0][i1][i2];
522 y1 = fCoord[1][i1][i2];
528 i12 = i1 + i2*kNDIMX;
530 x2 = fCoord[0][i1][i2];
531 y2 = fCoord[1][i1][i2];
534 clusdata[0] = (x1*z1+x2*z2)/(z1+z2);
535 clusdata[1] = (y1*z1+y2*z2)/(z1+z2);
538 clusdata[4] = (TMath::Sqrt(z1*z2))/(z1+z2);
541 clY = (Int_t)((ktwobysqrt3*y1)*10);
542 clX = (Int_t)((x1 - clY/20.)*10);
543 clxy[0] = clX*10000 + clY ;
545 clY = (Int_t)((ktwobysqrt3*y2)*10);
546 clX = (Int_t)((x2 - clY/20.)*10);
547 clxy[1] = clX*10000 + clY ;
549 for(Int_t icltr = 2; icltr < kNmaxCell; icltr++)
553 pmdcludata = new AliPMDcludata(clusdata, clxy);
554 fPMDclucont->Add(pmdcludata);
559 // super-cluster of more than two cells - broken up into smaller
560 // clusters gaussian centers computed. (peaks separated by > 1 cell)
561 // Begin from cell having largest energy deposited This is first
563 // *****************************************************************
564 // NOTE --- POSSIBLE MODIFICATION: ONE MAY NOT BREAKING SUPERCLUSTERS
565 // IF NO. OF CELLS IS NOT TOO LARGE ( SAY 5 OR 6 )
566 // SINCE WE EXPECT THE SUPERCLUSTER
567 // TO BE A SINGLE CLUSTER
568 //*******************************************************************
572 i12 = i1 + i2*kNDIMX;
574 x[0] = fCoord[0][i1][i2];
575 y[0] = fCoord[1][i1][i2];
576 z[0] = edepcell[i12];
579 for(j = 1; j <= ncl[i]; j++)
585 i12 = i1 + i2*kNDIMX;
587 x[j] = fCoord[0][i1][i2];
588 y[j] = fCoord[1][i1][i2];
589 z[j] = edepcell[i12];
592 // arranging cells within supercluster in decreasing order
593 for(j = 1; j <= ncl[i];j++)
597 for(i1 = 0; i1 < j; i1++)
599 if(itest == 0 && z[iord[i1]] < z[ihld])
602 for(i2 = j-1;i2 >= i1;i2--)
604 iord[i2+1] = iord[i2];
612 // compute the number of clusters and their centers ( first
614 // centers must be separated by cells having smaller ener. dep.
615 // neighbouring centers should be either strong or well-separated
620 for(j = 1; j <= ncl[i]; j++)
625 for(k = 0; k <= ig; k++)
629 rr = Distance(x1,y1,x2,y2);
630 //************************************************************
631 // finetuning cluster splitting
632 // the numbers zc/4 and zc/10 may need to be changed.
633 // Also one may need to add one more layer because our
634 // cells are smaller in absolute scale
635 //************************************************************
638 if( rr >= 1.1 && rr < 1.8 && z[iord[j]] > zc[k]/4.) itest++;
639 if( rr >= 1.8 && rr < 2.1 && z[iord[j]] > zc[k]/10.) itest++;
640 if( rr >= 2.1)itest++;
651 ClustDetails(ncl[i], ig, x, y ,z, xc, yc, zc, rcl, rcs, cells,
655 for(j = 0; j <= ig; j++)
660 AliWarning("RefClust: Too many clusters! more than 5000");
666 clusdata[4] = rcl[j];
667 clusdata[5] = rcs[j];
670 clusdata[3] = ncl[i] + 1;
674 clusdata[3] = cells[j];
677 Int_t ncellcls = testncl[j];
678 if( ncellcls < kNmaxCell )
680 for(Int_t kk = 1; kk <= ncellcls; kk++)
682 Int_t ll = testindex[pp];
683 clY = (Int_t)((ktwobysqrt3*y[ll])*10);
684 clX = (Int_t)((x[ll] - clY/20.)*10);
685 clxy[kk-1] = clX*10000 + clY ;
689 for(Int_t icltr = ncellcls ; icltr < kNmaxCell; icltr++)
694 pmdcludata = new AliPMDcludata(clusdata, clxy);
695 fPMDclucont->Add(pmdcludata);
713 // ------------------------------------------------------------------------ //
714 void AliPMDClusteringV2::ClustDetails(Int_t ncell, Int_t nclust, Double_t x[],
715 Double_t y[], Double_t z[],Double_t xc[],
716 Double_t yc[], Double_t zc[],
717 Double_t rcl[], Double_t rcs[],
718 Double_t cells[], TArrayI &testncl,
724 Int_t kndim1 = ncell + 1;//ncell
726 Int_t kndim3 = nclust + 1;//nclust
728 Int_t i, j, k, i1, i2;
729 Double_t x1, y1, x2, y2, rr, b, c, r1, r2;
730 Double_t sumx, sumy, sumxy, sumxx, sum, sum1, sumyy;
732 Double_t *str, *str1, *xcl, *ycl, *cln;
735 Double_t **clustcell;
736 str = new Double_t [kndim3];
737 str1 = new Double_t [kndim3];
738 xcl = new Double_t [kndim3];
739 ycl = new Double_t [kndim3];
740 cln = new Double_t [kndim3];
742 clustcell = new Double_t *[kndim3];
743 cell = new Int_t *[kndim3];
744 cluster = new Int_t *[kndim1];
745 for(i = 0; i < kndim1; i++)
747 cluster[i] = new Int_t [kndim2];
750 for(i = 0; i < kndim3; i++)
758 cell[i] = new Int_t [kndim2];
759 clustcell[i] = new Double_t [kndim1];
760 for(j = 0; j < kndim1; j++)
764 for(j = 0; j < kndim2; j++)
773 // more than one cluster
774 // checking cells shared between several clusters.
775 // First check if the cell is within
776 // one cell unit ( nearest neighbour). Else,
777 // if it is within 1.74 cell units ( next nearest )
778 // Else if it is upto 2 cell units etc.
780 for (i = 0; i <= ncell; i++)
786 // distance <= 1 cell unit
788 for(j = 0; j <= nclust; j++)
792 rr = Distance(x1, y1, x2, y2);
800 // next nearest neighbour
801 if(cluster[i][0] == 0)
803 for(j=0; j<=nclust; j++)
807 rr = Distance(x1, y1, x2, y2);
808 if(rr <= TMath::Sqrt(3.))
816 // next-to-next nearest neighbour
817 if(cluster[i][0] == 0)
819 for(j=0; j<=nclust; j++)
823 rr = Distance(x1, y1, x2, y2);
833 if(cluster[i][0] == 0)
835 for(j = 0; j <= nclust; j++)
839 rr = Distance(x1, y1, x2, y2);
850 // computing cluster strength. Some cells are shared.
851 for(i = 0; i <= ncell; i++)
853 if(cluster[i][0] != 0)
856 for(j = 1; j <= i1; j++)
864 for(k = 0; k < 5; k++)
866 for(i = 0; i <= ncell; i++)
868 if(cluster[i][0] != 0)
872 for(j = 1; j <= i1; j++)
874 sum += str[cluster[i][j]];
877 for(j = 1; j <= i1; j++)
880 str1[i2] += z[i]*str[i2]/sum;
881 clustcell[i2][i] = z[i]*str[i2]/sum;
887 for(j = 0; j <= nclust; j++)
894 for(i = 0; i <= nclust; i++)
900 for(j = 0; j <= ncell; j++)
902 if(clustcell[i][j] != 0)
904 sumx += clustcell[i][j]*x[j];
905 sumy += clustcell[i][j]*y[j];
906 sum += clustcell[i][j];
907 sum1 += clustcell[i][j]/z[j];
910 //** xcl and ycl are cluster centroid positions ( center of gravity )
918 for(j = 0; j <= ncell; j++)
920 sumxx += clustcell[i][j]*(x[j]-xcl[i])*(x[j]-xcl[i])/sum;
921 sumyy += clustcell[i][j]*(y[j]-ycl[i])*(y[j]-ycl[i])/sum;
922 sumxy += clustcell[i][j]*(x[j]-xcl[i])*(y[j]-ycl[i])/sum;
925 c = sumxx*sumyy-sumxy*sumxy;
926 // ******************r1 and r2 are major and minor axes ( r1 > r2 ).
927 r1 = b/2.+TMath::Sqrt(b*b/4.-c);
928 r2 = b/2.-TMath::Sqrt(b*b/4.-c);
929 // final assignments to proper external variables
939 //To get the cell position in a cluster
941 for(Int_t ii=0; ii<= ncell; ii++)
943 Int_t jj = cluster[ii][0];
944 for(Int_t kk=1; kk<= jj; kk++)
946 Int_t ll = cluster[ii][kk];
948 cell[ll][cell[ll][0]] = ii;
952 testncl.Set(nclust+1);
955 for(Int_t ii=0; ii <= nclust; ii++)
957 testncl[ii] = cell[ii][0];
958 counter += testncl[ii];
960 testindex.Set(counter);
962 for(Int_t ii=0; ii<= nclust; ii++)
964 for(Int_t jj = 1; jj<= testncl[ii]; jj++)
966 Int_t kk = cell[ii][jj];
980 for(j = 0; j <= ncell; j++)
993 for(j = 0; j <= ncell; j++)
995 sumxx += clustcell[i][j]*(x[j]-xcl[i])*(x[j]-xcl[i])/sum;
996 sumyy += clustcell[i][j]*(y[j]-ycl[i])*(y[j]-ycl[i])/sum;
997 sumxy += clustcell[i][j]*(x[j]-xcl[i])*(y[j]-ycl[i])/sum;
1000 c = sumxx*sumyy-sumxy*sumxy;
1001 r1 = b/2.+ TMath::Sqrt(b*b/4.-c);
1002 r2 = b/2.- TMath::Sqrt(b*b/4.-c);
1004 // To get the cell position in a cluster
1005 testncl.Set(nclust+1);
1006 testindex.Set(ncell+1);
1007 cell[0][0] = ncell + 1;
1008 testncl[0] = cell[0][0];
1010 for(Int_t ii = 1; ii <= ncell; ii++)
1013 Int_t kk = cell[0][ii];
1017 // final assignments
1025 for(i = 0; i < kndim3; i++)
1027 delete [] clustcell[i];
1030 delete [] clustcell;
1032 for(i = 0; i <kndim1 ; i++)
1034 delete [] cluster[i];
1044 // ------------------------------------------------------------------------ //
1045 Double_t AliPMDClusteringV2::Distance(Double_t x1, Double_t y1,
1046 Double_t x2, Double_t y2)
1048 return TMath::Sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
1050 // ------------------------------------------------------------------------ //
1051 void AliPMDClusteringV2::SetEdepCut(Float_t decut)
1055 // ------------------------------------------------------------------------ //