#include "AliAODEvent.h"
#include "AliVVertex.h"
#include "AliCentrality.h"
+#include "AliAnalysisUtils.h"
#include "AliAnalysisMuonUtility.h"
fVertexMinNContributors(0),
fVertexVzMin(0.),
fVertexVzMax(0.),
- fDefaultTrigClassPatterns(""),
+ fCheckMask(0),
fSelectedTrigPattern(0x0),
fRejectedTrigPattern(0x0),
fSelectedTrigLevel(0x0),
fTrigInputsMap(0x0),
fAllSelectedTrigClasses(0x0),
fCentralityClasses(0x0),
+ fAnalysisUtils(0x0),
fEventTriggerMask(0),
fSelectedTrigClassesInEvent(0x0)
{
fVertexMinNContributors(0),
fVertexVzMin(0.),
fVertexVzMax(0.),
- fDefaultTrigClassPatterns(""),
+ fCheckMask(0xFFFF),
fSelectedTrigPattern(new TObjArray()),
fRejectedTrigPattern(new TObjArray()),
fSelectedTrigLevel(new TObjArray()),
fTrigInputsMap(new THashList()),
fAllSelectedTrigClasses(new THashList()),
fCentralityClasses(0x0),
+ fAnalysisUtils(0x0),
fEventTriggerMask(0),
fSelectedTrigClassesInEvent(new TObjArray())
{
SetDefaultFilterMask();
SetDefaultTrigClassPatterns();
SetTrigClassLevels();
- SetDefaultTrigInputsMap();
SetCentralityClasses();
+ fAnalysisUtils = new AliAnalysisUtils();
fAllSelectedTrigClasses->SetOwner();
fSelectedTrigClassesInEvent->SetOwner();
}
fVertexMinNContributors(obj.fVertexMinNContributors),
fVertexVzMin(obj.fVertexVzMin),
fVertexVzMax(obj.fVertexVzMax),
- fDefaultTrigClassPatterns(obj.fDefaultTrigClassPatterns),
+ fCheckMask(obj.fCheckMask),
fSelectedTrigPattern(obj.fSelectedTrigPattern),
fRejectedTrigPattern(obj.fRejectedTrigPattern),
fSelectedTrigLevel(obj.fSelectedTrigLevel),
fTrigInputsMap(obj.fTrigInputsMap),
fAllSelectedTrigClasses(obj.fAllSelectedTrigClasses),
fCentralityClasses(obj.fCentralityClasses),
+ fAnalysisUtils(obj.fAnalysisUtils),
fEventTriggerMask(obj.fEventTriggerMask),
fSelectedTrigClassesInEvent(obj.fSelectedTrigClassesInEvent)
{
fVertexMinNContributors = obj.fVertexMinNContributors,
fVertexVzMin = obj.fVertexVzMin;
fVertexVzMax = obj.fVertexVzMax;
- fDefaultTrigClassPatterns = obj.fDefaultTrigClassPatterns;
+ fCheckMask = obj.fCheckMask;
fSelectedTrigPattern = obj.fSelectedTrigPattern;
fRejectedTrigPattern = obj.fRejectedTrigPattern;
fSelectedTrigLevel = obj.fSelectedTrigLevel;
fTrigInputsMap = obj.fTrigInputsMap;
fAllSelectedTrigClasses = obj.fAllSelectedTrigClasses;
fCentralityClasses = obj.fCentralityClasses;
+ fAnalysisUtils = obj.fAnalysisUtils;
fEventTriggerMask = obj.fEventTriggerMask;
fSelectedTrigClassesInEvent = obj.fSelectedTrigClassesInEvent;
}
delete fAllSelectedTrigClasses;
delete fSelectedTrigClassesInEvent;
delete fCentralityClasses;
+ delete fAnalysisUtils;
}
//________________________________________________________________________
UInt_t selectionMask = 0;
+ UInt_t checkMask = fCheckMask | GetFilterMask();
+
const AliInputEventHandler* inputHandler = static_cast<const AliInputEventHandler*> ( obj );
- if ( const_cast<AliInputEventHandler*>(inputHandler)->IsEventSelected() & fPhysicsSelectionMask ) selectionMask |= kPhysicsSelected;
+ if ( checkMask & kPhysicsSelected ) {
+ if ( const_cast<AliInputEventHandler*>(inputHandler)->IsEventSelected() & fPhysicsSelectionMask ) selectionMask |= kPhysicsSelected;
+ }
const AliVEvent* event = inputHandler->GetEvent();
if ( fSelectedTrigClassesInEvent->GetEntries() > 0 ) selectionMask |= kSelectedTrig;
- AliVVertex* vertex = AliAnalysisMuonUtility::GetVertexSPD(event);
- if ( vertex->GetNContributors() >= GetVertexMinNContributors() &&
+ if ( checkMask & kGoodVertex ) {
+ AliVVertex* vertex = AliAnalysisMuonUtility::GetVertexSPD(event);
+ if ( vertex->GetNContributors() >= GetVertexMinNContributors() &&
vertex->GetZ() >= GetVertexVzMin() && vertex->GetZ() <= GetVertexVzMax() ) selectionMask |= kGoodVertex;
+ }
- AliDebug(1, Form("Selection mask 0x%x\n", selectionMask));
+ if ( checkMask & kNoPileup ) {
+ if ( ! fAnalysisUtils->IsPileUpEvent(const_cast<AliVEvent*>(event)) ) selectionMask |= kNoPileup;
+ // // Uncomment to use settings for pPb
+ // if ( fRejectPileup ) {
+ // Int_t nTracklets = ( event.IsA() == AliESDEvent::Class() ) ? static_cast<AliESDEvent*>(event)->GetMultiplicity()->GetNumberOfTracklets() : static_cast<AliAODEvent*>(event)->GetTracklets()->GetNumberOfTracklets();
+ // Int_t nContrib = ( nTracklets < 40 ) ? 3 : 5;
+ // Double_t dist = 0.8;
+ // Bool_t isPielup = ( event.IsA() == AliESDEvent::Class() ) ? static_cast<AliESDEvent*>(event)->IsPileupFromSPD(nContrib,dist) : static_cast<AliAODEvent*>(event)->IsPileupFromSPD(nContrib,dist);
+ // if ( isPielup ) return;
+ // }
+ }
+ AliDebug(1, Form("Selection mask 0x%x\n", selectionMask));
return selectionMask;
}
return kTRUE;
}
+//________________________________________________________________________
+TString AliMuonEventCuts::GetDefaultTrigClassPatterns () const
+{
+ /// Get the default patterns
+ /// (done in such a way to get all muon triggers)
+ return "CM*,C0M*,CINT*,CPBI*,CCENT*,CV*,!*ABCE*,!*-ACE-*,!*-AC-*,!*-E-*,!*WU*,!*EGA*,!*EJE*,!*PHS*";
+}
+
+//________________________________________________________________________
+TString AliMuonEventCuts::GetDefaultTrigInputsMap () const
+{
+ /// Get the default trigger inputs
+ ///
+
+ TString trigInputsMap = "0VBA:0,";
+ trigInputsMap += "0VBC:1,";
+ trigInputsMap += "0SMB:2,";
+ trigInputsMap += "0TVX:3,";
+ trigInputsMap += "0VGC:4,";
+ trigInputsMap += "0VGA:5,";
+ trigInputsMap += "0SH1:6,";
+ trigInputsMap += "0SH2:7,";
+ trigInputsMap += "0HPT:8,";
+ trigInputsMap += "0AMU:9,";
+ trigInputsMap += "0OB0:10,";
+ trigInputsMap += "0ASL:11,";
+ trigInputsMap += "0MSL:12,";
+ trigInputsMap += "0MSH:13,";
+ trigInputsMap += "0MUL:14,";
+ trigInputsMap += "0MLL:15,";
+ trigInputsMap += "0EMC:16,";
+ trigInputsMap += "0PH0:17,";
+ trigInputsMap += "0HWU:18,";
+ trigInputsMap += "0LSR:19,";
+ trigInputsMap += "0T0A:20,";
+ trigInputsMap += "0BPA:21,";
+ trigInputsMap += "0BPC:22,";
+ trigInputsMap += "0T0C:23,";
+
+ trigInputsMap += "1EJE:0,";
+ trigInputsMap += "1EGA:1,";
+ trigInputsMap += "1EJ2:2,";
+ trigInputsMap += "1EG2:3,";
+ trigInputsMap += "1PHL:4,";
+ trigInputsMap += "1PHM:5,";
+ trigInputsMap += "1PHH:6,";
+ trigInputsMap += "1HCO:8,";
+ trigInputsMap += "1HJT:9,";
+ trigInputsMap += "1HSE:10,";
+ trigInputsMap += "1DUM:11,";
+ trigInputsMap += "1HQU:12,";
+ trigInputsMap += "1H14:13,";
+ trigInputsMap += "1ZMD:14,";
+ trigInputsMap += "1ZMB:16,";
+ trigInputsMap += "1ZED:17,";
+ trigInputsMap += "1ZAC:18,";
+ trigInputsMap += "1EJE:19";
+
+ return trigInputsMap;
+}
+
//________________________________________________________________________
void AliMuonEventCuts::SetDefaultTrigClassPatterns ()
{
/// Set the default patterns
/// (done in such a way to get all muon triggers)
- fDefaultTrigClassPatterns = "CM*,C0M*,CINT*,CPBI*,CCENT*,CV*,!*ABCE*,!*-ACE-*,!*-AC-*,!*-E-*,!*WU*,!*EGA*,!*EJE*,!*PHS*";
- SetTrigClassPatterns(fDefaultTrigClassPatterns);
+ SetTrigClassPatterns(GetDefaultTrigClassPatterns(),GetDefaultTrigInputsMap());
}
//________________________________________________________________________
-void AliMuonEventCuts::SetTrigClassPatterns ( const TString trigPattern )
+void AliMuonEventCuts::SetTrigClassPatterns ( TString trigPattern, TString trigInputsMap )
{
/// Set trigger classes
///
if ( fSelectedTrigPattern->GetEntries() > 0 ) fSelectedTrigPattern->Delete();
fRejectedTrigPattern->SetOwner();
if ( fRejectedTrigPattern->GetEntries() > 0 ) fRejectedTrigPattern->Delete();
-
+
+ SetTrigInputsMap(trigInputsMap);
+
TString badSyntax = "", duplicated = "";
TString listName[4] = {"L0","L1","L2","trigClass"};
Bool_t isSingleTrigger = ( ! isCombination && ! currPattern.BeginsWith("0") && ! currPattern.BeginsWith("1") && ! currPattern.BeginsWith("2") );
Bool_t isMatchPattern = ( currPattern.Contains("*") || isSingleTrigger );
Bool_t isRejectPattern = kFALSE;
- if ( currPattern.Contains("!") ) {
+ if ( isMatchPattern && currPattern.Contains("!") ) {
currPattern.ReplaceAll("!","");
isRejectPattern = kTRUE;
}
TString currPattern = objString->String();
TString tn (currPattern);
- Bool_t hasAND = kFALSE, hasOR = kFALSE;
+ Bool_t hasAND = kFALSE, hasOR = kFALSE, hasNOT = kFALSE;
if ( tn.Contains("&") ) {
tn.ReplaceAll("&",":");
hasAND = kTRUE;
tn.ReplaceAll("|",":");
hasOR = kTRUE;
}
+ if ( tn.Contains("!") ) {
+ tn.ReplaceAll("!","");
+ hasNOT = kTRUE;
+ }
if ( tn.Contains("(") || tn.Contains(")") ) {
tn.ReplaceAll("(","");
tn.ReplaceAll(")","");
}
- if ( ! hasAND && ! hasOR ) {
+ if ( ! hasAND && ! hasOR && ! hasNOT ) {
if ( CheckTriggerClassPattern(currPattern) ) {
duplicated += Form("%s ", currPattern.Data());
continue;
trigCombo->SetName(currPattern.Data());
UInt_t uniqueID = kComboSimple;
- if ( hasAND && hasOR ) uniqueID = kComboFormula;
+ if ( ( hasAND && hasOR ) || hasNOT ) uniqueID = kComboFormula;
else if ( hasAND ) uniqueID = kComboAND;
else if ( hasOR ) uniqueID = kComboOR;
}
//________________________________________________________________________
-TArrayI AliMuonEventCuts::GetTrigClassPtCutLevel ( const TString trigClassName ) const
+TArrayI AliMuonEventCuts::GetTrigClassPtCutLevel ( TString trigClassName ) const
{
/// Get trigger class pt cut level for tracking/trigger matching
///
fTrigInputsMap->SetOwner();
if ( fTrigInputsMap->GetEntries() > 0 ) fTrigInputsMap->Delete();
-
+
+ if ( trigInputsMap.IsNull() ) {
+ AliWarning("Trigger input map not specified: using default");
+ trigInputsMap = GetDefaultTrigInputsMap();
+ }
+
trigInputsMap.ReplaceAll(" ","");
-
+
TObjArray* fullList = trigInputsMap.Tokenize(",");
for ( Int_t ipat=0; ipat<fullList->GetEntries(); ++ipat ) {
TString currPattern = fullList->At(ipat)->GetName();
delete fullList;
}
-//________________________________________________________________________
-void AliMuonEventCuts::SetDefaultTrigInputsMap ()
-{
- /// Set default trigger input mask
-
- TString trigInputsMap = "0VBA:0,";
- trigInputsMap += "0VBC:1,";
- trigInputsMap += "0SMB:2,";
- trigInputsMap += "0TVX:3,";
- trigInputsMap += "0VGC:4,";
- trigInputsMap += "0VGA:5,";
- trigInputsMap += "0SH1:6,";
- trigInputsMap += "0SH2:7,";
- trigInputsMap += "0HPT:8,";
- trigInputsMap += "0AMU:9,";
- trigInputsMap += "0OB0:10,";
- trigInputsMap += "0ASL:11,";
- trigInputsMap += "0MSL:12,";
- trigInputsMap += "0MSH:13,";
- trigInputsMap += "0MUL:14,";
- trigInputsMap += "0MLL:15,";
- trigInputsMap += "0EMC:16,";
- trigInputsMap += "0PH0:17,";
- trigInputsMap += "0HWU:18,";
- trigInputsMap += "0LSR:19,";
- trigInputsMap += "0T0A:20,";
- trigInputsMap += "0BPA:21,";
- trigInputsMap += "0BPC:22,";
- trigInputsMap += "0T0C:23,";
-
- trigInputsMap += "1EJE:0,";
- trigInputsMap += "1EGA:1,";
- trigInputsMap += "1EJ2:2,";
- trigInputsMap += "1EG2:3,";
- trigInputsMap += "1PHL:4,";
- trigInputsMap += "1PHM:5,";
- trigInputsMap += "1PHH:6,";
- trigInputsMap += "1HCO:8,";
- trigInputsMap += "1HJT:9,";
- trigInputsMap += "1HSE:10,";
- trigInputsMap += "1DUM:11,";
- trigInputsMap += "1HQU:12,";
- trigInputsMap += "1H14:13,";
- trigInputsMap += "1ZMD:14,";
- trigInputsMap += "1ZMB:16,";
- trigInputsMap += "1ZED:17,";
- trigInputsMap += "1ZAC:18,";
- trigInputsMap += "1EJE:19";
-
- SetTrigInputsMap(trigInputsMap);
-}
-
//________________________________________________________________________
const TObjArray*
AliMuonEventCuts::GetSelectedTrigClassesInEvent(const TString& firedTriggerClasses,
//________________________________________________________________________
-void AliMuonEventCuts::BuildTriggerClasses ( const TString firedTrigClasses,
+void AliMuonEventCuts::BuildTriggerClasses ( TString firedTrigClasses,
UInt_t l0Inputs, UInt_t l1Inputs, UInt_t l2Inputs )
{
//
//_____________________________________________________________________________
void
-AliMuonEventCuts::AddToEventSelectedClass ( const TString& toCheck, const TObjString* foundTrig, const UInt_t comboType )
+AliMuonEventCuts::AddToEventSelectedClass ( const TString& toCheck, const TObjString* foundTrig, UInt_t comboType )
{
/// Add current trigger to the selected class for the event
// - the lowest pt cut among the macthing ones in case "toCheck" is a trigger class/input
// combined through (only) logical OR "|"
// This may lead to errors in case of complex combinations of trigger/inputs
+
+ // First eliminate trigger classes which are negated in combinations
+ TString checkStr(toCheck);
+ while ( checkStr.Contains("!") ) {
+ Int_t startNot = checkStr.Index("!");
+ Int_t endNot = startNot;
+ Int_t npars = 0;
+ for ( endNot = startNot; endNot<checkStr.Length(); endNot++ ) {
+ if ( checkStr[endNot] == '(' ) npars++;
+ else if ( checkStr[endNot] == ')' ) npars--;
+
+ if ( npars == 0 ) {
+ if ( checkStr[endNot] == '&' || checkStr[endNot] == '|' ) break;
+ }
+ }
+ checkStr.Remove(startNot,endNot-startNot);
+ }
+
+ // Then check if they match the Lpt or Hpt
Bool_t isFirst = kTRUE;
for ( Int_t ipat=0; ipat<fSelectedTrigLevel->GetEntries(); ++ipat ) {
- if ( toCheck.Contains(fSelectedTrigLevel->At(ipat)->GetName() ) ) {
+ if ( checkStr.Contains(fSelectedTrigLevel->At(ipat)->GetName() ) ) {
UInt_t currLevel = fSelectedTrigLevel->At(ipat)->GetUniqueID();
if ( comboType == kComboAND ) trigLevel = TMath::Max(trigLevel, currLevel);
else if ( comboType == kComboOR || comboType == kComboFormula ) {
}
//________________________________________________________________________
-void AliMuonEventCuts::SetCentralityEstimator ( const TString centralityEstimator )
+void AliMuonEventCuts::SetCentralityEstimator ( TString centralityEstimator )
{
/// Set centrality estimator
fCentralityClasses->SetName(centralityEstimator.Data());
printf(" 0x%x\n", filterMask);
if ( filterMask & kPhysicsSelected ) printf(" Pass physics selection 0x%x\n", fPhysicsSelectionMask);
if ( filterMask & kSelectedCentrality ) printf( "%g < centrality (%s) < %g\n", fCentralityClasses->GetXmin(), GetCentralityEstimator().Data(), fCentralityClasses->GetXmax() );
- if ( filterMask & kSelectedTrig ) printf(" Has selected trigger classes\n");
- if ( filterMask & kGoodVertex ) printf(" SPD vertex with %i contributors && %g < Vz < %g\n", GetVertexMinNContributors(), GetVertexVzMin(), GetVertexVzMax());
+ if ( filterMask & kSelectedTrig ) printf(" Has selected trigger classes\n");
+ if ( filterMask & kGoodVertex ) printf(" SPD vertex with %i contributors && %g < Vz < %g\n", GetVertexMinNContributors(), GetVertexVzMin(), GetVertexVzMax());
+ if ( filterMask & kNoPileup ) printf(" Reject pileup with SPD\n");
printf(" ******************** \n");
}
if ( sopt.Contains("param") ) {