ROOT logo
#ifndef ALIANALYSISMUMUCUTELEMENT_H
#define ALIANALYSISMUMUCUTELEMENT_H

/**
 *
 * \class AliAnalysisMuMuCutElement
 *
 * \brief Describes an elementary cut (either event cut, track cut, pair cut, or trigger class cut)
 *
 */

#include "TObject.h"
#include "TString.h"

#include <vector>

class TMethodCall;
class AliVEvent;
class AliInputEventHandler;
class AliVParticle;

class AliAnalysisMuMuCutElement : public TObject
{
public:
  
  enum ECutType
  {
    kEvent=0, // a cut on event
    kTrack=1, // a cut on track
    kTrackPair=2, // a cut on track pair
    kTriggerClass=3, // a cut on trigger class
    kAny=4 // must be the last one
  };
  
  static const char* CutTypeName(ECutType type);
  
  AliAnalysisMuMuCutElement();
  
  AliAnalysisMuMuCutElement(ECutType expectedType,
                            TObject& cutObject,
                            const char* cutMethodName,
                            const char* cutMethodPrototype,
                            const char* defaultParameters);
  
  virtual ~AliAnalysisMuMuCutElement();
  
  virtual Bool_t IsValid() const { return (fCutMethod != 0x0); }
  
  const char* GetName() const { return fName.Data(); }
  
  virtual Bool_t Pass(const AliVEvent& event) const;

  virtual Bool_t Pass(const AliInputEventHandler& eventHandler) const;

  virtual Bool_t Pass(const AliVParticle& particle) const;
  
  virtual Bool_t Pass(const AliVParticle& p1, const AliVParticle& p2) const;
  
  virtual Bool_t Pass(const TString& firedTriggerClasses, TString& acceptedTriggerClasses,
                      UInt_t L0, UInt_t L1, UInt_t L2) const;
  
  virtual void Print(Option_t* opt="") const;
  
  Bool_t IsEventCutter() const { return fIsEventCutter; }
  Bool_t IsEventHandlerCutter() const { return fIsEventHandlerCutter; }
  Bool_t IsTrackCutter() const { return fIsTrackCutter; }
  Bool_t IsTrackPairCutter() const { return fIsTrackPairCutter; }
  Bool_t IsTriggerClassCutter() const { return fIsTriggerClassCutter; }
  
  TObject* GetCutObject() const { return fCutObject; }
  
  const Long_t* GetCallParams() const { return &fCallParams[0]; }
  
  const char* GetCallMethodName() const;
  const char* GetCallMethodProto() const;
  
  Bool_t IsEqual(const TObject* obj) const;
  
private:
  
  void Init(ECutType type=kAny) const;
  
  Bool_t CallCutMethod(Long_t p) const;
  Bool_t CallCutMethod(Long_t p1, Long_t p2) const;
  
  Int_t CountOccurences(const TString& prototype, const char* search) const;

  /// not implemented on purpose
  AliAnalysisMuMuCutElement(const AliAnalysisMuMuCutElement& rhs);
  /// not implemented on purpose
  AliAnalysisMuMuCutElement& operator=(const AliAnalysisMuMuCutElement& rhs);
  
protected:
  TString fName; // name of the cut
  mutable Bool_t fIsEventCutter; // whether or not the cut is an event cutter
  mutable Bool_t fIsEventHandlerCutter; // whether or not the cut is an event handler cutter
  mutable Bool_t fIsTrackCutter; // whether or not the cut is a track cutter
  mutable Bool_t fIsTrackPairCutter; // whether or not the cut is a track pair cutter
  mutable Bool_t fIsTriggerClassCutter; // whether or not the cut is a trigger class cutter
private:
  
  TObject* fCutObject; // pointer (not owner) to the object doing the actual cut work
  TString fCutMethodName; // method (of fCutObject) to be called to do the cut
  TString fCutMethodPrototype; // prototype of the method to be called to do the cut
  TString fDefaultParameters; // default parameters of the cut method (might be empty)
  mutable Int_t fNofParams; // number of parameters
  mutable TMethodCall* fCutMethod; //! cut method
  
  mutable std::vector<Long_t> fCallParams; //! vector of parameters for the fCutMethod
  mutable std::vector<Double_t> fDoubleParams; //! temporary vector to hold the references

  ClassDef(AliAnalysisMuMuCutElement,1) // One piece of a cut combination
};

class AliAnalysisMuMuCutElementBar : public AliAnalysisMuMuCutElement
{
public:
  AliAnalysisMuMuCutElementBar();
  
  AliAnalysisMuMuCutElementBar(const AliAnalysisMuMuCutElement& ce);
  
  virtual ~AliAnalysisMuMuCutElementBar();
  
  Bool_t IsValid() const { return fCutElement && fCutElement->IsValid(); }
  
  Bool_t Pass(const AliVEvent& event) const { return !fCutElement->Pass(event); }
  
  Bool_t Pass(const AliInputEventHandler& eventHandler) const { return !fCutElement->Pass(eventHandler); }
  
  Bool_t Pass(const AliVParticle& particle) const { return !fCutElement->Pass(particle); }
  
  Bool_t Pass(const AliVParticle& p1, const AliVParticle& p2) const { return !fCutElement->Pass(p1,p2); }
  
  Bool_t Pass(const TString& firedTriggerClasses, TString& acceptedTriggerClasses,
              UInt_t L0, UInt_t L1, UInt_t L2) const
  { return fCutElement->Pass(firedTriggerClasses,acceptedTriggerClasses,L0,L1,L2); }

  void Print(Option_t* opt="") const;
  
private:
  
  /// not implemented on purpose
  AliAnalysisMuMuCutElementBar(const AliAnalysisMuMuCutElementBar& rhs);
  /// not implemented on purpose
  AliAnalysisMuMuCutElementBar& operator=(const AliAnalysisMuMuCutElementBar& rhs);

  const AliAnalysisMuMuCutElement* fCutElement; // the cut element we're the negation of
  
  ClassDef(AliAnalysisMuMuCutElementBar,1) // opposite of cut element (i.e. !cutelement)
};

#endif
 AliAnalysisMuMuCutElement.h:1
 AliAnalysisMuMuCutElement.h:2
 AliAnalysisMuMuCutElement.h:3
 AliAnalysisMuMuCutElement.h:4
 AliAnalysisMuMuCutElement.h:5
 AliAnalysisMuMuCutElement.h:6
 AliAnalysisMuMuCutElement.h:7
 AliAnalysisMuMuCutElement.h:8
 AliAnalysisMuMuCutElement.h:9
 AliAnalysisMuMuCutElement.h:10
 AliAnalysisMuMuCutElement.h:11
 AliAnalysisMuMuCutElement.h:12
 AliAnalysisMuMuCutElement.h:13
 AliAnalysisMuMuCutElement.h:14
 AliAnalysisMuMuCutElement.h:15
 AliAnalysisMuMuCutElement.h:16
 AliAnalysisMuMuCutElement.h:17
 AliAnalysisMuMuCutElement.h:18
 AliAnalysisMuMuCutElement.h:19
 AliAnalysisMuMuCutElement.h:20
 AliAnalysisMuMuCutElement.h:21
 AliAnalysisMuMuCutElement.h:22
 AliAnalysisMuMuCutElement.h:23
 AliAnalysisMuMuCutElement.h:24
 AliAnalysisMuMuCutElement.h:25
 AliAnalysisMuMuCutElement.h:26
 AliAnalysisMuMuCutElement.h:27
 AliAnalysisMuMuCutElement.h:28
 AliAnalysisMuMuCutElement.h:29
 AliAnalysisMuMuCutElement.h:30
 AliAnalysisMuMuCutElement.h:31
 AliAnalysisMuMuCutElement.h:32
 AliAnalysisMuMuCutElement.h:33
 AliAnalysisMuMuCutElement.h:34
 AliAnalysisMuMuCutElement.h:35
 AliAnalysisMuMuCutElement.h:36
 AliAnalysisMuMuCutElement.h:37
 AliAnalysisMuMuCutElement.h:38
 AliAnalysisMuMuCutElement.h:39
 AliAnalysisMuMuCutElement.h:40
 AliAnalysisMuMuCutElement.h:41
 AliAnalysisMuMuCutElement.h:42
 AliAnalysisMuMuCutElement.h:43
 AliAnalysisMuMuCutElement.h:44
 AliAnalysisMuMuCutElement.h:45
 AliAnalysisMuMuCutElement.h:46
 AliAnalysisMuMuCutElement.h:47
 AliAnalysisMuMuCutElement.h:48
 AliAnalysisMuMuCutElement.h:49
 AliAnalysisMuMuCutElement.h:50
 AliAnalysisMuMuCutElement.h:51
 AliAnalysisMuMuCutElement.h:52
 AliAnalysisMuMuCutElement.h:53
 AliAnalysisMuMuCutElement.h:54
 AliAnalysisMuMuCutElement.h:55
 AliAnalysisMuMuCutElement.h:56
 AliAnalysisMuMuCutElement.h:57
 AliAnalysisMuMuCutElement.h:58
 AliAnalysisMuMuCutElement.h:59
 AliAnalysisMuMuCutElement.h:60
 AliAnalysisMuMuCutElement.h:61
 AliAnalysisMuMuCutElement.h:62
 AliAnalysisMuMuCutElement.h:63
 AliAnalysisMuMuCutElement.h:64
 AliAnalysisMuMuCutElement.h:65
 AliAnalysisMuMuCutElement.h:66
 AliAnalysisMuMuCutElement.h:67
 AliAnalysisMuMuCutElement.h:68
 AliAnalysisMuMuCutElement.h:69
 AliAnalysisMuMuCutElement.h:70
 AliAnalysisMuMuCutElement.h:71
 AliAnalysisMuMuCutElement.h:72
 AliAnalysisMuMuCutElement.h:73
 AliAnalysisMuMuCutElement.h:74
 AliAnalysisMuMuCutElement.h:75
 AliAnalysisMuMuCutElement.h:76
 AliAnalysisMuMuCutElement.h:77
 AliAnalysisMuMuCutElement.h:78
 AliAnalysisMuMuCutElement.h:79
 AliAnalysisMuMuCutElement.h:80
 AliAnalysisMuMuCutElement.h:81
 AliAnalysisMuMuCutElement.h:82
 AliAnalysisMuMuCutElement.h:83
 AliAnalysisMuMuCutElement.h:84
 AliAnalysisMuMuCutElement.h:85
 AliAnalysisMuMuCutElement.h:86
 AliAnalysisMuMuCutElement.h:87
 AliAnalysisMuMuCutElement.h:88
 AliAnalysisMuMuCutElement.h:89
 AliAnalysisMuMuCutElement.h:90
 AliAnalysisMuMuCutElement.h:91
 AliAnalysisMuMuCutElement.h:92
 AliAnalysisMuMuCutElement.h:93
 AliAnalysisMuMuCutElement.h:94
 AliAnalysisMuMuCutElement.h:95
 AliAnalysisMuMuCutElement.h:96
 AliAnalysisMuMuCutElement.h:97
 AliAnalysisMuMuCutElement.h:98
 AliAnalysisMuMuCutElement.h:99
 AliAnalysisMuMuCutElement.h:100
 AliAnalysisMuMuCutElement.h:101
 AliAnalysisMuMuCutElement.h:102
 AliAnalysisMuMuCutElement.h:103
 AliAnalysisMuMuCutElement.h:104
 AliAnalysisMuMuCutElement.h:105
 AliAnalysisMuMuCutElement.h:106
 AliAnalysisMuMuCutElement.h:107
 AliAnalysisMuMuCutElement.h:108
 AliAnalysisMuMuCutElement.h:109
 AliAnalysisMuMuCutElement.h:110
 AliAnalysisMuMuCutElement.h:111
 AliAnalysisMuMuCutElement.h:112
 AliAnalysisMuMuCutElement.h:113
 AliAnalysisMuMuCutElement.h:114
 AliAnalysisMuMuCutElement.h:115
 AliAnalysisMuMuCutElement.h:116
 AliAnalysisMuMuCutElement.h:117
 AliAnalysisMuMuCutElement.h:118
 AliAnalysisMuMuCutElement.h:119
 AliAnalysisMuMuCutElement.h:120
 AliAnalysisMuMuCutElement.h:121
 AliAnalysisMuMuCutElement.h:122
 AliAnalysisMuMuCutElement.h:123
 AliAnalysisMuMuCutElement.h:124
 AliAnalysisMuMuCutElement.h:125
 AliAnalysisMuMuCutElement.h:126
 AliAnalysisMuMuCutElement.h:127
 AliAnalysisMuMuCutElement.h:128
 AliAnalysisMuMuCutElement.h:129
 AliAnalysisMuMuCutElement.h:130
 AliAnalysisMuMuCutElement.h:131
 AliAnalysisMuMuCutElement.h:132
 AliAnalysisMuMuCutElement.h:133
 AliAnalysisMuMuCutElement.h:134
 AliAnalysisMuMuCutElement.h:135
 AliAnalysisMuMuCutElement.h:136
 AliAnalysisMuMuCutElement.h:137
 AliAnalysisMuMuCutElement.h:138
 AliAnalysisMuMuCutElement.h:139
 AliAnalysisMuMuCutElement.h:140
 AliAnalysisMuMuCutElement.h:141
 AliAnalysisMuMuCutElement.h:142
 AliAnalysisMuMuCutElement.h:143
 AliAnalysisMuMuCutElement.h:144
 AliAnalysisMuMuCutElement.h:145
 AliAnalysisMuMuCutElement.h:146
 AliAnalysisMuMuCutElement.h:147
 AliAnalysisMuMuCutElement.h:148
 AliAnalysisMuMuCutElement.h:149
 AliAnalysisMuMuCutElement.h:150
 AliAnalysisMuMuCutElement.h:151
 AliAnalysisMuMuCutElement.h:152