ROOT logo
#ifndef ALISPDMCTRACKDENSITY_MC
#define ALISPDMCTRACKDENSITY_MC
#include "AliBaseMCTrackDensity.h"

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

  /** 
   * 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 SPD 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 SPD.  In that case,
   * figure out which @f$(\eta,\varphi)@f$-bin to assign the track to,
   * and fill the @a output histogram
   * 
   * @param event    MC event 
   * @param vz       IP z--coordinate
   * @param output   Output of SPD hits
   * @param primary  Primary information, if available. 
   * 
   * @return true 
   */
  Bool_t Calculate(const AliMCEvent&   event, 
		   Double_t            vz,
		   TH2D&               output,
		   TH2D*               primary);
  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();
  Bool_t CheckTrackRef(AliTrackReference* /*ref*/) const;
  /** 
   * 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;
  Double_t fMinR;             // Min radius 
  Double_t fMaxR;             // Max radius 
  Double_t fMinZ;             // Min z
  Double_t fMaxZ;             // Max z
  AliTrackReference* fStored; //! Last stored
  TH2D*              fOutput; //! Output 

  ClassDef(AliSPDMCTrackDensity,4); // Calculate track-ref density
};

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