ROOT logo
#ifndef ALIFMDESDFIXER_H
#define ALIFMDESDFIXER_H 
#include <TObject.h>
#include <TBits.h>
class TH1;
class TList;
class AliESDFMD;

/**
 * Class to fix up an ESD object for various small issues. 
 *
 * @par Input:
 *    - AliESDFMD object - from reconstruction 
 *    - Ip z coordinate - from reconstruction 
 *    - Reco noise factor - Assumed noise factor used in reconstruction
 *
 * @par Output:
 *    - The same AliESDFMD object but modified 
 *
 * @par Corrections used
 *    - AliFMDCorrNoiseGain if the noise correction is enabled 
 * 
 * @par Histograms
 *    - Change in @f$\Delta@f$ due to noise correction
 *    - Number of channels declared dead 
 *    - Change in @f$\eta@f$  
 *
 * @ingroup pwglf_forward_algo 
 * @ingroup pwglf_forward_aod
 */
class AliFMDESDFixer : public TObject 
{
public:
  /**
   * Default CTOR - for ROOT I/O - do not use 
   */
  AliFMDESDFixer();

  /** 
   * User CTOR 
   *
   * @param name Dummy argument 
   */
  AliFMDESDFixer(const char* name);
  /** 
   * Get name of object 
   * 
   * @return Always the same 
   */
  const char* GetName() const { return "fmdESDFixer"; }
  /**
   * Create output objects 
   */
  void CreateOutputObjects(TList* l);
  /** 
   * Fix the ESD object 
   * 
   * @param esd ESD object 
   * @param ipZ IP Z--coordinate
   */
  void Fix(AliESDFMD& esd, Double_t ipZ);

  /** 
   * @{ 
   * @name Noise suppression fix 
   */
  /** 
   * Set the factor assumed to be used in the reconstruction.  If this
   * is set way high (>=4) then this corrector will effectively be
   * disabled.
   * 
   * @param f 
   */
  void SetRecoNoiseFactor(Int_t f) { fRecoFactor = f; }
  void SetMaxNoiseCorrection(Double_t x) { fMaxNoiseCorr = x; }
  /** 
   * Get the factor assumed in reconstruction pass
   * 
   * @return factor assumed in reconstruction pass
   */
  Int_t GetRecoNoiseFactor() const { return fRecoFactor; }
  /** 
   * Check if we're using the noise correction. 
   * 
   * @return true if fRecoFactor < 4
   */
  Bool_t IsUseNoiseCorrection() const { return fRecoFactor < 4; }
  /** 
   * Find the target noise factor 
   * 
   * @param esd   ESD object. 
   * @param check If true, also check for correction object 
   * 
   * @return Needed noise factor, or 0 or less if no correction is needed
   */
  Int_t FindTargetNoiseFactor(const AliESDFMD& esd, Bool_t check=true) const;
  /* @} */

  /** 
   * @{ 
   * @name Recalculations 
   */
  /** 
   * In case of a displaced vertices recalculate @f$\eta@f$ and angle
   * correction
   * 
   * @param use recalculate or not
   * 
   */
  void SetRecalculateEta(Bool_t use) { fRecalculateEta = use; }
  /* @} */

  /**
   * @{ 
   * @name Special treatmeant of invalid signals 
   */
  /** 
   * Set whether to consider invalid multiplicities as null (or empty)
   * signal. 
   * 
   * @param flag If true, count invalids as empty
   */
  void SetInvalidIsEmpty(Bool_t flag) { fInvalidIsEmpty = flag; }
  /** @} */

  /** 
   * @{ 
   * @name Dead strip handling 
   */
  /** 
   * Add a dead strip
   * 
   * @param d  Detector
   * @param r  Ring 
   * @param s  Sector 
   * @param t  Strip
   */
  void AddDead(UShort_t d, Char_t r, UShort_t s, UShort_t t);
  /** 
   * Add a dead region in a detector ring
   * 
   * @param d   Detector
   * @param r   Ring
   * @param s1  First sector (inclusive)
   * @param s2  Last sector (inclusive)
   * @param t1  First strip (inclusive)
   * @param t2  Last strip (inclusive)
   */
  void AddDeadRegion(UShort_t d, Char_t r, UShort_t s1, UShort_t s2, 
		     UShort_t t1, UShort_t t2);
  /** 
   * Add dead strips from a script.  The script is supposed to accept
   * a pointer to this object (AliFMDSharingFilter) and then call
   * AddDead or AddDeadRegion as needed.
   * 
   * @code 
   * void deadstrips(AliFMDSharingFilter* filter)
   * { 
   *   filter->AddDead(...);
   *   // ... and so on 
   * }
   * @endcode 
   *
   * @param script The script to read dead strips from. 
   */
  void AddDead(const Char_t* script);
  /* @} */

  void Print(Option_t* option="") const;
protected:
  AliFMDESDFixer(const AliFMDESDFixer&);
  AliFMDESDFixer& operator=(const AliFMDESDFixer&);
  
  /** 
   * @{ 
   * @name Worker functions 
   */
  /** 
   * Check if a strip is marked as dead 
   * 
   * @param d   Detector 
   * @param r   Ring
   * @param s   Sector 
   * @param t   Strip 
   * 
   * @return true if dead 
   */
  virtual Bool_t IsDead(UShort_t d, Char_t r, UShort_t s, UShort_t t) const;
  /** 
   * Possibly raise a strip from the dead or kill it 
   * 
   * @param d   Detector 
   * @param r   Ring
   * @param s   Sector 
   * @param t   Strip 
   * @param m   Multiplicity
   * 
   * @return true if this was killed
   */
  Bool_t CheckDead(UShort_t d, Char_t r, UShort_t s, UShort_t t, Double_t& m);
  /** 
   * Re-calculate eta and correct the multiplicity accordingly 
   * 
   * @param d          Detector 
   * @param r          Ring
   * @param s          Sector 
   * @param t          Strip 
   * @param vz         Ip Z-coordinate
   * @param mult       In/out multiplicity
   * @param eta        In/out eta 
   * @param cosTheta   On return, the cosine of theta or null
   */
  void RecalculateEta(UShort_t d, Char_t r, UShort_t s, UShort_t t, 
		      Double_t vz, Double_t& mult, Double_t& eta, 
		      Double_t& cosTheta);
  /** 
   * Correct for noise suppression
   * 
   * @param f            Factor to apply
   * @param c            Correction 
   * @param cosTheta     Cosine to theta 
   * @param mult         In/Out multiplity 
   *
   * @return true if signal is good, otherwise false 
   */
  Bool_t NoiseCorrect(Int_t f, Double_t c, Double_t cosTheta, Double_t& mult);

  Int_t    fRecoFactor;      // Noise factor used in Reco
  Double_t fMaxNoiseCorr;    // If noise corr above this, flag as dead 
  Bool_t   fRecalculateEta;  // Whether to recalc eta and angle cor (disp vtx)
  TBits    fXtraDead;        // List of extra dead channels
  Bool_t   fHasXtraDead;     // Whether we have xtra dead channels
  Bool_t   fInvalidIsEmpty;  // Consider kInvalidMult as zero 
  TH1*     fNoiseChange;     // Diagnostics
  TH1*     fEtaChange;       // Diagnostics
  TH1*     fDeadChange;      // Diagnostics
  
  ClassDef(AliFMDESDFixer,1);  // Fix FMD ESD object for issues 
};

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