ROOT logo
#ifndef  HPARTICLEEVTCHARABK_H
#define  HPARTICLEEVTCHARABK_H

#include "TString.h"
#include "TFile.h"
#include "TROOT.h"
#include "TSystem.h"
#include "TNamed.h"
#include "TH1F.h"
#include "TString.h"
#include "TFile.h"
#include "TMath.h"
#include "TROOT.h"
#include "TH2F.h"
#include "TH3F.h"
#include "TProfile2D.h"
#include "TF1.h"
#include "TStyle.h"
#include "TGraphErrors.h"
#include "TTree.h"
#include "vector"
#include "TNtuple.h"
#include "TVector2.h"
#include "TRandom2.h"

#include "hades.h"
#include "htool.h"
#include "hphysicsconstants.h"
#include "hrootsource.h"
#include "hiterator.h"
#include "hloop.h"
#include "htime.h"
#include "hruntimedb.h"
#include "htaskset.h"

#include "haddef.h"
#include "heventheader.h"
#include "hreconstructor.h"
#include "hparticledef.h"
#include "hparticlestructs.h"
#include "hparticlecand.h"
#include "hparticlecandsim.h"

#include "hcategory.h"
#include "hcategorymanager.h"
#include "hparticleevtinfo.h"

#include "walldef.h"
#include "hwallhitsim.h"
#include "henergylosscorrpar.h"

using namespace std;
class HParticleCand;
class HCategory;

class HParticleEvtChara : public HReconstructor {

public:


    // -------------------------------------------------------------------------
    //  flags for HParticleEvtChara, CentralityEstimator
    enum eCentralityEstimator { 
        kTOFRPC                          =  0,
        kTOF                                 ,
        kRPC                                 ,
        kTOFRPCtot                           ,
        kTOFtot                              ,
        kRPCtot                              ,
        kSelectedParticleCand                ,
        kSelectedParticleCandCorr            ,
        kSelectedParticleCandNorm            ,
        kSelectedParticleCandSecNorm         ,
        kSelectedParticleCandCorrPerWire     ,
        kPrimaryParticleCand                 ,
        kMdcWires                            ,
        kMdcWiresOuterMod                    ,
        kFWSumChargeSpec                     ,
        kFWSumChargeZ                        ,
        kDirectivity                         ,
        kRatioEtEz                           ,
        kEt                                  ,
        kNumCentralityEstimator              
    };

    Int_t getCentralityEstimatorBinSize(UInt_t e)
    {
        if(e     ==kTOFRPC)                          return    500;
        else if(e==kTOF)                             return    500;
        else if(e==kRPC)                             return    500;
        else if(e==kTOFRPCtot)                       return    500;
        else if(e==kTOFtot)                          return    500;
        else if(e==kRPCtot)                          return    500;
        else if(e==kSelectedParticleCand)            return    500;
        else if(e==kSelectedParticleCandCorr)        return    500;
        else if(e==kSelectedParticleCandSecNorm)     return    500;
        else if(e==kSelectedParticleCandNorm)        return    500;
        else if(e==kSelectedParticleCandCorrPerWire) return    500;
        else if(e==kPrimaryParticleCand)             return    500;
        else if(e==kMdcWires)                        return   1000;
        else if(e==kMdcWiresOuterMod)                return   1000;
        else if(e==kFWSumChargeSpec)                 return   1000;
        else if(e==kFWSumChargeZ)                    return    500;
        else if(e==kDirectivity)                     return   1000;
        else if(e==kRatioEtEz)                       return   1000;
        else if(e==kEt)                              return   1000;
        else return 0;
    }

    Int_t getCentralityEstimatorBinMax(UInt_t e)
    {
        if(e     ==kTOFRPC)                          return     500; 
        else if(e==kTOF)                             return     500;
        else if(e==kRPC)                             return     500;
        else if(e==kTOFRPCtot)                       return     500;
        else if(e==kTOFtot)                          return     500;
        else if(e==kRPCtot)                          return     500;
        else if(e==kSelectedParticleCand)            return     500;
        else if(e==kSelectedParticleCandCorr)        return     500;
        else if(e==kSelectedParticleCandSecNorm)     return      50;
        else if(e==kSelectedParticleCandNorm)        return      50;
        else if(e==kSelectedParticleCandCorrPerWire) return     500;
        else if(e==kPrimaryParticleCand)             return     500;
        else if(e==kMdcWires)                        return   10000; 
        else if(e==kMdcWiresOuterMod)                return   10000; 
        else if(e==kFWSumChargeSpec)                 return   10000; 
        else if(e==kFWSumChargeZ)                    return     500; 
        else if(e==kDirectivity)                     return       3; 
        else if(e==kRatioEtEz)                       return       3; 
        else if(e==kEt)                              return   30000; 
        else return 0;
    }

    TString getStringCentralityEstimator(UInt_t e)
    {
        if(e     ==kTOFRPC)                         return "TOFRPC";
        else if(e==kTOF)                            return "TOF";
        else if(e==kRPC)                            return "RPC";
        else if(e==kTOFRPCtot)                      return "TOFRPCtot";
        else if(e==kTOFtot)                         return "TOFtot";
        else if(e==kRPCtot)                         return "RPCtot";
        else if(e==kSelectedParticleCand)           return "SelectedParticleCand";
        else if(e==kSelectedParticleCandCorr)       return "SelectedParticleCandCorr";
        else if(e==kSelectedParticleCandSecNorm)    return "SelectedParticleCandSecNorm";
        else if(e==kSelectedParticleCandNorm)       return "SelectedParticleCandNorm";
        else if(e==kSelectedParticleCandCorrPerWire)return "SelectedParticleCandCorrPerWire";
        else if(e==kPrimaryParticleCand)            return "PrimaryParticleCand";
        else if(e==kMdcWires)                       return "MdcWires";
        else if(e==kMdcWiresOuterMod)               return "MdcWiresOuterMod";
        else if(e==kFWSumChargeSpec)                return "FWSumChargeSpec";
        else if(e==kFWSumChargeZ)                   return "FWSumChargeZ";
        else if(e==kDirectivity)                    return "Directivity";
        else if(e==kRatioEtEz)                      return "RatioEtEz";
        else if(e==kEt)                             return "Et";
        else return "";
    }

    UInt_t getCentralityEstimatorFromString(TString s)
    {
             if(s.CompareTo("TOFRPC")==0 || s.CompareTo("TOFRPCtimecut")==0)    return kTOFRPC;
        else if(s.CompareTo("TOF")==0 || s.CompareTo("TOFtimecut")==0)          return kTOF;
        else if(s.CompareTo("RPC")==0 || s.CompareTo("RPCtimecut")==0)          return kRPC;
        else if(s.CompareTo("TOFRPCtot")==0)                                    return kTOFRPCtot;
        else if(s.CompareTo("TOFtot")==0)                                       return kTOFtot;
        else if(s.CompareTo("RPCtot")==0)                                       return kRPCtot;
        else if(s.CompareTo("SelectedParticleCand")==0)                         return kSelectedParticleCand;
        else if(s.CompareTo("SelectedParticleCandCorr")==0)                     return kSelectedParticleCandCorr;
        else if(s.CompareTo("SelectedParticleCandSecNorm")==0)                  return kSelectedParticleCandSecNorm;
        else if(s.CompareTo("SelectedParticleCandNorm")==0)                     return kSelectedParticleCandNorm;
        else if(s.CompareTo("SelectedParticleCandCorrPerWire")==0)              return kSelectedParticleCandCorrPerWire;
        else if(s.CompareTo("PrimaryParticleCand")==0)                          return kPrimaryParticleCand;
        else if(s.CompareTo("MdcWires")==0)                                     return kMdcWires;
        else if(s.CompareTo("MdcWiresOuterMod")==0)                             return kMdcWiresOuterMod;
        else if(s.CompareTo("FWSumChargeSpec")==0)                              return kFWSumChargeSpec;
        else if(s.CompareTo("FWSumChargeZ")==0)                                 return kFWSumChargeZ;
        else if(s.CompareTo("Directivity")==0)                                  return kDirectivity;
        else if(s.CompareTo("RatioEtEz")==0)                                    return kRatioEtEz;
        else if(s.CompareTo("Et")==0)                                           return kEt;
        else return kNumCentralityEstimator;
    }


    //  CentralityClass
    enum eCentralityClass { 
        k10                 = 0,        // (default) 10% classes
        k5                     ,        // 5% classes
        k2                     ,        // 2% classes
        k1                     ,        // 1% classes
        k13                    ,        // 13% classes 
        k15                    ,        // 15% classes
        k20                    ,        // 20% classes
        k1040                  ,        // 10-40% class
        kFOPI                  ,        // FOPI centrality classes
        kNumCentralityClass    
    };

    TString getStringCentralityClass(UInt_t e)
    {
             if(e==k10)                  return "10pc";
        else if(e==k5)                   return "5pc";
        else if(e==k2)                   return "2pc";
        else if(e==k1)                   return "1pc";
        else if(e==k13)                  return "13pc";
        else if(e==k15)                  return "15pc";
        else if(e==k20)                  return "20pc";
        else if(e==k1040)                return "1040class";
        else if(e==kFOPI)                return "FOPI";
        else return "";
    }

    Float_t getCentralityClassBinSize(UInt_t e)
    {
             if(e==k10)                  return 10. ;
        else if(e==k5)                   return  5. ;
        else if(e==k2)                   return  2. ;
        else if(e==k1)                   return  1. ;
        else if(e==k13)                  return 13. ;
        else if(e==k15)                  return 15. ;
        else if(e==k20)                  return 20. ;
        else if(e==k1040)                return  0. ;
        else if(e==kFOPI)                return  0. ;
        else return 0;
    }

    enum eEventPlaneCorrection {         // additive
        kNoCorrection           = 0x00,  //     
        kSmear                  = 0x01,  //    1
        kShiftFW                = 0x02,  //    2 
        kScaleFW                = 0x04,  //    2 
        kReCenter               = 0x08,  //    4
        kWidthEqualization      = 0x10,  //    8
        kFlatten                = 0x20,  //   16
        kWeightCharge           = 0x40,  //   32
        kWeightTheta            = 0x80, 

        kScalingFW = kScaleFW,
        kReCentering = kReCenter, 
        kScaling = kWidthEqualization,
        kFlattening = kFlatten,
        kRotation = kFlatten,
         
        kDefault                = kShiftFW|kWeightCharge|kRotation
    };

    TString getStringEventPlaneCorrection(UInt_t e)
    {
        TString s="";
        if(e==kNoCorrection)    return "NoCorrection";

        if(isFlagSet(kSmear,e)          )  s +="Smear";
        if(isFlagSet(kShiftFW,e)        )  s +="ShifFW";
        if(isFlagSet(kScaleFW,e)        )  s +="ScalFW";
        if(isFlagSet(kReCenter,e)       )  s +="Recent";
        if(isFlagSet(kScaling,e)        )  s +="Scale";
        if(isFlagSet(kFlattening,e)     )  s +="Flatt";
        if(isFlagSet(kWeightCharge,e)   )  s +="WCharge";
        if(isFlagSet(kWeightTheta,e)    )  s +="WTheta";
        return s;
    }

    //  EventPlaneCorrection Parameter
    enum eEventPlaneParameter {     
        kFWx                    = 0,
        kFWy                    ,
        kQx                     ,
        kQy                     ,
        kQxWCharge              ,
        kQyWCharge              ,
        kQx2                    ,
        kQy2                    ,
        kQx2WCharge             ,
        kQy2WCharge             ,
        kFourierC1              ,
        kFourierC2              ,
        kFourierC3              ,
        kFourierC4              ,
        kFourierC5              ,
        kFourierC6              ,
        kFourierC7              ,
        kFourierC8              , 
        kFourierS1              ,
        kFourierS2              ,
        kFourierS3              ,
        kFourierS4              ,
        kFourierS5              ,
        kFourierS6              ,
        kFourierS7              ,
        kFourierS8              ,
        kResolution             ,
        kResolutionWCharge      ,
        kChi                    ,
        kNumEventPlaneParameter 
    };
     
    TString getStringEventPlaneParameter(UInt_t e)
    {
           if(e==kFWx)                  return "FWx"  ;
      else if(e==kFWy              )    return "FWy"  ;
      else if(e==kQx               )    return "Qx"  ;
      else if(e==kQy               )    return "Qy"  ;
      else if(e==kQxWCharge        )    return "QxWCharge"  ;
      else if(e==kQyWCharge        )    return "QyWCharge"  ;
      else if(e==kQx2               )    return "Qx2"  ;
      else if(e==kQy2               )    return "Qy2"  ;
      else if(e==kQx2WCharge        )    return "Qx2WCharge"  ;
      else if(e==kQy2WCharge        )    return "Qy2WCharge"  ;

      else if(e==kFourierC1        )    return "FourierC1"  ;
      else if(e==kFourierC2        )    return "FourierC2"  ;
      else if(e==kFourierC3        )    return "FourierC3"  ;
      else if(e==kFourierC4        )    return "FourierC4"  ;
      else if(e==kFourierC5        )    return "FourierC5"  ;
      else if(e==kFourierC6        )    return "FourierC6"  ;
      else if(e==kFourierC7        )    return "FourierC7"  ;
      else if(e==kFourierC8        )    return "FourierC8"  ;
      else if(e==kFourierS1        )    return "FourierS1"  ;
      else if(e==kFourierS2        )    return "FourierS2"  ;
      else if(e==kFourierS3        )    return "FourierS3"  ;
      else if(e==kFourierS4        )    return "FourierS4"  ;
      else if(e==kFourierS5        )    return "FourierS5"  ;
      else if(e==kFourierS6        )    return "FourierS6"  ;
      else if(e==kFourierS7        )    return "FourierS7"  ;
      else if(e==kFourierS8        )    return "FourierS8"  ;
      else if(e==kResolution       )    return "Resolution"  ;
      else if(e==kResolutionWCharge)    return "ResolutionWCharge";
      else if(e==kChi              )    return "Chi" ;
   //     if(e<kNumEventPlaneParameter) return StringEventPlaneParameter[e];
        else return "";
    }

    UInt_t getEventPlaneParameterFromString(TString s)
    {
         if(s.CompareTo("FWx")==0)          return kFWx;
    else if(s.CompareTo("FWy")==0)          return kFWy;
    else if(s.CompareTo("Qx")==0)           return kQx;
    else if(s.CompareTo("Qy")==0)           return kQy;
    else if(s.CompareTo("QxWCharge")==0)    return kQxWCharge;
    else if(s.CompareTo("QyWCharge")==0)    return kQyWCharge;
    else if(s.CompareTo("Qx2")==0)          return kQx2;
    else if(s.CompareTo("Qy2")==0)          return kQy2;
    else if(s.CompareTo("Qx2WCharge")==0)   return kQx2WCharge;
    else if(s.CompareTo("Qy2WCharge")==0)   return kQy2WCharge;
    else if(s.CompareTo("FourierC1")==0)    return kFourierC1;
    else if(s.CompareTo("FourierC2")==0)    return kFourierC2;
    else if(s.CompareTo("FourierC3")==0)    return kFourierC3;
    else if(s.CompareTo("FourierC4")==0)    return kFourierC4;
    else if(s.CompareTo("FourierC5")==0)    return kFourierC5;
    else if(s.CompareTo("FourierC6")==0)    return kFourierC6;
    else if(s.CompareTo("FourierC7")==0)    return kFourierC7;
    else if(s.CompareTo("FourierC8")==0)    return kFourierC8;
    else if(s.CompareTo("FourierS1")==0)    return kFourierS1;
    else if(s.CompareTo("FourierS2")==0)    return kFourierS2;
    else if(s.CompareTo("FourierS3")==0)    return kFourierS3;
    else if(s.CompareTo("FourierS4")==0)    return kFourierS4;
    else if(s.CompareTo("FourierS5")==0)    return kFourierS5;
    else if(s.CompareTo("FourierS6")==0)    return kFourierS6;
    else if(s.CompareTo("FourierS7")==0)    return kFourierS7;
    else if(s.CompareTo("FourierS8")==0)    return kFourierS8;
    else if(s.CompareTo("Resolution")==0)   return kResolution;
    else if(s.CompareTo("ResolutionWCharge")==0)  return kResolutionWCharge;
    else if(s.CompareTo("Chi")==0)          return kChi;
    else return kNumEventPlaneParameter;
    }



  // static const char* getStringEventPlaneParameter(UInt_t e){
  //     if(e<kNumEventPlaneParameter) return StringEventPlaneParameter[e];
  //     else return "";
  // }
  // //{ return (e<kNumEventPlaneParameter)?StringEventPlaneParameter[e]:""; }
  // 
  // UInt_t getEventPlaneParameterFromString(const char* valname)
  // {
  //   TString name(valname);
  //   for(UInt_t i=0; i<kNumEventPlaneParameter; i++) {
  //     if(!name.CompareTo(StringEventPlaneParameter[i])) return i;
  //   }
  //   return kNumEventPlaneParameter; // alias none
  // }

    // -------------------------------------------------------------------------
    // helper class
    class SimpleQVector {
        public:
            Int_t   fSubEvent;
            Float_t fPhi;
            Float_t fPhiOrg;
            Float_t fWeight1;
            Float_t fWeight2;
            UInt_t  fFlag;
            
            SimpleQVector(Int_t se=0, Float_t phi=-1., Float_t w1=1., Float_t w2=1., UInt_t f=kNoCorrection){
                fSubEvent = se;
                fPhi      = phi;
                fWeight1  = w1;
                fWeight2  = w2;
                fFlag     = f;
            }
            
            void SetSubEvent(Int_t se)                { fSubEvent = se;}
            void SetFlag(UInt_t flag)                  { fFlag = flag;}
            void Set(Float_t x, Float_t y, Float_t w1=1., Float_t w2=1.)
                                              { fPhi = TVector2::Phi_0_2pi( TMath::Pi()+TMath::ATan2(-y,-x) );fWeight1 = w1;fWeight2 = w2;}
            void SetOrg(Float_t x, Float_t y) { fPhiOrg = TVector2::Phi_0_2pi( TMath::Pi()+TMath::ATan2(-y,-x) );}

//            void Set(Float_t x, Float_t y)            { fPhi = TVector2::Phi_0_2pi( TMath::Pi()+TMath::ATan2(-y,-x) );}
//            void Set(Float_t x, Float_t y, Float_t w) { fPhi = TVector2::Phi_0_2pi( TMath::Pi()+TMath::ATan2(-y,-x) );fWeight1 = w;}

            void Rotate(Float_t psi) { fPhi = TVector2::Phi_0_2pi( fPhi+psi );}

            
            UInt_t  Flag()     {return fFlag;}   
            Int_t   SubEvent() {return fSubEvent;}   
            Float_t Weight1()  {return fWeight1;}   
            Float_t Weight2()  {return fWeight2;}   

            Float_t Phi()     {return fPhi;}   
            Float_t PhiOrg()  {return fPhiOrg;}   

            Float_t X()   {return TMath::Cos(fPhi);}   
            Float_t Y()   {return TMath::Sin(fPhi);}
            Float_t XOrg()   {return TMath::Cos(fPhiOrg);}   
            Float_t YOrg()   {return TMath::Sin(fPhiOrg);}
            
            void print(){
                //print stuff
                printf("Phi: %.5f, PhiOrg: %.5f, Weight1: %.3f, Weight2: %.3f, SubEvent: %d \n",
                           fPhi,fPhiOrg,fWeight1,fWeight2,fSubEvent);
            }
        
            void Clear()
            {
                fSubEvent  = 0;
                fPhi       = -1.;
                fPhiOrg    = -1.;
                fWeight1   = 1.;
                fWeight2   = 1.;
                fFlag      = kNoCorrection;
            }
    };

#define MAXFWCELLS 302

    //  FWCutValues
    enum eFWCut {     
        kBetaCuts            = 0,
        kTimeCuts            = 1,
        kChargeCuts          = 2,
        kNumFWCutValues        = 3
    };
    TString getStringFWCutValues(UInt_t e)
    {
             if(e==kBetaCuts    )   return "BetaCuts"  ;
        else if(e==kTimeCuts    )   return "TimeCuts"  ;
        else if(e==kChargeCuts  )   return "ChargeCuts"  ;
        else return "";
    }
    

    HParticleEvtChara(const Text_t* name="HParticleEvtChara",const Text_t* title="HParticleEvtChara"); /// constructor
    ~HParticleEvtChara();  /// destructor
    Float_t getVersion() {return 0.7;}  // get parameterfile version, to avoid loading old format 
    Int_t   getNumFWCells() {return MAXFWCELLS;}
    Int_t   execute();
    Bool_t  init();
    Bool_t  reinit();
    Bool_t  finalize(){ return kTRUE;}

    //setter:
    void    setPostFix(TString postFix)              {fPostFix = postFix;}
    Bool_t  setParameterFile(TString ParameterFile);
    void    setUseFWCut(UInt_t eFWCut, Bool_t b=kTRUE)  {useFWCut[eFWCut] = b;}
    void    setExcludeNoisyFWcells(Bool_t b=kTRUE)      {excludeNoisyFWcells = b;}

    Int_t   loadDayOfYear();
    Bool_t  loadParameterFile();
    Bool_t  saveParameterFile();
    Bool_t  loadCentralityEstimatorHist();
    Bool_t  addEstimatorHist(TH1F* hist, Float_t fractionXsection=100., UInt_t centE=kTOFRPC, Int_t direction=-1);
    Bool_t  saveCentralityEstimatorHist();

    Bool_t  loadEventPlaneCorrectionHist();
    Bool_t  addEventPlaneCorrectionHist(TProfile2D *hist, UInt_t epParam=kQx);
    Bool_t  saveEventPlaneCorrectionHist();

    Bool_t  loadFWCutValuesHist();
    Bool_t  addFWCutValuesHist(TH1 *hist, Int_t cell, UInt_t eFWCut);
    Bool_t  saveFWCutValuesHist();

    void    setReferenceMean(Float_t referenceMean)       {fReferenceMeanSelTrack = referenceMean;}

    //getter:
    Bool_t   isNewEvent();
    Float_t  getEventWeight();
    
    Int_t    GetFWmoduleSize(HWallHitSim* wall);
    Bool_t   PassesCutsFW(HWallHitSim* wall);
    Bool_t   PassesCutsFW(HWallHitSim* wall, UInt_t eFWCut);

    TH1F*    getEventPlaneCorrectionHist(UInt_t flag) const;
    Float_t  getCorrection(UInt_t flag=kQx);
    Float_t  getCorrectionError(UInt_t flag=kQx);
    Int_t    getFWCharge(HWallHitSim* wall);
    Float_t  getSmearValue(Int_t size=1);
    Float_t  getThetaWeight(HWallHitSim* wall, Float_t min=3.5, Float_t max=8.);

    vector<Int_t> getFWhits();
    void     fillHitArray();
    void     printHitArray();
    void     printQVectors();

    Bool_t    fillQVectors(UInt_t EPcorr=kNoCorrection, UInt_t nHarmonic=1);  

    Float_t  getCorrectionPhi(Float_t phi);
    Float_t  getEventPlane(UInt_t EPcorr=kNoCorrection, UInt_t SubEvent=0, UInt_t nHarmonic=1);  
    Float_t  getEventPlaneWeight(UInt_t EPcorr=kNoCorrection, UInt_t SubEvent=0, UInt_t nHarmonic=1);
    Float_t  getEventPlaneParameter(UInt_t flag=kQx, Bool_t corr=kFALSE);
    
    
    Int_t   getCentralityClass(TString estimator);                       // Lagacy function should not be used
    Int_t   getCentralityClass(UInt_t centE=kTOFRPC, UInt_t centC=k10);  // Return centrality classes with adjusted fixed Cuts
    Float_t getCentralityEstimator(UInt_t centE=kTOFRPC);
    TH1F*   getCentralityClassHist(UInt_t centE=kTOFRPC, UInt_t centC=k10) const;

    Bool_t  printCentralityClass(TString estimator);
    Bool_t  printCentralityClass(UInt_t centE=kTOFRPC, UInt_t centC=k10);
    Bool_t  printCentralityClass(TH1* htemp);


    Float_t getCentralityPercentile(TString estimator);          // Return centrality percentile - Lagacy function should not be used
    Float_t getCentralityPercentile(UInt_t centE=kTOFRPC);       // Return centrality percentile [0.0-100.0%] of total cross section - Error gives 101% back
    TH1F*   getCentralityPercentileHist(UInt_t centE=kTOFRPC) const;

    Int_t   getCentralityClass5(TString estimator);              // Return centrality 5%  classes binned from centrality percentile
    Int_t   getCentralityClass10(TString estimator);             // Return centrality 10% classes binned from centrality percentile

    //maker
    TH2D*    makeEPresolution(TProfile2D* hist, Bool_t calcChi=kFALSE);
    TH1*     makeEPresolution(TH3* hist, Bool_t calcChi=kFALSE);
    Double_t ModifiedBesselI( Int_t n , Double_t x) const;
    Double_t ComputeResolution( Double_t x, Int_t n=1 ) const;
    Double_t FindXi( Double_t res, Double_t prec=1e-6, Int_t n=1) const;

    TH1F*    makePercentiles(TH1F* hist, Float_t fractionXsection=100., Int_t direction=-1);
    Int_t    getCentralityClassNbins(UInt_t centC=k10);
    Float_t* getCentralityClassArray(UInt_t centC=k10);
    TH1F*    makeClasses(TH1F *h, Float_t fractionXsection=100., UInt_t centC=k10, Int_t direction=-1);
    
    //helper
    Int_t    getNbins(TString estimator);
    Int_t    getNbins(UInt_t centE=kTOFRPC, UInt_t centC=k10);
    Float_t* getUpEdgeArray(UInt_t centE=kTOFRPC, UInt_t centC=k10);
    Float_t* getBinCenterArray(UInt_t centE=kTOFRPC, UInt_t centC=k10);
    vector<TString> getLabelArray(UInt_t centE=kTOFRPC, UInt_t centC=k10);

    // estimator getter:
    Int_t   getMdcWiresOuterMod();
    Float_t getSelectedParticleCandSecNorm();
    Float_t getSelectedParticleCandCorrPerWire();
    Float_t getFWSumChargeSpec();
    Float_t getFWSumZ(Int_t minZ=1, Int_t maxZ=99, UInt_t SubEvent=0);
    Float_t getEt();
    Float_t getRatioEtEz();
    Float_t getDirectivity();

    void    reset();
    Int_t   print();
    
private:

    HCategory* fParticleCandCat;     // ParticleCand category
    HCategory* fParticleEvtInfoCat;  // ParticleEvtInfo category
    HCategory* fCatWallHit;          // ForwardWall category
    
    TString    fParameterFile;          // location and name of ParameterFile
    TFile*     fFile;
    
    TRandom*  fRandom;
    
    // -------------------------------------------------------------------------
    UInt_t  fDayOfYear;                 // day of the year extracted fron filename (sim=0)
    UInt_t  currentEventSeqNumber;      // running seq. num. of event
    
    // flags
    TString fPostFix;
    Bool_t  isSimulation;               // for simulation if catGeantKine is available
    Float_t fReferenceMeanSelTrack;     // track running mean reference point

    vector<Float_t>  fFWminBeta;
    vector<Float_t>  fFWmaxBeta;
    vector<Float_t>  fFWminCharge;
    vector<Float_t>  fFWChargeCuts;    

    vector<vector<TH1*> > fCentralityHist;
    vector<TH1*>          fCentralityPercentileHist;
    vector<TH1*>          fEstimatorHist;
    vector<TH2*>          fEventPlaneCorrectionHist;
    vector<vector<TH1*> > fFWCutValuesHist;
    vector<Bool_t>        useFWCut;
    Bool_t                excludeNoisyFWcells;
    
    vector<SimpleQVector*> arrayOfHits;
    vector<Int_t>         iFWHitvector;   // list of selected and shuffled FW hit-num. 
    vector<Float_t>       vQPhi;    
    


    UInt_t fEventPlaneCorrectionFlag;
    Bool_t fQVectorCalcDone;
    
    inline Bool_t isFlagSet(UInt_t flag, UInt_t status){ return (flag==(status&flag));}
    inline Float_t getPhi(Float_t x, Float_t y){ return TVector2::Phi_0_2pi( TMath::Pi()+TMath::ATan2(-y,-x) );}

    ClassDef(HParticleEvtChara,3)

};

#endif
 hparticleevtchara.h:1
 hparticleevtchara.h:2
 hparticleevtchara.h:3
 hparticleevtchara.h:4
 hparticleevtchara.h:5
 hparticleevtchara.h:6
 hparticleevtchara.h:7
 hparticleevtchara.h:8
 hparticleevtchara.h:9
 hparticleevtchara.h:10
 hparticleevtchara.h:11
 hparticleevtchara.h:12
 hparticleevtchara.h:13
 hparticleevtchara.h:14
 hparticleevtchara.h:15
 hparticleevtchara.h:16
 hparticleevtchara.h:17
 hparticleevtchara.h:18
 hparticleevtchara.h:19
 hparticleevtchara.h:20
 hparticleevtchara.h:21
 hparticleevtchara.h:22
 hparticleevtchara.h:23
 hparticleevtchara.h:24
 hparticleevtchara.h:25
 hparticleevtchara.h:26
 hparticleevtchara.h:27
 hparticleevtchara.h:28
 hparticleevtchara.h:29
 hparticleevtchara.h:30
 hparticleevtchara.h:31
 hparticleevtchara.h:32
 hparticleevtchara.h:33
 hparticleevtchara.h:34
 hparticleevtchara.h:35
 hparticleevtchara.h:36
 hparticleevtchara.h:37
 hparticleevtchara.h:38
 hparticleevtchara.h:39
 hparticleevtchara.h:40
 hparticleevtchara.h:41
 hparticleevtchara.h:42
 hparticleevtchara.h:43
 hparticleevtchara.h:44
 hparticleevtchara.h:45
 hparticleevtchara.h:46
 hparticleevtchara.h:47
 hparticleevtchara.h:48
 hparticleevtchara.h:49
 hparticleevtchara.h:50
 hparticleevtchara.h:51
 hparticleevtchara.h:52
 hparticleevtchara.h:53
 hparticleevtchara.h:54
 hparticleevtchara.h:55
 hparticleevtchara.h:56
 hparticleevtchara.h:57
 hparticleevtchara.h:58
 hparticleevtchara.h:59
 hparticleevtchara.h:60
 hparticleevtchara.h:61
 hparticleevtchara.h:62
 hparticleevtchara.h:63
 hparticleevtchara.h:64
 hparticleevtchara.h:65
 hparticleevtchara.h:66
 hparticleevtchara.h:67
 hparticleevtchara.h:68
 hparticleevtchara.h:69
 hparticleevtchara.h:70
 hparticleevtchara.h:71
 hparticleevtchara.h:72
 hparticleevtchara.h:73
 hparticleevtchara.h:74
 hparticleevtchara.h:75
 hparticleevtchara.h:76
 hparticleevtchara.h:77
 hparticleevtchara.h:78
 hparticleevtchara.h:79
 hparticleevtchara.h:80
 hparticleevtchara.h:81
 hparticleevtchara.h:82
 hparticleevtchara.h:83
 hparticleevtchara.h:84
 hparticleevtchara.h:85
 hparticleevtchara.h:86
 hparticleevtchara.h:87
 hparticleevtchara.h:88
 hparticleevtchara.h:89
 hparticleevtchara.h:90
 hparticleevtchara.h:91
 hparticleevtchara.h:92
 hparticleevtchara.h:93
 hparticleevtchara.h:94
 hparticleevtchara.h:95
 hparticleevtchara.h:96
 hparticleevtchara.h:97
 hparticleevtchara.h:98
 hparticleevtchara.h:99
 hparticleevtchara.h:100
 hparticleevtchara.h:101
 hparticleevtchara.h:102
 hparticleevtchara.h:103
 hparticleevtchara.h:104
 hparticleevtchara.h:105
 hparticleevtchara.h:106
 hparticleevtchara.h:107
 hparticleevtchara.h:108
 hparticleevtchara.h:109
 hparticleevtchara.h:110
 hparticleevtchara.h:111
 hparticleevtchara.h:112
 hparticleevtchara.h:113
 hparticleevtchara.h:114
 hparticleevtchara.h:115
 hparticleevtchara.h:116
 hparticleevtchara.h:117
 hparticleevtchara.h:118
 hparticleevtchara.h:119
 hparticleevtchara.h:120
 hparticleevtchara.h:121
 hparticleevtchara.h:122
 hparticleevtchara.h:123
 hparticleevtchara.h:124
 hparticleevtchara.h:125
 hparticleevtchara.h:126
 hparticleevtchara.h:127
 hparticleevtchara.h:128
 hparticleevtchara.h:129
 hparticleevtchara.h:130
 hparticleevtchara.h:131
 hparticleevtchara.h:132
 hparticleevtchara.h:133
 hparticleevtchara.h:134
 hparticleevtchara.h:135
 hparticleevtchara.h:136
 hparticleevtchara.h:137
 hparticleevtchara.h:138
 hparticleevtchara.h:139
 hparticleevtchara.h:140
 hparticleevtchara.h:141
 hparticleevtchara.h:142
 hparticleevtchara.h:143
 hparticleevtchara.h:144
 hparticleevtchara.h:145
 hparticleevtchara.h:146
 hparticleevtchara.h:147
 hparticleevtchara.h:148
 hparticleevtchara.h:149
 hparticleevtchara.h:150
 hparticleevtchara.h:151
 hparticleevtchara.h:152
 hparticleevtchara.h:153
 hparticleevtchara.h:154
 hparticleevtchara.h:155
 hparticleevtchara.h:156
 hparticleevtchara.h:157
 hparticleevtchara.h:158
 hparticleevtchara.h:159
 hparticleevtchara.h:160
 hparticleevtchara.h:161
 hparticleevtchara.h:162
 hparticleevtchara.h:163
 hparticleevtchara.h:164
 hparticleevtchara.h:165
 hparticleevtchara.h:166
 hparticleevtchara.h:167
 hparticleevtchara.h:168
 hparticleevtchara.h:169
 hparticleevtchara.h:170
 hparticleevtchara.h:171
 hparticleevtchara.h:172
 hparticleevtchara.h:173
 hparticleevtchara.h:174
 hparticleevtchara.h:175
 hparticleevtchara.h:176
 hparticleevtchara.h:177
 hparticleevtchara.h:178
 hparticleevtchara.h:179
 hparticleevtchara.h:180
 hparticleevtchara.h:181
 hparticleevtchara.h:182
 hparticleevtchara.h:183
 hparticleevtchara.h:184
 hparticleevtchara.h:185
 hparticleevtchara.h:186
 hparticleevtchara.h:187
 hparticleevtchara.h:188
 hparticleevtchara.h:189
 hparticleevtchara.h:190
 hparticleevtchara.h:191
 hparticleevtchara.h:192
 hparticleevtchara.h:193
 hparticleevtchara.h:194
 hparticleevtchara.h:195
 hparticleevtchara.h:196
 hparticleevtchara.h:197
 hparticleevtchara.h:198
 hparticleevtchara.h:199
 hparticleevtchara.h:200
 hparticleevtchara.h:201
 hparticleevtchara.h:202
 hparticleevtchara.h:203
 hparticleevtchara.h:204
 hparticleevtchara.h:205
 hparticleevtchara.h:206
 hparticleevtchara.h:207
 hparticleevtchara.h:208
 hparticleevtchara.h:209
 hparticleevtchara.h:210
 hparticleevtchara.h:211
 hparticleevtchara.h:212
 hparticleevtchara.h:213
 hparticleevtchara.h:214
 hparticleevtchara.h:215
 hparticleevtchara.h:216
 hparticleevtchara.h:217
 hparticleevtchara.h:218
 hparticleevtchara.h:219
 hparticleevtchara.h:220
 hparticleevtchara.h:221
 hparticleevtchara.h:222
 hparticleevtchara.h:223
 hparticleevtchara.h:224
 hparticleevtchara.h:225
 hparticleevtchara.h:226
 hparticleevtchara.h:227
 hparticleevtchara.h:228
 hparticleevtchara.h:229
 hparticleevtchara.h:230
 hparticleevtchara.h:231
 hparticleevtchara.h:232
 hparticleevtchara.h:233
 hparticleevtchara.h:234
 hparticleevtchara.h:235
 hparticleevtchara.h:236
 hparticleevtchara.h:237
 hparticleevtchara.h:238
 hparticleevtchara.h:239
 hparticleevtchara.h:240
 hparticleevtchara.h:241
 hparticleevtchara.h:242
 hparticleevtchara.h:243
 hparticleevtchara.h:244
 hparticleevtchara.h:245
 hparticleevtchara.h:246
 hparticleevtchara.h:247
 hparticleevtchara.h:248
 hparticleevtchara.h:249
 hparticleevtchara.h:250
 hparticleevtchara.h:251
 hparticleevtchara.h:252
 hparticleevtchara.h:253
 hparticleevtchara.h:254
 hparticleevtchara.h:255
 hparticleevtchara.h:256
 hparticleevtchara.h:257
 hparticleevtchara.h:258
 hparticleevtchara.h:259
 hparticleevtchara.h:260
 hparticleevtchara.h:261
 hparticleevtchara.h:262
 hparticleevtchara.h:263
 hparticleevtchara.h:264
 hparticleevtchara.h:265
 hparticleevtchara.h:266
 hparticleevtchara.h:267
 hparticleevtchara.h:268
 hparticleevtchara.h:269
 hparticleevtchara.h:270
 hparticleevtchara.h:271
 hparticleevtchara.h:272
 hparticleevtchara.h:273
 hparticleevtchara.h:274
 hparticleevtchara.h:275
 hparticleevtchara.h:276
 hparticleevtchara.h:277
 hparticleevtchara.h:278
 hparticleevtchara.h:279
 hparticleevtchara.h:280
 hparticleevtchara.h:281
 hparticleevtchara.h:282
 hparticleevtchara.h:283
 hparticleevtchara.h:284
 hparticleevtchara.h:285
 hparticleevtchara.h:286
 hparticleevtchara.h:287
 hparticleevtchara.h:288
 hparticleevtchara.h:289
 hparticleevtchara.h:290
 hparticleevtchara.h:291
 hparticleevtchara.h:292
 hparticleevtchara.h:293
 hparticleevtchara.h:294
 hparticleevtchara.h:295
 hparticleevtchara.h:296
 hparticleevtchara.h:297
 hparticleevtchara.h:298
 hparticleevtchara.h:299
 hparticleevtchara.h:300
 hparticleevtchara.h:301
 hparticleevtchara.h:302
 hparticleevtchara.h:303
 hparticleevtchara.h:304
 hparticleevtchara.h:305
 hparticleevtchara.h:306
 hparticleevtchara.h:307
 hparticleevtchara.h:308
 hparticleevtchara.h:309
 hparticleevtchara.h:310
 hparticleevtchara.h:311
 hparticleevtchara.h:312
 hparticleevtchara.h:313
 hparticleevtchara.h:314
 hparticleevtchara.h:315
 hparticleevtchara.h:316
 hparticleevtchara.h:317
 hparticleevtchara.h:318
 hparticleevtchara.h:319
 hparticleevtchara.h:320
 hparticleevtchara.h:321
 hparticleevtchara.h:322
 hparticleevtchara.h:323
 hparticleevtchara.h:324
 hparticleevtchara.h:325
 hparticleevtchara.h:326
 hparticleevtchara.h:327
 hparticleevtchara.h:328
 hparticleevtchara.h:329
 hparticleevtchara.h:330
 hparticleevtchara.h:331
 hparticleevtchara.h:332
 hparticleevtchara.h:333
 hparticleevtchara.h:334
 hparticleevtchara.h:335
 hparticleevtchara.h:336
 hparticleevtchara.h:337
 hparticleevtchara.h:338
 hparticleevtchara.h:339
 hparticleevtchara.h:340
 hparticleevtchara.h:341
 hparticleevtchara.h:342
 hparticleevtchara.h:343
 hparticleevtchara.h:344
 hparticleevtchara.h:345
 hparticleevtchara.h:346
 hparticleevtchara.h:347
 hparticleevtchara.h:348
 hparticleevtchara.h:349
 hparticleevtchara.h:350
 hparticleevtchara.h:351
 hparticleevtchara.h:352
 hparticleevtchara.h:353
 hparticleevtchara.h:354
 hparticleevtchara.h:355
 hparticleevtchara.h:356
 hparticleevtchara.h:357
 hparticleevtchara.h:358
 hparticleevtchara.h:359
 hparticleevtchara.h:360
 hparticleevtchara.h:361
 hparticleevtchara.h:362
 hparticleevtchara.h:363
 hparticleevtchara.h:364
 hparticleevtchara.h:365
 hparticleevtchara.h:366
 hparticleevtchara.h:367
 hparticleevtchara.h:368
 hparticleevtchara.h:369
 hparticleevtchara.h:370
 hparticleevtchara.h:371
 hparticleevtchara.h:372
 hparticleevtchara.h:373
 hparticleevtchara.h:374
 hparticleevtchara.h:375
 hparticleevtchara.h:376
 hparticleevtchara.h:377
 hparticleevtchara.h:378
 hparticleevtchara.h:379
 hparticleevtchara.h:380
 hparticleevtchara.h:381
 hparticleevtchara.h:382
 hparticleevtchara.h:383
 hparticleevtchara.h:384
 hparticleevtchara.h:385
 hparticleevtchara.h:386
 hparticleevtchara.h:387
 hparticleevtchara.h:388
 hparticleevtchara.h:389
 hparticleevtchara.h:390
 hparticleevtchara.h:391
 hparticleevtchara.h:392
 hparticleevtchara.h:393
 hparticleevtchara.h:394
 hparticleevtchara.h:395
 hparticleevtchara.h:396
 hparticleevtchara.h:397
 hparticleevtchara.h:398
 hparticleevtchara.h:399
 hparticleevtchara.h:400
 hparticleevtchara.h:401
 hparticleevtchara.h:402
 hparticleevtchara.h:403
 hparticleevtchara.h:404
 hparticleevtchara.h:405
 hparticleevtchara.h:406
 hparticleevtchara.h:407
 hparticleevtchara.h:408
 hparticleevtchara.h:409
 hparticleevtchara.h:410
 hparticleevtchara.h:411
 hparticleevtchara.h:412
 hparticleevtchara.h:413
 hparticleevtchara.h:414
 hparticleevtchara.h:415
 hparticleevtchara.h:416
 hparticleevtchara.h:417
 hparticleevtchara.h:418
 hparticleevtchara.h:419
 hparticleevtchara.h:420
 hparticleevtchara.h:421
 hparticleevtchara.h:422
 hparticleevtchara.h:423
 hparticleevtchara.h:424
 hparticleevtchara.h:425
 hparticleevtchara.h:426
 hparticleevtchara.h:427
 hparticleevtchara.h:428
 hparticleevtchara.h:429
 hparticleevtchara.h:430
 hparticleevtchara.h:431
 hparticleevtchara.h:432
 hparticleevtchara.h:433
 hparticleevtchara.h:434
 hparticleevtchara.h:435
 hparticleevtchara.h:436
 hparticleevtchara.h:437
 hparticleevtchara.h:438
 hparticleevtchara.h:439
 hparticleevtchara.h:440
 hparticleevtchara.h:441
 hparticleevtchara.h:442
 hparticleevtchara.h:443
 hparticleevtchara.h:444
 hparticleevtchara.h:445
 hparticleevtchara.h:446
 hparticleevtchara.h:447
 hparticleevtchara.h:448
 hparticleevtchara.h:449
 hparticleevtchara.h:450
 hparticleevtchara.h:451
 hparticleevtchara.h:452
 hparticleevtchara.h:453
 hparticleevtchara.h:454
 hparticleevtchara.h:455
 hparticleevtchara.h:456
 hparticleevtchara.h:457
 hparticleevtchara.h:458
 hparticleevtchara.h:459
 hparticleevtchara.h:460
 hparticleevtchara.h:461
 hparticleevtchara.h:462
 hparticleevtchara.h:463
 hparticleevtchara.h:464
 hparticleevtchara.h:465
 hparticleevtchara.h:466
 hparticleevtchara.h:467
 hparticleevtchara.h:468
 hparticleevtchara.h:469
 hparticleevtchara.h:470
 hparticleevtchara.h:471
 hparticleevtchara.h:472
 hparticleevtchara.h:473
 hparticleevtchara.h:474
 hparticleevtchara.h:475
 hparticleevtchara.h:476
 hparticleevtchara.h:477
 hparticleevtchara.h:478
 hparticleevtchara.h:479
 hparticleevtchara.h:480
 hparticleevtchara.h:481
 hparticleevtchara.h:482
 hparticleevtchara.h:483
 hparticleevtchara.h:484
 hparticleevtchara.h:485
 hparticleevtchara.h:486
 hparticleevtchara.h:487
 hparticleevtchara.h:488
 hparticleevtchara.h:489
 hparticleevtchara.h:490
 hparticleevtchara.h:491
 hparticleevtchara.h:492
 hparticleevtchara.h:493
 hparticleevtchara.h:494
 hparticleevtchara.h:495
 hparticleevtchara.h:496
 hparticleevtchara.h:497
 hparticleevtchara.h:498
 hparticleevtchara.h:499
 hparticleevtchara.h:500
 hparticleevtchara.h:501
 hparticleevtchara.h:502
 hparticleevtchara.h:503
 hparticleevtchara.h:504
 hparticleevtchara.h:505
 hparticleevtchara.h:506
 hparticleevtchara.h:507
 hparticleevtchara.h:508
 hparticleevtchara.h:509
 hparticleevtchara.h:510
 hparticleevtchara.h:511
 hparticleevtchara.h:512
 hparticleevtchara.h:513
 hparticleevtchara.h:514
 hparticleevtchara.h:515
 hparticleevtchara.h:516
 hparticleevtchara.h:517
 hparticleevtchara.h:518
 hparticleevtchara.h:519
 hparticleevtchara.h:520
 hparticleevtchara.h:521
 hparticleevtchara.h:522
 hparticleevtchara.h:523
 hparticleevtchara.h:524
 hparticleevtchara.h:525
 hparticleevtchara.h:526
 hparticleevtchara.h:527
 hparticleevtchara.h:528
 hparticleevtchara.h:529
 hparticleevtchara.h:530
 hparticleevtchara.h:531
 hparticleevtchara.h:532
 hparticleevtchara.h:533
 hparticleevtchara.h:534
 hparticleevtchara.h:535
 hparticleevtchara.h:536
 hparticleevtchara.h:537
 hparticleevtchara.h:538
 hparticleevtchara.h:539
 hparticleevtchara.h:540
 hparticleevtchara.h:541
 hparticleevtchara.h:542
 hparticleevtchara.h:543
 hparticleevtchara.h:544
 hparticleevtchara.h:545
 hparticleevtchara.h:546
 hparticleevtchara.h:547
 hparticleevtchara.h:548
 hparticleevtchara.h:549
 hparticleevtchara.h:550
 hparticleevtchara.h:551
 hparticleevtchara.h:552
 hparticleevtchara.h:553
 hparticleevtchara.h:554
 hparticleevtchara.h:555
 hparticleevtchara.h:556
 hparticleevtchara.h:557
 hparticleevtchara.h:558
 hparticleevtchara.h:559
 hparticleevtchara.h:560
 hparticleevtchara.h:561
 hparticleevtchara.h:562
 hparticleevtchara.h:563
 hparticleevtchara.h:564
 hparticleevtchara.h:565
 hparticleevtchara.h:566
 hparticleevtchara.h:567
 hparticleevtchara.h:568
 hparticleevtchara.h:569
 hparticleevtchara.h:570
 hparticleevtchara.h:571
 hparticleevtchara.h:572
 hparticleevtchara.h:573
 hparticleevtchara.h:574
 hparticleevtchara.h:575
 hparticleevtchara.h:576
 hparticleevtchara.h:577
 hparticleevtchara.h:578
 hparticleevtchara.h:579
 hparticleevtchara.h:580
 hparticleevtchara.h:581
 hparticleevtchara.h:582
 hparticleevtchara.h:583
 hparticleevtchara.h:584
 hparticleevtchara.h:585
 hparticleevtchara.h:586
 hparticleevtchara.h:587
 hparticleevtchara.h:588
 hparticleevtchara.h:589
 hparticleevtchara.h:590
 hparticleevtchara.h:591
 hparticleevtchara.h:592
 hparticleevtchara.h:593
 hparticleevtchara.h:594
 hparticleevtchara.h:595
 hparticleevtchara.h:596
 hparticleevtchara.h:597
 hparticleevtchara.h:598
 hparticleevtchara.h:599
 hparticleevtchara.h:600
 hparticleevtchara.h:601
 hparticleevtchara.h:602
 hparticleevtchara.h:603
 hparticleevtchara.h:604
 hparticleevtchara.h:605
 hparticleevtchara.h:606
 hparticleevtchara.h:607
 hparticleevtchara.h:608
 hparticleevtchara.h:609
 hparticleevtchara.h:610
 hparticleevtchara.h:611
 hparticleevtchara.h:612
 hparticleevtchara.h:613
 hparticleevtchara.h:614
 hparticleevtchara.h:615
 hparticleevtchara.h:616
 hparticleevtchara.h:617
 hparticleevtchara.h:618
 hparticleevtchara.h:619