+ for (i = 0; i < fgkTotUM; i++)
+ {
+ for (j = 0; j < fgkRow; j++)
+ {
+ cpvTrack[i][j] = new Int_t *[fgkCol];
+ cpvEdep[i][j] = new Float_t *[fgkCol];
+ }
+ }
+ for (i = 0; i < fgkTotUM; i++)
+ {
+ for (j = 0; j < fgkRow; j++)
+ {
+ for (k = 0; k < fgkCol; k++)
+ {
+ Int_t nn = fCPVCounter[i][j][k];
+ if(nn > 0)
+ {
+ cpvTrack[i][j][k] = new Int_t[nn];
+ cpvEdep[i][j][k] = new Float_t[nn];
+ }
+ else
+ {
+ nn = 1;
+ cpvTrack[i][j][k] = new Int_t[nn];
+ cpvEdep[i][j][k] = new Float_t[nn];
+ }
+ fCPVCounter[i][j][k] = 0;
+ }
+ }
+ }
+
+
+ Int_t nentries = fCPVCell.GetEntries();
+
+ Int_t mtrackno = 0, ism = 0, ixp = 0, iyp = 0;
+ Float_t edep = 0.;
+ for (i = 0; i < nentries; i++)
+ {
+ AliPMDcell* cpvcell = (AliPMDcell*)fCPVCell.UncheckedAt(i);
+
+ mtrackno = cpvcell->GetTrackNumber();
+ ism = cpvcell->GetSMNumber();
+ ixp = cpvcell->GetX();
+ iyp = cpvcell->GetY();
+ edep = cpvcell->GetEdep();
+ Int_t nn = fCPVCounter[ism][ixp][iyp];
+ cpvTrack[ism][ixp][iyp][nn] = (Int_t) mtrackno;
+ cpvEdep[ism][ixp][iyp][nn] = edep;
+ fCPVCounter[ism][ixp][iyp]++;
+ }
+
+ Int_t iz = 0, il = 0;
+ Int_t im = 0, ix = 0, iy = 0;
+ Int_t nn = 0;
+ for (im=0; im<fgkTotUM; im++)
+ {
+ for (ix=0; ix<fgkRow; ix++)
+ {
+ for (iy=0; iy<fgkCol; iy++)
+ {
+ nn = fCPVCounter[im][ix][iy];
+ if (nn > 1)
+ {
+ // This block handles if a cell is fired
+ // many times by many tracks
+ status1 = new Int_t[nn];
+ status2 = new Int_t[2*nn];
+ trnarray = new Int_t[nn];
+ for (iz = 0; iz < nn; iz++)
+ {
+ status1[iz] = cpvTrack[im][ix][iy][iz];
+ }
+ TMath::Sort(nn,status1,status2,jsort);
+ Int_t trackOld = -99999;
+ Int_t track, trCount = 0;
+ for (iz = 0; iz < nn; iz++)
+ {
+ track = status1[status2[iz]];
+ if (trackOld != track)
+ {
+ trnarray[trCount] = track;
+ trCount++;
+ }
+ trackOld = track;
+ }
+ delete [] status1;
+ delete [] status2;
+ Float_t totEdp = 0.;
+ trEdp = new Float_t[trCount];
+ fracEdp = new Float_t[trCount];
+ for (il = 0; il < trCount; il++)
+ {
+ trEdp[il] = 0.;
+ track = trnarray[il];
+ for (iz = 0; iz < nn; iz++)
+ {
+ if (track == cpvTrack[im][ix][iy][iz])
+ {
+ trEdp[il] += cpvEdep[im][ix][iy][iz];
+ }
+ }
+ totEdp += trEdp[il];
+ }
+ Int_t ilOld = 0;
+ Float_t fracOld = 0.;
+
+ for (il = 0; il < trCount; il++)
+ {
+ fracEdp[il] = trEdp[il]/totEdp;
+ if (fracOld < fracEdp[il])
+ {
+ fracOld = fracEdp[il];
+ ilOld = il;
+ }
+ }
+ fCPVTrackNo[im][ix][iy] = trnarray[ilOld];
+ delete [] fracEdp;
+ delete [] trEdp;
+ delete [] trnarray;
+ }
+ else if (nn == 1)
+ {
+ // This only handles if a cell is fired
+ // by only one track
+
+ fCPVTrackNo[im][ix][iy] = cpvTrack[im][ix][iy][0];
+
+ }
+ else if (nn ==0)
+ {
+ // This is if no cell is fired
+ fCPVTrackNo[im][ix][iy] = -999;
+ }
+ } // end of iy
+ } // end of ix
+ } // end of im
+
+ // Delete all the pointers
+
+ for (i = 0; i < fgkTotUM; i++)
+ {
+ for (j = 0; j < fgkRow; j++)
+ {
+ for (k = 0; k < fgkCol; k++)
+ {
+ delete []cpvTrack[i][j][k];
+ delete []cpvEdep[i][j][k];
+ }
+ }
+ }
+
+ for (i = 0; i < fgkTotUM; i++)
+ {
+ for (j = 0; j < fgkRow; j++)
+ {
+ delete [] cpvTrack[i][j];
+ delete [] cpvEdep[i][j];
+ }
+ }
+
+ for (i = 0; i < fgkTotUM; i++)
+ {
+ delete [] cpvTrack[i];
+ delete [] cpvEdep[i];
+ }
+ delete [] cpvTrack;
+ delete [] cpvEdep;
+
+ //
+ // End of the cell id assignment
+ //