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

/* $Id$ */ 

//***********************************************************
// Class AliAODRecoDecayHF
// base class for AOD reconstructed heavy-flavour decays
// Author: A.Dainese, andrea.dainese@lnl.infn.it
//***********************************************************

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

class AliAODEvent;
class AliRDHFCuts;
class AliKFParticle;

class AliAODRecoDecayHF : public AliAODRecoDecay {

 public:

  AliAODRecoDecayHF();
  AliAODRecoDecayHF(AliAODVertex *vtx2,Int_t nprongs,Short_t charge,
		    Double_t *px,Double_t *py,Double_t *pz,
		    Double_t *d0,Double_t *d0err);
  AliAODRecoDecayHF(AliAODVertex *vtx2,Int_t nprongs,Short_t charge,
		    Double_t *d0,Double_t *d0err);
  AliAODRecoDecayHF(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 ~AliAODRecoDecayHF();

  AliAODRecoDecayHF(const AliAODRecoDecayHF& source);
  AliAODRecoDecayHF& operator=(const AliAODRecoDecayHF& 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());}
  AliRDHFCuts *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 AliAnalysisVertexingHF

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

inline void AliAODRecoDecayHF::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 AliAODRecoDecayHF::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 AliRDHFCuts *AliAODRecoDecayHF::GetCuts(const char* name) const
{ 
  // returns the analysis cuts

  TList *list = GetListOfCuts();
  if(!list) return 0;


  return (AliRDHFCuts*)list->FindObject(name);
}

inline Bool_t AliAODRecoDecayHF::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 AliAODRecoDecayHF::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 AliAODRecoDecayHF::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 AliAODRecoDecayHF::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

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