#include <TH2F.h>
#include <TIterator.h>
#include <TParticle.h>
#include <AliESDVertex.h>
#include <AliESDEvent.h>
#include <AliAODEvent.h>
#include <AliVTrack.h>
#include <AliESDtrack.h>
#include <AliAODTrack.h>
#include "AliHFEsecVtx.h"
#include <AliKFParticle.h>
#include <AliKFVertex.h>
#include <AliLog.h>
#include <AliMCEvent.h>
#include <AliAODMCParticle.h>
#include "AliHFEpairs.h"
#include "AliHFEsecVtxs.h"
#include "AliHFEtrackFilter.h"
#include "AliHFEmcQA.h"
#include "AliHFEtools.h"
ClassImp(AliHFEsecVtx)
AliHFEsecVtx::AliHFEsecVtx():
fFilter(0x0)
,fESD1(0x0)
,fAOD1(0x0)
,fMCEvent(0x0)
,fMCQA(0x0)
,fUseMCPID(kFALSE)
,fkSourceLabel()
,fNparents(0)
,fParentSelect()
,fPtRng()
,fDcaCut()
,fNoOfHFEpairs(0)
,fNoOfHFEsecvtxs(0)
,fArethereSecVtx(0)
,fHFEpairs(0x0)
,fHFEsecvtxs(0x0)
,fMCArray(0x0)
,fPVx(-999)
,fPVy(-999)
,fPVx2(999)
,fPVy2(-999)
,fCosPhi(-1)
,fSignedLxy(-1)
,fSignedLxy2(-1)
,fKFchi2(-1)
,fInvmass(-1)
,fInvmassSigma(-1)
,fKFip(0)
,fKFip2(0)
,fNsectrk2prim(0)
,fVtxchi2Tightcut(3.)
,fVtxchi2Loosecut(5.)
,fPairQA(0x0)
,fSecvtxQA(0x0)
,fSecVtxList(0x0)
{
Init();
}
AliHFEsecVtx::AliHFEsecVtx(const AliHFEsecVtx &p):
TObject(p)
,fFilter(0x0)
,fESD1(0x0)
,fAOD1(0x0)
,fMCEvent(0x0)
,fMCQA(0x0)
,fUseMCPID(p.fUseMCPID)
,fkSourceLabel()
,fNparents(p.fNparents)
,fParentSelect()
,fPtRng()
,fDcaCut()
,fNoOfHFEpairs(p.fNoOfHFEpairs)
,fNoOfHFEsecvtxs(p.fNoOfHFEsecvtxs)
,fArethereSecVtx(p.fArethereSecVtx)
,fHFEpairs(0x0)
,fHFEsecvtxs(0x0)
,fMCArray(0x0)
,fPVx(p.fPVx)
,fPVy(p.fPVy)
,fPVx2(p.fPVx2)
,fPVy2(p.fPVy2)
,fCosPhi(p.fCosPhi)
,fSignedLxy(p.fSignedLxy)
,fSignedLxy2(p.fSignedLxy2)
,fKFchi2(p.fKFchi2)
,fInvmass(p.fInvmass)
,fInvmassSigma(p.fInvmassSigma)
,fKFip(p.fKFip)
,fKFip2(p.fKFip2)
,fNsectrk2prim(p.fNsectrk2prim)
,fVtxchi2Tightcut(p.fVtxchi2Tightcut)
,fVtxchi2Loosecut(p.fVtxchi2Loosecut)
,fPairQA(0x0)
,fSecvtxQA(0x0)
,fSecVtxList(0x0)
{
fFilter = new AliHFEtrackFilter(*p.fFilter);
}
AliHFEsecVtx&
AliHFEsecVtx::operator=(const AliHFEsecVtx &)
{
AliInfo("Not yet implemented.");
return *this;
}
AliHFEsecVtx::~AliHFEsecVtx()
{
delete fFilter;
}
void AliHFEsecVtx::Init()
{
fNparents = 7;
fParentSelect[0][0] = 411;
fParentSelect[0][1] = 421;
fParentSelect[0][2] = 431;
fParentSelect[0][3] = 4122;
fParentSelect[0][4] = 4132;
fParentSelect[0][5] = 4232;
fParentSelect[0][6] = 4332;
fParentSelect[1][0] = 511;
fParentSelect[1][1] = 521;
fParentSelect[1][2] = 531;
fParentSelect[1][3] = 5122;
fParentSelect[1][4] = 5132;
fParentSelect[1][5] = 5232;
fParentSelect[1][6] = 5332;
fPtRng[0] = 1.0;
fPtRng[1] = 2.0;
fPtRng[2] = 2.5;
fPtRng[3] = 3.0;
fPtRng[4] = 5.0;
fPtRng[5] = 12.0;
fPtRng[6] = 20.0;
fDcaCut[0] = 0.04;
fDcaCut[1] = 0.03;
fDcaCut[2] = 0.02;
fDcaCut[3] = 0.015;
fDcaCut[4] = 0.01;
fDcaCut[5] = 0.005;
fFilter = new AliHFEtrackFilter("SecVtxFilter");
fFilter->MakeCutStepRecKineITSTPC();
fFilter->MakeCutStepPrimary();
}
Bool_t AliHFEsecVtx::Process(AliVTrack *signalTrack){
AliESDtrack *track = dynamic_cast<AliESDtrack *>(signalTrack);
if(!track){
AliDebug(1, "no esd track pointer, return\n");
return kFALSE;
}
Bool_t bTagged = kFALSE;
FillHistos(0,track);
InitHFEpairs();
InitHFEsecvtxs();
AliESDtrack *htrack = 0x0;
fFilter->Flush();
fFilter->FilterTracks(fESD1);
TObjArray *candidates = fFilter->GetFilteredTracks();
TIterator *trackIter = candidates->MakeIterator();
while((htrack = dynamic_cast<AliESDtrack *>(trackIter->Next()))){
if(track->GetID() == htrack->GetID()) continue;
if (htrack->Pt()<1.0) continue;
PairAnalysis(track, htrack, htrack->GetID());
}
delete trackIter;
for(int ip=0; ip<HFEpairs()->GetEntriesFast(); ip++){
AliHFEpairs *pair = (AliHFEpairs*) (HFEpairs()->UncheckedAt(ip));
if(pair->GetKFChi2()>5.)
HFEpairs()->RemoveAt(ip);
}
HFEpairs()->Compress();
if(HFEpairs()->GetEntriesFast()) FillHistos(1,track);
if(HFEpairs()->GetEntriesFast()) RunSECVTX(track);
if(HFEsecvtxs()->GetEntriesFast()) FillHistos(2,track);
for(int ip=0; ip<HFEsecvtxs()->GetEntriesFast(); ip++){
AliHFEsecVtxs *secvtx=0x0;
secvtx = (AliHFEsecVtxs*) (HFEsecvtxs()->UncheckedAt(ip));
if(!(secvtx->GetInvmass()>2.0 && secvtx->GetInvmass()<5.2) || !(secvtx->GetSignedLxy2()>0.08 && secvtx->GetSignedLxy2()<1.5) || !(secvtx->GetKFIP2()>-0.1 && secvtx->GetKFIP2()<0.1))
HFEsecvtxs()->RemoveAt(ip);
}
if(HFEsecvtxs()->GetEntriesFast()) {
FillHistos(3,track);
bTagged = kTRUE;
}
DeleteHFEpairs();
DeleteHFEsecvtxs();
return bTagged;
}
void AliHFEsecVtx::CreateHistograms(TList * const qaList)
{
if(!qaList) return;
fSecVtxList = qaList;
fSecVtxList->SetName("SecVtx");
MakeContainer();
MakeHistos(0);
MakeHistos(1);
MakeHistos(2);
MakeHistos(3);
}
void AliHFEsecVtx::GetPrimaryCondition()
{
if (fESD1) {
AliKFVertex primVtxCopy(*(fESD1->GetPrimaryVertex()));
if( primVtxCopy.GetNDF() <1 ) return;
fPVx = primVtxCopy.GetX();
fPVy = primVtxCopy.GetY();
}
else if(fAOD1) {
AliKFVertex primVtxCopy(*(fAOD1->GetPrimaryVertex()));
if( primVtxCopy.GetNDF() <1 ) return;
fPVx = primVtxCopy.GetX();
fPVy = primVtxCopy.GetY();
}
}
void AliHFEsecVtx::PairAnalysis(AliVTrack* track1, AliVTrack* track2, Int_t index2)
{
Float_t dca1[2]={-999.,-999.}, dca2[2]={-999.,-999.};
Float_t cov1[3]={-999.,-999.,-999.}, cov2[3]={-999.,-999.,-999.};
Double_t dca1aod[2]={-999.,-999.}, dca2aod[2]={-999.,-999.};
Double_t cov1aod[3]={-999.,-999.,-999.}, cov2aod[3]={-999.,-999.,-999.};
if (IsAODanalysis()){
const AliAODVertex *primVtx = fAOD1->GetPrimaryVertex();
AliESDtrack esdTrk1(track1);
AliESDtrack esdTrk2(track2);
esdTrk1.PropagateToDCA(primVtx,0.,10000.,dca1aod,cov1aod);
esdTrk2.PropagateToDCA(primVtx,0.,10000.,dca2aod,cov2aod);
}
else {
((AliESDtrack*)track1)->GetImpactParameters(dca1,cov1);
((AliESDtrack*)track2)->GetImpactParameters(dca2,cov2);
}
Int_t pdg1 = GetPDG(track1);
Int_t pdg2 = GetPDG(track2);
if(pdg1==-1 || pdg2==-1) {
return;
}
if(IsAODanalysis()) AliKFParticle::SetField(fAOD1->GetMagneticField());
else AliKFParticle::SetField(fESD1->GetMagneticField());
AliKFParticle kfTrack[2];
kfTrack[0] = AliKFParticle(*track1, pdg1);
kfTrack[1] = AliKFParticle(*track2, pdg2);
AliKFParticle kfSecondary(kfTrack[0],kfTrack[1]);
Double_t kfx = kfSecondary.GetX();
Double_t kfy = kfSecondary.GetY();
Double_t kfpx = kfSecondary.GetPx();
Double_t kfpy = kfSecondary.GetPy();
AliKFVertex primVtxCopy(*(fESD1->GetPrimaryVertex()));
if( primVtxCopy.GetNDF() <1 ) return;
fPVx = primVtxCopy.GetX();
fPVy = primVtxCopy.GetY();
Double_t dx = kfx-fPVx;
Double_t dy = kfy-fPVy;
Double_t invmass = -1;
Double_t invmassSigma = -1;
kfSecondary.GetMass(invmass,invmassSigma);
Double_t kfchi2 = -1;
if(kfSecondary.GetNDF()>0) kfchi2 = TMath::Sqrt(TMath::Abs(kfSecondary.GetChi2()/kfSecondary.GetNDF()));
Double_t phi = kfTrack[0].GetAngleXY(kfTrack[1]);
Double_t cosphi = TMath::Cos(phi);
Double_t vtx[2]={fPVx, fPVy};
Double_t kfip = kfSecondary.GetDistanceFromVertexXY(vtx);
Double_t signedLxy=-999.;
if((dx*kfpx+dy*kfpy)>0) signedLxy = TMath::Sqrt(dx*dx+dy*dy);
if((dx*kfpx+dy*kfpy)<0) signedLxy = -1*TMath::Sqrt(dx*dx+dy*dy);
Int_t trkid[2];
trkid[0] = track1->GetID();
trkid[1] = track2->GetID();
RecalcPrimvtx(2, trkid, kfTrack);
Double_t dx2 = kfx-fPVx2;
Double_t dy2 = kfy-fPVy2;
Double_t vtx2[2]={fPVx2, fPVy2};
Double_t kfip2 = kfSecondary.GetDistanceFromVertexXY(vtx2);
Double_t signedLxy2=-999.;
if((dx2*kfpx+dy2*kfpy)>0) signedLxy2 = TMath::Sqrt(dx2*dx2+dy2*dy2);
if((dx2*kfpx+dy2*kfpy)<0) signedLxy2 = -1*TMath::Sqrt(dx2*dx2+dy2*dy2);
Int_t paircode = -1;
if (HasMCData()) paircode = GetPairCode(track1,track2);
AliHFEpairs hfepair;
hfepair.SetTrkLabel(index2);
hfepair.SetInvmass(invmass);
hfepair.SetKFChi2(kfchi2);
hfepair.SetOpenangle(phi);
hfepair.SetCosOpenangle(cosphi);
hfepair.SetSignedLxy(signedLxy);
hfepair.SetSignedLxy2(signedLxy2);
hfepair.SetKFIP(kfip);
hfepair.SetKFIP2(kfip2);
hfepair.SetPairCode(paircode);
AddHFEpairToArray(&hfepair);
fNoOfHFEpairs++;
Double_t dataE[6];
dataE[0]=invmass;
dataE[1]=kfchi2;
dataE[2]=phi;
dataE[3]=signedLxy2;
dataE[4]=kfip2;
dataE[5]=paircode;
fPairQA->Fill(dataE);
}
void AliHFEsecVtx::RunSECVTX(AliVTrack *track)
{
FindSECVTXCandid(track);
}
void AliHFEsecVtx::FindSECVTXCandid(AliVTrack *track)
{
AliVTrack *htrack[20];
fVtxchi2Tightcut=3.;
fVtxchi2Loosecut=5.;
if (HFEpairs()->GetEntriesFast()>20){
AliDebug(3, "number of paired hadron is over maximum(20)");
return;
}
AliHFEpairs *pair=0x0;
if (IsAODanalysis()){
for (int ip=0; ip<HFEpairs()->GetEntriesFast(); ip++){
pair = (AliHFEpairs*) (HFEpairs()->UncheckedAt(ip));
htrack[ip] = fAOD1->GetTrack(pair->GetTrkLabel());
}
}
else{
for (int ip=0; ip<HFEpairs()->GetEntriesFast(); ip++){
pair = (AliHFEpairs*) (HFEpairs()->UncheckedAt(ip));
htrack[ip] = fESD1->GetTrack(pair->GetTrkLabel());
}
}
Int_t nPairs = HFEpairs()->GetEntriesFast();
if (nPairs == 1){
if (pair->GetKFChi2() < fVtxchi2Tightcut) {
Fill2TrkSECVTX(track, pair);
}
return;
}
if (nPairs == 2){
CalcSECVTXProperty(track, htrack[0], htrack[1]);
if (fKFchi2 < fVtxchi2Loosecut) {
Fill3TrkSECVTX(track, 0, 1);
}
else{
for(int jp=0; jp<2; jp++){
pair = (AliHFEpairs*) (HFEpairs()->UncheckedAt(jp));
if (pair->GetKFChi2() < fVtxchi2Tightcut){
Fill2TrkSECVTX(track, pair);
}
}
}
return;
}
if (nPairs == 3){
CalcSECVTXProperty(track, htrack[0], htrack[1], htrack[2]);
if (fKFchi2 < fVtxchi2Loosecut) {
Fill4TrkSECVTX(track, 0, 1, 2);
}
else {
fArethereSecVtx=0;
for (int i=0; i<nPairs-1; i++){
for (int j=i+1; j<nPairs; j++){
CalcSECVTXProperty(track, htrack[i], htrack[j]);
if (fKFchi2 < fVtxchi2Loosecut) {
fArethereSecVtx++;
Fill3TrkSECVTX(track, i, j);
}
}
}
if(!fArethereSecVtx){
for(int jp=0; jp<nPairs; jp++){
pair = (AliHFEpairs*) (HFEpairs()->UncheckedAt(jp));
if (pair->GetKFChi2() < fVtxchi2Tightcut){
Fill2TrkSECVTX(track, pair);
}
}
}
}
return;
}
if (nPairs > 3){
fArethereSecVtx=0;
for (int ih1=0; ih1<nPairs-2; ih1++){
for (int ih2=ih1+1; ih2<nPairs-1; ih2++){
for (int ih3=ih2+1; ih3<nPairs; ih3++){
CalcSECVTXProperty(track, htrack[ih1], htrack[ih2], htrack[ih3]);
if (fKFchi2 < fVtxchi2Loosecut) {
fArethereSecVtx++;
Fill4TrkSECVTX(track, ih1, ih2, ih3);
}
}
}
}
if (!fArethereSecVtx){
fArethereSecVtx=0;
for (int i=0; i<nPairs-1; i++){
for (int j=i+1; j<nPairs; j++){
CalcSECVTXProperty(track, htrack[i], htrack[j]);
if (fKFchi2 < fVtxchi2Loosecut) {
fArethereSecVtx++;
Fill3TrkSECVTX(track, i, j);
}
}
}
}
if (!fArethereSecVtx){
for(int jp=0; jp<nPairs; jp++){
pair = (AliHFEpairs*) (HFEpairs()->UncheckedAt(jp));
if (pair->GetKFChi2() < fVtxchi2Tightcut){
Fill2TrkSECVTX(track, pair);
}
}
}
return;
}
}
void AliHFEsecVtx::Fill4TrkSECVTX(AliVTrack* track, Int_t ipair, Int_t jpair, Int_t kpair)
{
Double_t dataE[9]={-999.,-999.,-999.,-999.,-1.,0,0,-999.,-999.};
Int_t paircode1 = 0, paircode2 = 0, paircode3 = 0;
Int_t htracklabel1 = 0, htracklabel2= 0;
if (HasMCData()){
AliHFEpairs *pair1=0x0;
AliHFEpairs *pair2=0x0;
AliHFEpairs *pair3=0x0;
pair1 = (AliHFEpairs*) (HFEpairs()->UncheckedAt(ipair));
pair2 = (AliHFEpairs*) (HFEpairs()->UncheckedAt(jpair));
pair3 = (AliHFEpairs*) (HFEpairs()->UncheckedAt(kpair));
htracklabel1 = pair1->GetTrkLabel();
htracklabel2 = pair2->GetTrkLabel();
if (pair1->GetPairCode()==2 || pair1->GetPairCode()==3) paircode1=1;
else paircode1=0;
if (pair2->GetPairCode()==2 || pair2->GetPairCode()==3) paircode2=1;
else paircode2=0;
if (pair3->GetPairCode()==2 || pair3->GetPairCode()==3) paircode3=1;
else paircode3=0;
}
AliHFEsecVtxs hfesecvtx;
hfesecvtx.SetTrkLabel1(htracklabel1);
hfesecvtx.SetTrkLabel2(htracklabel2);
if(HasMCData()) hfesecvtx.SetMCCode(GetElectronSource(TMath::Abs(track->GetLabel())));
hfesecvtx.SetKFChi2(fKFchi2);
hfesecvtx.SetInvmass(fInvmass);
hfesecvtx.SetSignedLxy(fSignedLxy);
hfesecvtx.SetSignedLxy2(fSignedLxy2);
hfesecvtx.SetKFIP(fKFip);
hfesecvtx.SetKFIP2(fKFip2);
AddHFEsecvtxToArray(&hfesecvtx);
fNoOfHFEsecvtxs++;
dataE[0]=fInvmass;
dataE[1]=fKFchi2;
dataE[2]=fSignedLxy;
dataE[3]=fKFip;
if(HasMCData()) dataE[4]=GetElectronSource(TMath::Abs(track->GetLabel()));
dataE[5]=4;
if(paircode1 & paircode2 & paircode3) dataE[6]=1;
else if(!paircode1 & !paircode2 & !paircode3) dataE[6]=0;
else dataE[6]=3;
dataE[7]=fSignedLxy2;
dataE[8]=track->Pt();
fSecvtxQA->Fill(dataE);
}
void AliHFEsecVtx::Fill3TrkSECVTX(AliVTrack* track, Int_t ipair, Int_t jpair)
{
Double_t dataE[9]={-999.,-999.,-999.,-999.,-1.,0,0,-999.,-999.};
Int_t paircode1 = 0, paircode2 = 0;
Int_t htracklabel1 = 0, htracklabel2 = 0;
if (HasMCData()){
AliHFEpairs *pair1=0x0;
AliHFEpairs *pair2=0x0;
pair1 = (AliHFEpairs*) (HFEpairs()->UncheckedAt(ipair));
pair2 = (AliHFEpairs*) (HFEpairs()->UncheckedAt(jpair));
htracklabel1 = pair1->GetTrkLabel();
htracklabel2 = pair2->GetTrkLabel();
if (pair1->GetPairCode()==2 || pair1->GetPairCode()==3) paircode1=1;
else paircode1=0;
if (pair2->GetPairCode()==2 || pair2->GetPairCode()==3) paircode2=1;
else paircode2=0;
}
AliHFEsecVtxs hfesecvtx;
hfesecvtx.SetTrkLabel1(htracklabel1);
hfesecvtx.SetTrkLabel2(htracklabel2);
if(HasMCData()) hfesecvtx.SetMCCode(GetElectronSource(TMath::Abs(track->GetLabel())));
hfesecvtx.SetKFChi2(fKFchi2);
hfesecvtx.SetInvmass(fInvmass);
hfesecvtx.SetSignedLxy(fSignedLxy);
hfesecvtx.SetSignedLxy2(fSignedLxy2);
hfesecvtx.SetKFIP(fKFip);
hfesecvtx.SetKFIP2(fKFip2);
AddHFEsecvtxToArray(&hfesecvtx);
fNoOfHFEsecvtxs++;
dataE[0]=fInvmass;
dataE[1]=fKFchi2;
dataE[2]=fSignedLxy;
dataE[3]=fKFip;
if(HasMCData()) dataE[4]=GetElectronSource(TMath::Abs(track->GetLabel()));
dataE[5]=3;
if(paircode1 & paircode2) dataE[6]=1;
else if(!paircode1 & !paircode2) dataE[6]=0;
else dataE[6]=3;
dataE[7]=fSignedLxy2;
dataE[8]=track->Pt();
fSecvtxQA->Fill(dataE);
}
void AliHFEsecVtx::Fill2TrkSECVTX(AliVTrack* track, const AliHFEpairs *pair)
{
Double_t dataE[9]={-999.,-999.,-999.,-999.,-1.,0,0,-999.,-999.};
Int_t paircode;
if (pair->GetPairCode()==2 || pair->GetPairCode()==3) paircode=1;
else paircode=0;
AliHFEsecVtxs hfesecvtx;
hfesecvtx.SetTrkLabel1(pair->GetTrkLabel());
hfesecvtx.SetTrkLabel2(-999);
if(HasMCData()) hfesecvtx.SetMCCode(GetElectronSource(TMath::Abs(track->GetLabel())));
hfesecvtx.SetInvmass(pair->GetInvmass());
hfesecvtx.SetKFChi2(pair->GetKFChi2());
hfesecvtx.SetSignedLxy(pair->GetSignedLxy());
hfesecvtx.SetSignedLxy2(pair->GetSignedLxy2());
hfesecvtx.SetKFIP(pair->GetKFIP());
hfesecvtx.SetKFIP2(pair->GetKFIP2());
AddHFEsecvtxToArray(&hfesecvtx);
fNoOfHFEsecvtxs++;
dataE[0]=pair->GetInvmass();
dataE[1]=pair->GetKFChi2();
dataE[2]=pair->GetSignedLxy();
dataE[3]=pair->GetKFIP();
if (HasMCData()) dataE[4]=GetElectronSource(TMath::Abs(track->GetLabel()));
dataE[5]=2;
dataE[6]=paircode;
dataE[7]=pair->GetSignedLxy2();
dataE[8]=track->Pt();
fSecvtxQA->Fill(dataE);
}
void AliHFEsecVtx::CalcSECVTXProperty(AliVTrack* track1, AliVTrack* track2, AliVTrack* track3)
{
Int_t pdg1 = GetPDG(track1);
Int_t pdg2 = GetPDG(track2);
Int_t pdg3 = GetPDG(track3);
if(pdg1==-1 || pdg2==-1 || pdg3==-1) {
return;
}
if(IsAODanalysis()) AliKFParticle::SetField(fAOD1->GetMagneticField());
else AliKFParticle::SetField(fESD1->GetMagneticField());
AliKFParticle kfTrack[3];
kfTrack[0] = AliKFParticle(*track1, pdg1);
kfTrack[1] = AliKFParticle(*track2, pdg2);
kfTrack[2] = AliKFParticle(*track3, pdg3);
AliKFParticle kfSecondary(kfTrack[0],kfTrack[1],kfTrack[2]);
Double_t kfx = kfSecondary.GetX();
Double_t kfy = kfSecondary.GetY();
Double_t kfpx = kfSecondary.GetPx();
Double_t kfpy = kfSecondary.GetPy();
Double_t dx = kfx-fPVx;
Double_t dy = kfy-fPVy;
if(kfSecondary.GetNDF()>0) fKFchi2 = TMath::Sqrt(TMath::Abs(kfSecondary.GetChi2()/kfSecondary.GetNDF()));
kfSecondary.GetMass(fInvmass,fInvmassSigma);
Double_t vtx[2]={fPVx, fPVy};
fKFip = kfSecondary.GetDistanceFromVertexXY(vtx);
if((dx*kfpx+dy*kfpy)>0) fSignedLxy= TMath::Sqrt(dx*dx+dy*dy);
if((dx*kfpx+dy*kfpy)<0) fSignedLxy= -1*TMath::Sqrt(dx*dx+dy*dy);
Int_t trkid[3];
trkid[0] = track1->GetID();
trkid[1] = track2->GetID();
trkid[2] = track3->GetID();
RecalcPrimvtx(3, trkid, kfTrack);
Double_t dx2 = kfx-fPVx2;
Double_t dy2 = kfy-fPVy2;
Double_t vtx2[2]={fPVx2, fPVy2};
fKFip2 = kfSecondary.GetDistanceFromVertexXY(vtx2);
if((dx2*kfpx+dy2*kfpy)>0) fSignedLxy2= TMath::Sqrt(dx2*dx2+dy2*dy2);
if((dx2*kfpx+dy2*kfpy)<0) fSignedLxy2= -1*TMath::Sqrt(dx2*dx2+dy2*dy2);
}
void AliHFEsecVtx::CalcSECVTXProperty(AliVTrack* track1, AliVTrack* track2, AliVTrack* track3, AliVTrack* track4)
{
Int_t pdg1 = GetPDG(track1);
Int_t pdg2 = GetPDG(track2);
Int_t pdg3 = GetPDG(track3);
Int_t pdg4 = GetPDG(track4);
if(pdg1==-1 || pdg2==-1 || pdg3==-1 || pdg4==-1) {
return;
}
if(IsAODanalysis()) AliKFParticle::SetField(fAOD1->GetMagneticField());
else AliKFParticle::SetField(fESD1->GetMagneticField());
AliKFParticle kfTrack[4];
kfTrack[0] = AliKFParticle(*track1, pdg1);
kfTrack[1] = AliKFParticle(*track2, pdg2);
kfTrack[2] = AliKFParticle(*track3, pdg3);
kfTrack[3] = AliKFParticle(*track4, pdg4);
AliKFParticle kfSecondary(kfTrack[0],kfTrack[1],kfTrack[2],kfTrack[3]);
Double_t kfx = kfSecondary.GetX();
Double_t kfy = kfSecondary.GetY();
Double_t kfpx = kfSecondary.GetPx();
Double_t kfpy = kfSecondary.GetPy();
Double_t dx = kfx-fPVx;
Double_t dy = kfy-fPVy;
if(kfSecondary.GetNDF()>0) fKFchi2 = TMath::Sqrt(TMath::Abs(kfSecondary.GetChi2()/kfSecondary.GetNDF()));
kfSecondary.GetMass(fInvmass,fInvmassSigma);
Double_t vtx[2]={fPVx, fPVy};
fKFip = kfSecondary.GetDistanceFromVertexXY(vtx);
if((dx*kfpx+dy*kfpy)>0) fSignedLxy= TMath::Sqrt(dx*dx+dy*dy);
if((dx*kfpx+dy*kfpy)<0) fSignedLxy= -1*TMath::Sqrt(dx*dx+dy*dy);
Int_t trkid[4];
trkid[0] = track1->GetID();
trkid[1] = track2->GetID();
trkid[2] = track3->GetID();
trkid[3] = track4->GetID();
RecalcPrimvtx(4, trkid, kfTrack);
Double_t dx2 = kfx-fPVx2;
Double_t dy2 = kfy-fPVy2;
Double_t vtx2[2]={fPVx2, fPVy2};
fKFip2 = kfSecondary.GetDistanceFromVertexXY(vtx2);
if((dx2*kfpx+dy2*kfpy)>0) fSignedLxy2= TMath::Sqrt(dx2*dx2+dy2*dy2);
if((dx2*kfpx+dy2*kfpy)<0) fSignedLxy2= -1*TMath::Sqrt(dx2*dx2+dy2*dy2);
}
void AliHFEsecVtx::RecalcPrimvtx(Int_t nkftrk, const Int_t * const trkid, const AliKFParticle * const kftrk){
const AliESDVertex *primvtx = fESD1->GetPrimaryVertex();
AliKFVertex kfESDprimary;
Int_t n = primvtx->GetNIndices();
fNsectrk2prim = 0;
fPVx2 = -999.;
fPVy2 = -999.;
if (n>0 && primvtx->GetStatus()){
kfESDprimary = AliKFVertex(*primvtx);
UShort_t *priIndex = primvtx->GetIndices();
for(Int_t j=0; j<nkftrk; j++){
for (Int_t i=0;i<n;i++){
Int_t idx = Int_t(priIndex[i]);
if (idx == trkid[j]){
kfESDprimary -= kftrk[j];
fNsectrk2prim++;
}
}
}
}
fPVx2 = kfESDprimary.GetX();
fPVy2 = kfESDprimary.GetY();
}
Int_t AliHFEsecVtx::GetMCPID(const AliESDtrack *track)
{
AliMCParticle *mctrack = NULL;
if(!(mctrack = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(TMath::Abs(track->GetLabel()))))) return 0;
TParticle *mcpart = mctrack->Particle();
if ( !mcpart ) return 0;
Int_t pdgCode = mcpart->GetPdgCode();
return pdgCode;
}
Int_t AliHFEsecVtx::GetPairOriginESD(AliESDtrack* trk1, AliESDtrack* trk2)
{
if (trk1->GetLabel()<0 || trk2->GetLabel()<0) return 0;
AliMCParticle *mctrack = NULL;
AliMCParticle *mctrack1 = NULL;
AliMCParticle *mctrack2 = NULL;
if(!(mctrack1 = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(TMath::Abs(trk1->GetLabel()))))) return 0;
if(!(mctrack2 = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(TMath::Abs(trk2->GetLabel()))))) return 0;
TParticle *part1 = mctrack1->Particle();
TParticle *part2 = mctrack2->Particle();
TParticle* part2cp = part2;
if (!(part1) || !(part2)) return 0;
Int_t srcpdg = 0;
for (Int_t i=0; i<10; i++){
Int_t label1 = part1->GetFirstMother();
if (label1 < 0) return 0;
for (Int_t j=0; j<10; j++){
Int_t label2 = part2->GetFirstMother();
if (label2 < 0) break;
if (label1 == label2){
if(!(mctrack = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(TMath::Abs(label2))))) return 0;
TParticle* commonmom = mctrack->Particle();
srcpdg = TMath::Abs(commonmom->GetPdgCode());
for (Int_t k=0; k<10; k++){
Int_t ancesterlabel = commonmom->GetFirstMother();
if (ancesterlabel < 0) return srcpdg;
if(!(mctrack = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(TMath::Abs(ancesterlabel))))) return 0;
TParticle* commonancester = mctrack->Particle();
Int_t ancesterpdg = TMath::Abs(commonancester->GetPdgCode());
for (Int_t l=0; l<fNparents; l++){
if (TMath::Abs(ancesterpdg)==fParentSelect[1][l]){
srcpdg = -1*srcpdg;
return srcpdg;
}
}
commonmom = commonancester;
}
}
if(!(mctrack = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(TMath::Abs(label2))))) return 0;
part2 = mctrack->Particle();
if (!(part2)) break;
}
if(!(mctrack = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(TMath::Abs(label1))))) return 0;
part1 = mctrack->Particle();
part2 = part2cp;
if (!(part1)) return 0;
}
return srcpdg;
}
Int_t AliHFEsecVtx::GetPairOriginAOD(AliAODTrack* trk1, AliAODTrack* trk2)
{
if (trk1->GetLabel()<0 || trk2->GetLabel()<0) return 0;
AliAODMCParticle *part1 = (AliAODMCParticle*)fMCArray->At(trk1->GetLabel());
AliAODMCParticle *part2 = (AliAODMCParticle*)fMCArray->At(trk2->GetLabel());
AliAODMCParticle *part2cp = part2;
if (!(part1) || !(part2)) return 0;
Int_t srcpdg = 0;
for (Int_t i=0; i<10; i++){
Int_t label1 = part1->GetMother();
if (label1 < 0) return 0;
for (Int_t j=0; j<10; j++){
Int_t label2 = part2->GetMother();
if (label2 < 0) return 0;
if (label1 == label2){
AliAODMCParticle *commonmom = (AliAODMCParticle*)fMCArray->At(label1);
srcpdg = TMath::Abs(commonmom->GetPdgCode());
for (Int_t k=0; k<10; k++){
Int_t ancesterlabel = commonmom->GetMother();
if (ancesterlabel < 0) return srcpdg;
AliAODMCParticle *commonancester = (AliAODMCParticle*)fMCArray->At(ancesterlabel);
Int_t ancesterpdg = TMath::Abs(commonancester->GetPdgCode());
for (Int_t l=0; l<fNparents; l++){
if (TMath::Abs(ancesterpdg)==fParentSelect[1][l]){
srcpdg = -1*srcpdg;
return srcpdg;
}
}
commonmom = commonancester;
}
}
part2 = (AliAODMCParticle*)fMCArray->At(label2);
if (!(part2)) break;
}
part1 = (AliAODMCParticle*)fMCArray->At(label1);
part2 = part2cp;
if (!(part1)) return 0;
}
return srcpdg;
}
Int_t AliHFEsecVtx::GetPairCode(const AliVTrack* const trk1, const AliVTrack* const trk2)
{
Int_t srcpdg = -1;
Int_t srccode = kElse;
if(IsAODanalysis()) srcpdg = GetPairOriginAOD((AliAODTrack*)trk1,(AliAODTrack*)trk2);
else srcpdg = GetPairOriginESD((AliESDtrack*)trk1,(AliESDtrack*)trk2);
if (srcpdg < 0) srccode = kBeautyElse;
for (Int_t i=0; i<fNparents; i++){
if (TMath::Abs(srcpdg)==fParentSelect[0][i]) {
if (srcpdg>0) srccode = kDirectCharm;
if (srcpdg<0) srccode = kBeautyCharm;
}
if (TMath::Abs(srcpdg)==fParentSelect[1][i]) {
if (srcpdg>0) srccode = kDirectBeauty;
if (srcpdg<0) return kElse;
}
}
if (srcpdg == 22) srccode = kGamma;
if (srcpdg == -22) srccode = kBeautyGamma;
if (srcpdg == 111) srccode = kPi0;
if (srcpdg == -111) srccode = kBeautyPi0;
return srccode;
}
Int_t AliHFEsecVtx::GetElectronSource(Int_t iTrack)
{
if (iTrack < 0) {
AliDebug(1, "Stack label is negative, return\n");
return -1;
}
AliMCParticle *mctrack = NULL;
if(!(mctrack = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(TMath::Abs(iTrack))))) return -1;
TParticle *mcpart = mctrack->Particle();
if(!mcpart){
AliDebug(1, "no mc particle, return\n");
return -1;
}
if ( TMath::Abs(mcpart->GetPdgCode()) != 11 ) return kMisID;
Int_t iLabel = mcpart->GetFirstMother();
if (iLabel<0){
AliDebug(1, "Stack label is negative, return\n");
return -1;
}
Int_t origin = -1;
Bool_t isFinalOpenCharm = kFALSE;
if(!(mctrack = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(TMath::Abs(iLabel))))) return -1;
TParticle *partMother = mctrack->Particle();
Int_t maPdgcode = partMother->GetPdgCode();
if ( int(TMath::Abs(maPdgcode)/100.) == kCharm || int(TMath::Abs(maPdgcode)/1000.) == kCharm ) {
for (Int_t i=0; i<fNparents; i++){
if (TMath::Abs(maPdgcode)==fParentSelect[0][i]){
isFinalOpenCharm = kTRUE;
}
}
if (!isFinalOpenCharm) return -1;
for (Int_t i=1; i<100; i++){
Int_t jLabel = partMother->GetFirstMother();
if (jLabel == -1){
origin = kDirectCharm;
return origin;
}
if (jLabel < 0){
AliDebug(1, "Stack label is negative, return\n");
return -1;
}
if(!(mctrack = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(TMath::Abs(jLabel))))) return -1;
TParticle *grandMa = mctrack->Particle();
Int_t grandMaPDG = grandMa->GetPdgCode();
for (Int_t j=0; j<fNparents; j++){
if (TMath::Abs(grandMaPDG)==fParentSelect[1][j]){
origin = kBeautyCharm;
return origin;
}
}
partMother = grandMa;
}
}
else if ( int(TMath::Abs(maPdgcode)/100.) == kBeauty || int(TMath::Abs(maPdgcode)/1000.) == kBeauty ) {
for (Int_t i=0; i<fNparents; i++){
if (TMath::Abs(maPdgcode)==fParentSelect[1][i]){
origin = kDirectBeauty;
return origin;
}
}
}
else if ( TMath::Abs(maPdgcode) == 22 ) {
origin = kGamma;
for (Int_t i=1; i<100; i++){
Int_t jLabel = partMother->GetFirstMother();
if (jLabel == -1){
origin = kGamma;
return origin;
}
if (jLabel < 0){
AliDebug(1, "Stack label is negative, return\n");
return -1;
}
if(!(mctrack = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(TMath::Abs(jLabel))))) return -1;
TParticle *grandMa = mctrack->Particle();
Int_t grandMaPDG = grandMa->GetPdgCode();
for (Int_t j=0; j<fNparents; j++){
if (TMath::Abs(grandMaPDG)==fParentSelect[1][j]){
origin = kBeautyGamma;
return origin;
}
}
partMother = grandMa;
}
return origin;
}
else if ( TMath::Abs(maPdgcode) == 111 ) {
origin = kPi0;
for (Int_t i=1; i<100; i++){
Int_t jLabel = partMother->GetFirstMother();
if (jLabel == -1){
origin = kPi0;
return origin;
}
if (jLabel < 0){
AliDebug(1, "Stack label is negative, return\n");
return -1;
}
if(!(mctrack = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(TMath::Abs(jLabel))))) return -1;
TParticle *grandMa = mctrack->Particle();
Int_t grandMaPDG = grandMa->GetPdgCode();
for (Int_t j=0; j<fNparents; j++){
if (TMath::Abs(grandMaPDG)==fParentSelect[1][j]){
origin = kBeautyPi0;
return origin;
}
}
partMother = grandMa;
}
return origin;
}
else {
origin = kElse;
for (Int_t i=1; i<100; i++){
Int_t jLabel = partMother->GetFirstMother();
if (jLabel == -1){
origin = kElse;
return origin;
}
if (jLabel < 0){
AliDebug(1, "Stack label is negative, return\n");
return -1;
}
if(!(mctrack = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(TMath::Abs(jLabel))))) return -1;
TParticle *grandMa = mctrack->Particle();
Int_t grandMaPDG = grandMa->GetPdgCode();
for (Int_t j=0; j<fNparents; j++){
if (TMath::Abs(grandMaPDG)==fParentSelect[1][j]){
origin = kBeautyElse;
return origin;
}
}
partMother = grandMa;
}
}
return origin;
}
Int_t AliHFEsecVtx::GetPDG(const AliVTrack *track)
{
Int_t pdgCode=-1;
if (fUseMCPID && HasMCData()){
pdgCode = GetMCPDG(track);
}
else if(fESD1){
Int_t pid=0;
Double_t prob;
GetESDPID((AliESDtrack*)track, pid, prob);
switch(pid){
case 0: pdgCode = 11; break;
case 1: pdgCode = 13; break;
case 2: pdgCode = 211; break;
case 3: pdgCode = 321; break;
case 4: pdgCode = 2212; break;
default: pdgCode = -1;
}
}
else if(fAOD1){
Int_t pid = ((AliAODTrack*)track)->GetMostProbablePID();
switch(pid){
case 0: pdgCode = 11; break;
case 1: pdgCode = 13; break;
case 2: pdgCode = 211; break;
case 3: pdgCode = 321; break;
case 4: pdgCode = 2212; break;
default: pdgCode = -1;
}
}
return pdgCode;
}
Int_t AliHFEsecVtx::GetMCPDG(const AliVTrack *track)
{
Int_t label = TMath::Abs(track->GetLabel());
Int_t pdgCode;
AliMCParticle *mctrack = NULL;
if (IsAODanalysis()) {
AliAODMCParticle *mcpart = (AliAODMCParticle*)fMCArray->At(label);
if ( !mcpart ) return 0;
pdgCode = mcpart->GetPdgCode();
}
else {
if(!(mctrack = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(TMath::Abs(label))))) return 0;
TParticle *mcpart = mctrack->Particle();
if ( !mcpart ) return 0;
pdgCode = mcpart->GetPdgCode();
}
return pdgCode;
}
void AliHFEsecVtx::GetESDPID(const AliESDtrack *track, Int_t &recpid, Double_t &recprob)
{
recpid = -1;
recprob = -1;
Int_t ipid=-1;
Double_t max=0.;
Double_t probability[5];
track->GetESDpid(probability);
ipid = TMath::LocMax(5,probability);
max = TMath::MaxElement(5,probability);
recpid = ipid;
recprob = max;
}
void AliHFEsecVtx::AddHFEpairToArray(const AliHFEpairs* const pair)
{
Int_t n = HFEpairs()->GetEntriesFast();
if(n!=fNoOfHFEpairs)AliError(Form("fNoOfHFEpairs != HFEpairs()->GetEntriesFast %i != %i \n", fNoOfHFEpairs, n));
new((*HFEpairs())[n]) AliHFEpairs(*pair);
}
TClonesArray *AliHFEsecVtx::HFEpairs()
{
if (!fHFEpairs) {
fHFEpairs = new TClonesArray("AliHFEpairs", 200);
}
return fHFEpairs;
}
void AliHFEsecVtx::DeleteHFEpairs()
{
if (fHFEpairs) {
fHFEpairs->Delete();
}
}
void AliHFEsecVtx::InitHFEpairs()
{
fNoOfHFEpairs = 0;
}
void AliHFEsecVtx::AddHFEsecvtxToArray(const AliHFEsecVtxs* const secvtx)
{
Int_t n = HFEsecvtxs()->GetEntriesFast();
if(n!=fNoOfHFEsecvtxs)AliError(Form("fNoOfHFEsecvtxs != HFEsecvtxs()->GetEntriesFast %i != %i \n", fNoOfHFEsecvtxs, n));
new((*HFEsecvtxs())[n]) AliHFEsecVtxs(*secvtx);
}
TClonesArray *AliHFEsecVtx::HFEsecvtxs()
{
if (!fHFEsecvtxs) {
fHFEsecvtxs = new TClonesArray("AliHFEsecVtxs", 200);
}
return fHFEsecvtxs;
}
void AliHFEsecVtx::DeleteHFEsecvtxs()
{
if (fHFEsecvtxs) {
fHFEsecvtxs->Delete();
}
}
void AliHFEsecVtx::InitHFEsecvtxs()
{
fNoOfHFEsecvtxs = 0;
}
void AliHFEsecVtx::MakeContainer(){
const Int_t nDimPair=6;
Int_t nBinPair[nDimPair] = {200, 500, 314, 2000, 2000, 13};
const Double_t kInvmassmin = 0., kInvmassmax = 20.;
const Double_t kKFChi2min = 0, kKFChi2max= 50;
const Double_t kOpenanglemin = 0, kOpenanglemax = 3.14;
const Double_t kSignedLxymin = -10, kSignedLxymax= 10;
const Double_t kKFIPmin = -10, kKFIPmax= 10;
const Double_t kPairCodemin = -1, kPairCodemax= 12;
Double_t* binEdgesPair[nDimPair];
for(Int_t ivar = 0; ivar < nDimPair; ivar++)
binEdgesPair[ivar] = new Double_t[nBinPair[ivar] + 1];
for(Int_t i=0; i<=nBinPair[0]; i++) binEdgesPair[0][i]=(Double_t)kInvmassmin + (kInvmassmax - kInvmassmin)/nBinPair[0]*(Double_t)i;
for(Int_t i=0; i<=nBinPair[1]; i++) binEdgesPair[1][i]=(Double_t)kKFChi2min + (kKFChi2max - kKFChi2min)/nBinPair[1]*(Double_t)i;
for(Int_t i=0; i<=nBinPair[2]; i++) binEdgesPair[2][i]=(Double_t)kOpenanglemin + (kOpenanglemax - kOpenanglemin)/nBinPair[2]*(Double_t)i;
for(Int_t i=0; i<=nBinPair[3]; i++) binEdgesPair[3][i]=(Double_t)kSignedLxymin + (kSignedLxymax - kSignedLxymin)/nBinPair[3]*(Double_t)i;
for(Int_t i=0; i<=nBinPair[4]; i++) binEdgesPair[4][i]=(Double_t)kKFIPmin + (kKFIPmax - kKFIPmin)/nBinPair[4]*(Double_t)i;
for(Int_t i=0; i<=nBinPair[5]; i++) binEdgesPair[5][i]=(Double_t)kPairCodemin + (kPairCodemax - kPairCodemin)/nBinPair[5]*(Double_t)i;
fPairQA = new THnSparseF("pairQA", "QA for Pair; invmass[GeV/c^2]; KF chi2; opening angle; signed Lxy; KF ip; pair code; dca1; dca2", nDimPair, nBinPair);
for(Int_t idim = 0; idim < nDimPair; idim++){
fPairQA->SetBinEdges(idim, binEdgesPair[idim]);
}
fSecVtxList->AddAt(fPairQA,0);
const Int_t nDimSecvtx=9;
Double_t* binEdgesSecvtx[nDimSecvtx];
Int_t nBinSecvtx[nDimSecvtx] = {200, 500, 2000, 2000, 13, 10, 4, 2000, 500};
const Double_t kNtrksmin = 0, kNtrksmax= 10;
const Double_t kTrueBmin = 0, kTrueBmax= 4;
const Double_t kPtmin = 0, kPtmax= 50;
for(Int_t ivar = 0; ivar < nDimSecvtx; ivar++)
binEdgesSecvtx[ivar] = new Double_t[nBinSecvtx[ivar] + 1];
for(Int_t i=0; i<=nBinSecvtx[0]; i++) binEdgesSecvtx[0][i]=binEdgesPair[0][i];
for(Int_t i=0; i<=nBinSecvtx[1]; i++) binEdgesSecvtx[1][i]=binEdgesPair[1][i];
for(Int_t i=0; i<=nBinSecvtx[2]; i++) binEdgesSecvtx[2][i]=binEdgesPair[3][i];
for(Int_t i=0; i<=nBinSecvtx[3]; i++) binEdgesSecvtx[3][i]=binEdgesPair[4][i];
for(Int_t i=0; i<=nBinSecvtx[4]; i++) binEdgesSecvtx[4][i]=binEdgesPair[5][i];
for(Int_t i=0; i<=nBinSecvtx[5]; i++) binEdgesSecvtx[5][i]=(Double_t)kNtrksmin + (kNtrksmax - kNtrksmin)/nBinSecvtx[5]*(Double_t)i;
for(Int_t i=0; i<=nBinSecvtx[6]; i++) binEdgesSecvtx[6][i]=(Double_t)kTrueBmin + (kTrueBmax - kTrueBmin)/nBinSecvtx[6]*(Double_t)i;
for(Int_t i=0; i<=nBinSecvtx[7]; i++) binEdgesSecvtx[7][i]=binEdgesPair[3][i];
for(Int_t i=0; i<=nBinSecvtx[8]; i++) binEdgesSecvtx[8][i]=(Double_t)kPtmin + (kPtmax - kPtmin)/nBinSecvtx[8]*(Double_t)i;
fSecvtxQA = new THnSparseF("secvtxQA", "QA for Secvtx; invmass[GeV/c^2]; KF chi2; signed Lxy; KF ip; pair code; n tracks ", nDimSecvtx, nBinSecvtx);
for(Int_t idim = 0; idim < nDimSecvtx; idim++){
fSecvtxQA->SetBinEdges(idim, binEdgesSecvtx[idim]);
}
fSecVtxList->AddAt(fSecvtxQA,1);
for(Int_t ivar = 0; ivar < nDimPair; ivar++)
delete[] binEdgesPair[ivar];
for(Int_t ivar = 0; ivar < nDimSecvtx; ivar++)
delete[] binEdgesSecvtx[ivar];
}
void AliHFEsecVtx::MakeHistos(Int_t step){
TString hname=Form("step%d",step);
step = step*7;
const Double_t kPtbound[2] = {0.1, 20.};
Int_t iBin[1];
iBin[0] = 44;
Double_t* binEdges[1];
binEdges[0] = AliHFEtools::MakeLogarithmicBinning(iBin[0], kPtbound[0], kPtbound[1]);
fSecVtxList->AddAt(new TH1F(hname+"taggedElec", "pT of e", iBin[0],binEdges[0]), step);
fSecVtxList->AddAt(new TH1F(hname+"charmElec", "pT of e", iBin[0],binEdges[0]), step+1);
fSecVtxList->AddAt(new TH1F(hname+"beautyElec", "pT of e", iBin[0],binEdges[0]), step+2);
fSecVtxList->AddAt(new TH1F(hname+"conversionElec", "pT of e", iBin[0],binEdges[0]), step+3);
fSecVtxList->AddAt(new TH1F(hname+"ebgElec", "pT of e", iBin[0],binEdges[0]), step+4);
fSecVtxList->AddAt(new TH1F(hname+"hcontaminElec", "pT of e", iBin[0],binEdges[0]), step+5);
fSecVtxList->AddAt(new TH1F(hname+"elseElec", "pT of e", iBin[0],binEdges[0]), step+6);
delete[] binEdges[0];
}
void AliHFEsecVtx::FillHistos(Int_t step, const AliESDtrack *track){
step = step*7;
AliMCParticle *mctrack = NULL;
TParticle* mcpart = NULL;
(static_cast<TH1F *>(fSecVtxList->At(step)))->Fill(track->Pt());
if(HasMCData() && fMCQA){
if(!(mctrack = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(TMath::Abs(track->GetLabel()))))) return;
mcpart = mctrack->Particle();
Int_t esource=fMCQA->GetElecSource(mcpart,kTRUE);
if(esource==1) {
(static_cast<TH1F *>(fSecVtxList->At(step+1)))->Fill(mcpart->Pt());
}
else if(esource==2 || esource==3) {
(static_cast<TH1F *>(fSecVtxList->At(step+2)))->Fill(mcpart->Pt());
}
else if(esource>12 && esource<19) {
(static_cast<TH1F *>(fSecVtxList->At(step+3)))->Fill(mcpart->Pt());
}
else if(esource==7) {
(static_cast<TH1F *>(fSecVtxList->At(step+5)))->Fill(mcpart->Pt());
}
else if(!(esource<0)) {
(static_cast<TH1F *>(fSecVtxList->At(step+4)))->Fill(mcpart->Pt());
}
else {
(static_cast<TH1F *>(fSecVtxList->At(step+6)))->Fill(mcpart->Pt());
}
}
}