#include "AliEveKink.h"
#include <TDatabasePDG.h>
#include <TEveTrack.h>
#include <TEveTrackPropagator.h>
#include <TEveManager.h>
ClassImp(AliEveKink)
AliEveKink::AliEveKink() :
TEvePointSet(),
fRecKinkPosition(),
fMotherMomentum(),
fDaughterMomentum(),
fMotherTrack(0),
fDaughterTrack(0),
fRnrStyleMoth(0),
fRnrStyleDaugh(0),
fESDKinkIndex(-1),
fDaugMaxProbPdg(0),
fDaugMaxProbPid(0)
{
fKinkAngle[0]=fKinkAngle[1]=fKinkAngle[2]=0.0;
fPickable = kTRUE;
}
AliEveKink::AliEveKink(TEveRecTrack* tMoth, TEveRecTrack* tDaug,
TEveRecKink* kink, TEveTrackPropagator* rsMoth, TEveTrackPropagator* rsDaugh) :
TEvePointSet(),
fRecKinkPosition(kink->fVKink),
fMotherMomentum(kink->fPMother),
fDaughterMomentum(kink->fPDaughter),
fMotherTrack(new TEveTrack(tMoth, rsMoth)),
fDaughterTrack(new TEveTrack(tDaug, rsDaugh)),
fRnrStyleMoth(rsMoth),
fRnrStyleDaugh(rsDaugh),
fESDKinkIndex(-1),
fDaugMaxProbPdg(0),
fDaugMaxProbPid(0)
{
fPickable = kTRUE;
fKinkAngle[0]=fKinkAngle[1]=fKinkAngle[2]=0;
fMotherTrack->SetLineColor(2);
fMotherTrack->SetStdTitle();
fMotherTrack->SetLineWidth(3);
TEvePathMark* pmM = new TEvePathMark(TEvePathMark::kDecay);
pmM->fV.Set(kink->fVKink);
fMotherTrack->AddPathMark(*pmM);
fDaughterTrack->SetLineColor(7);
fDaughterTrack->SetLineWidth(3);
fDaughterTrack->SetStdTitle();
fMotherTrack->IncDenyDestroy();
AddElement(fMotherTrack);
fDaughterTrack->IncDenyDestroy();
AddElement(fDaughterTrack);
delete pmM;
}
AliEveKink::~AliEveKink()
{
fMotherTrack->DecDenyDestroy();
fDaughterTrack->DecDenyDestroy();
}
void AliEveKink::SetMaxProbPdgPid(Int_t rPdg, Float_t rPid)
{
fDaugMaxProbPdg = rPdg;
fDaugMaxProbPid = rPid;
}
Float_t AliEveKink::GetInvMass(Int_t dPdgCode) const
{
TEveVector lDaugMomentum = fDaughterTrack->GetMomentum();
TEveVector lMothMomentum = fMotherTrack->GetMomentum();
Double_t dMass=TDatabasePDG::Instance()->GetParticle(dPdgCode)->Mass();
Double_t eDaug = TMath::Sqrt(dMass*dMass + lDaugMomentum.Mag2());
Double_t otherDaug=TMath::Sqrt(
(lMothMomentum.fX-lDaugMomentum.fX)*(lMothMomentum.fX-lDaugMomentum.fX)+
(lMothMomentum.fY-lDaugMomentum.fY)*(lMothMomentum.fY-lDaugMomentum.fY)+
(lMothMomentum.fZ-lDaugMomentum.fZ)*(lMothMomentum.fZ-lDaugMomentum.fZ));
return TMath::Sqrt( (eDaug+otherDaug)*(eDaug+otherDaug) - lMothMomentum.Mag2());
}
Float_t AliEveKink::GetQt() const
{
TEveVector lDaugMomentum = fDaughterTrack->GetMomentum();
Float_t daugMom=TMath::Sqrt(
(lDaugMomentum.fX)*(lDaugMomentum.fX)+
(lDaugMomentum.fY)*(lDaugMomentum.fY)+
(lDaugMomentum.fZ)*(lDaugMomentum.fZ));
return TMath::Sin(fKinkAngle[2])*daugMom ;
}
void AliEveKink::MakeKink()
{
SetPoint(0, fRecKinkPosition.fX, fRecKinkPosition.fY, fRecKinkPosition.fZ);
fMotherTrack->MakeTrack();
fDaughterTrack->MakeTrack();
}
ClassImp(AliEveKinkList)
AliEveKinkList::AliEveKinkList() :
TEveElementList(),
fRnrStyleMoth(0),
fRnrStyleDaugh(0),
fRnrKinkDaughter(kTRUE),
fRnrKinkvtx(kTRUE),
fMothColor(0),
fDaugColor(0),
fMinRCut(0),
fMaxRCut(300),
fMinKinkAngle(0),
fMaxKinkAngle(300),
fMinPt(0),
fMaxPt(20),
fMinInvariantMass(0),
fMaxInvariantMass(1.0),
fDaugCheckedPid(0),
fDaugCheckedProb(0)
{
fChildClass = AliEveKink::Class();
}
AliEveKinkList::AliEveKinkList(TEveTrackPropagator* rsMoth,TEveTrackPropagator* rsDaugh) :
TEveElementList(),
fRnrStyleMoth(rsMoth),
fRnrStyleDaugh(rsDaugh),
fRnrKinkDaughter(kTRUE),
fRnrKinkvtx(kTRUE),
fMothColor(0),
fDaugColor(0),
fMinRCut(0),
fMaxRCut(300),
fMinKinkAngle(0),
fMaxKinkAngle(300),
fMinPt(0),
fMaxPt(20),
fMinInvariantMass(0),
fMaxInvariantMass(1.0),
fDaugCheckedPid(0),
fDaugCheckedProb(0)
{
fChildClass = AliEveKink::Class();
Init();
}
AliEveKinkList::AliEveKinkList(const Text_t* name, TEveTrackPropagator* rsMoth, TEveTrackPropagator* rsDaugh) :
TEveElementList(),
fRnrStyleMoth(rsMoth),
fRnrStyleDaugh(rsDaugh),
fRnrKinkDaughter(kTRUE),
fRnrKinkvtx(kTRUE),
fMothColor(0),
fDaugColor(0),
fMinRCut(0),
fMaxRCut(300),
fMinKinkAngle(0),
fMaxKinkAngle(300),
fMinPt(0),
fMaxPt(20),
fMinInvariantMass(0),
fMaxInvariantMass(1.0),
fDaugCheckedPid(0),
fDaugCheckedProb(0)
{
fChildClass = AliEveKink::Class();
Init();
SetName(name);
}
void AliEveKinkList::Init()
{
if (fRnrStyleMoth== 0) fRnrStyleMoth = new TEveTrackPropagator;
if (fRnrStyleDaugh== 0) fRnrStyleDaugh = new TEveTrackPropagator;
}
void AliEveKinkList::MakeKinks()
{
for(List_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
((AliEveKink*)(*i))->MakeKink();
}
gEve->Redraw3D();
}
void AliEveKinkList::FilterByRadius(Float_t minR, Float_t maxR)
{
fMinRCut = minR;
fMaxRCut = maxR;
for(List_i i = fChildren.begin(); i != fChildren.end(); ++i)
{
AliEveKink* kink = (AliEveKink*) *i;
Float_t rad = kink->GetKinkRadius();
Bool_t show = rad >= fMinRCut && rad <= fMaxRCut;
kink->SetRnrState(show);
}
ElementChanged();
gEve->Redraw3D();
}
void AliEveKinkList::FilterByKinkAngle(Float_t minKinkAngle, Float_t maxKinkAngle)
{
fMinKinkAngle = minKinkAngle;
fMaxKinkAngle = maxKinkAngle;
for(List_i i = fChildren.begin(); i != fChildren.end(); ++i)
{
AliEveKink* kink = (AliEveKink*) *i;
Float_t angle = TMath::RadToDeg()*kink->GetKinkAngle(2);
Bool_t show = angle >= fMinKinkAngle && angle <= fMaxKinkAngle;
kink->SetRnrState(show);
}
ElementChanged();
gEve->Redraw3D();
}
void AliEveKinkList::FilterByPt(Float_t minPt, Float_t maxPt)
{
fMinPt = minPt;
fMaxPt = maxPt;
for(List_i i = fChildren.begin(); i != fChildren.end(); ++i)
{
AliEveKink* kink = (AliEveKink*) *i;
Float_t pt = kink->GetKinkPMotherPerp();
Bool_t show = pt >= fMinPt && pt <= fMaxPt;
kink->SetRnrState(show);
}
ElementChanged();
gEve->Redraw3D();
}
void AliEveKinkList::FilterByInvariantMass(Float_t minInvariantMass, Float_t maxInvariantMass, Int_t dPdgCode)
{
fMinInvariantMass = minInvariantMass;
fMaxInvariantMass = maxInvariantMass;
for(List_i i = fChildren.begin(); i != fChildren.end(); ++i)
{
AliEveKink* kink = (AliEveKink*) *i;
Float_t invMass = kink->GetInvMass(dPdgCode);
Bool_t show = invMass >= fMinInvariantMass && invMass <= fMaxInvariantMass;
kink->SetRnrState(show);
}
ElementChanged();
gEve->Redraw3D();
}
void AliEveKinkList::FilterByCheckedPidMinProb(Int_t rFlag, Int_t rPid, Float_t rProb)
{
fDaugCheckedPid = rPid;
fDaugCheckedProb = rProb;
for(List_i i = fChildren.begin(); i != fChildren.end(); ++i)
{
AliEveKink* kink = (AliEveKink*) *i;
Int_t pid = 0;
Float_t prob = 0;
Bool_t show = kFALSE;
pid = kink->GetDaugMaxProbPdg();
prob = kink->GetDaugMaxProbPid();
show = (pid == fDaugCheckedPid && prob > fDaugCheckedProb) || !rFlag ;
kink->SetRnrState(show);
}
ElementChanged();
gEve->Redraw3D();
}