]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG/muon/AliMuonEventCuts.cxx
The filter name and aliroot version are now given to the macro
[u/mrichter/AliRoot.git] / PWG / muon / AliMuonEventCuts.cxx
index d9fcc033a688ef320063e764c99e7f4bd856f37e..1541ba25e62bd5a43912a45ca78574d26c5d59f7 100644 (file)
@@ -36,6 +36,7 @@
 #include "AliAODEvent.h"
 #include "AliVVertex.h"
 #include "AliCentrality.h"
+#include "AliAnalysisUtils.h"
 
 #include "AliAnalysisMuonUtility.h"
 
@@ -51,7 +52,7 @@ AliMuonEventCuts::AliMuonEventCuts() :
   fVertexMinNContributors(0),
   fVertexVzMin(0.),
   fVertexVzMax(0.),
-  fDefaultTrigClassPatterns(""),
+  fCheckMask(0),
   fSelectedTrigPattern(0x0),
   fRejectedTrigPattern(0x0),
   fSelectedTrigLevel(0x0),
@@ -59,6 +60,7 @@ AliMuonEventCuts::AliMuonEventCuts() :
   fTrigInputsMap(0x0),
   fAllSelectedTrigClasses(0x0),
   fCentralityClasses(0x0),
+  fAnalysisUtils(0x0),
   fEventTriggerMask(0),
   fSelectedTrigClassesInEvent(0x0)
 {
@@ -72,7 +74,7 @@ AliAnalysisCuts(name, title),
   fVertexMinNContributors(0),
   fVertexVzMin(0.),
   fVertexVzMax(0.),
-  fDefaultTrigClassPatterns(""),
+  fCheckMask(0xFFFF),
   fSelectedTrigPattern(new TObjArray()),
   fRejectedTrigPattern(new TObjArray()),
   fSelectedTrigLevel(new TObjArray()),
@@ -80,6 +82,7 @@ AliAnalysisCuts(name, title),
   fTrigInputsMap(new THashList()),
   fAllSelectedTrigClasses(new THashList()),
   fCentralityClasses(0x0),
+  fAnalysisUtils(0x0),
   fEventTriggerMask(0),
   fSelectedTrigClassesInEvent(new TObjArray())
 {
@@ -88,8 +91,8 @@ AliAnalysisCuts(name, title),
   SetDefaultFilterMask();
   SetDefaultTrigClassPatterns();
   SetTrigClassLevels();
-  SetDefaultTrigInputsMap();
   SetCentralityClasses();
+  fAnalysisUtils = new AliAnalysisUtils();
   fAllSelectedTrigClasses->SetOwner();
   fSelectedTrigClassesInEvent->SetOwner();
 }
@@ -101,7 +104,7 @@ AliMuonEventCuts::AliMuonEventCuts(const AliMuonEventCuts& obj) :
   fVertexMinNContributors(obj.fVertexMinNContributors),
   fVertexVzMin(obj.fVertexVzMin),
   fVertexVzMax(obj.fVertexVzMax),
-  fDefaultTrigClassPatterns(obj.fDefaultTrigClassPatterns),
+  fCheckMask(obj.fCheckMask),
   fSelectedTrigPattern(obj.fSelectedTrigPattern),
   fRejectedTrigPattern(obj.fRejectedTrigPattern),
   fSelectedTrigLevel(obj.fSelectedTrigLevel),
@@ -109,6 +112,7 @@ AliMuonEventCuts::AliMuonEventCuts(const AliMuonEventCuts& obj) :
   fTrigInputsMap(obj.fTrigInputsMap),
   fAllSelectedTrigClasses(obj.fAllSelectedTrigClasses),
   fCentralityClasses(obj.fCentralityClasses),
+  fAnalysisUtils(obj.fAnalysisUtils),
   fEventTriggerMask(obj.fEventTriggerMask),
   fSelectedTrigClassesInEvent(obj.fSelectedTrigClassesInEvent)
 {
@@ -126,7 +130,7 @@ AliMuonEventCuts& AliMuonEventCuts::operator=(const AliMuonEventCuts& obj)
     fVertexMinNContributors = obj.fVertexMinNContributors,
     fVertexVzMin = obj.fVertexVzMin;
     fVertexVzMax = obj.fVertexVzMax;
-    fDefaultTrigClassPatterns = obj.fDefaultTrigClassPatterns;
+    fCheckMask = obj.fCheckMask;
     fSelectedTrigPattern = obj.fSelectedTrigPattern;
     fRejectedTrigPattern = obj.fRejectedTrigPattern;
     fSelectedTrigLevel = obj.fSelectedTrigLevel;
@@ -134,6 +138,7 @@ AliMuonEventCuts& AliMuonEventCuts::operator=(const AliMuonEventCuts& obj)
     fTrigInputsMap = obj.fTrigInputsMap;
     fAllSelectedTrigClasses = obj.fAllSelectedTrigClasses;
     fCentralityClasses = obj.fCentralityClasses;
+    fAnalysisUtils = obj.fAnalysisUtils;
     fEventTriggerMask = obj.fEventTriggerMask;
     fSelectedTrigClassesInEvent = obj.fSelectedTrigClassesInEvent;
   }
@@ -153,6 +158,7 @@ AliMuonEventCuts::~AliMuonEventCuts()
   delete fAllSelectedTrigClasses;
   delete fSelectedTrigClassesInEvent;
   delete fCentralityClasses;
+  delete fAnalysisUtils;
 }
 
 //________________________________________________________________________
@@ -175,9 +181,13 @@ UInt_t AliMuonEventCuts::GetSelectionMask( const TObject* obj )
   
   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();
   
@@ -188,12 +198,25 @@ UInt_t AliMuonEventCuts::GetSelectionMask( const TObject* obj )
   
   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;
 }
 
@@ -220,18 +243,78 @@ Bool_t AliMuonEventCuts::UpdateEvent ( const AliVEvent* event )
   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
   ///
@@ -270,7 +353,9 @@ void AliMuonEventCuts::SetTrigClassPatterns ( const TString trigPattern )
   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"};
   
@@ -288,7 +373,7 @@ void AliMuonEventCuts::SetTrigClassPatterns ( const TString trigPattern )
     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;
     }
@@ -313,7 +398,7 @@ void AliMuonEventCuts::SetTrigClassPatterns ( const TString trigPattern )
     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;
@@ -322,12 +407,16 @@ void AliMuonEventCuts::SetTrigClassPatterns ( const TString trigPattern )
       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;
@@ -339,7 +428,7 @@ void AliMuonEventCuts::SetTrigClassPatterns ( const TString trigPattern )
     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;
     
@@ -440,7 +529,27 @@ void AliMuonEventCuts::SetTrigClassLevels ( TString pattern )
 }
 
 //________________________________________________________________________
-TArrayI AliMuonEventCuts::GetTrigClassPtCutLevel ( const TString trigClassName ) const
+UInt_t AliMuonEventCuts::GetTriggerInputBitMaskFromInputName(const char* inputName) const
+{
+  // Get trigger input bit from its name
+  
+  if (!fTrigInputsMap)
+  {
+    AliError("No Inputs Map available");
+    return TMath::Limits<UInt_t>::Max();
+  }
+  
+  TObjString* s = static_cast<TObjString*>(fTrigInputsMap->FindObject(inputName));
+  if (!s)
+  {
+    AliError(Form("Did not find input %s",inputName));
+    return TMath::Limits<UInt_t>::Max();    
+  }
+  return s->GetUniqueID();
+}
+
+//________________________________________________________________________
+TArrayI AliMuonEventCuts::GetTrigClassPtCutLevel ( TString trigClassName ) const
 {
   /// Get trigger class pt cut level for tracking/trigger matching
   ///
@@ -478,9 +587,14 @@ void AliMuonEventCuts::SetTrigInputsMap ( TString trigInputsMap )
   
   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();
@@ -495,55 +609,17 @@ void AliMuonEventCuts::SetTrigInputsMap ( TString trigInputsMap )
 }
 
 //________________________________________________________________________
-void AliMuonEventCuts::SetDefaultTrigInputsMap ()
+const TObjArray*
+AliMuonEventCuts::GetSelectedTrigClassesInEvent(const TString& firedTriggerClasses,
+                                                UInt_t l0Inputs, UInt_t l1Inputs,
+                                                UInt_t l2Inputs)
 {
-  /// Set default trigger input mask
+  /// Return the selected trigger classes in the fired trigger classes
+  /// give also the L0,L1,L2 input bit masks
   
-  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);
+  BuildTriggerClasses(firedTriggerClasses,l0Inputs,l1Inputs,l2Inputs);
+
+  return fSelectedTrigClassesInEvent;
 }
 
 //________________________________________________________________________
@@ -556,7 +632,7 @@ const TObjArray* AliMuonEventCuts::GetSelectedTrigClassesInEvent( const AliVEven
 
 
 //________________________________________________________________________
-void AliMuonEventCuts::BuildTriggerClasses ( const TString firedTrigClasses,
+void AliMuonEventCuts::BuildTriggerClasses ( TString firedTrigClasses,
                                              UInt_t l0Inputs, UInt_t l1Inputs, UInt_t l2Inputs )
 {
   //
@@ -676,7 +752,7 @@ AliMuonEventCuts::CheckTriggerClassCombination ( const TObjArray* combo,
 
 //_____________________________________________________________________________
 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
   
@@ -691,9 +767,28 @@ AliMuonEventCuts::AddToEventSelectedClass ( const TString& toCheck, const TObjSt
     // - 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 ) {
@@ -755,7 +850,7 @@ void AliMuonEventCuts::SetCentralityClasses(Int_t nCentralityBins, Double_t* cen
 }
 
 //________________________________________________________________________
-void AliMuonEventCuts::SetCentralityEstimator ( const TString centralityEstimator )
+void AliMuonEventCuts::SetCentralityEstimator ( TString centralityEstimator )
 {
   /// Set centrality estimator
   fCentralityClasses->SetName(centralityEstimator.Data());
@@ -808,9 +903,15 @@ void AliMuonEventCuts::Print(Option_t* option) const
     printf(" *** Muon event filter mask: *** \n");
     printf("  0x%x\n", filterMask);
     if ( filterMask & kPhysicsSelected ) printf("  Pass physics selection 0x%x\n", fPhysicsSelectionMask);
-    if ( filterMask & kSelectedCentrality ) printf(  "%g < centrality < %g\n", fCentralityClasses->GetXmin(), 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 & 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 & kNoPileup ) printf("  Reject pileup with SPD\n");
+    printf(" ******************** \n");
+  }
+  if ( sopt.Contains("param") ) {
+    printf(" *** Muon event parameters: *** \n");
+    printf("  Centrality estimator: %s\n", GetCentralityEstimator().Data());
     printf(" ******************** \n");
   }
 }