ROOT logo
#ifndef ALIFMDMCTRACKDENSITY_MC
#define ALIFMDMCTRACKDENSITY_MC
#include "AliForwardUtil.h"
#include "AliBaseMCTrackDensity.h"
class TH1D;
class AliESDFMD;

/**
 * A class to calculate the particle density from track references.
 * This code is used both in AliForwardMCCorrectionsTask and
 * AliFMDMCDensity calculator. 
 * 
 * @par Input: 
 *    - AliESDFMD object  - from reconstruction
 *    - Kinematics
 *    - Track-References
 *
 * @par Output: 
 *    - AliESDFMD object  - content is # of track references/strip
 *
 * @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 AliFMDMCTrackDensity : public AliBaseMCTrackDensity 
{
public:
  /** 
   * Default constructor.  Do not use - for ROOT I/O system use only 
   */
  AliFMDMCTrackDensity();
  /** 
   * Normal constructor 
   * 
   * @param name Not used
   */
  AliFMDMCTrackDensity(const char* name);
  /** 
   * Copy constructor 
   * 
   * @param o Object to copy from 
   */
  AliFMDMCTrackDensity(const AliFMDMCTrackDensity& o);
  /** 
   * Assignment operator
   * 
   * @param o Object to assign from 
   * 
   * @return Reference to this 
   */
  AliFMDMCTrackDensity& operator=(const AliFMDMCTrackDensity& o);
  /** 
   * Destructor. 
   */
  virtual ~AliFMDMCTrackDensity() {}

  /** 
   * Set maximum number of strips per 'cluster' 
   * 
   * @param n  Maximum number of strips per 'cluster' 
   */
  void SetMaxConsequtiveStrips(UShort_t n) { fMaxConsequtiveStrips = n; }
  /** 
   * 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 FMD 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 FMD.  In that case,
   * figure out which strip(s) to assign the track to, and fill the @a
   * hits structure.
   * 
   * @param esd      FMD ESD structure 
   * @param event    MC event 
   * @param vz       IP z-coordinate
   * @param output   Output of FMD hits
   * @param primary  Primary information, if available. 
   * 
   * @return true 
   */
  Bool_t Calculate(const AliESDFMD&    esd, 
		   const AliMCEvent&   event, 
		   Double_t            vz,
		   AliESDFMD&          output,
		   TH2D*               primary);
  /** 
   * Define ouputs 
   * 
   * @param list List to add outputs to
   */
  void CreateOutputObjects(TList* list);
  
  void Print(Option_t* option="") const;
protected:
  /** 
   * Must be defined to return the track-reference ID for this detector
   * 
   * @return Detector id set on track references
   */
  Int_t GetDetectorId() const;
  /** 
   * 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.
   */
  AliTrackReference* ProcessRef(AliMCParticle* particle, 
				const AliMCParticle* mother, 
				AliTrackReference* ref);
  /** 
   * Called at before loop over track references
   * 
   */
  void BeginTrackRefs();
  /** 
   * Called at before loop over track references
   * 
   * @param nRefs Number of references 
   */
  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
   */  
  Double_t StoreParticle(AliMCParticle*       particle, 
			 const AliMCParticle* mother,
			 AliTrackReference*   ref) const;
  /** 
   * Structure holding the state of the `tracker' 
   * 
   */
  mutable struct State 
  {
    Double_t angle;            // Angle 
    UShort_t oldDetector;      // Last detector
    Char_t   oldRing;          // Last ring
    UShort_t oldSector;        // Last sector
    UShort_t oldStrip;         // Last strip 
    UShort_t startStrip;       // First strip 
    UShort_t nRefs;            // Number of references
    UShort_t nStrips;          // Number of strips 
    UShort_t count;            // Count of hit strips 
    AliTrackReference* longest; //! Longest track through 
    /** 
     * Clear this state
     * 
     * @param alsoCount If true, also clear count 
     */
    void Clear(Bool_t alsoCount=false);
    /** 
     * Assignment operator 
     * 
     * @param o Object to assign from 
     * 
     * @return Reference to this object 
     */
    State& operator=(const State& o);
  } fState; //! State 
  
    
  UShort_t   fMaxConsequtiveStrips; // Max 'cluster' size
  TH1D*      fNr;                   // Number of track-refs per cluster
  TH1D*      fNt;                   // Size of cluster in strips 
  TH1D*      fNc;                   // Number of clusters per track
  TH2D*      fNcr;                  // Number of clusters per track
  AliESDFMD* fOutput;               //! Output ESD object

  ClassDef(AliFMDMCTrackDensity,5); // Calculate track-ref density
};

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