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],
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);
243 Int_t irow = celldataX[ihit];
244 Int_t icol = celldataY[ihit];
246 if ((irow >= 0 && irow < 48) && (icol >= 0 && icol < 96))
248 celldataTr[ihit] = celltrack[irow][icol];
249 celldataPid[ihit] = cellpid[irow][icol];
250 celldataAdc[ihit] = (Float_t) celladc[irow][icol];
254 celldataTr[ihit] = -1;
255 celldataPid[ihit] = -1;
256 celldataAdc[ihit] = -1;
261 pmdcl = new AliPMDcluster(idet, ismn, clusdata, celldataX, celldataY,
262 celldataTr, celldataPid, celldataAdc);
265 fPMDclucont->Delete();
267 // ------------------------------------------------------------------------ //
268 Int_t AliPMDClusteringV2::CrClust(Double_t ave, Double_t cutoff, Int_t nmx1,
269 Int_t iord1[], Double_t edepcell[])
271 // Does crude clustering
272 // Finds out only the big patch by just searching the
276 Int_t i,j,k,id1,id2,icl, numcell;
277 Int_t jd1,jd2, icell, cellcount;
278 Int_t clust[2][5000];
279 static Int_t neibx[6] = {1,0,-1,-1,0,1}, neiby[6] = {0,1,1,0,-1,-1};
281 // neibx and neiby define ( incremental ) (i,j) for the neighbours of a
282 // cell. There are six neighbours.
283 // cellcount --- total number of cells having nonzero ener dep
284 // numcell --- number of cells in a given supercluster
286 AliDebug(1,Form("kNMX = %d nmx1 = %d kNDIMX = %d kNDIMY = %d ave = %f cutoff = %f",kNMX,nmx1,kNDIMX,kNDIMY,ave,cutoff));
288 for (j=0; j < kNDIMX; j++)
290 for(k=0; k < kNDIMY; k++)
292 fInfocl[0][j][k] = 0;
293 fInfocl[1][j][k] = 0;
297 for(i=0; i < kNMX; i++)
305 if(edepcell[j] <= cutoff)
307 fInfocl[0][id1][id2] = -1;
310 // ---------------------------------------------------------------
311 // crude clustering begins. Start with cell having largest adc
312 // count and loop over the cells in descending order of adc count
313 // ---------------------------------------------------------------
316 for(icell=0; icell <= nmx1; icell++)
321 if(fInfocl[0][id1][id2] == 0 )
323 // ---------------------------------------------------------------
324 // icl -- cluster #, numcell -- # of cells in it, clust -- stores
325 // coordinates of the cells in a cluster, fInfocl[0][i1][i2] is 1 for
326 // primary and 2 for secondary cells,
327 // fInfocl[1][i1][i2] stores cluster #
328 // ---------------------------------------------------------------
332 fInfocl[0][id1][id2] = 1;
333 fInfocl[1][id1][id2] = icl;
334 fInfcl[0][cellcount] = icl;
335 fInfcl[1][cellcount] = id1;
336 fInfcl[2][cellcount] = id2;
338 clust[0][numcell] = id1;
339 clust[1][numcell] = id2;
340 for(i = 1; i < 5000; i++)
344 // ---------------------------------------------------------------
345 // check for adc count in neib. cells. If ne 0 put it in this clust
346 // ---------------------------------------------------------------
347 for(i = 0; i < 6; i++)
349 jd1 = id1 + neibx[i];
350 jd2 = id2 + neiby[i];
351 if( (jd1 >= 0 && jd1 < kNDIMX) && (jd2 >= 0 && jd2 < kNDIMY) &&
352 fInfocl[0][jd1][jd2] == 0)
355 fInfocl[0][jd1][jd2] = 2;
356 fInfocl[1][jd1][jd2] = icl;
357 clust[0][numcell] = jd1;
358 clust[1][numcell] = jd2;
360 fInfcl[0][cellcount] = icl;
361 fInfcl[1][cellcount] = jd1;
362 fInfcl[2][cellcount] = jd2;
365 // ---------------------------------------------------------------
366 // check adc count for neighbour's neighbours recursively and
367 // if nonzero, add these to the cluster.
368 // ---------------------------------------------------------------
369 for(i = 1;i < 5000; i++)
371 if(clust[0][i] != -1)
375 for(j = 0; j < 6 ; j++)
377 jd1 = id1 + neibx[j];
378 jd2 = id2 + neiby[j];
379 if( (jd1 >= 0 && jd1 < kNDIMX) &&
380 (jd2 >= 0 && jd2 < kNDIMY)
381 && fInfocl[0][jd1][jd2] == 0 )
383 fInfocl[0][jd1][jd2] = 2;
384 fInfocl[1][jd1][jd2] = icl;
386 clust[0][numcell] = jd1;
387 clust[1][numcell] = jd2;
389 fInfcl[0][cellcount] = icl;
390 fInfcl[1][cellcount] = jd1;
391 fInfcl[2][cellcount] = jd2;
400 // ------------------------------------------------------------------------ //
401 void AliPMDClusteringV2::RefClust(Int_t incr, Double_t edepcell[])
403 // Does the refining of clusters
404 // Takes the big patch and does gaussian fitting and
405 // finds out the more refined clusters
407 const Float_t ktwobysqrt3 = 1.1547;
408 const Int_t kNmaxCell = 19;
410 AliPMDcludata *pmdcludata = 0;
413 Int_t i, j, k, i1, i2, id, icl, itest, ihld;
414 Int_t ig, nsupcl, clno, clX,clY;
415 Int_t clxy[kNmaxCell];
418 Double_t x1, y1, z1, x2, y2, z2, rr;
420 Int_t kndim = incr + 1;
427 Double_t *x, *y, *z, *xc, *yc, *zc, *cells, *rcl, *rcs;
429 ncl = new Int_t [kndim];
430 iord = new Int_t [kndim];
431 x = new Double_t [kndim];
432 y = new Double_t [kndim];
433 z = new Double_t [kndim];
434 xc = new Double_t [kndim];
435 yc = new Double_t [kndim];
436 zc = new Double_t [kndim];
437 cells = new Double_t [kndim];
438 rcl = new Double_t [kndim];
439 rcs = new Double_t [kndim];
441 for(Int_t kk = 0; kk < 15; kk++)
443 if( kk < 6 )clusdata[kk] = 0.;
446 // nsupcl = # of superclusters; ncl[i]= # of cells in supercluster i
447 // x, y and z store (x,y) coordinates of and energy deposited in a cell
448 // xc, yc store (x,y) coordinates of the cluster center
449 // zc stores the energy deposited in a cluster, rc is cluster radius
454 for(i = 0; i < kndim; i++)
458 for(i = 0; i <= incr; i++)
460 if(fInfcl[0][i] != nsupcl)
466 AliWarning("RefClust: Too many superclusters!");
473 AliDebug(1,Form("Number of cells = %d Number of Superclusters = %d",
478 for(i = 0; i <= nsupcl; i++)
484 // one cell super-clusters --> single cluster
485 // cluster center at the centyer of the cell
486 // cluster radius = half cell dimension
489 AliWarning("RefClust: Too many clusters! more than 5000");
495 i12 = i1 + i2*kNDIMX;
496 clusdata[0] = fCoord[0][i1][i2];
497 clusdata[1] = fCoord[1][i1][i2];
498 clusdata[2] = edepcell[i12];
505 clY = (Int_t)((ktwobysqrt3*fCoord[1][i1][i2])*10);
506 clX = (Int_t)((fCoord[0][i1][i2] - clY/20.)*10);
507 clxy[0] = clX*10000 + clY ;
509 for(Int_t icltr = 1; icltr < kNmaxCell; icltr++)
513 pmdcludata = new AliPMDcludata(clusdata,clxy);
514 fPMDclucont->Add(pmdcludata);
520 // two cell super-cluster --> single cluster
521 // cluster center is at ener. dep.-weighted mean of two cells
522 // cluster radius == half cell dimension
527 AliWarning("RefClust: Too many clusters! more than 5000");
533 i12 = i1 + i2*kNDIMX;
535 x1 = fCoord[0][i1][i2];
536 y1 = fCoord[1][i1][i2];
542 i12 = i1 + i2*kNDIMX;
544 x2 = fCoord[0][i1][i2];
545 y2 = fCoord[1][i1][i2];
548 clusdata[0] = (x1*z1+x2*z2)/(z1+z2);
549 clusdata[1] = (y1*z1+y2*z2)/(z1+z2);
552 clusdata[4] = (TMath::Sqrt(z1*z2))/(z1+z2);
555 clY = (Int_t)((ktwobysqrt3*y1)*10);
556 clX = (Int_t)((x1 - clY/20.)*10);
557 clxy[0] = clX*10000 + clY ;
559 clY = (Int_t)((ktwobysqrt3*y2)*10);
560 clX = (Int_t)((x2 - clY/20.)*10);
561 clxy[1] = clX*10000 + clY ;
563 for(Int_t icltr = 2; icltr < kNmaxCell; icltr++)
567 pmdcludata = new AliPMDcludata(clusdata, clxy);
568 fPMDclucont->Add(pmdcludata);
573 // super-cluster of more than two cells - broken up into smaller
574 // clusters gaussian centers computed. (peaks separated by > 1 cell)
575 // Begin from cell having largest energy deposited This is first
577 // *****************************************************************
578 // NOTE --- POSSIBLE MODIFICATION: ONE MAY NOT BREAKING SUPERCLUSTERS
579 // IF NO. OF CELLS IS NOT TOO LARGE ( SAY 5 OR 6 )
580 // SINCE WE EXPECT THE SUPERCLUSTER
581 // TO BE A SINGLE CLUSTER
582 //*******************************************************************
586 i12 = i1 + i2*kNDIMX;
588 x[0] = fCoord[0][i1][i2];
589 y[0] = fCoord[1][i1][i2];
590 z[0] = edepcell[i12];
593 for(j = 1; j <= ncl[i]; j++)
599 i12 = i1 + i2*kNDIMX;
601 x[j] = fCoord[0][i1][i2];
602 y[j] = fCoord[1][i1][i2];
603 z[j] = edepcell[i12];
606 // arranging cells within supercluster in decreasing order
607 for(j = 1; j <= ncl[i];j++)
611 for(i1 = 0; i1 < j; i1++)
613 if(itest == 0 && z[iord[i1]] < z[ihld])
616 for(i2 = j-1;i2 >= i1;i2--)
618 iord[i2+1] = iord[i2];
626 // compute the number of clusters and their centers ( first
628 // centers must be separated by cells having smaller ener. dep.
629 // neighbouring centers should be either strong or well-separated
634 for(j = 1; j <= ncl[i]; j++)
639 for(k = 0; k <= ig; k++)
643 rr = Distance(x1,y1,x2,y2);
644 //************************************************************
645 // finetuning cluster splitting
646 // the numbers zc/4 and zc/10 may need to be changed.
647 // Also one may need to add one more layer because our
648 // cells are smaller in absolute scale
649 //************************************************************
652 if( rr >= 1.1 && rr < 1.8 && z[iord[j]] > zc[k]/4.) itest++;
653 if( rr >= 1.8 && rr < 2.1 && z[iord[j]] > zc[k]/10.) itest++;
654 if( rr >= 2.1)itest++;
665 ClustDetails(ncl[i], ig, x, y ,z, xc, yc, zc, rcl, rcs, cells,
669 for(j = 0; j <= ig; j++)
674 AliWarning("RefClust: Too many clusters! more than 5000");
680 clusdata[4] = rcl[j];
681 clusdata[5] = rcs[j];
684 clusdata[3] = ncl[i] + 1;
688 clusdata[3] = cells[j];
691 Int_t ncellcls = testncl[j];
692 if( ncellcls < kNmaxCell )
694 for(Int_t kk = 1; kk <= ncellcls; kk++)
696 Int_t ll = testindex[pp];
697 clY = (Int_t)((ktwobysqrt3*y[ll])*10);
698 clX = (Int_t)((x[ll] - clY/20.)*10);
699 clxy[kk-1] = clX*10000 + clY ;
703 for(Int_t icltr = ncellcls ; icltr < kNmaxCell; icltr++)
708 pmdcludata = new AliPMDcludata(clusdata, clxy);
709 fPMDclucont->Add(pmdcludata);
727 // ------------------------------------------------------------------------ //
728 void AliPMDClusteringV2::ClustDetails(Int_t ncell, Int_t nclust, Double_t x[],
729 Double_t y[], Double_t z[],Double_t xc[],
730 Double_t yc[], Double_t zc[],
731 Double_t rcl[], Double_t rcs[],
732 Double_t cells[], TArrayI &testncl,
738 Int_t kndim1 = ncell + 1;//ncell
740 Int_t kndim3 = nclust + 1;//nclust
742 Int_t i, j, k, i1, i2;
743 Double_t x1, y1, x2, y2, rr, b, c, r1, r2;
744 Double_t sumx, sumy, sumxy, sumxx, sum, sum1, sumyy;
746 Double_t *str, *str1, *xcl, *ycl, *cln;
749 Double_t **clustcell;
750 str = new Double_t [kndim3];
751 str1 = new Double_t [kndim3];
752 xcl = new Double_t [kndim3];
753 ycl = new Double_t [kndim3];
754 cln = new Double_t [kndim3];
756 clustcell = new Double_t *[kndim3];
757 cell = new Int_t *[kndim3];
758 cluster = new Int_t *[kndim1];
759 for(i = 0; i < kndim1; i++)
761 cluster[i] = new Int_t [kndim2];
764 for(i = 0; i < kndim3; i++)
772 cell[i] = new Int_t [kndim2];
773 clustcell[i] = new Double_t [kndim1];
774 for(j = 0; j < kndim1; j++)
778 for(j = 0; j < kndim2; j++)
787 // more than one cluster
788 // checking cells shared between several clusters.
789 // First check if the cell is within
790 // one cell unit ( nearest neighbour). Else,
791 // if it is within 1.74 cell units ( next nearest )
792 // Else if it is upto 2 cell units etc.
794 for (i = 0; i <= ncell; i++)
800 // distance <= 1 cell unit
802 for(j = 0; j <= nclust; j++)
806 rr = Distance(x1, y1, x2, y2);
814 // next nearest neighbour
815 if(cluster[i][0] == 0)
817 for(j=0; j<=nclust; j++)
821 rr = Distance(x1, y1, x2, y2);
822 if(rr <= TMath::Sqrt(3.))
830 // next-to-next nearest neighbour
831 if(cluster[i][0] == 0)
833 for(j=0; j<=nclust; j++)
837 rr = Distance(x1, y1, x2, y2);
847 if(cluster[i][0] == 0)
849 for(j = 0; j <= nclust; j++)
853 rr = Distance(x1, y1, x2, y2);
864 // computing cluster strength. Some cells are shared.
865 for(i = 0; i <= ncell; i++)
867 if(cluster[i][0] != 0)
870 for(j = 1; j <= i1; j++)
878 for(k = 0; k < 5; k++)
880 for(i = 0; i <= ncell; i++)
882 if(cluster[i][0] != 0)
886 for(j = 1; j <= i1; j++)
888 sum += str[cluster[i][j]];
891 for(j = 1; j <= i1; j++)
894 str1[i2] += z[i]*str[i2]/sum;
895 clustcell[i2][i] = z[i]*str[i2]/sum;
901 for(j = 0; j <= nclust; j++)
908 for(i = 0; i <= nclust; i++)
914 for(j = 0; j <= ncell; j++)
916 if(clustcell[i][j] != 0)
918 sumx += clustcell[i][j]*x[j];
919 sumy += clustcell[i][j]*y[j];
920 sum += clustcell[i][j];
921 sum1 += clustcell[i][j]/z[j];
924 //** xcl and ycl are cluster centroid positions ( center of gravity )
932 for(j = 0; j <= ncell; j++)
934 sumxx += clustcell[i][j]*(x[j]-xcl[i])*(x[j]-xcl[i])/sum;
935 sumyy += clustcell[i][j]*(y[j]-ycl[i])*(y[j]-ycl[i])/sum;
936 sumxy += clustcell[i][j]*(x[j]-xcl[i])*(y[j]-ycl[i])/sum;
939 c = sumxx*sumyy-sumxy*sumxy;
940 // ******************r1 and r2 are major and minor axes ( r1 > r2 ).
941 r1 = b/2.+TMath::Sqrt(b*b/4.-c);
942 r2 = b/2.-TMath::Sqrt(b*b/4.-c);
943 // final assignments to proper external variables
953 //To get the cell position in a cluster
955 for(Int_t ii=0; ii<= ncell; ii++)
957 Int_t jj = cluster[ii][0];
958 for(Int_t kk=1; kk<= jj; kk++)
960 Int_t ll = cluster[ii][kk];
962 cell[ll][cell[ll][0]] = ii;
966 testncl.Set(nclust+1);
969 for(Int_t ii=0; ii <= nclust; ii++)
971 testncl[ii] = cell[ii][0];
972 counter += testncl[ii];
974 testindex.Set(counter);
976 for(Int_t ii=0; ii<= nclust; ii++)
978 for(Int_t jj = 1; jj<= testncl[ii]; jj++)
980 Int_t kk = cell[ii][jj];
994 for(j = 0; j <= ncell; j++)
1007 for(j = 0; j <= ncell; j++)
1009 sumxx += clustcell[i][j]*(x[j]-xcl[i])*(x[j]-xcl[i])/sum;
1010 sumyy += clustcell[i][j]*(y[j]-ycl[i])*(y[j]-ycl[i])/sum;
1011 sumxy += clustcell[i][j]*(x[j]-xcl[i])*(y[j]-ycl[i])/sum;
1014 c = sumxx*sumyy-sumxy*sumxy;
1015 r1 = b/2.+ TMath::Sqrt(b*b/4.-c);
1016 r2 = b/2.- TMath::Sqrt(b*b/4.-c);
1018 // To get the cell position in a cluster
1019 testncl.Set(nclust+1);
1020 testindex.Set(ncell+1);
1021 cell[0][0] = ncell + 1;
1022 testncl[0] = cell[0][0];
1024 for(Int_t ii = 1; ii <= ncell; ii++)
1027 Int_t kk = cell[0][ii];
1031 // final assignments
1039 for(i = 0; i < kndim3; i++)
1041 delete [] clustcell[i];
1044 delete [] clustcell;
1046 for(i = 0; i <kndim1 ; i++)
1048 delete [] cluster[i];
1058 // ------------------------------------------------------------------------ //
1059 Double_t AliPMDClusteringV2::Distance(Double_t x1, Double_t y1,
1060 Double_t x2, Double_t y2)
1062 return TMath::Sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
1064 // ------------------------------------------------------------------------ //
1065 void AliPMDClusteringV2::SetEdepCut(Float_t decut)
1069 // ------------------------------------------------------------------------ //