ROOT logo
using namespace std;
#include "hmdccluster.h"
#include "TMath.h"
#include "hmdcclussim.h"
#include "hmdcgeanttrack.h"
#include "hmdclistcells.h"

//*-- AUTHOR : Pechenov Vladimir
//*-- Modified : 15/02/2007 by V. Pechenov

//_HADES_CLASS_DESCRIPTION 
////////////////////////////////////////////////////////////////
// HMdcCluster
//
// Temporary cluster information for cluster finder
//
////////////////////////////////////////////////////////////////

ClassImp(HMdcCluster)
ClassImp(HMdcClustersArrs)

void HMdcCluster::init(Char_t sec,Char_t seg,Float_t x,Float_t y,Float_t sx,Float_t sy) {
  sector      = sec;
  segment     = seg;
  status      = kTRUE;
  nMergedClus = 1;
  clusMerg    = 0;
  lCells1.clear();
  lCells2.clear();
  clearBinStat();
  x0       = x;
  y0       = y;
  xSt      = sx;
  ySt      = sy;
  errX     = 0.5*xSt;
  errY     = 0.5*ySt;
  sigma1   = 0.;
  sigma2   = 0.;
  alpha    = 0.;
  fakeFlag = 0;
  realFlag = 0;
}

void HMdcCluster::clearBinStat(void) {
  nBins    = 0;
  sumWt    = 0;   
  meanX    = 0;   
  meanY    = 0;   
  meanXX   = 0;  
  meanYY   = 0;  
  meanYX   = 0;  
  meanXWt  = 0; 
  meanYWt  = 0; 
  meanXXWt = 0;
  meanYYWt = 0;
  minWt    = 1000; 
   
  clusMod1  = 0;
  clusMod2  = 0;
  flag      = 0;
  numCells1 = -1;
  numCells2 = -1;
}

void HMdcCluster::setModCluster(Int_t im, HMdcCluster* cl) {
  if(im==0)      clusMod1 = cl;
  else if(im==1) clusMod2 = cl;
  cl->flag++;
}

void HMdcCluster::addClus(HMdcCluster& clst2) {
  // seg!=0 and seg!=1 - inner and outer segments
  if(segment != 1) {
    lCells1.add(&(clst2.lCells1));
    numCells1 = -1;
  }
  if(segment != 0) {
    lCells2.add(&(clst2.lCells2));
    numCells2 = -1;
  }
  clst2.status   = kFALSE;
  clst2.clusMerg = this;

  clst2.correctContent(iXFirst,iYFirst);
  sumWt         += clst2.sumWt;
  nBins         += clst2.nBins;
  meanX         += clst2.meanX;
  meanY         += clst2.meanY;
  meanXX        += clst2.meanXX;
  meanYY        += clst2.meanYY;
  meanYX        += clst2.meanYX;
  meanXWt       += clst2.meanXWt;
  meanYWt       += clst2.meanYWt;
  meanXXWt      += clst2.meanXXWt;
  meanYYWt      += clst2.meanYYWt;
  nMergedClus   += clst2.nMergedClus;
  if(minWt > clst2.minWt) minWt = clst2.minWt;

  calcXY();
}

void HMdcCluster::correctContent(Int_t iXf,Int_t iYf) {
  Int_t shX = iXf - iXFirst;
  Int_t shY = iYf - iYFirst;
  if(shX != 0) {
    Int_t vl1 = shX*nBins;
    Int_t vl2 = shX*sumWt;
    meanX    -= vl1;
    meanXX   -= shX*(2*meanX + vl1);
    meanXWt  -= vl2;
    meanXXWt -= shX*(2*meanXWt + vl2);
  }
  if(shY != 0) {
    Int_t vl1 = shY*nBins;
    Int_t vl2 = shY*sumWt;
    meanY    -= vl1;
    meanYY   -= shY*(2*meanY + vl1);
    meanYWt  -= vl2;
    meanYYWt -= shY*(2*meanYWt + vl2);
  }
  meanYX   -= meanX*shY + meanY*shX + shX*shY*nBins;
  iXFirst = iXf;
  iYFirst = iYf;
}

void HMdcCluster::calcXY(void) {
  if(nBins<2) {
    x = x0 + iXFirst*xSt;
    y = y0 + iYFirst*ySt;
  } else if(minWt > 1) {
    Int_t norm = minWt-1;
    Float_t rSumWt = 1/Float_t(sumWt-nBins*norm);
    
    x    = Float_t(meanXWt-meanX*norm)*rSumWt;
    errX = (meanXXWt-meanXX*norm)*rSumWt - x*x;
    x    = (x + iXFirst)*xSt + x0;
    
    y    = Float_t(meanYWt-meanY*norm)*rSumWt;
    errY = (meanYYWt-meanYY*norm)*rSumWt - y*y;
    y    = (y + iYFirst)*ySt + y0;
  } else {
    Float_t rSumWt = 1/Float_t(sumWt);
    
    x    = meanXWt*rSumWt;
    errX = meanXXWt*rSumWt - x*x;
    x    = (x + iXFirst)*xSt + x0;
    
    y    = meanYWt*rSumWt;
    errY = meanYYWt*rSumWt - y*y;
    y    = (y + iYFirst)*ySt + y0;
  }
}

void HMdcCluster::sumClus(HMdcCluster& clst1, HMdcCluster& clst2) {
  lCells1=clst1.lCells1;
  lCells1.add(&(clst2.lCells1));
  if(segment != 0) {
    lCells2=clst1.lCells2;
    lCells2.add(&(clst2.lCells2));
  }
  clst1.flag = 1;
  clst2.flag = 1;
//  clst2.status=kFALSE; ?
//  clst2.clusMerg=this; ?
  clst2.correctContent(clst1.iXFirst,clst1.iYFirst);
  sumWt        = clst1.sumWt+clst2.sumWt;
  nBins        = clst1.nBins+clst2.nBins;
  meanX        = clst1.meanX+clst2.meanX;
  meanY        = clst1.meanY+clst2.meanY;
  meanXX       = clst1.meanXX+clst2.meanXX;
  meanYY       = clst1.meanYY+clst2.meanYY;
  meanYX       = clst1.meanYX+clst2.meanYX;
  meanXWt      = clst1.meanXWt+clst2.meanXWt;
  meanYWt      = clst1.meanYWt+clst2.meanYWt;
  meanXXWt     = clst1.meanXXWt+clst2.meanXXWt;
  meanYYWt     = clst1.meanYYWt+clst2.meanYYWt;
  minWt        = clst1.minWt <= clst2.minWt ? clst1.minWt : clst2.minWt; //???
  nMergedClus += clst2.nMergedClus;  //?????????????? 
  
  calcXY();
}

void HMdcCluster::calcClusParam(void) {
  if(nBins<2) return;
  errX = TMath::Sqrt(errX + 0.25)*xSt;  // 0.25 = 0.5*0.5 (half of bin)
  errY = TMath::Sqrt(errY + 0.25)*ySt;
  // Cluster shape:-------------------------------------------------
  //  eXX,eYY,eXY=eYX - covariance matrix componets
  //
  //    | eXX-sigma   aXY       |           | E1 |
  // A= |                       |         B=|    |
  //    | eYX         eYY-sigma |           | E2 |
  //
  // A^2=0;  ==> sigma1 & sigma2  - (sigma1 > sigma2)
  //
  //    | 0 |        | E1 |
  // AB=|   |;   ==> |    | - direction of main axis
  //    | 0 |        | E2 |
  Float_t eXX     = (meanXX*nBins - meanX*meanX)*xSt*xSt;
  Float_t eYX     = (meanYX*nBins - meanY*meanX)*xSt*ySt;
  Float_t eYY     = (meanYY*nBins - meanY*meanY)*ySt*ySt;
  Float_t v1      = (eXX+eYY)*0.5;
  Float_t eYX2    = eYX*eYX;
  Float_t v2      = TMath::Sqrt(v1*v1 - eXX*eYY + eYX2);
  Float_t sigma1D = v1 + v2;
  Float_t sigma2D = v1 - v2;
  Float_t e1      = sigma1D - eXX;
  Float_t e2      = sigma1D - eYY;
  sigma1 = TMath::Sqrt(sigma1D)/nBins;
  sigma2 = (sigma2D<10e-5) ? 0. : TMath::Sqrt(sigma2D)/nBins;
  alpha  = TMath::ATan2(TMath::Sqrt(eYX2+e1*e1),TMath::Sqrt(eYX2+e2*e2))*TMath::RadToDeg();
  if(eYX<0.) alpha=180.-alpha;
}

void HMdcCluster::fillClus(HMdcClus* fClus, Int_t nLst, Bool_t fillTrList) {
  fClus->setSumWt(sumWt);
  fClus->setNBins(nBins);
  fClus->setXY(x,errX,y,errY);
  fClus->setNMergClust(nMergedClus);
  fClus->setRealLevel(minWt);
  fClus->setFakeFlag(fakeFlag);
  HMdcList12GroupCells& list=(nLst==0) ? lCells1:lCells2;
  HMdcTrackInfSim* clusSimInf = 0;
  if(fillTrList && fClus->isGeant()) clusSimInf = HMdcGeantEvent::getMdcTrackInfSim();
  if(clusSimInf) clusSimInf->fillClusTrackInf((HMdcClusSim*)fClus);
  if(clusMod1==0) {
    Int_t nDrTm=list.getNDrTimes(0,5);
    if(nDrTm>0 && fClus->getMinCl(0)>0) {
      fClus->setClFnLevelM1(fClus->getMinCl(0));
      fClus->setClusSizeM1(nBins);
      fClus->setNMergClustM1(nMergedClus);
      fClus->setShapeM1(sigma1,sigma2,alpha);
      if(clusSimInf) clusSimInf->fillClusModTrackInf((HMdcClusSim*)fClus, &list,0);
    } else fClus->clearMod1Par();
    fClus->setNDrTimesM1(nDrTm);
  } else {
    fClus->setClFnLevelM1((UChar_t)(clusMod1->minWt+0.1));
    fClus->setClusSizeM1(clusMod1->nBins);
    fClus->setNDrTimesM1(clusMod1->lCells1.getNDrTimes(0,5));
    fClus->setNMergClustM1(clusMod1->nMergedClus);
    fClus->setShapeM1(clusMod1->sigma1,clusMod1->sigma2,clusMod1->alpha);
    if(clusSimInf) clusSimInf->fillClusModTrackInf((HMdcClusSim*)fClus, &(clusMod1->lCells1),0);
  }
  if(clusMod2==0) {
    Int_t nDrTm=list.getNDrTimes(6,11);
    if(nDrTm>0 && fClus->getMinCl(1)>0) {
      fClus->setClFnLevelM2(fClus->getMinCl(1));
      fClus->setClusSizeM2(nBins);
      fClus->setNMergClustM2(nMergedClus);
      fClus->setShapeM2(sigma1,sigma2,alpha);
      if(clusSimInf) clusSimInf->fillClusModTrackInf((HMdcClusSim*)fClus,
                                                     &list,1);
    } else fClus->clearMod2Par();
    fClus->setNDrTimesM2(nDrTm);
  } else {
    fClus->setClFnLevelM2((UChar_t)(clusMod2->minWt+0.1));
    fClus->setClusSizeM2(clusMod2->nBins);
    fClus->setNDrTimesM2(clusMod2->lCells1.getNDrTimes(6,11));
    fClus->setNMergClustM2(clusMod2->nMergedClus);
    fClus->setShapeM2(clusMod2->sigma1,clusMod2->sigma2,clusMod2->alpha);
    if(clusSimInf) clusSimInf->fillClusModTrackInf((HMdcClusSim*)fClus, &(clusMod2->lCells1),1);
  }
}

void HMdcCluster::print(void) {
  // Debug print:
  printf("Sector %i Cluster: status=%s, flag=%i,nMergedClus=%i  x=%.1f y=%.1f\n",
         sector+1,status ? "kTRUE" : "kFALSE",flag,nMergedClus,x,y);
  HMdcEvntListCells *listCells = HMdcEvntListCells::getExObject();
  for(Int_t seg=0;seg<2;seg++) {
    HMdcList12GroupCells &lCells = seg==0 ? lCells1 : lCells2;
    if(lCells.getNCells()==0) continue;
    if(listCells == NULL) {
      printf(" - - - - - - - lCells%i:\n",seg+1);
      lCells.print();
    } else  for(Int_t lay=0; lay<12; lay++) {
      Int_t mod   = seg*2 + lay/6;
      Int_t layer = lay%6;
      printf("M.%i L.%i  %2i cells:",mod+1,layer+1,lCells.getNCells(lay));
      HMdcLayListCells &listCellsLay = (*listCells)[sector][mod][layer];
      Int_t cell=-1;
      while((cell=lCells.next(lay,cell)) >= 0) listCellsLay.printCellInfo(cell);
      printf("\n");
    }
  }
}

Int_t HMdcCluster::testForInclude(HMdcCluster& cl2) {
  // For HMdcLookUpTb !
  // Function test are wires from one cluster fully included in another cluster.
  // Index of "this" obj. in array must be < index cl2 !!!
  // ??? return kTRUE 0,1,2, or 3if "cl2" is included to "this" (STOP LOOP)
  // ??? return kFALSE cl2 is not included to "this" or "this" is included to "cl2"
  if(numCells1<0)         {
    numCells1 = lCells1.getNCells();
    nLayers1  = lCells1.getNLayers();
  }
  if(numCells2<0)         {
    numCells2 = lCells2.getNCells();
    nLayers2  = lCells2.getNLayers();
  }
  if(cl2.numCells1<0) {
    cl2.numCells1 = cl2.lCells1.getNCells();
    cl2.nLayers1  = cl2.lCells1.getNLayers();
  }
  if(cl2.numCells2<0) {
    cl2.numCells2 = cl2.lCells2.getNCells();
    cl2.nLayers2  = cl2.lCells2.getNLayers();
  }

  // dCells - Number of not identical cells (for smaller cluster)
  //                       nIdentDrTimes return num.cells!
  Int_t dCells;
  Int_t dNCells;
  Int_t dLayers;
  Int_t nIdCells;
  if       (segment == 0) {
    nIdCells = lCells1.nIdentDrTimes(&(cl2.lCells1));
    dCells   = numCells1 <= cl2.numCells1 ?    numCells1-nIdCells : 
                                           cl2.numCells1-nIdCells;
    // !!!!!!!!!! 6 ???        2 ??? It is not fine tuning!
    if(nIdCells < 6  || dCells+2 > nIdCells) return 0;
    dNCells  = numCells1 - cl2.numCells1;
    dLayers  = nLayers1  - cl2.nLayers1;
  } else if(segment == 1) {
    nIdCells = lCells2.nIdentDrTimes(&(cl2.lCells2));
    dCells  = numCells2 <= cl2.numCells2 ?    numCells2-nIdCells :
                                          cl2.numCells2-nIdCells;
    //!!!!!!!!!!!!!!  ????????? 6 !!!!!!   One need to tune next line:
    if(nIdCells < 6  || dCells+2 > nIdCells) return 0;
    dNCells = numCells2 - cl2.numCells2;
    dLayers = nLayers2  - cl2.nLayers2;
  } else {
    Int_t nCells1  =     numCells1 +     numCells2;
    Int_t nCells2  = cl2.numCells1 + cl2.numCells2;
    nIdCells = lCells1.nIdentDrTimes(&(cl2.lCells1)) +
               lCells2.nIdentDrTimes(&(cl2.lCells2));
    dCells   = nCells1 <= nCells2 ? nCells1-nIdCells : nCells2-nIdCells;
    //!!!!!!!!!!!!!!  ????????? 6 !!!!!!   One need to tune next line:
    if(nIdCells < 6  || dCells+2 > nIdCells) return 0;
    dNCells  = nCells1 - nCells2;
    dLayers  = (nLayers1+nLayers2)  - (cl2.nLayers1+cl2.nLayers2);
  }
  
  
  Int_t nDBins = nBins - cl2.nBins;
  Int_t dRLevel = (Int_t)(minWt+0.1) - (Int_t)(cl2.minWt+0.1);
  Int_t inclFlag = 0;                //  inclFlag==0 continue loop!

  // Don't change order without testing efficiency!:
  
  if(dCells==0) {  //== dCells==0 ============================:
    if     (nDBins>0 && dNCells>0)   inclFlag = 3; // delete cl2
    else if(nDBins<0 && dNCells<0)   inclFlag = 2; // replace "this"
    else if(dRLevel > 0)             inclFlag = 3; // delete cl2
    else if(dRLevel < 0)             inclFlag = 2; // replace "this"
    else if(nDBins  > 0)             inclFlag = 3; // delete cl2
    else if(nDBins  < 0)             inclFlag = 2; // replace "this"
    else if(dNCells > 0)             inclFlag = 3; // delete cl2
    else if(dNCells < 0)             inclFlag = 2; // replace "this"
    else                             inclFlag = 1; // add "this" to cl2  
  } else if(dCells==1) { //== dCells==1 ============================:
//???? 2 and 4 are parameters. ???
    if     (nDBins> 2 && dNCells> 4) inclFlag = 3; // delete cl2
    else if(nDBins<-2 && dNCells<-4) inclFlag = 2; // replace "this"
    else if(dRLevel > 0)             inclFlag = 3; // delete cl2
    else if(dRLevel < 0)             inclFlag = 2; // replace "this"
    else if(dLayers > 0)             inclFlag = 3; // delete cl2
    else if(dLayers < 0)             inclFlag = 2; // replace "this"
    else if(nDBins  > 0)             inclFlag = 3; // delete cl2
    else if(nDBins  < 0)             inclFlag = 2; // replace "this"
    else if(dNCells > 0)             inclFlag = 3; // delete cl2
    else if(dNCells < 0)             inclFlag = 2; // replace "this"
    else                             inclFlag = 1; // add "this" to cl2
  } else if(dCells==2) { //== dCells==2 ============================:
//???? 2 and 6 are parameters. ???
    if     (nDBins> 2 && dNCells> 6)  inclFlag = 3; // delete cl2
    else if(nDBins<-2 && dNCells<-6)  inclFlag = 2; // replace "this"
    else if(dRLevel > 0)              inclFlag = 3; // delete cl2
    else if(dRLevel < 0)              inclFlag = 2; // replace "this"
    else if(dLayers > 0)              inclFlag = 3; // delete cl2
    else if(dLayers < 0)              inclFlag = 2; // replace "this"
    else if(nDBins  > 0)              inclFlag = 3; // delete cl2
    else if(nDBins  < 0)              inclFlag = 2; // replace "this"
    else if(dNCells > 0)              inclFlag = 3; // delete cl2
    else if(dNCells < 0)              inclFlag = 2; // replace "this"
    else                              inclFlag = 1; // add "this" to cl2
  } else if(dCells==3) { //== dCells==3 ============================:
//???? 2 and 7 are parameters. ???
    if     (nDBins> 2 && dNCells> 7)  inclFlag = 3; // delete cl2
    else if(nDBins<-2 && dNCells<-7)  inclFlag = 2; // replace "this"
    else if(dRLevel > 0)              inclFlag = 3; // delete cl2
    else if(dRLevel < 0)              inclFlag = 2; // replace "this"
    else if(dLayers > 0)              inclFlag = 3; // delete cl2
    else if(dLayers < 0)              inclFlag = 2; // replace "this"
    else if(nDBins  > 0)              inclFlag = 3; // delete cl2
    else if(nDBins  < 0)              inclFlag = 2; // replace "this"
    else if(dNCells > 0)              inclFlag = 3; // delete cl2
    else if(dNCells < 0)              inclFlag = 2; // replace "this"
    else                              inclFlag = 1; // add "this" to cl2
  } else if(dCells==4) { //== dCells==4 ============================:
//???? 2 and 8 are parameters. ???
    if     (nDBins> 2 && dNCells> 8)  inclFlag = 3; // delete cl2
    else if(nDBins<-2 && dNCells<-8)  inclFlag = 2; // replace "this"
    else if(dRLevel > 0)              inclFlag = 3; // delete cl2
    else if(dRLevel < 0)              inclFlag = 2; // replace "this"
    else if(dLayers > 0)              inclFlag = 3; // delete cl2
    else if(dLayers < 0)              inclFlag = 2; // replace "this"
    else if(nDBins  > 0)              inclFlag = 3; // delete cl2
    else if(nDBins  < 0)              inclFlag = 2; // replace "this"
    else if(dNCells > 0)              inclFlag = 3; // delete cl2
    else if(dNCells < 0)              inclFlag = 2; // replace "this"
    else                              inclFlag = 1; // add "this" to cl2
  }

  if(inclFlag == 3) {                     // "cl2" cluster will not used.  Stop loop!
    cl2.clusMerg = this;
    cl2.setFakeFlagAndStatus(dCells+1);   // dCells+1 for tuning of fake suppr.cuts
  } else if(inclFlag == 2) {              // "this" cluster will not used. Continue loop!
    clusMerg = &cl2;
    setFakeFlagAndStatus(dCells+1);       // dCells+1 for tuning of fake suppr.cuts
  } else if(inclFlag == 1) {              // add "this" to "cl2" and repeat loop!
    cl2.addClus(*this);
    clusMerg = &cl2;
    setFakeFlagAndStatus(dCells+1);       // dCells+1 for tuning of fake suppr.cuts
  }
  return inclFlag;
}

Int_t HMdcCluster::testForInc34CFnd(HMdcCluster& cl2) {
  // For HMdc34ClFinder !
  // Function test are wires from one cluster fully included in another cluster.
  // Index of "this" obj. in array must be < index cl2 !!!
  // return kTRUE if "cl2" is included to "this" (STOP LOOP)
  // return kFALSE cl2 is not included to "this" or "this" is included to "cl2"

  if(segment != 1) return 0; //?????
  
  if(numCells2<0) {
    numCells2 = lCells2.getNCells();
    nLayers2  = lCells2.getNLayers();
  }
  if(cl2.numCells2<0) {
    cl2.numCells2 = cl2.lCells2.getNCells();
    cl2.nLayers2  = cl2.lCells2.getNLayers();
  }
    
  // dCells - Number of not identical cells (for smaller cluster)
  //                       nIdentDrTimes return num.cells!
  Int_t nIdCells = lCells2.nIdentDrTimes(&(cl2.lCells2));
  Int_t dCells  = numCells2 <= cl2.numCells2 ? numCells2-nIdCells : cl2.numCells2-nIdCells;
  //!!!!!!!!!!!!!!  ????????? 6 !!!!!!   One need to tune next line:
  if(nIdCells < 6  || dCells+2 > nIdCells) return 0;
  Int_t dNCells = numCells2 - cl2.numCells2;
  Int_t dLayers = nLayers2  - cl2.nLayers2;

  Int_t nDBins = nBins - cl2.nBins;
  Int_t dRLevel = (Int_t)(minWt+0.1) - (Int_t)(cl2.minWt+0.1);
  Int_t inclFlag = 0;

  // Don't change order without testing efficiency!:
  
  if(dCells==0) {  //== dCells==0 ============================:
    if     (nDBins>0 && dNCells>0)   inclFlag = 3; // delete cl2
    else if(nDBins<0 && dNCells<0)   inclFlag = 2; // replace "this"
    else if(dRLevel > 0)             inclFlag = 3; // delete cl2
    else if(dRLevel < 0)             inclFlag = 2; // replace "this"
    else if(nDBins  > 0)             inclFlag = 3; // delete cl2
    else if(nDBins  < 0)             inclFlag = 2; // replace "this"
    else if(dNCells > 0)             inclFlag = 3; // delete cl2
    else if(dNCells < 0)             inclFlag = 2; // replace "this"
    else                             inclFlag = 1; // add "this" to cl2
  } else if(dCells==1) { //== dCells==1 ============================:
//???? 2 and 4 are parameters. ???
    if     (nDBins> 2 && dNCells> 4) inclFlag = 3; // delete cl2
    else if(nDBins<-2 && dNCells<-4) inclFlag = 2; // replace "this"
    else if(dRLevel > 0)             inclFlag = 3; // delete cl2
    else if(dRLevel < 0)             inclFlag = 2; // replace "this"
    else if(dLayers > 0)             inclFlag = 3; // delete cl2
    else if(dLayers < 0)             inclFlag = 2; // replace "this"
    else if(nDBins  > 0)             inclFlag = 3; // delete cl2
    else if(nDBins  < 0)             inclFlag = 2; // replace "this"
    else if(dNCells > 0)             inclFlag = 3; // delete cl2
    else if(dNCells < 0)             inclFlag = 2; // replace "this"
    else                             inclFlag = 1; // add "this" to cl2
  } else if(dCells==2) { //== dCells==2 ============================:
//???? 2 and 6 are parameters. ???
    if     (nDBins> 2 && dNCells> 6)  inclFlag = 3; // delete cl2
    else if(nDBins<-2 && dNCells<-6)  inclFlag = 2; // replace "this"
    else if(dRLevel > 0)              inclFlag = 3; // delete cl2
    else if(dRLevel < 0)              inclFlag = 2; // replace "this"
    else if(dLayers > 0)              inclFlag = 3; // delete cl2
    else if(dLayers < 0)              inclFlag = 2; // replace "this"
    else if(nDBins  > 0)              inclFlag = 3; // delete cl2
    else if(nDBins  < 0)              inclFlag = 2; // replace "this"
    else if(dNCells > 0)              inclFlag = 3; // delete cl2
    else if(dNCells < 0)              inclFlag = 2; // replace "this"
    // -no for sim.data    else                           inclFlag = 1; // add "this" to cl2  ---------------?
  } else if(dCells==3) { //== dCells==3 ============================:
//???? 2 and 6 are parameters. ???
    if     (nDBins> 2 && dNCells> 7)  inclFlag = 3; // delete cl2
    else if(nDBins<-2 && dNCells<-7)  inclFlag = 2; // replace "this"
    else if(dRLevel > 0)              inclFlag = 3; // delete cl2
    else if(dRLevel < 0)              inclFlag = 2; // replace "this"
    else if(dLayers > 0)              inclFlag = 3; // delete cl2
    else if(dLayers < 0)              inclFlag = 2; // replace "this"
    else if(nDBins  > 0)              inclFlag = 3; // delete cl2
    else if(nDBins  < 0)              inclFlag = 2; // replace "this"
    else if(dNCells > 0)              inclFlag = 3; // delete cl2
    else if(dNCells < 0)              inclFlag = 2; // replace "this"
    // -no for sim.data    else                           inclFlag = 1; // add "this" to cl2  ---------------?
  } else if(dCells==4) { //== dCells==4 ============================:
//???? 2 and 6 are parameters. ???
    if     (nDBins> 2 && dNCells> 8)  inclFlag = 3; // delete cl2
    else if(nDBins<-2 && dNCells<-8)  inclFlag = 2; // replace "this"
    else if(dRLevel > 0)              inclFlag = 3; // delete cl2
    else if(dRLevel < 0)              inclFlag = 2; // replace "this"
    else if(dLayers > 0)              inclFlag = 3; // delete cl2
    else if(dLayers < 0)              inclFlag = 2; // replace "this"
    else if(nDBins  > 0)              inclFlag = 3; // delete cl2
    else if(nDBins  < 0)              inclFlag = 2; // replace "this"
    else if(dNCells > 0)              inclFlag = 3; // delete cl2
    else if(dNCells < 0)              inclFlag = 2; // replace "this"
    // -no for sim.data    else                           inclFlag = 1; // add "this" to cl2
  }
  
  if(inclFlag == 3) {                     // "cl2" cluster will not used.  Stop loop!
    cl2.clusMerg = this;
    cl2.setFakeFlagAndStatus(dCells+1);   // dCells+1 for tuning of fake suppr.cuts
  } else if(inclFlag == 2) {              // "this" cluster will not used. Continue loop!
    clusMerg = &cl2;
    setFakeFlagAndStatus(dCells+1);       // dCells+1 for tuning of fake suppr.cuts
  } else if(inclFlag == 1) {              // add "this" to "cl2" and repeat loop!
    cl2.addClus(*this);
    clusMerg = &cl2;
    setFakeFlagAndStatus(dCells+1);       // dCells+1 for tuning of fake suppr.cuts
  }
  return inclFlag;
}

void HMdcCluster::setMod1ClusSkipMerg(HMdcCluster* clusM1) {
  clusMod1 = clusM1;
  // Skip merged clusters:
  while(clusMod1->clusMerg != 0) clusMod1 = clusMod1->clusMerg;
  clusMod1->flag++;
}

void HMdcCluster::setMod2ClusSkipMerg(HMdcCluster* clusM2) {
  clusMod2 = clusM2;
  // Skip merged clusters:
  while(clusMod2->clusMerg != 0) clusMod2 = clusMod2->clusMerg;
  clusMod2->flag++;
}

Bool_t HMdcCluster::isModClusNotTheSame(HMdcCluster& cls2) {
  if(clusMod1!=0 && cls2.clusMod1!=0 && clusMod1!=cls2.clusMod1) return kTRUE;
  if(clusMod2!=0 && cls2.clusMod2!=0 && clusMod2!=cls2.clusMod2) return kTRUE;
  return kFALSE;
}

Bool_t HMdcCluster::testNLayersSeg1(void) {
  return minWt <= lCells1.getNLayers() + 1;
}

Bool_t HMdcCluster::testNLayersSeg2(void) {
  return minWt <= lCells2.getNLayers() + 1;
}

Int_t HMdcCluster::getNUniqueWiresSeg1(HMdcSecListCells* pListCells) {
  if(fakeFlag==0) return pListCells->getNUniqueWires(0,lCells1);
  else            return pListCells->getNUniqueWires2(0,lCells1);
}

Int_t HMdcCluster::getNUniqueAndRWiresSeg1(HMdcSecListCells* pListCells,Int_t& nRWires) {
  if(fakeFlag==0) return pListCells->getNUniqueAndRWires(0,lCells1,nRWires);
  else            return pListCells->getNUniqueAndRWires2(0,lCells1,nRWires);
}

void HMdcCluster::resetFakeFlagSeg1(Bool_t fake,HMdcSecListCells* pListCells) {
  if(fake && fakeFlag == 0) {
    fakeFlag = 11;
    pListCells->subFrClusCounters(0,lCells1);
    if(realFlag > 0) {
      realFlag = 0;
      pListCells->subFrRClusCounters(0,lCells1);
    }
  } else if(!fake && fakeFlag > 0) {
    fakeFlag = 0;
    pListCells->addToClusCounters(0,lCells1);
  }
}

void HMdcCluster::resetRealFlagSeg1(Bool_t real,HMdcSecListCells* pListCells) {
  if(real && realFlag == 0) {
    if(fakeFlag > 0) {
      fakeFlag = 0;
      pListCells->addToClusCounters(0,lCells1);
    }
    realFlag = 1;
    pListCells->addToRClusCounters(0,lCells1);
  }
  else if(!real && realFlag > 0) {
    realFlag = 0;
    pListCells->subFrRClusCounters(0,lCells1);
  }
}

//===HMdcClustersArrs===========================================================

HMdcClustersArrs* HMdcClustersArrs::pMdcClustersArrs = 0;

HMdcClustersArrs* HMdcClustersArrs::getObject(void) {
  if(!pMdcClustersArrs) pMdcClustersArrs = new HMdcClustersArrs();
  return pMdcClustersArrs;
}

void HMdcClustersArrs::deleteCont(void) {
  if(pMdcClustersArrs != 0) delete pMdcClustersArrs;
}

HMdcClustersArrs::HMdcClustersArrs(void) {
  for(Int_t i=0;i<3;i++) {
    clusArr[i] = 0;
    arrSize[i] = 0;
  }
  dXWind1 =  40.; // ??? 40. ???
  dYWind1 =  10.;
  dXWind2 = 120.; // ??? 40. ???
  dYWind2 =  40.;
}

HMdcClustersArrs::~HMdcClustersArrs(void) {
  if(this == pMdcClustersArrs) pMdcClustersArrs = 0;
  for(Int_t i=0;i<3;i++) if(clusArr[i]) {
    delete [] clusArr[i];
    clusArr[i] = 0;
  }
}

Int_t HMdcClustersArrs::createAllArrays(Int_t size) {
  if(createArray(0,size) == 0) return 0;
  size = arrSize[0];
  if(createArray(1,size) == 0) return 0;
  size = arrSize[1];
  if(createArray(2,size) == 0) return 0;
  return size;
}

HMdcCluster* HMdcClustersArrs::createArray(Int_t ind,Int_t size) {
  // return pointer to the array of HMdcCluster objects
  // if array is not created it will be created
  if(clusArr[ind] != 0) size = arrSize[ind];
  else if(size>0) {
    clusArr[ind] = new HMdcCluster [size];
    arrSize[ind] = size;
  }
  return clusArr[ind];
}

HMdcCluster* HMdcClustersArrs::getCluster(Int_t indarr,Int_t  indClus) {
  if(clusArr[indarr]==0 || indClus>=arrSize[indarr] || indClus<0) return 0;
  return &(clusArr[indarr][indClus]);
}

void HMdcClustersArrs::testCluster(Int_t indArr,Int_t indClus) {
  HMdcCluster* clArr = clusArr[indArr];
  for(Int_t iCl=0;iCl<indClus;iCl++) if(clArr[iCl].getStatus()) {
    // Optimization:
    if(TMath::Abs(clArr[iCl].getY()-clArr[indClus].getY()) > dYWind1) continue;
    if(TMath::Abs(clArr[iCl].getX()-clArr[indClus].getX()) > dXWind1) continue;
    Int_t inclFlag = clArr[iCl].testForInclude(clArr[indClus]);
    if( inclFlag == 0 || inclFlag == 2 ) continue;
    if( inclFlag == 1 ) testCluster(indArr,indClus);
    return;
  }
}

Bool_t HMdcClustersArrs::testMdc34Cluster(Int_t indArr,Int_t indClus,Int_t firstClst) {
  // return kTRUE if cluster "indClus" is removed
  HMdcCluster* clArr = clusArr[indArr];
  for(Int_t iCl=firstClst;iCl<indClus;iCl++) if(clArr[iCl].getStatus()) {
    // Optimization:
    if(TMath::Abs(clArr[iCl].getY()-clArr[indClus].getY()) > dYWind2) continue;
    if(TMath::Abs(clArr[iCl].getX()-clArr[indClus].getX()) > dXWind2) continue;
    Int_t inclFlag = clArr[iCl].testForInc34CFnd(clArr[indClus]);
    if( inclFlag == 0 || inclFlag == 2 ) continue;
    if( inclFlag == 1 ) return testMdc34Cluster(indArr,indClus,firstClst);
    return kTRUE;    // inclFlag == 3 - remove cluster "indcClus"
  }
  return kFALSE;
}
 hmdccluster.cc:1
 hmdccluster.cc:2
 hmdccluster.cc:3
 hmdccluster.cc:4
 hmdccluster.cc:5
 hmdccluster.cc:6
 hmdccluster.cc:7
 hmdccluster.cc:8
 hmdccluster.cc:9
 hmdccluster.cc:10
 hmdccluster.cc:11
 hmdccluster.cc:12
 hmdccluster.cc:13
 hmdccluster.cc:14
 hmdccluster.cc:15
 hmdccluster.cc:16
 hmdccluster.cc:17
 hmdccluster.cc:18
 hmdccluster.cc:19
 hmdccluster.cc:20
 hmdccluster.cc:21
 hmdccluster.cc:22
 hmdccluster.cc:23
 hmdccluster.cc:24
 hmdccluster.cc:25
 hmdccluster.cc:26
 hmdccluster.cc:27
 hmdccluster.cc:28
 hmdccluster.cc:29
 hmdccluster.cc:30
 hmdccluster.cc:31
 hmdccluster.cc:32
 hmdccluster.cc:33
 hmdccluster.cc:34
 hmdccluster.cc:35
 hmdccluster.cc:36
 hmdccluster.cc:37
 hmdccluster.cc:38
 hmdccluster.cc:39
 hmdccluster.cc:40
 hmdccluster.cc:41
 hmdccluster.cc:42
 hmdccluster.cc:43
 hmdccluster.cc:44
 hmdccluster.cc:45
 hmdccluster.cc:46
 hmdccluster.cc:47
 hmdccluster.cc:48
 hmdccluster.cc:49
 hmdccluster.cc:50
 hmdccluster.cc:51
 hmdccluster.cc:52
 hmdccluster.cc:53
 hmdccluster.cc:54
 hmdccluster.cc:55
 hmdccluster.cc:56
 hmdccluster.cc:57
 hmdccluster.cc:58
 hmdccluster.cc:59
 hmdccluster.cc:60
 hmdccluster.cc:61
 hmdccluster.cc:62
 hmdccluster.cc:63
 hmdccluster.cc:64
 hmdccluster.cc:65
 hmdccluster.cc:66
 hmdccluster.cc:67
 hmdccluster.cc:68
 hmdccluster.cc:69
 hmdccluster.cc:70
 hmdccluster.cc:71
 hmdccluster.cc:72
 hmdccluster.cc:73
 hmdccluster.cc:74
 hmdccluster.cc:75
 hmdccluster.cc:76
 hmdccluster.cc:77
 hmdccluster.cc:78
 hmdccluster.cc:79
 hmdccluster.cc:80
 hmdccluster.cc:81
 hmdccluster.cc:82
 hmdccluster.cc:83
 hmdccluster.cc:84
 hmdccluster.cc:85
 hmdccluster.cc:86
 hmdccluster.cc:87
 hmdccluster.cc:88
 hmdccluster.cc:89
 hmdccluster.cc:90
 hmdccluster.cc:91
 hmdccluster.cc:92
 hmdccluster.cc:93
 hmdccluster.cc:94
 hmdccluster.cc:95
 hmdccluster.cc:96
 hmdccluster.cc:97
 hmdccluster.cc:98
 hmdccluster.cc:99
 hmdccluster.cc:100
 hmdccluster.cc:101
 hmdccluster.cc:102
 hmdccluster.cc:103
 hmdccluster.cc:104
 hmdccluster.cc:105
 hmdccluster.cc:106
 hmdccluster.cc:107
 hmdccluster.cc:108
 hmdccluster.cc:109
 hmdccluster.cc:110
 hmdccluster.cc:111
 hmdccluster.cc:112
 hmdccluster.cc:113
 hmdccluster.cc:114
 hmdccluster.cc:115
 hmdccluster.cc:116
 hmdccluster.cc:117
 hmdccluster.cc:118
 hmdccluster.cc:119
 hmdccluster.cc:120
 hmdccluster.cc:121
 hmdccluster.cc:122
 hmdccluster.cc:123
 hmdccluster.cc:124
 hmdccluster.cc:125
 hmdccluster.cc:126
 hmdccluster.cc:127
 hmdccluster.cc:128
 hmdccluster.cc:129
 hmdccluster.cc:130
 hmdccluster.cc:131
 hmdccluster.cc:132
 hmdccluster.cc:133
 hmdccluster.cc:134
 hmdccluster.cc:135
 hmdccluster.cc:136
 hmdccluster.cc:137
 hmdccluster.cc:138
 hmdccluster.cc:139
 hmdccluster.cc:140
 hmdccluster.cc:141
 hmdccluster.cc:142
 hmdccluster.cc:143
 hmdccluster.cc:144
 hmdccluster.cc:145
 hmdccluster.cc:146
 hmdccluster.cc:147
 hmdccluster.cc:148
 hmdccluster.cc:149
 hmdccluster.cc:150
 hmdccluster.cc:151
 hmdccluster.cc:152
 hmdccluster.cc:153
 hmdccluster.cc:154
 hmdccluster.cc:155
 hmdccluster.cc:156
 hmdccluster.cc:157
 hmdccluster.cc:158
 hmdccluster.cc:159
 hmdccluster.cc:160
 hmdccluster.cc:161
 hmdccluster.cc:162
 hmdccluster.cc:163
 hmdccluster.cc:164
 hmdccluster.cc:165
 hmdccluster.cc:166
 hmdccluster.cc:167
 hmdccluster.cc:168
 hmdccluster.cc:169
 hmdccluster.cc:170
 hmdccluster.cc:171
 hmdccluster.cc:172
 hmdccluster.cc:173
 hmdccluster.cc:174
 hmdccluster.cc:175
 hmdccluster.cc:176
 hmdccluster.cc:177
 hmdccluster.cc:178
 hmdccluster.cc:179
 hmdccluster.cc:180
 hmdccluster.cc:181
 hmdccluster.cc:182
 hmdccluster.cc:183
 hmdccluster.cc:184
 hmdccluster.cc:185
 hmdccluster.cc:186
 hmdccluster.cc:187
 hmdccluster.cc:188
 hmdccluster.cc:189
 hmdccluster.cc:190
 hmdccluster.cc:191
 hmdccluster.cc:192
 hmdccluster.cc:193
 hmdccluster.cc:194
 hmdccluster.cc:195
 hmdccluster.cc:196
 hmdccluster.cc:197
 hmdccluster.cc:198
 hmdccluster.cc:199
 hmdccluster.cc:200
 hmdccluster.cc:201
 hmdccluster.cc:202
 hmdccluster.cc:203
 hmdccluster.cc:204
 hmdccluster.cc:205
 hmdccluster.cc:206
 hmdccluster.cc:207
 hmdccluster.cc:208
 hmdccluster.cc:209
 hmdccluster.cc:210
 hmdccluster.cc:211
 hmdccluster.cc:212
 hmdccluster.cc:213
 hmdccluster.cc:214
 hmdccluster.cc:215
 hmdccluster.cc:216
 hmdccluster.cc:217
 hmdccluster.cc:218
 hmdccluster.cc:219
 hmdccluster.cc:220
 hmdccluster.cc:221
 hmdccluster.cc:222
 hmdccluster.cc:223
 hmdccluster.cc:224
 hmdccluster.cc:225
 hmdccluster.cc:226
 hmdccluster.cc:227
 hmdccluster.cc:228
 hmdccluster.cc:229
 hmdccluster.cc:230
 hmdccluster.cc:231
 hmdccluster.cc:232
 hmdccluster.cc:233
 hmdccluster.cc:234
 hmdccluster.cc:235
 hmdccluster.cc:236
 hmdccluster.cc:237
 hmdccluster.cc:238
 hmdccluster.cc:239
 hmdccluster.cc:240
 hmdccluster.cc:241
 hmdccluster.cc:242
 hmdccluster.cc:243
 hmdccluster.cc:244
 hmdccluster.cc:245
 hmdccluster.cc:246
 hmdccluster.cc:247
 hmdccluster.cc:248
 hmdccluster.cc:249
 hmdccluster.cc:250
 hmdccluster.cc:251
 hmdccluster.cc:252
 hmdccluster.cc:253
 hmdccluster.cc:254
 hmdccluster.cc:255
 hmdccluster.cc:256
 hmdccluster.cc:257
 hmdccluster.cc:258
 hmdccluster.cc:259
 hmdccluster.cc:260
 hmdccluster.cc:261
 hmdccluster.cc:262
 hmdccluster.cc:263
 hmdccluster.cc:264
 hmdccluster.cc:265
 hmdccluster.cc:266
 hmdccluster.cc:267
 hmdccluster.cc:268
 hmdccluster.cc:269
 hmdccluster.cc:270
 hmdccluster.cc:271
 hmdccluster.cc:272
 hmdccluster.cc:273
 hmdccluster.cc:274
 hmdccluster.cc:275
 hmdccluster.cc:276
 hmdccluster.cc:277
 hmdccluster.cc:278
 hmdccluster.cc:279
 hmdccluster.cc:280
 hmdccluster.cc:281
 hmdccluster.cc:282
 hmdccluster.cc:283
 hmdccluster.cc:284
 hmdccluster.cc:285
 hmdccluster.cc:286
 hmdccluster.cc:287
 hmdccluster.cc:288
 hmdccluster.cc:289
 hmdccluster.cc:290
 hmdccluster.cc:291
 hmdccluster.cc:292
 hmdccluster.cc:293
 hmdccluster.cc:294
 hmdccluster.cc:295
 hmdccluster.cc:296
 hmdccluster.cc:297
 hmdccluster.cc:298
 hmdccluster.cc:299
 hmdccluster.cc:300
 hmdccluster.cc:301
 hmdccluster.cc:302
 hmdccluster.cc:303
 hmdccluster.cc:304
 hmdccluster.cc:305
 hmdccluster.cc:306
 hmdccluster.cc:307
 hmdccluster.cc:308
 hmdccluster.cc:309
 hmdccluster.cc:310
 hmdccluster.cc:311
 hmdccluster.cc:312
 hmdccluster.cc:313
 hmdccluster.cc:314
 hmdccluster.cc:315
 hmdccluster.cc:316
 hmdccluster.cc:317
 hmdccluster.cc:318
 hmdccluster.cc:319
 hmdccluster.cc:320
 hmdccluster.cc:321
 hmdccluster.cc:322
 hmdccluster.cc:323
 hmdccluster.cc:324
 hmdccluster.cc:325
 hmdccluster.cc:326
 hmdccluster.cc:327
 hmdccluster.cc:328
 hmdccluster.cc:329
 hmdccluster.cc:330
 hmdccluster.cc:331
 hmdccluster.cc:332
 hmdccluster.cc:333
 hmdccluster.cc:334
 hmdccluster.cc:335
 hmdccluster.cc:336
 hmdccluster.cc:337
 hmdccluster.cc:338
 hmdccluster.cc:339
 hmdccluster.cc:340
 hmdccluster.cc:341
 hmdccluster.cc:342
 hmdccluster.cc:343
 hmdccluster.cc:344
 hmdccluster.cc:345
 hmdccluster.cc:346
 hmdccluster.cc:347
 hmdccluster.cc:348
 hmdccluster.cc:349
 hmdccluster.cc:350
 hmdccluster.cc:351
 hmdccluster.cc:352
 hmdccluster.cc:353
 hmdccluster.cc:354
 hmdccluster.cc:355
 hmdccluster.cc:356
 hmdccluster.cc:357
 hmdccluster.cc:358
 hmdccluster.cc:359
 hmdccluster.cc:360
 hmdccluster.cc:361
 hmdccluster.cc:362
 hmdccluster.cc:363
 hmdccluster.cc:364
 hmdccluster.cc:365
 hmdccluster.cc:366
 hmdccluster.cc:367
 hmdccluster.cc:368
 hmdccluster.cc:369
 hmdccluster.cc:370
 hmdccluster.cc:371
 hmdccluster.cc:372
 hmdccluster.cc:373
 hmdccluster.cc:374
 hmdccluster.cc:375
 hmdccluster.cc:376
 hmdccluster.cc:377
 hmdccluster.cc:378
 hmdccluster.cc:379
 hmdccluster.cc:380
 hmdccluster.cc:381
 hmdccluster.cc:382
 hmdccluster.cc:383
 hmdccluster.cc:384
 hmdccluster.cc:385
 hmdccluster.cc:386
 hmdccluster.cc:387
 hmdccluster.cc:388
 hmdccluster.cc:389
 hmdccluster.cc:390
 hmdccluster.cc:391
 hmdccluster.cc:392
 hmdccluster.cc:393
 hmdccluster.cc:394
 hmdccluster.cc:395
 hmdccluster.cc:396
 hmdccluster.cc:397
 hmdccluster.cc:398
 hmdccluster.cc:399
 hmdccluster.cc:400
 hmdccluster.cc:401
 hmdccluster.cc:402
 hmdccluster.cc:403
 hmdccluster.cc:404
 hmdccluster.cc:405
 hmdccluster.cc:406
 hmdccluster.cc:407
 hmdccluster.cc:408
 hmdccluster.cc:409
 hmdccluster.cc:410
 hmdccluster.cc:411
 hmdccluster.cc:412
 hmdccluster.cc:413
 hmdccluster.cc:414
 hmdccluster.cc:415
 hmdccluster.cc:416
 hmdccluster.cc:417
 hmdccluster.cc:418
 hmdccluster.cc:419
 hmdccluster.cc:420
 hmdccluster.cc:421
 hmdccluster.cc:422
 hmdccluster.cc:423
 hmdccluster.cc:424
 hmdccluster.cc:425
 hmdccluster.cc:426
 hmdccluster.cc:427
 hmdccluster.cc:428
 hmdccluster.cc:429
 hmdccluster.cc:430
 hmdccluster.cc:431
 hmdccluster.cc:432
 hmdccluster.cc:433
 hmdccluster.cc:434
 hmdccluster.cc:435
 hmdccluster.cc:436
 hmdccluster.cc:437
 hmdccluster.cc:438
 hmdccluster.cc:439
 hmdccluster.cc:440
 hmdccluster.cc:441
 hmdccluster.cc:442
 hmdccluster.cc:443
 hmdccluster.cc:444
 hmdccluster.cc:445
 hmdccluster.cc:446
 hmdccluster.cc:447
 hmdccluster.cc:448
 hmdccluster.cc:449
 hmdccluster.cc:450
 hmdccluster.cc:451
 hmdccluster.cc:452
 hmdccluster.cc:453
 hmdccluster.cc:454
 hmdccluster.cc:455
 hmdccluster.cc:456
 hmdccluster.cc:457
 hmdccluster.cc:458
 hmdccluster.cc:459
 hmdccluster.cc:460
 hmdccluster.cc:461
 hmdccluster.cc:462
 hmdccluster.cc:463
 hmdccluster.cc:464
 hmdccluster.cc:465
 hmdccluster.cc:466
 hmdccluster.cc:467
 hmdccluster.cc:468
 hmdccluster.cc:469
 hmdccluster.cc:470
 hmdccluster.cc:471
 hmdccluster.cc:472
 hmdccluster.cc:473
 hmdccluster.cc:474
 hmdccluster.cc:475
 hmdccluster.cc:476
 hmdccluster.cc:477
 hmdccluster.cc:478
 hmdccluster.cc:479
 hmdccluster.cc:480
 hmdccluster.cc:481
 hmdccluster.cc:482
 hmdccluster.cc:483
 hmdccluster.cc:484
 hmdccluster.cc:485
 hmdccluster.cc:486
 hmdccluster.cc:487
 hmdccluster.cc:488
 hmdccluster.cc:489
 hmdccluster.cc:490
 hmdccluster.cc:491
 hmdccluster.cc:492
 hmdccluster.cc:493
 hmdccluster.cc:494
 hmdccluster.cc:495
 hmdccluster.cc:496
 hmdccluster.cc:497
 hmdccluster.cc:498
 hmdccluster.cc:499
 hmdccluster.cc:500
 hmdccluster.cc:501
 hmdccluster.cc:502
 hmdccluster.cc:503
 hmdccluster.cc:504
 hmdccluster.cc:505
 hmdccluster.cc:506
 hmdccluster.cc:507
 hmdccluster.cc:508
 hmdccluster.cc:509
 hmdccluster.cc:510
 hmdccluster.cc:511
 hmdccluster.cc:512
 hmdccluster.cc:513
 hmdccluster.cc:514
 hmdccluster.cc:515
 hmdccluster.cc:516
 hmdccluster.cc:517
 hmdccluster.cc:518
 hmdccluster.cc:519
 hmdccluster.cc:520
 hmdccluster.cc:521
 hmdccluster.cc:522
 hmdccluster.cc:523
 hmdccluster.cc:524
 hmdccluster.cc:525
 hmdccluster.cc:526
 hmdccluster.cc:527
 hmdccluster.cc:528
 hmdccluster.cc:529
 hmdccluster.cc:530
 hmdccluster.cc:531
 hmdccluster.cc:532
 hmdccluster.cc:533
 hmdccluster.cc:534
 hmdccluster.cc:535
 hmdccluster.cc:536
 hmdccluster.cc:537
 hmdccluster.cc:538
 hmdccluster.cc:539
 hmdccluster.cc:540
 hmdccluster.cc:541
 hmdccluster.cc:542
 hmdccluster.cc:543
 hmdccluster.cc:544
 hmdccluster.cc:545
 hmdccluster.cc:546
 hmdccluster.cc:547
 hmdccluster.cc:548
 hmdccluster.cc:549
 hmdccluster.cc:550
 hmdccluster.cc:551
 hmdccluster.cc:552
 hmdccluster.cc:553
 hmdccluster.cc:554
 hmdccluster.cc:555
 hmdccluster.cc:556
 hmdccluster.cc:557
 hmdccluster.cc:558
 hmdccluster.cc:559
 hmdccluster.cc:560
 hmdccluster.cc:561
 hmdccluster.cc:562
 hmdccluster.cc:563
 hmdccluster.cc:564
 hmdccluster.cc:565
 hmdccluster.cc:566
 hmdccluster.cc:567
 hmdccluster.cc:568
 hmdccluster.cc:569
 hmdccluster.cc:570
 hmdccluster.cc:571
 hmdccluster.cc:572
 hmdccluster.cc:573
 hmdccluster.cc:574
 hmdccluster.cc:575
 hmdccluster.cc:576
 hmdccluster.cc:577
 hmdccluster.cc:578
 hmdccluster.cc:579
 hmdccluster.cc:580
 hmdccluster.cc:581
 hmdccluster.cc:582
 hmdccluster.cc:583
 hmdccluster.cc:584
 hmdccluster.cc:585
 hmdccluster.cc:586
 hmdccluster.cc:587
 hmdccluster.cc:588
 hmdccluster.cc:589
 hmdccluster.cc:590
 hmdccluster.cc:591
 hmdccluster.cc:592
 hmdccluster.cc:593
 hmdccluster.cc:594
 hmdccluster.cc:595
 hmdccluster.cc:596
 hmdccluster.cc:597
 hmdccluster.cc:598
 hmdccluster.cc:599
 hmdccluster.cc:600
 hmdccluster.cc:601
 hmdccluster.cc:602
 hmdccluster.cc:603
 hmdccluster.cc:604
 hmdccluster.cc:605
 hmdccluster.cc:606
 hmdccluster.cc:607
 hmdccluster.cc:608
 hmdccluster.cc:609
 hmdccluster.cc:610
 hmdccluster.cc:611
 hmdccluster.cc:612
 hmdccluster.cc:613
 hmdccluster.cc:614
 hmdccluster.cc:615
 hmdccluster.cc:616
 hmdccluster.cc:617
 hmdccluster.cc:618
 hmdccluster.cc:619
 hmdccluster.cc:620
 hmdccluster.cc:621
 hmdccluster.cc:622
 hmdccluster.cc:623
 hmdccluster.cc:624
 hmdccluster.cc:625
 hmdccluster.cc:626
 hmdccluster.cc:627
 hmdccluster.cc:628
 hmdccluster.cc:629
 hmdccluster.cc:630
 hmdccluster.cc:631
 hmdccluster.cc:632
 hmdccluster.cc:633
 hmdccluster.cc:634
 hmdccluster.cc:635
 hmdccluster.cc:636
 hmdccluster.cc:637
 hmdccluster.cc:638
 hmdccluster.cc:639
 hmdccluster.cc:640
 hmdccluster.cc:641
 hmdccluster.cc:642
 hmdccluster.cc:643
 hmdccluster.cc:644
 hmdccluster.cc:645
 hmdccluster.cc:646
 hmdccluster.cc:647
 hmdccluster.cc:648
 hmdccluster.cc:649
 hmdccluster.cc:650
 hmdccluster.cc:651
 hmdccluster.cc:652
 hmdccluster.cc:653
 hmdccluster.cc:654
 hmdccluster.cc:655
 hmdccluster.cc:656
 hmdccluster.cc:657
 hmdccluster.cc:658
 hmdccluster.cc:659
 hmdccluster.cc:660
 hmdccluster.cc:661
 hmdccluster.cc:662
 hmdccluster.cc:663
 hmdccluster.cc:664
 hmdccluster.cc:665
 hmdccluster.cc:666
 hmdccluster.cc:667
 hmdccluster.cc:668
 hmdccluster.cc:669
 hmdccluster.cc:670
 hmdccluster.cc:671
 hmdccluster.cc:672
 hmdccluster.cc:673
 hmdccluster.cc:674
 hmdccluster.cc:675
 hmdccluster.cc:676
 hmdccluster.cc:677
 hmdccluster.cc:678
 hmdccluster.cc:679
 hmdccluster.cc:680
 hmdccluster.cc:681
 hmdccluster.cc:682
 hmdccluster.cc:683
 hmdccluster.cc:684
 hmdccluster.cc:685
 hmdccluster.cc:686
 hmdccluster.cc:687
 hmdccluster.cc:688
 hmdccluster.cc:689
 hmdccluster.cc:690
 hmdccluster.cc:691