ROOT logo
#ifndef ALIBaseMCTRACKDENSITY_MC
#define ALIBaseMCTRACKDENSITY_MC
#include <TNamed.h>
#include "AliForwardFlowWeights.h"
class TList;
class TH1D;
class TH2D;
class TF1;
class TGraph;
class AliMCEvent;
class AliMCParticle;
class AliTrackReference;
class AliStack;

/**
 * A class to calculate the particle density from track references.
 * This code is used both in AliForwardMCCorrectionsTask and
 * AliBaseMCDensity calculator. 
 * 
 * @par Input: 
 *    - Kinematics
 *    - Track-References
 *
 * @par Corrections used: 
 *    - None
 *
 * @par Histograms: 
 *    - Incident angle vs number of track references
 *    - Incident angle vs number of strips/cluster
 *
 * @ingroup pwglf_forward_algo
 * @ingroup pwglf_forward_mc
 * @ingroup pwglf_forward_aod
 */
class AliBaseMCTrackDensity : public TNamed
{
public:
  /** 
   * Default constructor.  Do not use - for ROOT I/O system use only 
   */
  AliBaseMCTrackDensity();
  /** 
   * Normal constructor 
   * 
   * @param name Not used
   */
  AliBaseMCTrackDensity(const char* name);
  /** 
   * Copy constructor 
   * 
   * @param o Object to copy from 
   */
  AliBaseMCTrackDensity(const AliBaseMCTrackDensity& o);
  /** 
   * Assignment operator
   * 
   * @param o Object to assign from 
   * 
   * @return Reference to this 
   */
  AliBaseMCTrackDensity& operator=(const AliBaseMCTrackDensity& o);
  /** 
   * Destructor. 
   */
  virtual ~AliBaseMCTrackDensity() {}

  /** 
   * Set whether to only consider primaries 
   * 
   * @param use If true, consider only primaries
   */
  void SetUseOnlyPrimary(Bool_t use) { fUseOnlyPrimary = use; }
  /** 
   * Whether to `after-burn' the particles with flow 
   * 
   * @param use 
   */  
  void SetUseFlowWeights(Bool_t use) { fUseFlowWeights = use; }
  /** 
   * Set whether to print debug messages.  Please note this will
   * produce a lot of output. 
   * 
   * @param debug Whether to enable debug messages or not 
   */
  void SetDebug(Bool_t debug=true) { fDebug = debug; }
  /** 
   * Define ouputs 
   * 
   * @param list List to add outputs to
   */
  virtual void CreateOutputObjects(TList* list);
  /** 
   * Print information to standard out
   * 
   * @param option Not used
   */
  virtual void Print(Option_t* option="") const;
protected:
  /** 
   * Loops over all the particles in the passed event.  If @a primary
   * is not null, then that histogram is filled with the primary
   * particle information - irrespective of whether the particle
   * actually hits the Base or not.  For each track (primary or
   * secondary, unless only primary information is requested - see
   * SetUseOnlyPrimary) loop over all track references to that
   * particle and check if they come from the Base.  In that case,
   * figure out which strip(s) to assign the track to, and fill the @a
   * hits structure.
   * 
   * @param event    MC event 
   * @param vz       IP z-coordinate
   * @param primary  Primary information, if available. 
   * 
   * @return true 
   */
  Bool_t ProcessTracks(const AliMCEvent&   event, 
		       Double_t            vz,
		       TH2D*               primary);
  /** 
   * Process a single track 
   * 
   * @param particle   Particle 
   * @param mother     Ultimate mother
   * 
   * @return true on succsess 
   */
  Bool_t ProcessTrack(AliMCParticle* particle, 
		      const AliMCParticle* mother);
  /** 
   * Must be defined to return the track-reference ID for this detector
   * 
   * @return Detector id set on track references
   */
  virtual Int_t GetDetectorId() const = 0;
  /** 
   * Process a track reference 
   * 
   * @param particle Particle 
   * @param mother   Ultimate mother (if not primary)
   * @param ref      Reference 
   * 
   * @return 0 if no output should be generated for this reference, or
   * pointer to track-reference to produce output for.
   */
  virtual AliTrackReference* ProcessRef(AliMCParticle* particle, 
					const AliMCParticle* mother, 
					AliTrackReference* ref) = 0;
  /** 
   * Called at before loop over track references
   * 
   */
  virtual void BeginTrackRefs() {}
  /** 
   * Check a track reference 
   * 
   * @return true if the track reference should be used
   */
  virtual Bool_t CheckTrackRef(AliTrackReference*) const { return true; }
  /** 
   * Called at before loop over track references
   * 
   */
  virtual void EndTrackRefs(Int_t /*nRefs*/) {}
  /** 
   * Store a particle hit in Base<i>dr</i>[<i>s,t</i>] in @a output
   * 
   * 
   * @param particle  Particle to store
   * @param mother    Ultimate mother of particle 
   * @param ref      Longest track reference
   *
   * @return Weight factor
   */  
  virtual Double_t StoreParticle(AliMCParticle*       particle, 
				 const AliMCParticle* mother,
				 AliTrackReference*   ref) const;
  /** 
   * Get the parameters of this event 
   * 
   * @param event Event
   * 
   * @return true if found, false otherwise 
   */
  Bool_t GetCollisionParameters(const AliMCEvent& event);
  /** 
   * Get incident angle of this track reference
   * 
   * @param ref Track reference
   * 
   * @return incident angle (in radians)
   */
  Double_t GetTrackRefTheta(const AliTrackReference* ref) const;
  /** 
   * Get ultimate mother of a track 
   * 
   * @param iTr   Track number 
   * @param event Event
   * 
   * @return Pointer to mother or null 
   */
  const AliMCParticle* GetMother(Int_t iTr, const AliMCEvent& event) const;
  /** 
   * Calculate flow weight 
   *
   * @param eta  Pseudo rapidity 
   * @param pt   Transverse momemtum 
   * @param phi  Azimuthal angle 
   * @param id   Particle PDG code
   *
   * @return Flow weight for the particle
   */
  Double_t CalculateWeight(Double_t eta, Double_t pt, 
			   Double_t phi, Int_t id) const;

  Bool_t   fUseOnlyPrimary;       // Only use primaries 
  Bool_t   fUseFlowWeights;       // Wether to use flow weights 
  TH2D*    fBinFlow;              // eta,phi bin flow 
  TH2D*    fEtaBinFlow;           // dEta vs eta of strip
  TH2D*    fPhiBinFlow;           // dPhi vs phi of strip
  TH1D*    fNRefs;                // Number of track-references per track
  AliForwardFlowWeights fWeights; // Flow weights
  Double_t fVz;                   // IP z-coordinate of this event
  Double_t fB;                    // Impact parameter of this event
  Double_t fPhiR;                 // Reaction plane  of this event
  Bool_t   fDebug;                // Debug flag

  ClassDef(AliBaseMCTrackDensity,3); // Calculate track-ref density
};

#endif
// Local Variables:
//  mode: C++ 
// End:
 AliBaseMCTrackDensity.h:1
 AliBaseMCTrackDensity.h:2
 AliBaseMCTrackDensity.h:3
 AliBaseMCTrackDensity.h:4
 AliBaseMCTrackDensity.h:5
 AliBaseMCTrackDensity.h:6
 AliBaseMCTrackDensity.h:7
 AliBaseMCTrackDensity.h:8
 AliBaseMCTrackDensity.h:9
 AliBaseMCTrackDensity.h:10
 AliBaseMCTrackDensity.h:11
 AliBaseMCTrackDensity.h:12
 AliBaseMCTrackDensity.h:13
 AliBaseMCTrackDensity.h:14
 AliBaseMCTrackDensity.h:15
 AliBaseMCTrackDensity.h:16
 AliBaseMCTrackDensity.h:17
 AliBaseMCTrackDensity.h:18
 AliBaseMCTrackDensity.h:19
 AliBaseMCTrackDensity.h:20
 AliBaseMCTrackDensity.h:21
 AliBaseMCTrackDensity.h:22
 AliBaseMCTrackDensity.h:23
 AliBaseMCTrackDensity.h:24
 AliBaseMCTrackDensity.h:25
 AliBaseMCTrackDensity.h:26
 AliBaseMCTrackDensity.h:27
 AliBaseMCTrackDensity.h:28
 AliBaseMCTrackDensity.h:29
 AliBaseMCTrackDensity.h:30
 AliBaseMCTrackDensity.h:31
 AliBaseMCTrackDensity.h:32
 AliBaseMCTrackDensity.h:33
 AliBaseMCTrackDensity.h:34
 AliBaseMCTrackDensity.h:35
 AliBaseMCTrackDensity.h:36
 AliBaseMCTrackDensity.h:37
 AliBaseMCTrackDensity.h:38
 AliBaseMCTrackDensity.h:39
 AliBaseMCTrackDensity.h:40
 AliBaseMCTrackDensity.h:41
 AliBaseMCTrackDensity.h:42
 AliBaseMCTrackDensity.h:43
 AliBaseMCTrackDensity.h:44
 AliBaseMCTrackDensity.h:45
 AliBaseMCTrackDensity.h:46
 AliBaseMCTrackDensity.h:47
 AliBaseMCTrackDensity.h:48
 AliBaseMCTrackDensity.h:49
 AliBaseMCTrackDensity.h:50
 AliBaseMCTrackDensity.h:51
 AliBaseMCTrackDensity.h:52
 AliBaseMCTrackDensity.h:53
 AliBaseMCTrackDensity.h:54
 AliBaseMCTrackDensity.h:55
 AliBaseMCTrackDensity.h:56
 AliBaseMCTrackDensity.h:57
 AliBaseMCTrackDensity.h:58
 AliBaseMCTrackDensity.h:59
 AliBaseMCTrackDensity.h:60
 AliBaseMCTrackDensity.h:61
 AliBaseMCTrackDensity.h:62
 AliBaseMCTrackDensity.h:63
 AliBaseMCTrackDensity.h:64
 AliBaseMCTrackDensity.h:65
 AliBaseMCTrackDensity.h:66
 AliBaseMCTrackDensity.h:67
 AliBaseMCTrackDensity.h:68
 AliBaseMCTrackDensity.h:69
 AliBaseMCTrackDensity.h:70
 AliBaseMCTrackDensity.h:71
 AliBaseMCTrackDensity.h:72
 AliBaseMCTrackDensity.h:73
 AliBaseMCTrackDensity.h:74
 AliBaseMCTrackDensity.h:75
 AliBaseMCTrackDensity.h:76
 AliBaseMCTrackDensity.h:77
 AliBaseMCTrackDensity.h:78
 AliBaseMCTrackDensity.h:79
 AliBaseMCTrackDensity.h:80
 AliBaseMCTrackDensity.h:81
 AliBaseMCTrackDensity.h:82
 AliBaseMCTrackDensity.h:83
 AliBaseMCTrackDensity.h:84
 AliBaseMCTrackDensity.h:85
 AliBaseMCTrackDensity.h:86
 AliBaseMCTrackDensity.h:87
 AliBaseMCTrackDensity.h:88
 AliBaseMCTrackDensity.h:89
 AliBaseMCTrackDensity.h:90
 AliBaseMCTrackDensity.h:91
 AliBaseMCTrackDensity.h:92
 AliBaseMCTrackDensity.h:93
 AliBaseMCTrackDensity.h:94
 AliBaseMCTrackDensity.h:95
 AliBaseMCTrackDensity.h:96
 AliBaseMCTrackDensity.h:97
 AliBaseMCTrackDensity.h:98
 AliBaseMCTrackDensity.h:99
 AliBaseMCTrackDensity.h:100
 AliBaseMCTrackDensity.h:101
 AliBaseMCTrackDensity.h:102
 AliBaseMCTrackDensity.h:103
 AliBaseMCTrackDensity.h:104
 AliBaseMCTrackDensity.h:105
 AliBaseMCTrackDensity.h:106
 AliBaseMCTrackDensity.h:107
 AliBaseMCTrackDensity.h:108
 AliBaseMCTrackDensity.h:109
 AliBaseMCTrackDensity.h:110
 AliBaseMCTrackDensity.h:111
 AliBaseMCTrackDensity.h:112
 AliBaseMCTrackDensity.h:113
 AliBaseMCTrackDensity.h:114
 AliBaseMCTrackDensity.h:115
 AliBaseMCTrackDensity.h:116
 AliBaseMCTrackDensity.h:117
 AliBaseMCTrackDensity.h:118
 AliBaseMCTrackDensity.h:119
 AliBaseMCTrackDensity.h:120
 AliBaseMCTrackDensity.h:121
 AliBaseMCTrackDensity.h:122
 AliBaseMCTrackDensity.h:123
 AliBaseMCTrackDensity.h:124
 AliBaseMCTrackDensity.h:125
 AliBaseMCTrackDensity.h:126
 AliBaseMCTrackDensity.h:127
 AliBaseMCTrackDensity.h:128
 AliBaseMCTrackDensity.h:129
 AliBaseMCTrackDensity.h:130
 AliBaseMCTrackDensity.h:131
 AliBaseMCTrackDensity.h:132
 AliBaseMCTrackDensity.h:133
 AliBaseMCTrackDensity.h:134
 AliBaseMCTrackDensity.h:135
 AliBaseMCTrackDensity.h:136
 AliBaseMCTrackDensity.h:137
 AliBaseMCTrackDensity.h:138
 AliBaseMCTrackDensity.h:139
 AliBaseMCTrackDensity.h:140
 AliBaseMCTrackDensity.h:141
 AliBaseMCTrackDensity.h:142
 AliBaseMCTrackDensity.h:143
 AliBaseMCTrackDensity.h:144
 AliBaseMCTrackDensity.h:145
 AliBaseMCTrackDensity.h:146
 AliBaseMCTrackDensity.h:147
 AliBaseMCTrackDensity.h:148
 AliBaseMCTrackDensity.h:149
 AliBaseMCTrackDensity.h:150
 AliBaseMCTrackDensity.h:151
 AliBaseMCTrackDensity.h:152
 AliBaseMCTrackDensity.h:153
 AliBaseMCTrackDensity.h:154
 AliBaseMCTrackDensity.h:155
 AliBaseMCTrackDensity.h:156
 AliBaseMCTrackDensity.h:157
 AliBaseMCTrackDensity.h:158
 AliBaseMCTrackDensity.h:159
 AliBaseMCTrackDensity.h:160
 AliBaseMCTrackDensity.h:161
 AliBaseMCTrackDensity.h:162
 AliBaseMCTrackDensity.h:163
 AliBaseMCTrackDensity.h:164
 AliBaseMCTrackDensity.h:165
 AliBaseMCTrackDensity.h:166
 AliBaseMCTrackDensity.h:167
 AliBaseMCTrackDensity.h:168
 AliBaseMCTrackDensity.h:169
 AliBaseMCTrackDensity.h:170
 AliBaseMCTrackDensity.h:171
 AliBaseMCTrackDensity.h:172
 AliBaseMCTrackDensity.h:173
 AliBaseMCTrackDensity.h:174
 AliBaseMCTrackDensity.h:175
 AliBaseMCTrackDensity.h:176
 AliBaseMCTrackDensity.h:177
 AliBaseMCTrackDensity.h:178
 AliBaseMCTrackDensity.h:179
 AliBaseMCTrackDensity.h:180
 AliBaseMCTrackDensity.h:181
 AliBaseMCTrackDensity.h:182
 AliBaseMCTrackDensity.h:183
 AliBaseMCTrackDensity.h:184
 AliBaseMCTrackDensity.h:185
 AliBaseMCTrackDensity.h:186
 AliBaseMCTrackDensity.h:187
 AliBaseMCTrackDensity.h:188
 AliBaseMCTrackDensity.h:189
 AliBaseMCTrackDensity.h:190
 AliBaseMCTrackDensity.h:191
 AliBaseMCTrackDensity.h:192
 AliBaseMCTrackDensity.h:193
 AliBaseMCTrackDensity.h:194
 AliBaseMCTrackDensity.h:195
 AliBaseMCTrackDensity.h:196
 AliBaseMCTrackDensity.h:197
 AliBaseMCTrackDensity.h:198
 AliBaseMCTrackDensity.h:199
 AliBaseMCTrackDensity.h:200
 AliBaseMCTrackDensity.h:201
 AliBaseMCTrackDensity.h:202
 AliBaseMCTrackDensity.h:203
 AliBaseMCTrackDensity.h:204
 AliBaseMCTrackDensity.h:205
 AliBaseMCTrackDensity.h:206
 AliBaseMCTrackDensity.h:207
 AliBaseMCTrackDensity.h:208
 AliBaseMCTrackDensity.h:209
 AliBaseMCTrackDensity.h:210
 AliBaseMCTrackDensity.h:211
 AliBaseMCTrackDensity.h:212
 AliBaseMCTrackDensity.h:213
 AliBaseMCTrackDensity.h:214
 AliBaseMCTrackDensity.h:215
 AliBaseMCTrackDensity.h:216
 AliBaseMCTrackDensity.h:217
 AliBaseMCTrackDensity.h:218
 AliBaseMCTrackDensity.h:219
 AliBaseMCTrackDensity.h:220
 AliBaseMCTrackDensity.h:221
 AliBaseMCTrackDensity.h:222
 AliBaseMCTrackDensity.h:223
 AliBaseMCTrackDensity.h:224
 AliBaseMCTrackDensity.h:225
 AliBaseMCTrackDensity.h:226
 AliBaseMCTrackDensity.h:227
 AliBaseMCTrackDensity.h:228
 AliBaseMCTrackDensity.h:229
 AliBaseMCTrackDensity.h:230
 AliBaseMCTrackDensity.h:231
 AliBaseMCTrackDensity.h:232
 AliBaseMCTrackDensity.h:233