ROOT logo

//  **************************************************************************
//  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
//  *                                                                        *
//  * Author: The ALICE Off-line Project.                                    *
//  * Contributors are mentioned in the code where appropriate.              *
//  *                                                                        *
//  * Permission to use, copy, modify and distribute this software and its   *
//  * documentation strictly for non-commercial purposes is hereby granted   *
//  * without fee, provided that the above copyright notice appears in all   *
//  * copies and that both the copyright notice and this permission notice   *
//  * appear in the supporting documentation. The authors make no claims     *
//  * about the suitability of this software for any purpose. It is          *
//  * provided "as is" without express or implied warranty.                  *
//  **************************************************************************

/* $Id$ */

//-----------------------------------------------------------------------------------
// Jet finder based on Deterministic Annealing
// For further informations about the DA working features see:
// Phys.Lett. B601 (2004) 56-63 (http://arxiv.org/abs/hep-ph/0407214)
// Author: Davide Perrino (davide.perrino@ba.infn.it, davide.perrino@cern.ch)
//         alexandre.shabetai@cern.ch (Modification of the input object (reader/finder splitting)) 
// ** 2011
// Modified accordingly to reader/finder splitting and new handling of neutral information   
//-----------------------------------------------------------------------------------

#include <TMath.h>
#include <TRandom2.h>

#include "AliAODJet.h"
#include "AliDAJetHeader.h"
#include "AliDAJetFinder.h"

ClassImp(AliDAJetFinder)

///////////////////////////////////////////////////////////////////////

AliDAJetFinder::AliDAJetFinder():
  AliJetFinder(),
  fAlpha(1.01),
  fDelta(1e-8),
  fAvDist(1e-6),
  fEps(1e-4),
  fEpsMax(1e-2),
  fNloopMax(100),
  fBeta(0.1),
  fNclustMax(0),
  fNin(0),
  fNeff(0)
{
  // Constructor
}

//-----------------------------------------------------------------------------------
AliDAJetFinder::~AliDAJetFinder()
{
  // Destructor
}

//-----------------------------------------------------------------------------------
void AliDAJetFinder::FindJets()  
{
  // Find the jets in current event
  //
  Float_t betaStop=100.;
  fDebug = fHeader->GetDebug();

  Double_t dEtSum=0;
  Double_t *xData[2];
  TVectorD *vPx = new TVectorD();
  TVectorD *vPy = new TVectorD();
  TMatrixD *mPyx= new TMatrixD();
  TMatrixD *mY  = new TMatrixD();
  InitDetAnn(dEtSum,xData,vPx,vPy,mPyx,mY);
  if (fNin < fNclustMax){
    delete [] xData[0], delete [] xData[1];
    delete vPx;
    delete vPy;
    delete mPyx;
    delete mY;
    return;
  }
  Int_t nc=1, nk;
  DoubleClusters(nc,nk,vPy,mY);
  do{					//loop over beta
    fBeta*=fAlpha;
    Annealing(nk,xData,vPx,vPy,mPyx,mY);
    NumCl(nc,nk,vPy,mPyx,mY);
  }while((fBeta<betaStop || nc<4) && nc<fNclustMax);

  Int_t *xx=new Int_t[fNeff];
  for (Int_t i = 0; i < fNeff; i++) xx[i] = 0;

  EndDetAnn(nk,xData,xx,dEtSum,vPx,vPy,mPyx,mY);
  StoreJets(nk,xData,xx,mY);
  delete [] xx;

  delete [] xData[0], delete [] xData[1];
  delete mPyx;
  delete mY;
  delete vPx;
  delete vPy;

}

//-----------------------------------------------------------------------------------
void AliDAJetFinder::InitDetAnn(Double_t &dEtSum,Double_t **xData,TVectorD *vPx,TVectorD *vPy,TMatrixD *mPyx,TMatrixD *mY)
{
  //Initialise the variables used by the algorithm
  fBeta=0.1;
  fNclustMax = ((AliDAJetHeader*)fHeader)->GetFixedCl() ?
    ((AliDAJetHeader*)fHeader)->GetNclustMax() :
    TMath::Max((Int_t)TMath::Sqrt(fNin),5);
  Float_t etaEff = ((AliDAJetHeader*)fHeader)->GetEtaEff();

  fNin=0;
  for (Int_t iTr=0; iTr<GetCalTrkEvent()->GetNCalTrkTracks(); iTr++) if (GetCalTrkEvent()->GetCalTrkTrack(iTr)->GetCutFlag()==1) fNin++;

  fNeff = ((AliDAJetHeader*)fHeader)->GetNeff();
  fNeff = TMath::Max(fNeff,fNin);
  Double_t *xEta = new Double_t[fNeff];
  Double_t *xPhi = new Double_t[fNeff];
  xData[0]=xEta; xData[1]=xPhi;
  vPx->ResizeTo(fNeff);
  Int_t iIn=0;

  for (Int_t iTr=0; iTr<GetCalTrkEvent()->GetNCalTrkTracks(); iTr++){
    AliJetCalTrkTrack* ctT = GetCalTrkEvent()->GetCalTrkTrack(iTr);
    if (ctT->GetCutFlag()==0) continue;
    xEta[iIn] = ctT->GetEta();
    xPhi[iIn] = ctT->GetPhi()<0 ? ctT->GetPhi() + 2*TMath::Pi() : ctT->GetPhi();
    (*vPx)(iIn)=ctT->GetPt();
    dEtSum+=(*vPx)(iIn);
    iIn++;
  }

  TRandom2 r;
  r.SetSeed(0);
  for (iIn=fNin; iIn<fNeff; iIn++){
    xEta[iIn]=r.Uniform(-1*etaEff,etaEff);
    xPhi[iIn]=r.Uniform(0.,2*TMath::Pi());
    (*vPx)(iIn)=r.Uniform(0.01,0.02);
    dEtSum+=(*vPx)(iIn);
  }
  for (iIn=0; iIn<fNeff; iIn++) (*vPx)(iIn)=(*vPx)(iIn)/dEtSum;

  Int_t njdim=2*fNclustMax+1;
  mPyx->ResizeTo(fNeff,njdim);
  mY->ResizeTo(4,njdim);
  vPy->ResizeTo(njdim);
  mY->Zero();mPyx->Zero();vPy->Zero();
  (*vPy)(0)=1;
  TMatrixDColumn(*mPyx,0)=1;
  Double_t ypos=0,xpos=0;
  for (iIn=0; iIn<fNeff; iIn++){
    (*mY)(0,0)+=(*vPx)(iIn)*xEta[iIn];
    ypos+=(*vPx)(iIn)*TMath::Sin(xPhi[iIn]);
    xpos+=(*vPx)(iIn)*TMath::Cos(xPhi[iIn]);
  }
  (*mY)(1,0)=(atan2(ypos,xpos)>0) ? atan2(ypos,xpos) : atan2(ypos,xpos)+2*TMath::Pi();

}

//-----------------------------------------------------------------------------------
void AliDAJetFinder::DoubleClusters(Int_t nc,Int_t &nk, TVectorD *vPy, TMatrixD *mY) const
{
  // Return double clusters
  for(Int_t iClust=0; iClust<nc; iClust++){
    (*vPy)(iClust)=(*vPy)(iClust)/2;
    (*vPy)(nc+iClust)=(*vPy)(iClust);
    for(Int_t iComp=0; iComp<3; iComp++) (*mY)(iComp,nc+iClust)=(*mY)(iComp,iClust);
  }
  nk=2*nc;

}

//-----------------------------------------------------------------------------------
void AliDAJetFinder::Annealing(Int_t nk,Double_t **xData,  const TVectorD *vPx,  TVectorD *vPy,  TMatrixD *mPyx,  TMatrixD *mY)
{
  // Main part of the algorithm
  const Double_t pi=TMath::Pi();
  TVectorD *py = new TVectorD(nk);
  TVectorD *p  = new TVectorD(nk);
  TMatrixD *y  = new TMatrixD(4,nk);
  TMatrixD *y1 = new TMatrixD(4,nk);
  TMatrixD *ry = new TMatrixD(2,nk);
  Double_t *xEta = xData[0];
  Double_t *xPhi = xData[1];
  Double_t Dist(TVectorD,TVectorD);

  Double_t df[2]={((AliDAJetHeader*)fHeader)->GetFiducialEtaMax(),pi};
  TVectorD vPart(2);
  Double_t *m = new Double_t[nk];
  Double_t chi,chi1;
  do{
    Int_t nloop=0;
    for (Int_t iClust=0; iClust<nk; iClust++){
      for (Int_t i=0; i<3; i++)(*y1)(i,iClust)=(*mY)(i,iClust);
      (*py)(iClust)=(*vPy)(iClust);
    }
    //perturbation of codevectors
    Double_t seed=1000000*gRandom->Rndm(24);
    ry->Randomize(-0.5,0.5,seed);
    for (Int_t i=0; i<2; i++){
      for (Int_t iClust=0; iClust<nk/2; iClust++)
	(*y1)(i,iClust)+=((*ry)(i,iClust)+TMath::Sign(0.5,(*ry)(i,iClust)))*fDelta*df[i];
      for (Int_t iClust=nk/2; iClust<nk; iClust++)
	(*y1)(i,iClust)-=((*ry)(i,iClust-nk/2)+TMath::Sign(0.5,(*ry)(i,iClust-nk/2)))*fDelta*df[i];
    }
    do{
      //recalculate conditional probabilities
      nloop++;
      for (Int_t iIn=0; iIn<fNeff; iIn++){
	vPart(0)=xEta[iIn]; vPart(1)=xPhi[iIn];
	for(Int_t iClust=0; iClust<nk; iClust++){
	  (*mPyx)(iIn,iClust)=-log((*py)(iClust))+fBeta*Dist(vPart,TMatrixDColumn(*y1,iClust));
	  m[iClust]=(*mPyx)(iIn,iClust);
	}
	Double_t pyxNorm=0;
	Double_t minPyx=TMath::MinElement(nk,m);
	for (Int_t iClust=0; iClust<nk; iClust++){
	  (*mPyx)(iIn,iClust)-=minPyx;
	  (*mPyx)(iIn,iClust)=exp(-(*mPyx)(iIn,iClust));
	  pyxNorm+=(*mPyx)(iIn,iClust);
	}
	for (Int_t iClust=0; iClust<nk; iClust++) (*mPyx)(iIn,iClust)/=pyxNorm;
      }
      p->Zero();
      y->Zero();
      //recalculate codevectors
      for (Int_t iClust=0; iClust<nk; iClust++){
	Double_t xpos=0,ypos=0,pxy;
	for (Int_t iIn=0; iIn<fNeff; iIn++) (*p)(iClust)+=(*vPx)(iIn)*(*mPyx)(iIn,iClust);
	for (Int_t iIn=0; iIn<fNeff; iIn++){
	  pxy=(*vPx)(iIn)*(*mPyx)(iIn,iClust)/(*p)(iClust);
	  ypos+=pxy*TMath::Sin(xPhi[iIn]);
	  xpos+=pxy*TMath::Cos(xPhi[iIn]);
	  (*y)(0,iClust)+=pxy*xEta[iIn];
	}
	(*y)(1,iClust)=(atan2(ypos,xpos)>0) ? atan2(ypos,xpos) : atan2(ypos,xpos)+2*pi;
      }
      //verify codevectors' stability
      chi=0;
      for (Int_t iClust=0; iClust<nk; iClust++){
	chi1=TMath::CosH((*y1)(0,iClust)-(*y)(0,iClust))-TMath::Cos((*y1)(1,iClust)-(*y)(1,iClust));
	chi1/=(2*TMath::CosH((*y1)(0,iClust))*TMath::CosH((*y)(0,iClust)));
	chi1*=chi1;
	if (chi1>chi) chi=chi1;
      }
      chi=TMath::Sqrt(chi);
      for (Int_t iClust=0; iClust<nk; iClust++){
	for (Int_t i=0; i<2; i++) (*y1)(i,iClust)=(*y)(i,iClust);
	(*py)(iClust)=(*p)(iClust);
      }
      if (nloop>fNloopMax){
	if (chi<fEpsMax || nloop>500) break;
      }
    }while (chi>fEps);
  }while (chi>fEpsMax);
  for (Int_t iClust=0; iClust<nk; iClust++){				//set codevectors and probability equal to those calculated
    for (Int_t i=0; i<2; i++) (*mY)(i,iClust)=(*y)(i,iClust);
    (*vPy)(iClust)=(*p)(iClust);
  }
  delete py;
  delete p;
  delete y;
  delete y1;
  delete ry;
  delete [] m;

}

//-----------------------------------------------------------------------------------
void AliDAJetFinder::NumCl(Int_t &nc,Int_t &nk,TVectorD *vPy, TMatrixD *mPyx,TMatrixD *mY)
{
  // Number of clusters
  static Bool_t growcl=true;
	
  if (nk==2) growcl=true;
  if (growcl){
    //verify if two codevectors are equal within fAvDist
    Int_t *nSame = new Int_t[nk];
    Int_t **iSame = new Int_t*[nk];
    Int_t **cont = new Int_t*[nk];
    for (Int_t iClust=0; iClust<nk; iClust++) {
      cont[iClust] =new Int_t[nk];
      iSame[iClust]=new Int_t[nk];         
    }

    for (Int_t iClust=0; iClust<nk; iClust++){
      iSame[iClust][iClust]=1;
      for (Int_t iClust1=iClust+1; iClust1<nk; iClust1++){
	Double_t eta  = (*mY)(0,iClust) ; Double_t phi  = (*mY)(1,iClust);
	Double_t eta1 = (*mY)(0,iClust1); Double_t phi1 = (*mY)(1,iClust1);
	Double_t distCl=(TMath::CosH(eta-eta1)-TMath::Cos(phi-phi1))/(2*TMath::CosH(eta)*TMath::CosH(eta1));
	if (distCl < fAvDist) iSame[iClust][iClust1]=iSame[iClust1][iClust]=1;
	else iSame[iClust][iClust1]=iSame[iClust1][iClust]=0;
      }
    }
    ReduceClusters(iSame,nk,nc,cont,nSame);
    if (nc >= fNclustMax) growcl=false;
    //recalculate the nc distinct codevectors
    TMatrixD *pyx = new TMatrixD(fNeff,2*nc);
    TVectorD *py = new TVectorD(nk);
    TMatrixD *y1  = new TMatrixD(3,nk);
    for (Int_t iClust=0; iClust<nc; iClust++){
      for(Int_t j=0; j<nSame[iClust]; j++){
	Int_t iClust1 = cont[iClust][j];
	for (Int_t iIn=0; iIn<fNeff; iIn++) (*pyx)(iIn,iClust)+=(*mPyx)(iIn,iClust1);
	(*py)(iClust)+=(*vPy)(iClust1);
	for (Int_t i=0; i<2; i++) (*y1)(i,iClust)+=(*mY)(i,iClust1);
      }
      for (Int_t i=0; i<2; i++) (*y1)(i,iClust)/=nSame[iClust];
    }
    for (Int_t iClust=0; iClust<nk; iClust++) delete [] cont[iClust], delete [] iSame[iClust];
    delete [] iSame;
    delete [] cont;
    delete [] nSame;
    if (nc > nk/2){
      for (Int_t iClust=0; iClust<nc; iClust++){
	for (Int_t iIn=0; iIn<fNeff; iIn++) (*mPyx)(iIn,iClust)=(*pyx)(iIn,iClust);
	for (Int_t iComp=0; iComp<2; iComp++) (*mY)(iComp,iClust)=(*y1)(iComp,iClust);
	(*vPy)(iClust)=(*py)(iClust);
      }
      nk=nc;
      if (growcl) DoubleClusters(nc,nk,vPy,mY);
    }
    delete pyx;
    delete py;
    delete y1;
  }

}

//-----------------------------------------------------------------------------------
void AliDAJetFinder::ReduceClusters(Int_t **iSame,Int_t nc,Int_t &ncout,Int_t **cont,Int_t *nSameOut) const
{
  // Reduction step
  Int_t *nSame = new Int_t[nc];
  Int_t *iperm = new Int_t[nc];
  Int_t *go = new Int_t[nc];
  for (Int_t iCl=0; iCl<nc; iCl++){
    nSame[iCl]=0;
    for (Int_t jCl=0; jCl<nc; jCl++) nSame[iCl]+=iSame[iCl][jCl], cont[iCl][jCl]=0;
    iperm[iCl]=iCl;
    go[iCl]=1;
  }
  TMath::Sort(nc,nSame,iperm,true);
  Int_t l=0;
  for (Int_t iCl=0; iCl<nc; iCl++){
    Int_t k=iperm[iCl];
    if (go[k] == 1){
      Int_t m=0;
      for (Int_t jCl=0; jCl<nc; jCl++){
	if (iSame[k][jCl] == 1){
	  cont[l][m]=jCl;
	  go[jCl]=0;
	  m++;
	}
      }
      nSameOut[l]=m;
      l++;
    }
  }
  ncout=l;
  delete [] nSame;
  delete [] iperm;
  delete [] go;

}

//-----------------------------------------------------------------------------------
void AliDAJetFinder::EndDetAnn(Int_t &nk,Double_t **xData,Int_t *xx,Double_t etx,const TVectorD *vPx,TVectorD *vPy,TMatrixD *mPyx,TMatrixD *mY)
{
  //now assign each particle to only one cluster
  Double_t *clusters=new Double_t[nk];
  for (Int_t iIn=0; iIn<fNeff; iIn++){
    for (Int_t iClust=0; iClust<nk; iClust++) clusters[iClust]=(*mPyx)(iIn,iClust);
    xx[iIn]=TMath::LocMax(nk,clusters);
  }
  delete [] clusters;
	
  //recalculate codevectors, having all p(y|x)=0 or 1
  Double_t *xEta = xData[0];
  Double_t *xPhi = xData[1];
  mY->Zero();
  mPyx->Zero();
  vPy->Zero();
  for (Int_t iIn=0; iIn<fNin; iIn++){
    Int_t iClust=xx[iIn];
    (*mPyx)(iIn,iClust)=1;
    (*vPy)(iClust)+=(*vPx)(iIn);
    (*mY)(0,iClust)+=(*vPx)(iIn)*xEta[iIn];
    (*mY)(3,iClust)+=(*vPx)(iIn)*etx;
  }
  Int_t k=0;
  for (Int_t iClust=0; iClust<nk; iClust++){
    if ((*vPy)(iClust)>0){
      Double_t xpos=0,ypos=0,pxy;
      for (Int_t iIn=0; iIn<fNin; iIn++){
	pxy=(*vPx)(iIn)*(*mPyx)(iIn,iClust)/(*vPy)(iClust);
	ypos+=pxy*TMath::Sin(xPhi[iIn]);
	xpos+=pxy*TMath::Cos(xPhi[iIn]);
	if (xx[iIn]==iClust) xx[iIn]=k;
      }
      (*mY)(0,k)=(*mY)(0,iClust)/(*vPy)(iClust);
      (*mY)(1,k)=(atan2(ypos,xpos)>0) ? atan2(ypos,xpos) : atan2(ypos,xpos)+2*TMath::Pi();
      (*mY)(3,k)=(*mY)(3,iClust);
      k++;
    }
  }
  nk=k;

}

//-----------------------------------------------------------------------------------
void AliDAJetFinder::StoreJets(Int_t nk, Double_t **xData, const Int_t *xx, const TMatrixD *mY)
{
  //evaluate significant clusters properties
  const Double_t pi=TMath::Pi();
  Float_t dFidEtaMax = ((AliDAJetHeader*)fHeader)->GetFiducialEtaMax();
  Float_t dFidEtaMin = ((AliDAJetHeader*)fHeader)->GetFiducialEtaMin();
  Float_t dFiducialEta= dFidEtaMax - dFidEtaMin;
  Double_t *xEta = xData[0];
  Double_t *xPhi = xData[1];
  Int_t nEff = 0;
  for (Int_t i=0; i<fNeff; i++) if (xEta[i]<dFidEtaMax && xEta[i]>dFidEtaMin) nEff++;
  Double_t dMeanDist=0.;
  if (nEff > 0)
    dMeanDist=TMath::Sqrt(2*dFiducialEta*pi/nEff);
  Bool_t   *isJet = new Bool_t[nk];
  Double_t *etNoBg= new Double_t[nk];
  Double_t *dDeltaEta=new Double_t[nk];
  Double_t *dDeltaPhi=new Double_t[nk];
  Double_t *surf  = new Double_t[nk];
  Double_t *etDens= new Double_t[nk];
  for (Int_t iClust=0; iClust<nk; iClust++){
    isJet[iClust]=false;
    Double_t dEtaMin=10.,dEtaMax=-10.,dPhiMin=10.,dPhiMax=0.;
    for (Int_t iIn=0; iIn<fNeff; iIn++){
      if (xx[iIn]!=iClust || xEta[iIn]>dFidEtaMax || xEta[iIn]<dFidEtaMin) continue;
      if (xEta[iIn] < dEtaMin) dEtaMin=xEta[iIn];
      if (xEta[iIn] > dEtaMax) dEtaMax=xEta[iIn];
      Double_t dPhi=xPhi[iIn]-(*mY)(1,iClust);
      if      (dPhi > pi     ) dPhi-=2*pi;
      else if (dPhi < (-1)*pi) dPhi+=2*pi;
      if      (dPhi < dPhiMin) dPhiMin=dPhi;
      else if (dPhi > dPhiMax) dPhiMax=dPhi;
    }
    dDeltaEta[iClust]=dEtaMax-dEtaMin+dMeanDist;
    dDeltaPhi[iClust]=dPhiMax-dPhiMin+dMeanDist;
    surf[iClust]=0.25*pi*dDeltaEta[iClust]*dDeltaPhi[iClust];
    etDens[iClust]=(*mY)(3,iClust)/surf[iClust];
  }

  if (((AliDAJetHeader*)fHeader)->GetSelJets()){
    for (Int_t iClust=0; iClust<nk; iClust++){
      if (!isJet[iClust] && (*mY)(0,iClust)<dFidEtaMax && (*mY)(0,iClust)>dFidEtaMin){
	Double_t etDensMed=0.;
	Double_t etDensSqr=0.;
	Int_t norm=0;
	for (Int_t iClust1=0; iClust1<nk; iClust1++){
	  if(iClust1!=iClust && (*mY)(0,iClust)<dFidEtaMax && (*mY)(0,iClust)>dFidEtaMin){
	    etDensMed+=etDens[iClust1];
	    etDensSqr+=TMath::Power(etDens[iClust1],2);
	    norm++;
	  }
	}
	etDensMed/=TMath::Max(norm,1);
	etDensSqr/=TMath::Max(norm,1);
	Double_t deltaEtDens=TMath::Sqrt(etDensSqr-TMath::Power(etDensMed,2));
	if ((*mY)(3,iClust) > (etDensMed+deltaEtDens)*surf[iClust]) isJet[iClust]=kTRUE;
	etNoBg[iClust]=(*mY)(3,iClust)-etDensMed*surf[iClust];
      }
    }
    for (Int_t iClust=0; iClust<nk; iClust++){
      if (isJet[iClust]){
	Double_t etDensMed=0;
	Double_t extSurf=2*dFiducialEta*pi;
	for (Int_t iClust1=0; iClust1<nk; iClust1++){
	  if (!isJet[iClust1]) etDensMed+=(*mY)(3,iClust1);
	  else extSurf-=surf[iClust1];
	}
	etDensMed/=extSurf;
	etNoBg[iClust]=(*mY)(3,iClust)-etDensMed*surf[iClust];
	if (etNoBg[iClust]<((AliDAJetHeader*)fHeader)->GetEtMin()){
	  isJet[iClust]=kFALSE;
	  iClust=-1;
	}
      }
    }
  } else {
    for (Int_t iClust=0; iClust<nk; iClust++){
      isJet[iClust]=true;
      etNoBg[iClust]=(*mY)(3,iClust);
    }
  }
  delete [] etDens;
  delete [] surf;
	
  //now add selected jets to the list
  Int_t *iSort = new Int_t[nk];
  TMath::Sort(nk,etNoBg,iSort,true);
  Int_t iCl = 0;

  for (Int_t iClust=0; iClust<nk; iClust++){ //clusters loop
    iCl=iSort[iClust];
    if (isJet[iCl]){ //choose cluster
      Float_t px,py,pz,en;
      px = (*mY)(3,iCl)*TMath::Cos((*mY)(1,iCl));
      py = (*mY)(3,iCl)*TMath::Sin((*mY)(1,iCl));
      pz = (*mY)(3,iCl)/TMath::Tan(2.0 * TMath::ATan(TMath::Exp(-(*mY)(0,iCl))));
      en = TMath::Sqrt(px * px + py * py + pz * pz);
      AliAODJet jet(px, py, pz, en);
      Int_t iIn=0;
      Int_t nTr = GetCalTrkEvent()->GetNCalTrkTracks();
      for (Int_t iTr=0; iTr<nTr; iTr++){
	AliJetCalTrkTrack* ctT = GetCalTrkEvent()->GetCalTrkTrack(iTr);
	if (ctT->GetCutFlag()==0) continue;
	if (xx[iIn]==iCl) jet.AddTrack(ctT->GetTrackObject());
	iIn++;
      }
      AddJet(jet);
      if (fDebug > 0) printf("jet %d, Eta: %f, Phi: %f, Et: %f\n",iCl,jet.Eta(),jet.Phi(),jet.Pt());
    }
  }
  delete [] dDeltaEta; delete [] dDeltaPhi;
  delete [] etNoBg;
  delete [] isJet;
  delete [] iSort;

}

//-----------------------------------------------------------------------------------
Double_t Dist(TVectorD x,TVectorD y)
{
  // Squared distance
  const Double_t pi=TMath::Pi();
  Double_t dphi=TMath::Abs(x(1)-y(1));
  if (dphi > pi) dphi=2*pi-dphi;
  Double_t dist=pow(x(0)-y(0),2)+pow(dphi,2);
  return dist;

}
 AliDAJetFinder.cxx:1
 AliDAJetFinder.cxx:2
 AliDAJetFinder.cxx:3
 AliDAJetFinder.cxx:4
 AliDAJetFinder.cxx:5
 AliDAJetFinder.cxx:6
 AliDAJetFinder.cxx:7
 AliDAJetFinder.cxx:8
 AliDAJetFinder.cxx:9
 AliDAJetFinder.cxx:10
 AliDAJetFinder.cxx:11
 AliDAJetFinder.cxx:12
 AliDAJetFinder.cxx:13
 AliDAJetFinder.cxx:14
 AliDAJetFinder.cxx:15
 AliDAJetFinder.cxx:16
 AliDAJetFinder.cxx:17
 AliDAJetFinder.cxx:18
 AliDAJetFinder.cxx:19
 AliDAJetFinder.cxx:20
 AliDAJetFinder.cxx:21
 AliDAJetFinder.cxx:22
 AliDAJetFinder.cxx:23
 AliDAJetFinder.cxx:24
 AliDAJetFinder.cxx:25
 AliDAJetFinder.cxx:26
 AliDAJetFinder.cxx:27
 AliDAJetFinder.cxx:28
 AliDAJetFinder.cxx:29
 AliDAJetFinder.cxx:30
 AliDAJetFinder.cxx:31
 AliDAJetFinder.cxx:32
 AliDAJetFinder.cxx:33
 AliDAJetFinder.cxx:34
 AliDAJetFinder.cxx:35
 AliDAJetFinder.cxx:36
 AliDAJetFinder.cxx:37
 AliDAJetFinder.cxx:38
 AliDAJetFinder.cxx:39
 AliDAJetFinder.cxx:40
 AliDAJetFinder.cxx:41
 AliDAJetFinder.cxx:42
 AliDAJetFinder.cxx:43
 AliDAJetFinder.cxx:44
 AliDAJetFinder.cxx:45
 AliDAJetFinder.cxx:46
 AliDAJetFinder.cxx:47
 AliDAJetFinder.cxx:48
 AliDAJetFinder.cxx:49
 AliDAJetFinder.cxx:50
 AliDAJetFinder.cxx:51
 AliDAJetFinder.cxx:52
 AliDAJetFinder.cxx:53
 AliDAJetFinder.cxx:54
 AliDAJetFinder.cxx:55
 AliDAJetFinder.cxx:56
 AliDAJetFinder.cxx:57
 AliDAJetFinder.cxx:58
 AliDAJetFinder.cxx:59
 AliDAJetFinder.cxx:60
 AliDAJetFinder.cxx:61
 AliDAJetFinder.cxx:62
 AliDAJetFinder.cxx:63
 AliDAJetFinder.cxx:64
 AliDAJetFinder.cxx:65
 AliDAJetFinder.cxx:66
 AliDAJetFinder.cxx:67
 AliDAJetFinder.cxx:68
 AliDAJetFinder.cxx:69
 AliDAJetFinder.cxx:70
 AliDAJetFinder.cxx:71
 AliDAJetFinder.cxx:72
 AliDAJetFinder.cxx:73
 AliDAJetFinder.cxx:74
 AliDAJetFinder.cxx:75
 AliDAJetFinder.cxx:76
 AliDAJetFinder.cxx:77
 AliDAJetFinder.cxx:78
 AliDAJetFinder.cxx:79
 AliDAJetFinder.cxx:80
 AliDAJetFinder.cxx:81
 AliDAJetFinder.cxx:82
 AliDAJetFinder.cxx:83
 AliDAJetFinder.cxx:84
 AliDAJetFinder.cxx:85
 AliDAJetFinder.cxx:86
 AliDAJetFinder.cxx:87
 AliDAJetFinder.cxx:88
 AliDAJetFinder.cxx:89
 AliDAJetFinder.cxx:90
 AliDAJetFinder.cxx:91
 AliDAJetFinder.cxx:92
 AliDAJetFinder.cxx:93
 AliDAJetFinder.cxx:94
 AliDAJetFinder.cxx:95
 AliDAJetFinder.cxx:96
 AliDAJetFinder.cxx:97
 AliDAJetFinder.cxx:98
 AliDAJetFinder.cxx:99
 AliDAJetFinder.cxx:100
 AliDAJetFinder.cxx:101
 AliDAJetFinder.cxx:102
 AliDAJetFinder.cxx:103
 AliDAJetFinder.cxx:104
 AliDAJetFinder.cxx:105
 AliDAJetFinder.cxx:106
 AliDAJetFinder.cxx:107
 AliDAJetFinder.cxx:108
 AliDAJetFinder.cxx:109
 AliDAJetFinder.cxx:110
 AliDAJetFinder.cxx:111
 AliDAJetFinder.cxx:112
 AliDAJetFinder.cxx:113
 AliDAJetFinder.cxx:114
 AliDAJetFinder.cxx:115
 AliDAJetFinder.cxx:116
 AliDAJetFinder.cxx:117
 AliDAJetFinder.cxx:118
 AliDAJetFinder.cxx:119
 AliDAJetFinder.cxx:120
 AliDAJetFinder.cxx:121
 AliDAJetFinder.cxx:122
 AliDAJetFinder.cxx:123
 AliDAJetFinder.cxx:124
 AliDAJetFinder.cxx:125
 AliDAJetFinder.cxx:126
 AliDAJetFinder.cxx:127
 AliDAJetFinder.cxx:128
 AliDAJetFinder.cxx:129
 AliDAJetFinder.cxx:130
 AliDAJetFinder.cxx:131
 AliDAJetFinder.cxx:132
 AliDAJetFinder.cxx:133
 AliDAJetFinder.cxx:134
 AliDAJetFinder.cxx:135
 AliDAJetFinder.cxx:136
 AliDAJetFinder.cxx:137
 AliDAJetFinder.cxx:138
 AliDAJetFinder.cxx:139
 AliDAJetFinder.cxx:140
 AliDAJetFinder.cxx:141
 AliDAJetFinder.cxx:142
 AliDAJetFinder.cxx:143
 AliDAJetFinder.cxx:144
 AliDAJetFinder.cxx:145
 AliDAJetFinder.cxx:146
 AliDAJetFinder.cxx:147
 AliDAJetFinder.cxx:148
 AliDAJetFinder.cxx:149
 AliDAJetFinder.cxx:150
 AliDAJetFinder.cxx:151
 AliDAJetFinder.cxx:152
 AliDAJetFinder.cxx:153
 AliDAJetFinder.cxx:154
 AliDAJetFinder.cxx:155
 AliDAJetFinder.cxx:156
 AliDAJetFinder.cxx:157
 AliDAJetFinder.cxx:158
 AliDAJetFinder.cxx:159
 AliDAJetFinder.cxx:160
 AliDAJetFinder.cxx:161
 AliDAJetFinder.cxx:162
 AliDAJetFinder.cxx:163
 AliDAJetFinder.cxx:164
 AliDAJetFinder.cxx:165
 AliDAJetFinder.cxx:166
 AliDAJetFinder.cxx:167
 AliDAJetFinder.cxx:168
 AliDAJetFinder.cxx:169
 AliDAJetFinder.cxx:170
 AliDAJetFinder.cxx:171
 AliDAJetFinder.cxx:172
 AliDAJetFinder.cxx:173
 AliDAJetFinder.cxx:174
 AliDAJetFinder.cxx:175
 AliDAJetFinder.cxx:176
 AliDAJetFinder.cxx:177
 AliDAJetFinder.cxx:178
 AliDAJetFinder.cxx:179
 AliDAJetFinder.cxx:180
 AliDAJetFinder.cxx:181
 AliDAJetFinder.cxx:182
 AliDAJetFinder.cxx:183
 AliDAJetFinder.cxx:184
 AliDAJetFinder.cxx:185
 AliDAJetFinder.cxx:186
 AliDAJetFinder.cxx:187
 AliDAJetFinder.cxx:188
 AliDAJetFinder.cxx:189
 AliDAJetFinder.cxx:190
 AliDAJetFinder.cxx:191
 AliDAJetFinder.cxx:192
 AliDAJetFinder.cxx:193
 AliDAJetFinder.cxx:194
 AliDAJetFinder.cxx:195
 AliDAJetFinder.cxx:196
 AliDAJetFinder.cxx:197
 AliDAJetFinder.cxx:198
 AliDAJetFinder.cxx:199
 AliDAJetFinder.cxx:200
 AliDAJetFinder.cxx:201
 AliDAJetFinder.cxx:202
 AliDAJetFinder.cxx:203
 AliDAJetFinder.cxx:204
 AliDAJetFinder.cxx:205
 AliDAJetFinder.cxx:206
 AliDAJetFinder.cxx:207
 AliDAJetFinder.cxx:208
 AliDAJetFinder.cxx:209
 AliDAJetFinder.cxx:210
 AliDAJetFinder.cxx:211
 AliDAJetFinder.cxx:212
 AliDAJetFinder.cxx:213
 AliDAJetFinder.cxx:214
 AliDAJetFinder.cxx:215
 AliDAJetFinder.cxx:216
 AliDAJetFinder.cxx:217
 AliDAJetFinder.cxx:218
 AliDAJetFinder.cxx:219
 AliDAJetFinder.cxx:220
 AliDAJetFinder.cxx:221
 AliDAJetFinder.cxx:222
 AliDAJetFinder.cxx:223
 AliDAJetFinder.cxx:224
 AliDAJetFinder.cxx:225
 AliDAJetFinder.cxx:226
 AliDAJetFinder.cxx:227
 AliDAJetFinder.cxx:228
 AliDAJetFinder.cxx:229
 AliDAJetFinder.cxx:230
 AliDAJetFinder.cxx:231
 AliDAJetFinder.cxx:232
 AliDAJetFinder.cxx:233
 AliDAJetFinder.cxx:234
 AliDAJetFinder.cxx:235
 AliDAJetFinder.cxx:236
 AliDAJetFinder.cxx:237
 AliDAJetFinder.cxx:238
 AliDAJetFinder.cxx:239
 AliDAJetFinder.cxx:240
 AliDAJetFinder.cxx:241
 AliDAJetFinder.cxx:242
 AliDAJetFinder.cxx:243
 AliDAJetFinder.cxx:244
 AliDAJetFinder.cxx:245
 AliDAJetFinder.cxx:246
 AliDAJetFinder.cxx:247
 AliDAJetFinder.cxx:248
 AliDAJetFinder.cxx:249
 AliDAJetFinder.cxx:250
 AliDAJetFinder.cxx:251
 AliDAJetFinder.cxx:252
 AliDAJetFinder.cxx:253
 AliDAJetFinder.cxx:254
 AliDAJetFinder.cxx:255
 AliDAJetFinder.cxx:256
 AliDAJetFinder.cxx:257
 AliDAJetFinder.cxx:258
 AliDAJetFinder.cxx:259
 AliDAJetFinder.cxx:260
 AliDAJetFinder.cxx:261
 AliDAJetFinder.cxx:262
 AliDAJetFinder.cxx:263
 AliDAJetFinder.cxx:264
 AliDAJetFinder.cxx:265
 AliDAJetFinder.cxx:266
 AliDAJetFinder.cxx:267
 AliDAJetFinder.cxx:268
 AliDAJetFinder.cxx:269
 AliDAJetFinder.cxx:270
 AliDAJetFinder.cxx:271
 AliDAJetFinder.cxx:272
 AliDAJetFinder.cxx:273
 AliDAJetFinder.cxx:274
 AliDAJetFinder.cxx:275
 AliDAJetFinder.cxx:276
 AliDAJetFinder.cxx:277
 AliDAJetFinder.cxx:278
 AliDAJetFinder.cxx:279
 AliDAJetFinder.cxx:280
 AliDAJetFinder.cxx:281
 AliDAJetFinder.cxx:282
 AliDAJetFinder.cxx:283
 AliDAJetFinder.cxx:284
 AliDAJetFinder.cxx:285
 AliDAJetFinder.cxx:286
 AliDAJetFinder.cxx:287
 AliDAJetFinder.cxx:288
 AliDAJetFinder.cxx:289
 AliDAJetFinder.cxx:290
 AliDAJetFinder.cxx:291
 AliDAJetFinder.cxx:292
 AliDAJetFinder.cxx:293
 AliDAJetFinder.cxx:294
 AliDAJetFinder.cxx:295
 AliDAJetFinder.cxx:296
 AliDAJetFinder.cxx:297
 AliDAJetFinder.cxx:298
 AliDAJetFinder.cxx:299
 AliDAJetFinder.cxx:300
 AliDAJetFinder.cxx:301
 AliDAJetFinder.cxx:302
 AliDAJetFinder.cxx:303
 AliDAJetFinder.cxx:304
 AliDAJetFinder.cxx:305
 AliDAJetFinder.cxx:306
 AliDAJetFinder.cxx:307
 AliDAJetFinder.cxx:308
 AliDAJetFinder.cxx:309
 AliDAJetFinder.cxx:310
 AliDAJetFinder.cxx:311
 AliDAJetFinder.cxx:312
 AliDAJetFinder.cxx:313
 AliDAJetFinder.cxx:314
 AliDAJetFinder.cxx:315
 AliDAJetFinder.cxx:316
 AliDAJetFinder.cxx:317
 AliDAJetFinder.cxx:318
 AliDAJetFinder.cxx:319
 AliDAJetFinder.cxx:320
 AliDAJetFinder.cxx:321
 AliDAJetFinder.cxx:322
 AliDAJetFinder.cxx:323
 AliDAJetFinder.cxx:324
 AliDAJetFinder.cxx:325
 AliDAJetFinder.cxx:326
 AliDAJetFinder.cxx:327
 AliDAJetFinder.cxx:328
 AliDAJetFinder.cxx:329
 AliDAJetFinder.cxx:330
 AliDAJetFinder.cxx:331
 AliDAJetFinder.cxx:332
 AliDAJetFinder.cxx:333
 AliDAJetFinder.cxx:334
 AliDAJetFinder.cxx:335
 AliDAJetFinder.cxx:336
 AliDAJetFinder.cxx:337
 AliDAJetFinder.cxx:338
 AliDAJetFinder.cxx:339
 AliDAJetFinder.cxx:340
 AliDAJetFinder.cxx:341
 AliDAJetFinder.cxx:342
 AliDAJetFinder.cxx:343
 AliDAJetFinder.cxx:344
 AliDAJetFinder.cxx:345
 AliDAJetFinder.cxx:346
 AliDAJetFinder.cxx:347
 AliDAJetFinder.cxx:348
 AliDAJetFinder.cxx:349
 AliDAJetFinder.cxx:350
 AliDAJetFinder.cxx:351
 AliDAJetFinder.cxx:352
 AliDAJetFinder.cxx:353
 AliDAJetFinder.cxx:354
 AliDAJetFinder.cxx:355
 AliDAJetFinder.cxx:356
 AliDAJetFinder.cxx:357
 AliDAJetFinder.cxx:358
 AliDAJetFinder.cxx:359
 AliDAJetFinder.cxx:360
 AliDAJetFinder.cxx:361
 AliDAJetFinder.cxx:362
 AliDAJetFinder.cxx:363
 AliDAJetFinder.cxx:364
 AliDAJetFinder.cxx:365
 AliDAJetFinder.cxx:366
 AliDAJetFinder.cxx:367
 AliDAJetFinder.cxx:368
 AliDAJetFinder.cxx:369
 AliDAJetFinder.cxx:370
 AliDAJetFinder.cxx:371
 AliDAJetFinder.cxx:372
 AliDAJetFinder.cxx:373
 AliDAJetFinder.cxx:374
 AliDAJetFinder.cxx:375
 AliDAJetFinder.cxx:376
 AliDAJetFinder.cxx:377
 AliDAJetFinder.cxx:378
 AliDAJetFinder.cxx:379
 AliDAJetFinder.cxx:380
 AliDAJetFinder.cxx:381
 AliDAJetFinder.cxx:382
 AliDAJetFinder.cxx:383
 AliDAJetFinder.cxx:384
 AliDAJetFinder.cxx:385
 AliDAJetFinder.cxx:386
 AliDAJetFinder.cxx:387
 AliDAJetFinder.cxx:388
 AliDAJetFinder.cxx:389
 AliDAJetFinder.cxx:390
 AliDAJetFinder.cxx:391
 AliDAJetFinder.cxx:392
 AliDAJetFinder.cxx:393
 AliDAJetFinder.cxx:394
 AliDAJetFinder.cxx:395
 AliDAJetFinder.cxx:396
 AliDAJetFinder.cxx:397
 AliDAJetFinder.cxx:398
 AliDAJetFinder.cxx:399
 AliDAJetFinder.cxx:400
 AliDAJetFinder.cxx:401
 AliDAJetFinder.cxx:402
 AliDAJetFinder.cxx:403
 AliDAJetFinder.cxx:404
 AliDAJetFinder.cxx:405
 AliDAJetFinder.cxx:406
 AliDAJetFinder.cxx:407
 AliDAJetFinder.cxx:408
 AliDAJetFinder.cxx:409
 AliDAJetFinder.cxx:410
 AliDAJetFinder.cxx:411
 AliDAJetFinder.cxx:412
 AliDAJetFinder.cxx:413
 AliDAJetFinder.cxx:414
 AliDAJetFinder.cxx:415
 AliDAJetFinder.cxx:416
 AliDAJetFinder.cxx:417
 AliDAJetFinder.cxx:418
 AliDAJetFinder.cxx:419
 AliDAJetFinder.cxx:420
 AliDAJetFinder.cxx:421
 AliDAJetFinder.cxx:422
 AliDAJetFinder.cxx:423
 AliDAJetFinder.cxx:424
 AliDAJetFinder.cxx:425
 AliDAJetFinder.cxx:426
 AliDAJetFinder.cxx:427
 AliDAJetFinder.cxx:428
 AliDAJetFinder.cxx:429
 AliDAJetFinder.cxx:430
 AliDAJetFinder.cxx:431
 AliDAJetFinder.cxx:432
 AliDAJetFinder.cxx:433
 AliDAJetFinder.cxx:434
 AliDAJetFinder.cxx:435
 AliDAJetFinder.cxx:436
 AliDAJetFinder.cxx:437
 AliDAJetFinder.cxx:438
 AliDAJetFinder.cxx:439
 AliDAJetFinder.cxx:440
 AliDAJetFinder.cxx:441
 AliDAJetFinder.cxx:442
 AliDAJetFinder.cxx:443
 AliDAJetFinder.cxx:444
 AliDAJetFinder.cxx:445
 AliDAJetFinder.cxx:446
 AliDAJetFinder.cxx:447
 AliDAJetFinder.cxx:448
 AliDAJetFinder.cxx:449
 AliDAJetFinder.cxx:450
 AliDAJetFinder.cxx:451
 AliDAJetFinder.cxx:452
 AliDAJetFinder.cxx:453
 AliDAJetFinder.cxx:454
 AliDAJetFinder.cxx:455
 AliDAJetFinder.cxx:456
 AliDAJetFinder.cxx:457
 AliDAJetFinder.cxx:458
 AliDAJetFinder.cxx:459
 AliDAJetFinder.cxx:460
 AliDAJetFinder.cxx:461
 AliDAJetFinder.cxx:462
 AliDAJetFinder.cxx:463
 AliDAJetFinder.cxx:464
 AliDAJetFinder.cxx:465
 AliDAJetFinder.cxx:466
 AliDAJetFinder.cxx:467
 AliDAJetFinder.cxx:468
 AliDAJetFinder.cxx:469
 AliDAJetFinder.cxx:470
 AliDAJetFinder.cxx:471
 AliDAJetFinder.cxx:472
 AliDAJetFinder.cxx:473
 AliDAJetFinder.cxx:474
 AliDAJetFinder.cxx:475
 AliDAJetFinder.cxx:476
 AliDAJetFinder.cxx:477
 AliDAJetFinder.cxx:478
 AliDAJetFinder.cxx:479
 AliDAJetFinder.cxx:480
 AliDAJetFinder.cxx:481
 AliDAJetFinder.cxx:482
 AliDAJetFinder.cxx:483
 AliDAJetFinder.cxx:484
 AliDAJetFinder.cxx:485
 AliDAJetFinder.cxx:486
 AliDAJetFinder.cxx:487
 AliDAJetFinder.cxx:488
 AliDAJetFinder.cxx:489
 AliDAJetFinder.cxx:490
 AliDAJetFinder.cxx:491
 AliDAJetFinder.cxx:492
 AliDAJetFinder.cxx:493
 AliDAJetFinder.cxx:494
 AliDAJetFinder.cxx:495
 AliDAJetFinder.cxx:496
 AliDAJetFinder.cxx:497
 AliDAJetFinder.cxx:498
 AliDAJetFinder.cxx:499
 AliDAJetFinder.cxx:500
 AliDAJetFinder.cxx:501
 AliDAJetFinder.cxx:502
 AliDAJetFinder.cxx:503
 AliDAJetFinder.cxx:504
 AliDAJetFinder.cxx:505
 AliDAJetFinder.cxx:506
 AliDAJetFinder.cxx:507
 AliDAJetFinder.cxx:508
 AliDAJetFinder.cxx:509
 AliDAJetFinder.cxx:510
 AliDAJetFinder.cxx:511
 AliDAJetFinder.cxx:512
 AliDAJetFinder.cxx:513
 AliDAJetFinder.cxx:514
 AliDAJetFinder.cxx:515
 AliDAJetFinder.cxx:516
 AliDAJetFinder.cxx:517
 AliDAJetFinder.cxx:518
 AliDAJetFinder.cxx:519
 AliDAJetFinder.cxx:520
 AliDAJetFinder.cxx:521
 AliDAJetFinder.cxx:522
 AliDAJetFinder.cxx:523
 AliDAJetFinder.cxx:524
 AliDAJetFinder.cxx:525
 AliDAJetFinder.cxx:526
 AliDAJetFinder.cxx:527
 AliDAJetFinder.cxx:528
 AliDAJetFinder.cxx:529
 AliDAJetFinder.cxx:530
 AliDAJetFinder.cxx:531
 AliDAJetFinder.cxx:532
 AliDAJetFinder.cxx:533
 AliDAJetFinder.cxx:534
 AliDAJetFinder.cxx:535
 AliDAJetFinder.cxx:536
 AliDAJetFinder.cxx:537
 AliDAJetFinder.cxx:538
 AliDAJetFinder.cxx:539
 AliDAJetFinder.cxx:540
 AliDAJetFinder.cxx:541
 AliDAJetFinder.cxx:542
 AliDAJetFinder.cxx:543
 AliDAJetFinder.cxx:544
 AliDAJetFinder.cxx:545
 AliDAJetFinder.cxx:546