ROOT logo
#ifndef ALIRSNMINIOUTPUT_H
#define ALIRSNMINIOUTPUT_H

//
// Mini-Output
// All the definitions needed for building a RSN histogram
// including:
// -- properties of resonance (mass, PDG code if needed)
// -- properties of daughters (assigned mass, charges)
// -- definition of output histogram
//

#include "AliRsnEvent.h"
#include "AliRsnDaughter.h"
#include "AliRsnMiniParticle.h"

class THnSparse;
class TList;
class TH1;

class TList;
class TClonesArray;
class AliRsnMiniAxis;
class AliRsnMiniPair;
class AliRsnMiniEvent;

typedef AliRsnDaughter::ESpecies RSNPID;

class AliRsnMiniOutput : public TNamed {
public:

   enum EOutputType {
      kHistogram,
      kHistogramSparse,
      kTypes
   };

   enum EComputation {
      kEventOnly,
      kTrackPair,
      kTrackPairMix,
      kTrackPairRotated1,
      kTrackPairRotated2,
      kTruePair,
      kMother,
      kMotherInAcc,
      kComputations
   };

   AliRsnMiniOutput();
   AliRsnMiniOutput(const char *name, EOutputType type, EComputation src = kTrackPair);
   AliRsnMiniOutput(const char *name, const char *outType, const char *compType);
   AliRsnMiniOutput(const AliRsnMiniOutput &copy);
   AliRsnMiniOutput &operator=(const AliRsnMiniOutput &copy);

   Bool_t          IsEventOnly()        const {return (fComputation == kEventOnly);}
   Bool_t          IsTrackPair()        const {return (fComputation == kTrackPair);}
   Bool_t          IsTrackPairMix()     const {return (fComputation == kTrackPairMix);}
   Bool_t          IsTruePair()         const {return (fComputation == kTruePair);}
   Bool_t          IsMother()           const {return (fComputation == kMother);}
   Bool_t          IsMotherInAcc()      const {return (fComputation == kMotherInAcc);}
   Bool_t          IsDefined()          const {return (IsEventOnly() || IsTrackPair() || IsTrackPairMix() || IsTruePair() || IsMother());}
   Bool_t          IsLikeSign()         const {return (fCharge[0] == fCharge[1]);}
   Bool_t          IsSameCut()          const {return (fCutID[0] == fCutID[1]);}
   Bool_t          IsSameDaughter()     const {return (fDaughter[0] == fDaughter[1]);}
   //Bool_t          IsSymmetric()        const {return (IsLikeSign() && IsSameCut());}
   Bool_t          IsSymmetric()        const {return (IsLikeSign() && IsSameDaughter());}

   EOutputType     GetOutputType()      const {return fOutputType;}
   EComputation    GetComputation()     const {return fComputation;}
   Int_t           GetCutID(Int_t i)    const {if (i <= 0) return fCutID [0]; else return fCutID [1];}
   RSNPID          GetDaughter(Int_t i) const {if (i <= 0) return fDaughter[0]; else return fDaughter[1];}
   Double_t        GetMass(Int_t i)     const {return AliRsnDaughter::SpeciesMass(GetDaughter(i));}
   Int_t           GetPDG(Int_t i)      const {return AliRsnDaughter::SpeciesPDG(GetDaughter(i));}
   Int_t           GetCharge(Int_t i)   const {if (i <= 0) return fCharge[0]; else return fCharge[1];}
   Int_t           GetMotherPDG()       const {return fMotherPDG;}
   Double_t        GetMotherMass()      const {return fMotherMass;}
   Bool_t          GetFillHistogramOnlyInRange() { return fCheckHistRange; }
   Short_t         GetMaxNSisters()           {return fMaxNSisters;}

   void            SetOutputType(EOutputType type)    {fOutputType = type;}
   void            SetComputation(EComputation src)   {fComputation = src;}
   void            SetCutID(Int_t i, Int_t   value)   {if (i <= 0) fCutID [0] = value; else fCutID [1] = value;}
   void            SetDaughter(Int_t i, RSNPID value) {if (i <= 0) fDaughter[0] = value; else fDaughter[1] = value;}
   void            SetCharge(Int_t i, Char_t  value)  {if (i <= 0) fCharge[0] = value; else fCharge[1] = value;}
   void            SetMotherPDG(Int_t pdg)            {fMotherPDG = pdg;}
   void            SetMotherMass(Double_t mass)       {fMotherMass = mass;}
   void            SetPairCuts(AliRsnCutSet *set)     {fPairCuts = set;}
   void            SetFillHistogramOnlyInRange(Bool_t fillInRangeOnly) { fCheckHistRange = fillInRangeOnly; }
   void            SetMaxNSisters(Short_t n)          {fMaxNSisters = n;}
   void            SetCheckMomentumConservation(Bool_t checkP) {fCheckP = checkP;}
   void            SetCheckFeedDown(Bool_t checkFeedDown)      {fCheckFeedDown = checkFeedDown;}
   void            SetDselection(UShort_t originDselection);
   void 	   SetRejectCandidateIfNotFromQuark(Bool_t opt){fRejectIfNoQuark=opt;}

   void            AddAxis(Int_t id, Int_t nbins, Double_t min, Double_t max);
   void            AddAxis(Int_t id, Double_t min, Double_t max, Double_t step);
   void            AddAxis(Int_t id, Int_t nbins, Double_t *values);
   AliRsnMiniAxis *GetAxis(Int_t i)  {if (i >= 0 && i < fAxes.GetEntries()) return (AliRsnMiniAxis *)fAxes[i]; return 0x0;}
   Double_t       *GetAllComputed()  {return fComputed.GetArray();}

   AliRsnMiniPair &Pair() {return fPair;}
   Bool_t          Init(const char *prefix, TList *list);
   Bool_t          FillMother(const AliRsnMiniPair *pair, AliRsnMiniEvent *event, TClonesArray *valueList);
   Bool_t          FillMotherInAcceptance(const AliRsnMiniPair *pair, AliRsnMiniEvent *event, TClonesArray *valueList);
   Bool_t          FillEvent(AliRsnMiniEvent *event, TClonesArray *valueList);
   Int_t           FillPair(AliRsnMiniEvent *event1, AliRsnMiniEvent *event2, TClonesArray *valueList, Bool_t refFirst = kTRUE);

private:

   void   CreateHistogram(const char *name);
   void   CreateHistogramSparse(const char *name);
   void   ComputeValues(AliRsnMiniEvent *event, TClonesArray *valueList);
   void   FillHistogram();

   EOutputType      fOutputType;       //  type of output
   EComputation     fComputation;      //  type of computation
   Int_t            fCutID[2];         //  ID of cut set used to select tracks
   RSNPID           fDaughter[2];      //  species of daughters
   Char_t           fCharge[2];        //  required track charge
   Int_t            fMotherPDG;        //  PDG code of resonance
   Double_t         fMotherMass;       //  nominal resonance mass
   AliRsnCutSet    *fPairCuts;         //  cuts on the pair

   Int_t            fOutputID;         //  index of output object in container list
   TClonesArray     fAxes;             //  definitions for the axes of each value
   TArrayD          fComputed;         //! temporary container for all computed values
   AliRsnMiniPair   fPair;             //! minipair for computations
   TList           *fList;             //! pointer to the TList containing the output
   TArrayI          fSel1;             //! list of selected particles for definition 1
   TArrayI          fSel2;             //! list of selected particles for definition 2
   Short_t          fMaxNSisters;      // maximum number of allowed mother's daughter
   Bool_t           fCheckP;           // flag to set in order to check the momentum conservation for daughters
   Bool_t           fCheckFeedDown;    // flag to set in order to check the particle feed down (specific for D meson analysis)
   UShort_t 	    fOriginDselection; // flag to select D0 origins. 0 Only from charm 1 only from beauty 2 both from charm and beauty (specific for D meson analysis)
   Bool_t   	    fKeepDfromB;       // flag for the feed down from b quark decay (specific for D meson analysis)			  
   Bool_t   	    fKeepDfromBOnly;   // flag to keep only the charm particles that comes from beauty decays (specific for D meson analysis)
   Bool_t 	    fRejectIfNoQuark;  // flag to remove events not generated with PYTHIA
   Bool_t           fCheckHistRange;   //  check if values is in histogram range

   ClassDef(AliRsnMiniOutput, 4)  // AliRsnMiniOutput class
};

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