ROOT logo
#ifndef ALIAODRECODECAYLF_H
#define ALIAODRECODECAYLF_H
/* Copyright(c) 1998-2006, ALICE Experiment at CERN, All rights reserved. *
 * See cxx source for full Copyright notice                               */

/* $Id$ */ 

//***********************************************************
// Class AliAODRecoDecayLF
// base class for AOD reconstructed light-flavour decays
// strongly based on AliAODRecoDecayHF by A.Dainese, andrea.dainese@lnl.infn.it
// Author: Ramona Lea (ramona.lea@cern.ch)
//***********************************************************

#include <TRef.h>
#include <TList.h>
#include "AliAODTrack.h"
#include "AliAODRecoDecay.h"

class AliAODEvent;
class AliKFParticle;

class AliAODRecoDecayLF : public AliAODRecoDecay {

 public:

  AliAODRecoDecayLF();
  AliAODRecoDecayLF(AliAODVertex *vtx2,Int_t nprongs,Short_t charge,
		    Double_t *px,Double_t *py,Double_t *pz,
		    Double_t *d0,Double_t *d0err);
  AliAODRecoDecayLF(AliAODVertex *vtx2,Int_t nprongs,Short_t charge,
		    Double_t *d0,Double_t *d0err);
  AliAODRecoDecayLF(Double_t vtx1[3],Double_t vtx2[3],
		    Int_t nprongs,Short_t charge,
		    Double_t *px,Double_t *py,Double_t *pz,Double_t *d0);
  virtual ~AliAODRecoDecayLF();

  AliAODRecoDecayLF(const AliAODRecoDecayLF& source);
  AliAODRecoDecayLF& operator=(const AliAODRecoDecayLF& source); 
   

  // primary vertex
  void SetPrimaryVtxRef(TObject *vtx) { fEventPrimaryVtx = vtx; }
  AliAODVertex* GetPrimaryVtxRef() const { return (AliAODVertex*)(fEventPrimaryVtx.GetObject()); }
  void SetOwnPrimaryVtx(const AliAODVertex *vtx) { UnsetOwnPrimaryVtx(); fOwnPrimaryVtx = new AliAODVertex(*vtx);}
  void CheckOwnPrimaryVtx() const 
    {if(!fOwnPrimaryVtx) printf("fOwnPrimaryVtx not set"); return;}
  AliAODVertex* GetOwnPrimaryVtx() const {return fOwnPrimaryVtx;}
  void GetOwnPrimaryVtx(Double_t vtx[3]) const 
    {CheckOwnPrimaryVtx();fOwnPrimaryVtx->GetPosition(vtx);}
  void UnsetOwnPrimaryVtx() {if(fOwnPrimaryVtx) {delete fOwnPrimaryVtx; fOwnPrimaryVtx=0;} return;}
  AliAODVertex* GetPrimaryVtx() const { return (GetOwnPrimaryVtx() ? GetOwnPrimaryVtx() : GetPrimaryVtxRef()); }
  AliAODVertex* RemoveDaughtersFromPrimaryVtx(AliAODEvent *aod);  
  void          RecalculateImpPars(AliAODVertex *vtxAODNew,AliAODEvent *aod);


  // kinematics & topology
  Double_t DecayLength2() const 
    { return AliAODRecoDecay::DecayLength2(GetPrimaryVtx());}
  Double_t DecayLength() const 
    { return AliAODRecoDecay::DecayLength(GetPrimaryVtx());}
  Double_t DecayLengthError() const 
    { return AliAODRecoDecay::DecayLengthError(GetPrimaryVtx());}
  Double_t NormalizedDecayLength() const 
    { return AliAODRecoDecay::NormalizedDecayLength(GetPrimaryVtx());}
  Double_t NormalizedDecayLength2() const 
    { return AliAODRecoDecay::NormalizedDecayLength2(GetPrimaryVtx());}
  Double_t DecayLengthXY() const 
    { return AliAODRecoDecay::DecayLengthXY(GetPrimaryVtx());}
  Double_t DecayLengthXYError() const 
    { return AliAODRecoDecay::DecayLengthXYError(GetPrimaryVtx());}
  Double_t NormalizedDecayLengthXY() const 
    { return AliAODRecoDecay::NormalizedDecayLengthXY(GetPrimaryVtx());}
  Double_t Ct(UInt_t pdg) const 
    { return AliAODRecoDecay::Ct(pdg,GetPrimaryVtx());}
  Double_t CosPointingAngle() const 
    { return AliAODRecoDecay::CosPointingAngle(GetPrimaryVtx());}
  Double_t CosPointingAngleXY() const 
    { return AliAODRecoDecay::CosPointingAngleXY(GetPrimaryVtx());}
  Double_t ImpParXY() const 
    { return AliAODRecoDecay::ImpParXY(GetPrimaryVtx());}
  Double_t QtProngFlightLine(Int_t ip) const 
    { return AliAODRecoDecay::QtProngFlightLine(ip,GetPrimaryVtx());}
  Double_t QlProngFlightLine(Int_t ip) const 
    { return AliAODRecoDecay::QlProngFlightLine(ip,GetPrimaryVtx());}

  // prongs
  Double_t Getd0errProng(Int_t ip) const {return fd0err[ip];}
  void     Setd0errProngs(Int_t nprongs,Double_t *d0);
  Double_t Normalizedd0Prong(Int_t ip) const 
    {return Getd0Prong(ip)/Getd0errProng(ip);}
  
  void SetProngIDs(Int_t nIDs,UShort_t *id);
  UShort_t GetProngID(Int_t ip) const 
    {if(fProngID) {return fProngID[ip];} else {return 9999;}}

  // ITS clustermap for daughters
  Bool_t DaughterHasPointOnITSLayer(Int_t dg,Int_t l) const;

  // check if it is like-sign
  Bool_t IsLikeSign() const;

  // list of cuts
  /* void SetListOfCutsRef(TObject *obj) {fListOfCuts=obj;} */
  /* TList *GetListOfCuts() const {return (TList*)(fListOfCuts.GetObject());} */
  /* AliRDLFCuts *GetCuts(const char* name) const; */

  // vertexing KF:
  AliKFParticle *ApplyVertexingKF(Int_t *iprongs,Int_t nprongs,Int_t *pdgs,
				 Bool_t topoCostraint,Double_t bzkG,
				 Double_t *mass) const;
  
  // misalign
  void Misalign(TString misal="null");

  // selection map
  void    SetSelectionBit(Int_t i) {SETBIT(fSelectionMap,i); return;}
  Bool_t  HasSelectionBit(Int_t i) const {return TESTBIT(fSelectionMap,i);}
  ULong_t GetSelectionMap() const {return fSelectionMap;}

  Int_t   NumberOfFakeDaughters() const;

  Bool_t  HasBadDaughters() const; // TPC+ITS tracks not passing the StandardCuts2010 with loose DCA

 protected:

  AliAODVertex *fOwnPrimaryVtx; // primary vertex for this candidate
  TRef          fEventPrimaryVtx; // ref to primary vertex of the event
  TRef          fListOfCuts;  // ref to the list of analysis cuts
  Double_t     *fd0err;  //[fNProngs] error on prongs rphi impact param [cm]
  UShort_t     *fProngID;  //[fNProngs] track ID of daughters
  ULong_t       fSelectionMap; // used to store outcome of selection in AliAnalysisVertexingLF

  ClassDef(AliAODRecoDecayLF,5)  // base class for AOD reconstructed heavy-flavour decays
};

inline void AliAODRecoDecayLF::SetProngIDs(Int_t nIDs,UShort_t *id) 
{
  if(nIDs!=GetNProngs()) { 
    printf("Wrong number of IDs, must be nProngs\n");
    return;
  }
  if(fProngID) delete [] fProngID;
  fProngID = new UShort_t[nIDs];
  for(Int_t i=0;i<nIDs;i++) 
    fProngID[i] = id[i]; 
  return;
}

inline Bool_t AliAODRecoDecayLF::IsLikeSign() const
{
  // check if it is like-sign

  Int_t ndg=GetNDaughters();
  if(!ndg) {
    printf("Daughters not available\n");
    return kFALSE;
  }
  Int_t chargeDg0 = ((AliAODTrack*)GetDaughter(0))->Charge();

  for(Int_t i=1; i<ndg; i++) {
    if(chargeDg0!=((AliAODTrack*)GetDaughter(i))->Charge()) return kFALSE;
  }

  return kTRUE;
}

inline Bool_t AliAODRecoDecayLF::DaughterHasPointOnITSLayer(Int_t dg,Int_t l) const
{
  // ITS clustermap for daughters

  if(l<0 || l>5) {
    printf("ERROR: layer has to be in the range 0-5\n");
    return kFALSE;
  }
  AliAODTrack *t = (AliAODTrack*)GetDaughter(dg);
  if(!t) return kFALSE;

  return TESTBIT(t->GetITSClusterMap(),l);
}

inline Int_t AliAODRecoDecayLF::NumberOfFakeDaughters() const 
{
  // Count number of daughters with negative label

  Int_t nfakes=0;
  for(Int_t i=0; i<GetNDaughters(); i++) {
    AliAODTrack *track=(AliAODTrack*)GetDaughter(i);

    if(track->Charge()==0) { // this is a two prong decay
      AliAODRecoDecay *rd=(AliAODRecoDecay*)GetDaughter(i);
      for(Int_t j=0; j<rd->GetNDaughters(); j++) {
	AliAODTrack *track2=(AliAODTrack*)GetDaughter(j);
	if(track2->GetLabel()<0) nfakes++;
      }
      continue;
    }

    if(track->GetLabel()<0) nfakes++;
  }
  return nfakes;
}

inline void AliAODRecoDecayLF::Setd0errProngs(Int_t nprongs,Double_t *d0err) 
{
  if(nprongs!=GetNProngs()) { 
    printf("Wrong number of momenta, must be nProngs");
    return;
  }
  if(!fd0) {
    fd0err = new Double32_t[nprongs];
  }
  for(Int_t i=0;i<nprongs;i++) {
    fd0err[i] = d0err[i]; 
  }

  return;
}

inline Bool_t AliAODRecoDecayLF::HasBadDaughters() const {

  // checks if at least one of ITS+TPC daughters didn't pass the StandardCuts2010 with loose DCA (ie doesn't have the BIT(4) set)

  for(Int_t iDau=0; iDau<GetNDaughters(); iDau++){
    if (GetDaughter(iDau)==NULL) continue;
    AliAODTrack* at=dynamic_cast<AliAODTrack*>(GetDaughter(iDau));
    if (!at) continue;
    if(at->Charge()==0) continue;
    if(at->GetTPCNcls()==0) continue;
    if(!(at->TestFilterMask(BIT(4)))) return kTRUE;
  }
  return kFALSE;
}


#endif

 AliAODRecoDecayLF.h:1
 AliAODRecoDecayLF.h:2
 AliAODRecoDecayLF.h:3
 AliAODRecoDecayLF.h:4
 AliAODRecoDecayLF.h:5
 AliAODRecoDecayLF.h:6
 AliAODRecoDecayLF.h:7
 AliAODRecoDecayLF.h:8
 AliAODRecoDecayLF.h:9
 AliAODRecoDecayLF.h:10
 AliAODRecoDecayLF.h:11
 AliAODRecoDecayLF.h:12
 AliAODRecoDecayLF.h:13
 AliAODRecoDecayLF.h:14
 AliAODRecoDecayLF.h:15
 AliAODRecoDecayLF.h:16
 AliAODRecoDecayLF.h:17
 AliAODRecoDecayLF.h:18
 AliAODRecoDecayLF.h:19
 AliAODRecoDecayLF.h:20
 AliAODRecoDecayLF.h:21
 AliAODRecoDecayLF.h:22
 AliAODRecoDecayLF.h:23
 AliAODRecoDecayLF.h:24
 AliAODRecoDecayLF.h:25
 AliAODRecoDecayLF.h:26
 AliAODRecoDecayLF.h:27
 AliAODRecoDecayLF.h:28
 AliAODRecoDecayLF.h:29
 AliAODRecoDecayLF.h:30
 AliAODRecoDecayLF.h:31
 AliAODRecoDecayLF.h:32
 AliAODRecoDecayLF.h:33
 AliAODRecoDecayLF.h:34
 AliAODRecoDecayLF.h:35
 AliAODRecoDecayLF.h:36
 AliAODRecoDecayLF.h:37
 AliAODRecoDecayLF.h:38
 AliAODRecoDecayLF.h:39
 AliAODRecoDecayLF.h:40
 AliAODRecoDecayLF.h:41
 AliAODRecoDecayLF.h:42
 AliAODRecoDecayLF.h:43
 AliAODRecoDecayLF.h:44
 AliAODRecoDecayLF.h:45
 AliAODRecoDecayLF.h:46
 AliAODRecoDecayLF.h:47
 AliAODRecoDecayLF.h:48
 AliAODRecoDecayLF.h:49
 AliAODRecoDecayLF.h:50
 AliAODRecoDecayLF.h:51
 AliAODRecoDecayLF.h:52
 AliAODRecoDecayLF.h:53
 AliAODRecoDecayLF.h:54
 AliAODRecoDecayLF.h:55
 AliAODRecoDecayLF.h:56
 AliAODRecoDecayLF.h:57
 AliAODRecoDecayLF.h:58
 AliAODRecoDecayLF.h:59
 AliAODRecoDecayLF.h:60
 AliAODRecoDecayLF.h:61
 AliAODRecoDecayLF.h:62
 AliAODRecoDecayLF.h:63
 AliAODRecoDecayLF.h:64
 AliAODRecoDecayLF.h:65
 AliAODRecoDecayLF.h:66
 AliAODRecoDecayLF.h:67
 AliAODRecoDecayLF.h:68
 AliAODRecoDecayLF.h:69
 AliAODRecoDecayLF.h:70
 AliAODRecoDecayLF.h:71
 AliAODRecoDecayLF.h:72
 AliAODRecoDecayLF.h:73
 AliAODRecoDecayLF.h:74
 AliAODRecoDecayLF.h:75
 AliAODRecoDecayLF.h:76
 AliAODRecoDecayLF.h:77
 AliAODRecoDecayLF.h:78
 AliAODRecoDecayLF.h:79
 AliAODRecoDecayLF.h:80
 AliAODRecoDecayLF.h:81
 AliAODRecoDecayLF.h:82
 AliAODRecoDecayLF.h:83
 AliAODRecoDecayLF.h:84
 AliAODRecoDecayLF.h:85
 AliAODRecoDecayLF.h:86
 AliAODRecoDecayLF.h:87
 AliAODRecoDecayLF.h:88
 AliAODRecoDecayLF.h:89
 AliAODRecoDecayLF.h:90
 AliAODRecoDecayLF.h:91
 AliAODRecoDecayLF.h:92
 AliAODRecoDecayLF.h:93
 AliAODRecoDecayLF.h:94
 AliAODRecoDecayLF.h:95
 AliAODRecoDecayLF.h:96
 AliAODRecoDecayLF.h:97
 AliAODRecoDecayLF.h:98
 AliAODRecoDecayLF.h:99
 AliAODRecoDecayLF.h:100
 AliAODRecoDecayLF.h:101
 AliAODRecoDecayLF.h:102
 AliAODRecoDecayLF.h:103
 AliAODRecoDecayLF.h:104
 AliAODRecoDecayLF.h:105
 AliAODRecoDecayLF.h:106
 AliAODRecoDecayLF.h:107
 AliAODRecoDecayLF.h:108
 AliAODRecoDecayLF.h:109
 AliAODRecoDecayLF.h:110
 AliAODRecoDecayLF.h:111
 AliAODRecoDecayLF.h:112
 AliAODRecoDecayLF.h:113
 AliAODRecoDecayLF.h:114
 AliAODRecoDecayLF.h:115
 AliAODRecoDecayLF.h:116
 AliAODRecoDecayLF.h:117
 AliAODRecoDecayLF.h:118
 AliAODRecoDecayLF.h:119
 AliAODRecoDecayLF.h:120
 AliAODRecoDecayLF.h:121
 AliAODRecoDecayLF.h:122
 AliAODRecoDecayLF.h:123
 AliAODRecoDecayLF.h:124
 AliAODRecoDecayLF.h:125
 AliAODRecoDecayLF.h:126
 AliAODRecoDecayLF.h:127
 AliAODRecoDecayLF.h:128
 AliAODRecoDecayLF.h:129
 AliAODRecoDecayLF.h:130
 AliAODRecoDecayLF.h:131
 AliAODRecoDecayLF.h:132
 AliAODRecoDecayLF.h:133
 AliAODRecoDecayLF.h:134
 AliAODRecoDecayLF.h:135
 AliAODRecoDecayLF.h:136
 AliAODRecoDecayLF.h:137
 AliAODRecoDecayLF.h:138
 AliAODRecoDecayLF.h:139
 AliAODRecoDecayLF.h:140
 AliAODRecoDecayLF.h:141
 AliAODRecoDecayLF.h:142
 AliAODRecoDecayLF.h:143
 AliAODRecoDecayLF.h:144
 AliAODRecoDecayLF.h:145
 AliAODRecoDecayLF.h:146
 AliAODRecoDecayLF.h:147
 AliAODRecoDecayLF.h:148
 AliAODRecoDecayLF.h:149
 AliAODRecoDecayLF.h:150
 AliAODRecoDecayLF.h:151
 AliAODRecoDecayLF.h:152
 AliAODRecoDecayLF.h:153
 AliAODRecoDecayLF.h:154
 AliAODRecoDecayLF.h:155
 AliAODRecoDecayLF.h:156
 AliAODRecoDecayLF.h:157
 AliAODRecoDecayLF.h:158
 AliAODRecoDecayLF.h:159
 AliAODRecoDecayLF.h:160
 AliAODRecoDecayLF.h:161
 AliAODRecoDecayLF.h:162
 AliAODRecoDecayLF.h:163
 AliAODRecoDecayLF.h:164
 AliAODRecoDecayLF.h:165
 AliAODRecoDecayLF.h:166
 AliAODRecoDecayLF.h:167
 AliAODRecoDecayLF.h:168
 AliAODRecoDecayLF.h:169
 AliAODRecoDecayLF.h:170
 AliAODRecoDecayLF.h:171
 AliAODRecoDecayLF.h:172
 AliAODRecoDecayLF.h:173
 AliAODRecoDecayLF.h:174
 AliAODRecoDecayLF.h:175
 AliAODRecoDecayLF.h:176
 AliAODRecoDecayLF.h:177
 AliAODRecoDecayLF.h:178
 AliAODRecoDecayLF.h:179
 AliAODRecoDecayLF.h:180
 AliAODRecoDecayLF.h:181
 AliAODRecoDecayLF.h:182
 AliAODRecoDecayLF.h:183
 AliAODRecoDecayLF.h:184
 AliAODRecoDecayLF.h:185
 AliAODRecoDecayLF.h:186
 AliAODRecoDecayLF.h:187
 AliAODRecoDecayLF.h:188
 AliAODRecoDecayLF.h:189
 AliAODRecoDecayLF.h:190
 AliAODRecoDecayLF.h:191
 AliAODRecoDecayLF.h:192
 AliAODRecoDecayLF.h:193
 AliAODRecoDecayLF.h:194
 AliAODRecoDecayLF.h:195
 AliAODRecoDecayLF.h:196
 AliAODRecoDecayLF.h:197
 AliAODRecoDecayLF.h:198
 AliAODRecoDecayLF.h:199
 AliAODRecoDecayLF.h:200
 AliAODRecoDecayLF.h:201
 AliAODRecoDecayLF.h:202
 AliAODRecoDecayLF.h:203
 AliAODRecoDecayLF.h:204
 AliAODRecoDecayLF.h:205
 AliAODRecoDecayLF.h:206
 AliAODRecoDecayLF.h:207
 AliAODRecoDecayLF.h:208
 AliAODRecoDecayLF.h:209
 AliAODRecoDecayLF.h:210
 AliAODRecoDecayLF.h:211
 AliAODRecoDecayLF.h:212
 AliAODRecoDecayLF.h:213
 AliAODRecoDecayLF.h:214
 AliAODRecoDecayLF.h:215
 AliAODRecoDecayLF.h:216
 AliAODRecoDecayLF.h:217
 AliAODRecoDecayLF.h:218
 AliAODRecoDecayLF.h:219
 AliAODRecoDecayLF.h:220
 AliAODRecoDecayLF.h:221
 AliAODRecoDecayLF.h:222
 AliAODRecoDecayLF.h:223
 AliAODRecoDecayLF.h:224
 AliAODRecoDecayLF.h:225
 AliAODRecoDecayLF.h:226
 AliAODRecoDecayLF.h:227
 AliAODRecoDecayLF.h:228
 AliAODRecoDecayLF.h:229
 AliAODRecoDecayLF.h:230
 AliAODRecoDecayLF.h:231
 AliAODRecoDecayLF.h:232
 AliAODRecoDecayLF.h:233
 AliAODRecoDecayLF.h:234
 AliAODRecoDecayLF.h:235
 AliAODRecoDecayLF.h:236
 AliAODRecoDecayLF.h:237