#include "AliLog.h"
#include "AliRsnExpression.h"
#include "AliRsnCut.h"
#include "AliRsnCutSet.h"
ClassImp(AliRsnCutSet)
AliRsnCutSet::AliRsnCutSet() :
AliRsnTarget(),
fCuts(0),
fNumOfCuts(0),
fCutScheme(""),
fCutSchemeIndexed(""),
fBoolValues(0),
fIsScheme(kFALSE),
fExpression(0),
fMonitors(),
fUseMonitor(kFALSE)
{
fBoolValues = new Bool_t[1];
AliRsnExpression::fgCutSet = this;
}
AliRsnCutSet::AliRsnCutSet(const char *name, RSNTARGET target) :
AliRsnTarget(name, target),
fCuts(0),
fNumOfCuts(0),
fCutScheme(""),
fCutSchemeIndexed(""),
fBoolValues(0),
fIsScheme(kFALSE),
fExpression(0),
fMonitors(),
fUseMonitor(kFALSE)
{
fBoolValues = new Bool_t[1];
fExpression = 0;
AliRsnExpression::fgCutSet = this;
}
AliRsnCutSet::AliRsnCutSet(const AliRsnCutSet ©) :
AliRsnTarget(copy),
fCuts(copy.fCuts),
fNumOfCuts(copy.fNumOfCuts),
fCutScheme(copy.fCutScheme),
fCutSchemeIndexed(copy.fCutSchemeIndexed),
fBoolValues(0),
fIsScheme(copy.fIsScheme),
fExpression(copy.fExpression),
fMonitors(copy.fMonitors),
fUseMonitor(copy.fUseMonitor)
{
Int_t i;
fBoolValues = new Bool_t[fNumOfCuts];
for (i = 0; i < fNumOfCuts; ++i) {
fBoolValues[i] = copy.fBoolValues[i];
}
AliRsnExpression::fgCutSet = this;
}
AliRsnCutSet &AliRsnCutSet::operator=(const AliRsnCutSet ©)
{
AliRsnTarget::operator=(copy);
if (this == ©)
return *this;
fCuts = copy.fCuts;
fNumOfCuts = copy.fNumOfCuts;
fCutScheme = copy.fCutScheme;
fCutSchemeIndexed = copy.fCutSchemeIndexed;
fIsScheme = copy.fIsScheme;
fExpression = copy.fExpression;
fMonitors = copy.fMonitors;
fUseMonitor = copy.fUseMonitor;
if (fBoolValues) delete [] fBoolValues;
Int_t i;
fBoolValues = new Bool_t[fNumOfCuts];
for (i = 0; i < fNumOfCuts; ++i) {
fBoolValues[i] = copy.fBoolValues[i];
}
AliRsnExpression::fgCutSet = this;
return (*this);
}
AliRsnCutSet::~AliRsnCutSet()
{
delete fExpression;
delete [] fBoolValues;
}
void AliRsnCutSet::AddCut(AliRsnCut *cut)
{
if (!cut->IsTarget(GetTargetType())) {
AliError(Form("Cannot add this cut (cut set name,target = [%s],[%s] --- cut name,target = [%s],[%s]", GetName(), GetTargetTypeName(), cut->GetName(), cut->GetTargetTypeName()));
return;
}
Int_t i;
AliDebug(AliLog::kDebug, "<-");
fCuts.Add(cut);
AliInfo(Form("====> Adding a new cut: [%s]", cut->GetName()));
fNumOfCuts++;
if (fBoolValues) delete [] fBoolValues;
fBoolValues = new Bool_t[fNumOfCuts];
for (i = 0; i < fNumOfCuts; i++) {
fBoolValues[i] = kTRUE;
}
AliDebug(AliLog::kDebug, Form("%d", fCuts.GetEntriesFast()));
AliDebug(AliLog::kDebug, "->");
}
void AliRsnCutSet::ShowCuts() const
{
AliRsnCut *cut;
for (Int_t i = 0; i < fCuts.GetEntriesFast() ; i++) {
cut = (AliRsnCut *)fCuts.At(i);
cut->Print();
}
}
Bool_t AliRsnCutSet::IsSelected(TObject *object)
{
Int_t i;
if (!fNumOfCuts) return kTRUE;
Bool_t boolReturn = kTRUE;
AliRsnCut *cut;
for (i = 0; i < fNumOfCuts; i++) {
cut = (AliRsnCut *)fCuts.At(i);
fBoolValues[i] = cut->IsSelected(object);
}
if (fIsScheme) boolReturn = Passed();
if (boolReturn && fUseMonitor) {
if (TargetOK(object)) {
TIter next(&fMonitors);
AliRsnListOutput *mo;
while ((mo = (AliRsnListOutput *) next())) {
mo->Fill(fEvent,fDaughter);
}
}
}
return boolReturn;
}
void AliRsnCutSet::SetCutScheme(const char *theValue)
{
AliDebug(AliLog::kDebug, "<-");
fCutScheme = theValue;
SetCutSchemeIndexed(theValue);
fIsScheme = kTRUE;
AliDebug(AliLog::kDebug, "->");
}
void AliRsnCutSet::SetCutSchemeIndexed(TString theValue)
{
AliDebug(AliLog::kDebug, "<-");
theValue.Append(" ");
fCutSchemeIndexed = GetCutSchemeIndexed();
AliDebug(AliLog::kDebug, "->");
}
Int_t AliRsnCutSet::GetIndexByCutName(TString s)
{
Int_t i;
AliRsnCut *cut;
for (i = 0; i < fCuts.GetEntriesFast(); i++) {
cut = (AliRsnCut *) fCuts.At(i);
if (!s.CompareTo(cut->GetName())) return i;
}
return -1;
}
Bool_t AliRsnCutSet::Passed()
{
AliRsnExpression::fgCutSet = this;
if (!fExpression) {
fExpression = new AliRsnExpression(fCutSchemeIndexed);
AliDebug(AliLog::kDebug, "fExpression was created.");
}
if (fCuts.IsEmpty()) return kTRUE;
return fExpression->Value(*GetCuts());
}
Bool_t AliRsnCutSet::IsValidScheme()
{
TString str(fCutScheme);
AliRsnCut *cut;
for (Int_t i = 0; i < fNumOfCuts; i++) {
cut = (AliRsnCut *)fCuts.At(i);
str.ReplaceAll(cut->GetName(), "");
}
str.ReplaceAll("&", "");
str.ReplaceAll("!", "");
str.ReplaceAll("|", "");
str.ReplaceAll("(", "");
str.ReplaceAll(")", "");
if (!str.IsNull()) {
AliError(Form("Cut scheme '%s' is not valid !!!", fCutScheme.Data()));
return kFALSE;
}
return kTRUE;
}
TString AliRsnCutSet::ShowCutScheme() const
{
return fCutScheme;
}
Int_t AliRsnCutSet::TestExpression(TString opt)
{
AliDebug(1, opt.Data());
return 0;
}
void AliRsnCutSet::PrintSetInfo()
{
Int_t i;
AliInfo("========== Rsn Cut Set info ==============");
AliInfo(Form("Scheme : %s", fCutScheme.Data()));
AliInfo(Form("Scheme : %s", fCutSchemeIndexed.Data()));
AliInfo(Form("Num of Cuts: %d", fCuts.GetEntriesFast()));
AliInfo("====== Cuts ======");
AliRsnCut *cut;
for (i = 0; i < fCuts.GetEntriesFast(); i++) {
cut = (AliRsnCut *) fCuts.At(i);
if (cut) AliInfo(Form("%d %d", i, fBoolValues[i]));
}
AliInfo("========== END Rsn Cut Mgr info ==============");
}
TString AliRsnCutSet::GetCutSchemeIndexed()
{
AliDebug(AliLog::kDebug, "<-");
Int_t i;
TString str(fCutScheme);
AliDebug(AliLog::kDebug, Form("Num of cuts %d", fCuts.GetEntriesFast()));
AliRsnCut *cut;
for (i = 0; i < fCuts.GetEntriesFast(); i++) {
cut = (AliRsnCut *) fCuts.At(i);
str.ReplaceAll(cut->GetName(), Form("%d", i));
}
AliDebug(AliLog::kDebug, "->");
return str;
}
Bool_t AliRsnCutSet::Init(TList *list)
{
if (!fUseMonitor) return kTRUE;
TIter next(&fMonitors);
AliRsnListOutput *mo;
while ((mo = (AliRsnListOutput *) next())) {
mo->Init(GetName(),list);
}
return kTRUE;
}
void AliRsnCutSet::AddMonitor(AliRsnListOutput *mon)
{
fMonitors.Add(mon);
}