#include "Riostream.h"
#include "AliLog.h"
#include "AliRsnLoopEff.h"
ClassImp(AliRsnLoopEff)
AliRsnLoopEff::AliRsnLoopEff(const char *name, Int_t nSteps, Double_t maxDist) :
AliRsnLoop(name),
fAddSteps(nSteps),
fSteps(0),
fOutput(0),
fMaxDistPV(maxDist)
{
fVertex[0] = fVertex[1] = fVertex[2] = 0.0;
}
AliRsnLoopEff::AliRsnLoopEff(const AliRsnLoopEff ©) :
AliRsnLoop(copy),
fAddSteps(copy.fAddSteps),
fSteps(copy.fSteps),
fOutput(copy.fOutput),
fMaxDistPV(copy.fMaxDistPV)
{
fVertex[0] = fVertex[1] = fVertex[2] = 0.0;
}
AliRsnLoopEff &AliRsnLoopEff::operator=(const AliRsnLoopEff ©)
{
AliRsnLoop::operator=(copy);
if (this == ©)
return *this;
fAddSteps = copy.fAddSteps;
fSteps = copy.fSteps;
fOutput = copy.fOutput;
return (*this);
}
AliRsnLoopEff::~AliRsnLoopEff()
{
fSteps.Delete();
delete fOutput;
}
void AliRsnLoopEff::CreateOutput()
{
fOutput = new AliRsnListOutput(Form("%s_out", GetName()), AliRsnListOutput::kCFContainer);
}
void AliRsnLoopEff::AddStep(TObject *cuts)
{
fSteps.AddLast(cuts);
}
Bool_t AliRsnLoopEff::Init(const char *prefix, TList *list)
{
if (!fOutputs.IsEmpty()) {
AliInfo("Clearing container of this efficiency loop.");
fOutputs.Delete();
}
Int_t nSteps = (Int_t)fSteps.GetEntries();
nSteps += fAddSteps;
fOutput->SetSteps(nSteps);
fOutput->SetSkipFailed(kFALSE);
AliRsnLoop::AddOutput(fOutput);
if (AliRsnLoop::Init(Form("%s_%s", prefix, GetName()), list)) {
fOutput = (AliRsnListOutput *)fOutputs[0];
return kTRUE;
} else {
fOutput = 0x0;
return kFALSE;
}
}
Int_t AliRsnLoopEff::FindTrack(Int_t label, const AliVEvent *event)
{
Int_t i = 0;
Int_t ntracks = event->GetNumberOfTracks();
TArrayI array(100);
for (i = 0; i < ntracks; i++) {
AliVParticle *track = event->GetTrack(i);
if (TMath::Abs(track->GetLabel()) != label) continue;
return i;
}
return -1;
}
Int_t AliRsnLoopEff::GetMatchedDaughter(Int_t label, AliRsnEvent *event)
{
if (!event) return -1;
AliRsnDaughter out;
Int_t i, imax = event->GetAbsoluteSum();
for (i = 0; i < imax; i++) {
event->SetDaughter(out, i);
if (out.IsOK() && out.GetLabel() == label) return i;
}
return -1;
}
Double_t AliRsnLoopEff::DistanceFromPV(Double_t x, Double_t y, Double_t z)
{
AliDebugClass(1, Form("Vertex = %.3f %.3f %.3f -- vprod = %.3f %.3f %.3f", fVertex[0], fVertex[1], fVertex[2], x, y, z));
x -= fVertex[0];
y -= fVertex[1];
z -= fVertex[2];
return TMath::Sqrt(x*x + y*y + z*z);
}