ROOT logo
/**************************************************************************
 * Copyright(c) 1998-2006, 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.                  *
 **************************************************************************/

/////////////////////////////////////////////////////////////
//
// Base class for AOD reconstructed decay
//
// Author: A.Dainese, andrea.dainese@lnl.infn.it
/////////////////////////////////////////////////////////////

#include <TDatabasePDG.h>
#include <TVector3.h>
#include <TClonesArray.h>
#include "AliLog.h"
#include "AliVTrack.h"
#include "AliExternalTrackParam.h"
#include "AliNeutralTrackParam.h"
#include "AliAODMCParticle.h"
#include "AliAODRecoDecay.h"

ClassImp(AliAODRecoDecay)

//--------------------------------------------------------------------------
AliAODRecoDecay::AliAODRecoDecay() :
  AliVTrack(),
  fSecondaryVtx(0x0),
  fOwnSecondaryVtx(0x0),
  fCharge(0),
  fNProngs(0), fNDCA(0), fNPID(0),
  fPx(0x0), fPy(0x0), fPz(0x0),
  fd0(0x0),
  fDCA(0x0),
  fPID(0x0), 
  fEventNumber(-1),fRunNumber(-1)
{
  //
  // Default Constructor
  //
}
//--------------------------------------------------------------------------
AliAODRecoDecay::AliAODRecoDecay(AliAODVertex *vtx2,Int_t nprongs,
				 Short_t charge,
				 Double_t *px,Double_t *py,Double_t *pz,
				 Double_t *d0) :
  AliVTrack(),
  fSecondaryVtx(vtx2),
  fOwnSecondaryVtx(0x0),
  fCharge(charge),
  fNProngs(nprongs), fNDCA(0), fNPID(0),
  fPx(0x0), fPy(0x0), fPz(0x0),
  fd0(0x0),
  fDCA(0x0),
  fPID(0x0), 
  fEventNumber(-1),fRunNumber(-1)
{
  //
  // Constructor with AliAODVertex for decay vertex
  //

  fPx = new Double_t[GetNProngs()];
  fPy = new Double_t[GetNProngs()];
  fPz = new Double_t[GetNProngs()];
  fd0 = new Double_t[GetNProngs()];
  for(Int_t i=0; i<GetNProngs(); i++) {
    fPx[i] = px[i];
    fPy[i] = py[i];
    fPz[i] = pz[i];
    fd0[i] = d0[i];
  }
}
//--------------------------------------------------------------------------
AliAODRecoDecay::AliAODRecoDecay(AliAODVertex *vtx2,Int_t nprongs,
				 Short_t charge,
				 Double_t *d0) :
  AliVTrack(),
  fSecondaryVtx(vtx2),
  fOwnSecondaryVtx(0x0),
  fCharge(charge),
  fNProngs(nprongs), fNDCA(0), fNPID(0),
  fPx(0x0), fPy(0x0), fPz(0x0),
  fd0(0x0),
  fDCA(0x0),
  fPID(0x0), 
  fEventNumber(-1),fRunNumber(-1)
{
  //
  // Constructor with AliAODVertex for decay vertex and without prongs momenta
  //

  fd0 = new Double_t[GetNProngs()];
  for(Int_t i=0; i<GetNProngs(); i++) fd0[i] = d0[i];
}
//--------------------------------------------------------------------------
AliAODRecoDecay::AliAODRecoDecay(const AliAODRecoDecay &source) :
  AliVTrack(source),
  fSecondaryVtx(source.fSecondaryVtx),
  fOwnSecondaryVtx(source.fOwnSecondaryVtx),
  fCharge(source.fCharge),
  fNProngs(source.fNProngs), fNDCA(source.fNDCA), fNPID(source.fNPID),
  fPx(0x0), fPy(0x0), fPz(0x0),
  fd0(0x0), 
  fDCA(0x0),
  fPID(0x0), 
  fEventNumber(source.fEventNumber),fRunNumber(source.fRunNumber)
{
  //
  // Copy constructor
  //
  if(source.GetNProngs()>0) {
    fd0 = new Double32_t[GetNProngs()];
    memcpy(fd0,source.fd0,GetNProngs()*sizeof(Double32_t));
    if(source.fPx) {
      fPx = new Double32_t[GetNProngs()];
      fPy = new Double32_t[GetNProngs()];
      fPz = new Double32_t[GetNProngs()];
      memcpy(fPx,source.fPx,GetNProngs()*sizeof(Double32_t));
      memcpy(fPy,source.fPy,GetNProngs()*sizeof(Double32_t));
      memcpy(fPz,source.fPz,GetNProngs()*sizeof(Double32_t));
    }
    if(source.fPID) {
      fPID = new Double32_t[fNPID];
      memcpy(fPID,source.fPID,fNPID*sizeof(Double32_t));
    }
    if(source.fDCA) {
      fDCA = new Double32_t[fNDCA];
      memcpy(fDCA,source.fDCA,fNDCA*sizeof(Double32_t));
    }
  }
}
//--------------------------------------------------------------------------
AliAODRecoDecay &AliAODRecoDecay::operator=(const AliAODRecoDecay &source)
{
  //
  // assignment operator
  //
  if(&source == this) return *this;
  fSecondaryVtx = source.fSecondaryVtx;
  fOwnSecondaryVtx = source.fOwnSecondaryVtx;
  fCharge = source.fCharge;
  fNProngs = source.fNProngs;
  fNDCA = source.fNDCA;
  fNPID = source.fNPID;
  fEventNumber = source.fEventNumber;
  fRunNumber = source.fRunNumber;
  if(source.GetNProngs()>0) {
    if(fd0)delete [] fd0; 
    fd0 = new Double32_t[GetNProngs()];
    memcpy(fd0,source.fd0,GetNProngs()*sizeof(Double32_t));
    if(source.fPx) {
      if(fPx) delete [] fPx; 
      fPx = new Double32_t[GetNProngs()];
      if(fPy) delete [] fPy; 
      fPy = new Double32_t[GetNProngs()];
      if(fPz) delete [] fPz; 
      fPz = new Double32_t[GetNProngs()];
      memcpy(fPx,source.fPx,GetNProngs()*sizeof(Double32_t));
      memcpy(fPy,source.fPy,GetNProngs()*sizeof(Double32_t));
      memcpy(fPz,source.fPz,GetNProngs()*sizeof(Double32_t));
    }
    if(source.fPID) {
      if(fPID) delete [] fPID; 
      fPID = new Double32_t[fNPID];
      memcpy(fPID,source.fPID,fNPID*sizeof(Double32_t));
    }
    if(source.fDCA) {
      if(fDCA) delete [] fDCA; 
      fDCA = new Double32_t[fNDCA];
      memcpy(fDCA,source.fDCA,fNDCA*sizeof(Double32_t));
    }
  }
  return *this;
}
//--------------------------------------------------------------------------
AliAODRecoDecay::~AliAODRecoDecay() {
  //  
  // Default Destructor
  //
  if(fPx) { delete [] fPx; fPx=NULL; } 
  if(fPy) { delete [] fPy; fPy=NULL; }
  if(fPz) { delete [] fPz; fPz=NULL; }
  if(fd0) { delete [] fd0; fd0=NULL; }
  if(fPID) { delete [] fPID; fPID=NULL; }
  if(fDCA) { delete [] fDCA; fDCA=NULL; }
  if(fOwnSecondaryVtx) { delete fOwnSecondaryVtx; fOwnSecondaryVtx=NULL; }
}
//----------------------------------------------------------------------------
Double_t AliAODRecoDecay::Alpha() const 
{
  //
  // Armenteros-Podolanski alpha for 2-prong decays
  //
  if(GetNProngs()!=2) {
    printf("Can be called only for 2-prong decays");
    return (Double_t)-99999.;
  }
  return 1.-2./(1.+QlProng(0)/QlProng(1));
}
//----------------------------------------------------------------------------
Double_t AliAODRecoDecay::DecayLength2(Double_t point[3]) const 
{
  //
  // Decay length assuming it is produced at "point" [cm]
  //
  return (point[0]-GetSecVtxX())
    *(point[0]-GetSecVtxX())
    +(point[1]-GetSecVtxY())
    *(point[1]-GetSecVtxY())
    +(point[2]-GetSecVtxZ())
    *(point[2]-GetSecVtxZ());  
}
//----------------------------------------------------------------------------
Double_t AliAODRecoDecay::DecayLengthXY(Double_t point[3]) const 
{
  //
  // Decay length in XY assuming it is produced at "point" [cm]
  //
  return TMath::Sqrt((point[0]-GetSecVtxX())
		    *(point[0]-GetSecVtxX())
		    +(point[1]-GetSecVtxY())
		    *(point[1]-GetSecVtxY()));  
}
//----------------------------------------------------------------------------
Double_t AliAODRecoDecay::CosPointingAngle(Double_t point[3]) const 
{
  //
  // Cosine of pointing angle in space assuming it is produced at "point"
  //
  TVector3 mom(Px(),Py(),Pz());
  TVector3 fline(GetSecVtxX()-point[0],
		 GetSecVtxY()-point[1],
		 GetSecVtxZ()-point[2]);

  Double_t ptot2 = mom.Mag2()*fline.Mag2();
  if(ptot2 <= 0) {
    return 0.0;
  } else {
    Double_t cos = mom.Dot(fline)/TMath::Sqrt(ptot2);
    if(cos >  1.0) cos =  1.0;
    if(cos < -1.0) cos = -1.0;
    return cos;
  }
}
//----------------------------------------------------------------------------
Double_t AliAODRecoDecay::CosPointingAngleXY(Double_t point[3]) const 
{
  //
  // Cosine of pointing angle in transverse plane assuming it is produced 
  // at "point"
  //
  TVector3 momXY(Px(),Py(),0.);
  TVector3 flineXY(GetSecVtxX()-point[0],
		   GetSecVtxY()-point[1],
		   0.);

  Double_t ptot2 = momXY.Mag2()*flineXY.Mag2();
  if(ptot2 <= 0) {
    return 0.0;
  } else {
    Double_t cos = momXY.Dot(flineXY)/TMath::Sqrt(ptot2);
    if(cos >  1.0) cos =  1.0;
    if(cos < -1.0) cos = -1.0;
    return cos;
  }
}
//----------------------------------------------------------------------------
Double_t AliAODRecoDecay::CosThetaStar(Int_t ip,UInt_t pdgvtx,UInt_t pdgprong0,UInt_t pdgprong1) const 
{
  //
  // Only for 2-prong decays: 
  // Cosine of decay angle (theta*) in the rest frame of the mother particle
  // for prong ip (0 or 1) with mass hypotheses pdgvtx for mother particle,
  // pdgprong0 for prong 0 and pdgprong1 for prong1
  //
  if(GetNProngs()!=2) {
    printf("Can be called only for 2-prong decays");
    return (Double_t)-99999.;
  }
  Double_t massvtx = TDatabasePDG::Instance()->GetParticle(pdgvtx)->Mass();
  Double_t massp[2];
  massp[0] = TDatabasePDG::Instance()->GetParticle(pdgprong0)->Mass();
  massp[1] = TDatabasePDG::Instance()->GetParticle(pdgprong1)->Mass();

  Double_t pStar = TMath::Sqrt((massvtx*massvtx-massp[0]*massp[0]-massp[1]*massp[1])*(massvtx*massvtx-massp[0]*massp[0]-massp[1]*massp[1])-4.*massp[0]*massp[0]*massp[1]*massp[1])/(2.*massvtx);

  Double_t e=E(pdgvtx);
  Double_t beta = P()/e;
  Double_t gamma = e/massvtx;

  Double_t cts = (QlProng(ip)/gamma-beta*TMath::Sqrt(pStar*pStar+massp[ip]*massp[ip]))/pStar;

  return cts;
}
//---------------------------------------------------------------------------
Double_t AliAODRecoDecay::Ct(UInt_t pdg,Double_t point[3]) const
{
  //
  // Decay time * c assuming it is produced at "point" [cm]
  //
  Double_t mass = TDatabasePDG::Instance()->GetParticle(pdg)->Mass();
  return DecayLength(point)*mass/P();
}
//---------------------------------------------------------------------------
Double_t AliAODRecoDecay::E2(UInt_t pdg) const 
{
  //
  // Energy
  //
  Double_t mass = TDatabasePDG::Instance()->GetParticle(pdg)->Mass();
  return mass*mass+P2();
}
//---------------------------------------------------------------------------
Double_t AliAODRecoDecay::E2Prong(Int_t ip,UInt_t pdg) const 
{
  //
  // Energy of ip-th prong 
  //
  Double_t mass = TDatabasePDG::Instance()->GetParticle(pdg)->Mass();
  return mass*mass+P2Prong(ip);
}
//--------------------------------------------------------------------------
Bool_t AliAODRecoDecay::GetCovarianceXYZPxPyPz(Double_t cv[21]) const {
  //
  // This function returns the global covariance matrix of the track params
  // 
  // Cov(x,x) ... :   cv[0]
  // Cov(y,x) ... :   cv[1]  cv[2]
  // Cov(z,x) ... :   cv[3]  cv[4]  cv[5]
  // Cov(px,x)... :   cv[6]  cv[7]  cv[8]  cv[9]
  // Cov(py,x)... :   cv[10] cv[11] cv[12] cv[13] cv[14]
  // Cov(pz,x)... :   cv[15] cv[16] cv[17] cv[18] cv[19] cv[20]
  //
  // For XYZ we take the cov of the vertex, for PxPyPz we take the 
  // sum of the covs of PxPyPz from the daughters, for the moment 
  // we set the cov between position and momentum as the sum of 
  // the same cov from the daughters.
  //

  Int_t j;
  for(j=0;j<21;j++) cv[j]=0.;

  if(!GetNDaughters()) {
    AliError("No daughters available");
    return kFALSE;
  }

  Double_t v[6];
  AliAODVertex *secv=GetSecondaryVtx();
  if(!secv) {
    AliError("Vertex covariance matrix not available");
    return kFALSE;
  }
  if(!secv->GetCovMatrix(v)) {
    AliError("Vertex covariance matrix not available");
    return kFALSE;
  }

  Double_t p[21]; for(j=0;j<21;j++) p[j]=0.;
  Bool_t error=kFALSE;
  for(Int_t i=1; i<GetNDaughters(); i++) {
    AliVTrack *daugh = (AliVTrack*)GetDaughter(i);
    Double_t dcov[21];
    if(!daugh->GetCovarianceXYZPxPyPz(dcov)) error=kTRUE;
    for(j=0;j<21;j++) p[j] += dcov[j];
  }
  if(error) {
    AliError("No covariance for at least one daughter");
    return kFALSE;
  }

  for(j=0; j<21; j++) {
    if(j<6) {
      cv[j] = v[j];
    } else {
      cv[j] = p[j];
    }
  }

  return kTRUE;
}
//----------------------------------------------------------------------------
UChar_t  AliAODRecoDecay::GetITSClusterMap() const {
  //
  // We take the logical AND of the daughters cluster maps 
  // (only if all daughters have the bit for given layer, we set the bit)
  //
  UChar_t map=0;

  if(!GetNDaughters()) {
    AliError("No daughters available");
    return map;
  }

  for(Int_t l=0; l<12; l++) { // loop on ITS layers (from here we cannot know how many they are; let's put 12 to be conservative)
    Int_t bit = 1;
    for(Int_t i=0; i<GetNDaughters(); i++) {
      AliVTrack *daugh = (AliVTrack*)GetDaughter(i);
      if(!TESTBIT(daugh->GetITSClusterMap(),l)) bit=0; 
    }
    if(bit) SETBIT(map,l);
  }

  return map;
}
//--------------------------------------------------------------------------
ULong_t AliAODRecoDecay::GetStatus() const {
  // 
  // Same as for ITSClusterMap
  //
  ULong_t status=0;

  if(!GetNDaughters()) {
    AliError("No daughters available");
    return status;
  }

  AliVTrack *daugh0 = (AliVTrack*)GetDaughter(0);
  status = status&(daugh0->GetStatus());

  for(Int_t i=1; i<GetNDaughters(); i++) {
    AliVTrack *daugh = (AliVTrack*)GetDaughter(i);
    status = status&(daugh->GetStatus());
  }

  return status;
}
//--------------------------------------------------------------------------
Bool_t AliAODRecoDecay::PropagateToDCA(const AliVVertex* vtx,Double_t b,Double_t maxd,Double_t dz[2],Double_t covar[3]) 
{
  // compute impact parameters to the vertex vtx and their covariance matrix
  // b is the Bz, needed to propagate correctly the track to vertex 
  // return kFALSE is something went wrong

  AliWarning("The AliAODRecoDecay momentum is not updated to the DCA");

  Bool_t retval=kTRUE;
  if(Charge()==0) {
    // convert to AliNeutralTrackParam
    AliNeutralTrackParam ntp(this);  
    retval = ntp.PropagateToDCA(vtx,b,maxd,dz,covar);
  } else {
    // convert to AliExternalTrackParam
    AliExternalTrackParam etp; etp.CopyFromVTrack(this);  
    retval = etp.PropagateToDCA(vtx,b,maxd,dz,covar);
  }
  return retval;
}
//--------------------------------------------------------------------------
Double_t AliAODRecoDecay::ImpParXY(Double_t point[3]) const 
{
  //
  // Impact parameter in the bending plane of the particle 
  // w.r.t. to "point"
  //
  Double_t k = -(GetSecVtxX()-point[0])*Px()-(GetSecVtxY()-point[1])*Py();
  k /= Pt()*Pt();
  Double_t dx = GetSecVtxX()-point[0]+k*Px();
  Double_t dy = GetSecVtxY()-point[1]+k*Py();
  Double_t absImpPar = TMath::Sqrt(dx*dx+dy*dy);
  TVector3 mom(Px(),Py(),Pz());
  TVector3 fline(GetSecVtxX()-point[0],
		 GetSecVtxY()-point[1],
		 GetSecVtxZ()-point[2]);
  TVector3 cross = mom.Cross(fline);
  return (cross.Z()>0. ? absImpPar : -absImpPar);
}
//----------------------------------------------------------------------------
Double_t AliAODRecoDecay::InvMass2(Int_t npdg,UInt_t *pdg) const 
{
  //
  // Invariant mass for prongs mass hypotheses in pdg array
  //
  if(GetNProngs()!=npdg) {
    printf("npdg != GetNProngs()");
    return (Double_t)-99999.;
  }
  Double_t energysum = 0.;

  for(Int_t i=0; i<GetNProngs(); i++) {
    energysum += EProng(i,pdg[i]);
  }

  Double_t mass2 = energysum*energysum-P2();

  return mass2;
}
//----------------------------------------------------------------------------
Bool_t AliAODRecoDecay::PassInvMassCut(Int_t pdgMom,Int_t npdgDg,UInt_t *pdgDg,Double_t cut) const {
  //
  // Apply mass cut
  //

  Double_t invmass2=InvMass2(npdgDg,pdgDg);
  Double_t massMom=TDatabasePDG::Instance()->GetParticle(pdgMom)->Mass();
  Double_t massMom2 = massMom*massMom;
  Double_t cut2= cut*cut;


  if(invmass2 > massMom2) {
    if(invmass2 < cut2 + massMom2 + 2.*cut*massMom) return kTRUE;
  } else {
    if(invmass2 > cut2 + massMom2 - 2.*cut*massMom) return kTRUE;
  }

   return kFALSE;
}
//----------------------------------------------------------------------------
Double_t AliAODRecoDecay::InvMass2Prongs(Int_t ip1,Int_t ip2,
				      UInt_t pdg1,UInt_t pdg2) const 
{
  //
  // 2-prong(ip1,ip2) invariant mass for prongs mass hypotheses in pdg1,2
  //
  Double_t energysum = EProng(ip1,pdg1) + EProng(ip2,pdg2);
  Double_t psum2 = (PxProng(ip1)+PxProng(ip2))*(PxProng(ip1)+PxProng(ip2))
                  +(PyProng(ip1)+PyProng(ip2))*(PyProng(ip1)+PyProng(ip2))
                  +(PzProng(ip1)+PzProng(ip2))*(PzProng(ip1)+PzProng(ip2));
  Double_t mass = TMath::Sqrt(energysum*energysum-psum2);

  return mass;
}
//----------------------------------------------------------------------------
Int_t AliAODRecoDecay::MatchToMC(Int_t pdgabs, TClonesArray *mcArray,
				 Int_t ndgCk, const Int_t *pdgDg) const
{
  //
  // Check if this candidate is matched to a MC signal
  // If no, return -1
  // If yes, return label (>=0) of the AliAODMCParticle
  // 
  // if ndgCk>0, checks also daughters PDGs
  //
  Int_t ndg=GetNDaughters();
  if(!ndg) {
    AliError("No daughters available");
    return -1;
  }
  if(ndg>10) {
    AliError("Only decays with <10 daughters supported");
    return -1;
  }
  if(ndgCk>0 && ndgCk!=ndg) {
    AliError("Wrong number of daughter PDGs passed");
    return -1;
  }
  
  Int_t dgLabels[10] = {0};

  // loop on daughters and write the labels
  for(Int_t i=0; i<ndg; i++) {
    AliAODTrack *trk = (AliAODTrack*)GetDaughter(i);
    dgLabels[i] = trk->GetLabel();
  }

  return MatchToMC(pdgabs,mcArray,dgLabels,ndg,ndgCk,pdgDg);
}
//----------------------------------------------------------------------------
Int_t AliAODRecoDecay::MatchToMC(Int_t pdgabs,TClonesArray *mcArray,
				 Int_t dgLabels[10],Int_t ndg,
				 Int_t ndgCk, const Int_t *pdgDg) const
{
  //
  // Check if this candidate is matched to a MC signal
  // If no, return -1
  // If yes, return label (>=0) of the AliAODMCParticle
  // 

  Int_t labMom[10]={0,0,0,0,0,0,0,0,0,0};
  Int_t i,j,lab,labMother,pdgMother,pdgPart;
  AliAODMCParticle *part=0;
  AliAODMCParticle *mother=0;
  Double_t pxSumDgs=0.,pySumDgs=0.,pzSumDgs=0.;
  Bool_t pdgUsed[10]={kFALSE,kFALSE,kFALSE,kFALSE,kFALSE,kFALSE,kFALSE,kFALSE,kFALSE,kFALSE};

  // loop on daughter labels
  for(i=0; i<ndg; i++) {
    labMom[i]=-1;
    lab = TMath::Abs(dgLabels[i]);
    if(lab<0) {
      printf("daughter with negative label %d\n",lab);
      return -1;
    }
    part = (AliAODMCParticle*)mcArray->At(lab);
    if(!part) { 
      printf("no MC particle\n");
      return -1;
    }

    // check the PDG of the daughter, if requested
    if(ndgCk>0) {
      pdgPart=TMath::Abs(part->GetPdgCode());
      for(j=0; j<ndg; j++) {
	if(!pdgUsed[j] && pdgPart==pdgDg[j]) {
	  pdgUsed[j]=kTRUE;
	  break;
	}
      }
    }

    // for the J/psi, check that the daughters are electrons
    if(pdgabs==443) {
      if(TMath::Abs(part->GetPdgCode())!=11) return -1;
    }

    mother = part;
    while(mother->GetMother()>=0) {
      labMother=mother->GetMother();
      mother = (AliAODMCParticle*)mcArray->At(labMother);
      if(!mother) {
	printf("no MC mother particle\n");
	break;
      }
      pdgMother = TMath::Abs(mother->GetPdgCode());
      if(pdgMother==pdgabs) {
	labMom[i]=labMother;
	// keep sum of daughters' momenta, to check for mom conservation
	pxSumDgs += part->Px();
	pySumDgs += part->Py();
	pzSumDgs += part->Pz();
	break;
      } else if(pdgMother>pdgabs || pdgMother<10) {
	break;
      }
    }
    if(labMom[i]==-1) return -1; // mother PDG not ok for this daughter
  } // end loop on daughters

  // check if the candidate is signal
  labMother=labMom[0];
  // all labels have to be the same and !=-1
  for(i=0; i<ndg; i++) {
    if(labMom[i]==-1)        return -1;
    if(labMom[i]!=labMother) return -1;
  }

  // check that all daughter PDGs are matched
  if(ndgCk>0) {
    for(i=0; i<ndg; i++) {
      if(pdgUsed[i]==kFALSE) return -1;
    }
  }
  
  /*
  // check that the mother decayed in <GetNDaughters()> prongs
  Int_t ndg2 = TMath::Abs(mother->GetDaughter(1)-mother->GetDaughter(0))+1;
  printf("  MC daughters %d\n",ndg2);
  //if(ndg!=GetNDaughters()) return -1;
  AliAODMCParticle* p1=(AliAODMCParticle*)(mcArray->At(mother->GetDaughter(1)));
  AliAODMCParticle* p0=(AliAODMCParticle*)(mcArray->At(mother->GetDaughter(0)));
  printf(">>>>>>>> pdg %d  %d %d %d   %d %d\n",mother->GetDaughter(0),mother->GetDaughter(1),dgLabels[0],dgLabels[1],p0->GetPdgCode(),p1->GetPdgCode());
  */

  // the above works only for non-resonant decays,
  // it's better to check for mom conservation
  mother = (AliAODMCParticle*)mcArray->At(labMother);
  Double_t pxMother = mother->Px();
  Double_t pyMother = mother->Py();
  Double_t pzMother = mother->Pz();
  // within 0.1%
  if((TMath::Abs(pxMother-pxSumDgs)/(TMath::Abs(pxMother)+1.e-13)) > 0.00001 &&
     (TMath::Abs(pyMother-pySumDgs)/(TMath::Abs(pyMother)+1.e-13)) > 0.00001 &&
     (TMath::Abs(pzMother-pzSumDgs)/(TMath::Abs(pzMother)+1.e-13)) > 0.00001) 
    return -1;
 
  return labMother;
}
//---------------------------------------------------------------------------
void AliAODRecoDecay::Print(Option_t* /*option*/) const 
{
  //
  // Print some information
  //
  printf("AliAODRecoDecay with %d prongs\n",GetNProngs());
  printf("Secondary Vertex: (%f, %f, %f)\n",GetSecVtxX(),GetSecVtxY(),GetSecVtxZ());

  return;
}
//----------------------------------------------------------------------------
Double_t AliAODRecoDecay::ProngsRelAngle(Int_t ip1,Int_t ip2) const 
{
  //
  // Relative angle between two prongs
  //
  TVector3 momA(PxProng(ip1),PyProng(ip1),PzProng(ip1));
  TVector3 momB(PxProng(ip2),PyProng(ip2),PzProng(ip2));

  Double_t angle = momA.Angle(momB);

  return angle; 
}
//----------------------------------------------------------------------------
Double_t AliAODRecoDecay::QlProng(Int_t ip) const 
{
  //
  // Longitudinal momentum of prong w.r.t. to total momentum
  //
  TVector3 mom(PxProng(ip),PyProng(ip),PzProng(ip));
  TVector3 momTot(Px(),Py(),Pz());

  return mom.Dot(momTot)/momTot.Mag();
}
//----------------------------------------------------------------------------
Double_t AliAODRecoDecay::QtProng(Int_t ip) const 
{
  //
  // Transverse momentum of prong w.r.t. to total momentum  
  //
  TVector3 mom(PxProng(ip),PyProng(ip),PzProng(ip));
  TVector3 momTot(Px(),Py(),Pz());

  return mom.Perp(momTot);
}
//----------------------------------------------------------------------------
Double_t AliAODRecoDecay::QlProngFlightLine(Int_t ip,Double_t point[3]) const 
{
  //
  // Longitudinal momentum of prong w.r.t. to flight line between "point"
  // and fSecondaryVtx
  //
  TVector3 mom(PxProng(ip),PyProng(ip),PzProng(ip));
  TVector3 fline(GetSecVtxX()-point[0],
		 GetSecVtxY()-point[1],
		 GetSecVtxZ()-point[2]);

  return mom.Dot(fline)/fline.Mag();
}
//----------------------------------------------------------------------------
Double_t AliAODRecoDecay::QtProngFlightLine(Int_t ip,Double_t point[3]) const 
{
  //
  // Transverse momentum of prong w.r.t. to flight line between "point" and 
  // fSecondaryVtx 
  //
  TVector3 mom(PxProng(ip),PyProng(ip),PzProng(ip));
  TVector3 fline(GetSecVtxX()-point[0],
		 GetSecVtxY()-point[1],
		 GetSecVtxZ()-point[2]);

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