ROOT logo
#ifndef ALIFMDMULTCUTS_H
#define ALIFMDMULTCUTS_H
#include <TObject.h>
class TH2;

/**
 * Cuts used when calculating the multiplicity.
 *
 * We can define our cuts in four ways (in order of priorty)
 *
 * - Using a fixed value @f$ v@f$- AliFMDMultCuts:: SetMultCuts
 * - Using a fraction @f$ f@f$ of the most probably value (@f$ \Delta_p@f$)
 *   from the energy loss fits
 * - Using some number @f$ n@$ of widths (@f$ \xi@f$) below the most
 *   probable value (@f$ \Delta_p@f$) from the energy loss fits 
 * - Using some number @f$ n@$ of widths (@f$ \xi+\sigma@f$) below the
 *   most probable value (@f$ \Delta_p@f$) from the energy loss fits 
 * - Using the @f$ x@f$ value for which @f$ P(x>p)@f$ given some cut
 *   value @f$ p@f$
 * - Using the lower fit range of the energy loss fits
 *
 * The member function AliFMDMultCuts::Reset resets all cut values,
 * meaning the lower bound on the fits will be used by default.  This
 * is useful to ensure a fresh start:
 *
 * @code 
 AliFMDMultCuts c;
 c.Reset();
 c.Set(AliFMDMultCuts::kLandauWidth,2);
 @endcode 
 *
 * The member function AliFMDMultCuts::GetMethod will return the
 * method identifier for the current method employed
 * (AliFMDMultCuts::EMethod).  Like wise will the method
 * AliFMDMultCuts::GetMethodString give a human readable string of the
 * current method employed.
 */
class AliFMDMultCuts : public TObject 
{
public:
  enum EMethod { 
    kFixed, 
    kMPVFraction, 
    kFitRange, 
    kLandauWidth,
    kLandauSigmaWidth,
    kProbability
  };
  enum {
    kBad = 1024
  };
  
  /** 
   * CTOR
   */
  AliFMDMultCuts();
  /** 
   * Set the cut for specified method.
   * 
   * @param method Cut method
   * @param fmd1i  Value for FMD1i
   * @param fmd2i  Value for FMD2i (if < 0, use fmd1i) 
   * @param fmd2o  Value for FMD2o (if < 0, use fmd1i) 
   * @param fmd3i  Value for FMD3i (if < 0, use fmd1i) 
   * @param fmd3o  Value for FMD3o (if < 0, use fmd1i) 
   */
   AliFMDMultCuts(EMethod method, 
		  Double_t fmd1i, 
		  Double_t fmd2i=-1, 
		  Double_t fmd2o=-1, 
		  Double_t fmd3i=-1, 
		  Double_t fmd3o=-1);
  /** 
   * Copy CTOR
   * 
   * @param o Oject to copy from
   */
  AliFMDMultCuts(const AliFMDMultCuts& o);
  /** 
   * Assignment operator 
   * 
   * @param o Object to asing from 
   * 
   * @return Reference to this object 
   */
  AliFMDMultCuts& operator=(const AliFMDMultCuts& o);
  /** 
   * Reset all cuts to default value. 
   */
  void Reset();
  /** 
   * Get the multiplicity cuts for a specific ring and pseudo-rapidity 
   * 
   * @param d      Detector 
   * @param r      Ring  
   * @param eta    pseudo-rapidity 
   * @param errors Get error on cut
   * 
   * @return Cut value 
   */
  Double_t GetMultCut(UShort_t d, Char_t r, Double_t eta, Bool_t errors) const;
  /** 
   * Get the multiplicity cuts for a specific ring and pseudo-rapidity bin
   * 
   * @param d      Detector 
   * @param r      Ring  
   * @param etabin pseudo-rapidity bin
   * @param errors Get error on cut
   * 
   * @return Cut value 
   */
  Double_t GetMultCut(UShort_t d, Char_t r, Int_t etabin, Bool_t errors) const;
  /** 
   * Set the cuts
   * 
   * @param fmd1i  Value for FMD1i
   * @param fmd2i  Value for FMD2i (if < 0, use fmd1i) 
   * @param fmd2o  Value for FMD2o (if < 0, use fmd1i) 
   * @param fmd3i  Value for FMD3i (if < 0, use fmd1i) 
   * @param fmd3o  Value for FMD3o (if < 0, use fmd1i) 
   *
   * @deprecated Use AliFMDMultCuts::Set 
   */
  void SetMultCuts(Double_t fmd1i, 
		   Double_t fmd2i=-1, 
		   Double_t fmd2o=-1, 
		   Double_t fmd3i=-1, 
		   Double_t fmd3o=-1) 
  { 
    DepSet("SetMultCuts", kFixed,fmd1i,fmd2i,fmd2o,fmd3i,fmd3o); 
  }
  /** 
   * Set the faction of most probable value 
   * 
   * @param frac Fraction
   *
   * @deprecated Use AliFMDMultCuts::Set 
   */
  void SetMPVFraction(Double_t frac=0) 
  { 
    DepSet("SetMPVFraction",kMPVFraction, frac); 
  }
  /** 
   * Set the number times the Landau width
   * 
   * @param nXi Number of widths 
   *
   * @deprecated Use AliFMDMultCuts::Set 
   */
  void SetNXi(Double_t nXi) { DepSet("SetNXi", kLandauWidth, nXi); }
  /** 
   * Set wether to includle the Gaussian sigma in cut calculation
   * 
   * @param in If true, use Gaussian variance 
   *
   * @deprecated Use AliFMDMultCuts::Set with kLandauSigmaWidth
   */
  void SetIncludeSigma(Bool_t in);
  /** 
   * Set probability cut.  See
   * AliFMDCorrELossFit::ELossFit::FindProbabilityCut
   * 
   * @param cut Cut value 
   *
   * @deprecated Use AliFMDMultCuts::Set 
   */
  void SetProbability(Double_t cut=1e-5) 
  { 
    DepSet("SetProbability", kProbability, cut); 
  }
  /** 
   * Set the cut for specified method.
   *
   * Note, that if @a method is kFixed, and only @a fmd1i is specified,
   * then the outer rings cut value is increased by 20% relative to @a
   * fmd1i.
   *
   * Also note, that if @a method is kLandauWidth, and @a cut2 is
   * larger than zero, then @f$\sigma@f$ of the fits are included in
   * the cut value.
   * 
   * @param method Method to use 
   * @param fmd1i  Value for FMD1i
   * @param fmd2i  Value for FMD2i (if < 0, use fmd1i) 
   * @param fmd2o  Value for FMD2o (if < 0, use fmd1i) 
   * @param fmd3i  Value for FMD3i (if < 0, use fmd1i) 
   * @param fmd3o  Value for FMD3o (if < 0, use fmd1i) 
   */
  void Set(EMethod method, 
	   Double_t fmd1i, 
	   Double_t fmd2i=-1, 
	   Double_t fmd2o=-1, 
	   Double_t fmd3i=-1, 
	   Double_t fmd3o=-1);
  /** 
   * Print information
   * 
   * @param option Not used
   */
  void Print(Option_t* option="") const;
  /** 
   * Fill a histogram with cut values.  The histogram is assumed to
   * have rings on the y axis, and @f$ \eta@f$ on the x axis.
   * 
   * @param h Histogram to fill 
   */
  void FillHistogram(TH2* h) const;
  /** 
   * Define outputs 
   * 
   * @param l      List to add to 
   * @param name   Name 
   */
  void Output(TList* l, const char* name=0) const;
  /** 
   * Read in cuts stored in file 
   * 
   * @param l      List to read from 
   * @param name   Name of possible sub-list
   * 
   * @return true on success
   */
  Bool_t Input(TList* l, const char* name);
  /** 
   * Return methid Id
   * 
   * @return method number
   */
  EMethod GetMethod() const { return fMethod; }
  /** 
   * Get a string descriping the method used
   * 
   * @return String 
   */
  const char* GetMethodString(Bool_t latex=false) const;
  /** 
   * helper function to translate a method into a string 
   * 
   * @param method Method identifier 
   * 
   * @return String 
   */
  static const char* Method2String(EMethod method, Bool_t latex);
  /** 
   * Helper function to translate a string into a method identifier 
   * 
   * @param str String
   * 
   * @return Method identifier 
   */
  static EMethod String2Method(const char* str);
protected:
  /** 
   * Set the cut for specified method.
   *
   * @param method Cut method
   * @param fmd1i  Value for FMD1i
   * @param fmd2i  Value for FMD2i (if < 0, use fmd1i) 
   * @param fmd2o  Value for FMD2o (if < 0, use fmd1i) 
   * @param fmd3i  Value for FMD3i (if < 0, use fmd1i) 
   * @param fmd3o  Value for FMD3o (if < 0, use fmd1i) 
   */
  void DepSet(const char* what, 
	      EMethod method, 
	      Double_t fmd1i, 
	      Double_t fmd2i=-1, 
	      Double_t fmd2o=-1, 
	      Double_t fmd3i=-1, 
	      Double_t fmd3o=-1);
  /** 
   * Get the cut parameter for a specific ring 
   * 
   * @param d Detector
   * @param r Ring 
   * 
   * @return Cut parameter
   */
  Double_t GetCutParam(UShort_t d, Char_t r) const;

  Double_t fCuts[5];   // Fixed cuts
  EMethod  fMethod;

  ClassDef(AliFMDMultCuts,5); // Cuts on ESD Mult 
};

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