#include <TIterator.h>
#include <TMath.h>
#include <TObjArray.h>
#include <TObjString.h>
#include <TString.h>
#include "AliLog.h"
#include "AliESDEvent.h"
#include "AliESDVertex.h"
#include "AliTRDeventInfo.h"
#include "AliTRDeventCuts.h"
ClassImp(AliTRDeventCuts)
AliTRDeventCuts::AliTRDeventCuts()
:TNamed("trdEventCuts", "")
,fTriggerNames(NULL)
,fBunches(NULL)
,fEventType(7)
,fVertexN(1)
,fVertexZ(15.)
{
}
AliTRDeventCuts::AliTRDeventCuts(const Char_t *name)
:TNamed(name, "")
,fTriggerNames(NULL)
,fBunches(NULL)
,fEventType(7)
,fVertexN(1)
,fVertexZ(15.)
{
}
AliTRDeventCuts::AliTRDeventCuts(const AliTRDeventCuts &ref)
:TNamed((TNamed&)ref)
,fTriggerNames(NULL)
,fBunches(NULL)
,fEventType(ref.fEventType)
,fVertexN(ref.fVertexN)
,fVertexZ(ref.fVertexZ)
{
if(ref.fTriggerNames){
for(Int_t it(0); it<ref.fTriggerNames->GetEntriesFast(); it++) AddTrigger(((TObjString*)(*ref.fTriggerNames)[it])->GetName());
}
if(ref.fBunches) SetBunchSelection(AliTRDeventInfo::kLHCbunches, ref.fBunches);
}
AliTRDeventCuts::~AliTRDeventCuts()
{
if(fTriggerNames) fTriggerNames->Delete();
delete fTriggerNames;
if(fBunches) delete [] fBunches;
}
Bool_t AliTRDeventCuts::IsSelected(AliESDEvent *ev, Bool_t col)
{
Bool_t select = kTRUE;
if(fTriggerNames){
Bool_t passTrigger = kFALSE;
TString trgname = ev->GetFiredTriggerClasses();
TObjArray *triggers = trgname.Tokenize(" ");
TIterator *trgIter = triggers->MakeIterator();
TObjString *trg(NULL);
while((trg = dynamic_cast<TObjString *>(trgIter->Next())))
passTrigger = passTrigger || CheckTrigger(trg->String().Data());
triggers->Delete(); delete triggers; delete trgIter;
select = select && passTrigger;
}
if(!select){
AliDebug(1, Form("Reject Ev[%d] for trigger[%s]", ev->GetEventNumberInFile(), ev->GetFiredTriggerClasses().Data()));
return select;
}
select = select && (ev->GetEventType() == fEventType);
if(!select){
AliDebug(1, Form("Reject Ev[%d] for EvType[%d]", ev->GetEventNumberInFile(), ev->GetEventType()));
return select;
}
if(!col) return select;
const AliESDVertex *primVtx = ev->GetPrimaryVertex();
if(fVertexN > 0)
select = select && (primVtx && primVtx->GetNContributors() >= fVertexN);
if(fVertexZ >= 0.)
select = select && (primVtx && TMath::Abs(primVtx->GetZ()) <= fVertexZ);
if(!select){
AliDebug(1, Form("Reject Ev[%d] for Vertex[%p][%d %6.2f]", ev->GetEventNumberInFile(), (void*)primVtx, primVtx?primVtx->GetNContributors():0, primVtx?TMath::Abs(primVtx->GetZ()):0));
return select;
}
if(fBunches){
Int_t evBC(ev->GetBunchCrossNumber()), ibc(0);
Bool_t kFOUND(kFALSE);
while(fBunches[ibc]>0){
if(evBC==fBunches[ibc]){
kFOUND = kTRUE;
break;
}
ibc++;
}
select = select && kFOUND;
}
if(!select){
AliDebug(1, Form("Reject Ev[%d] for BunchCross[%d]", ev->GetEventNumberInFile(), ev->GetBunchCrossNumber()));
return select;
}
return select;
}
void AliTRDeventCuts::AddTrigger(const Char_t *name)
{
if(!fTriggerNames) fTriggerNames = new TObjArray;
if(CheckTrigger(name)) return;
fTriggerNames->Add(new TObjString(name));
}
Bool_t AliTRDeventCuts::CheckTrigger(const Char_t *name)
{
if(!fTriggerNames) return kFALSE;
Bool_t kExists(kFALSE);
for(Int_t it(0); it<fTriggerNames->GetEntriesFast(); it++){
if(((TObjString*)(*fTriggerNames)[it])->String().CompareTo(name)==0){
kExists = kTRUE;
break;
}
}
return kExists;
}
void AliTRDeventCuts::Print(Option_t *) const
{
printf("Event Type : %2d\n", fEventType);
printf("Vertex selection: N[%2d] Z[cm]=%6.2f\n", fVertexN, fVertexZ);
if(fTriggerNames){
printf("Trigger selection: ");
for(Int_t it(0); it<fTriggerNames->GetEntriesFast(); it++) printf("\"%s\" ", ((TObjString*)(*fTriggerNames)[it])->GetName());
printf("\n");
}
if(fBunches){
printf("Bunches selection: ");
for(Int_t ibc(0); ibc<AliTRDeventInfo::kLHCbunches; ibc++){
if(fBunches[ibc]<0) break;
printf("%4d ", fBunches[ibc]);
}
printf("\n");
}
}
void AliTRDeventCuts::SetBunchSelection(Int_t n, Int_t bunches[])
{
if(!fBunches) fBunches = new Int_t[AliTRDeventInfo::kLHCbunches];
for(Int_t ibc(0); ibc<AliTRDeventInfo::kLHCbunches; ibc++) fBunches[ibc] = ibc<n?bunches[ibc]:-1;
}