]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGCF/EBYE/LRC/AliLRCProcess.cxx
Fix for end-of-line style
[u/mrichter/AliRoot.git] / PWGCF / EBYE / LRC / AliLRCProcess.cxx
index 182088fd8f018dd2b3b86b9baf06375dec923c34..5f329139892d1d8c860f2b27a038f50204eb41e6 100644 (file)
-/**************************************************************************\r
- * Authors: Andrey Ivanov, Igor Altsybeev.                                                 *\r
- * Contributors are mentioned in the code where appropriate.              *\r
- *                                                                        *\r
- * Permission to use, copy, modify and distribute this software and its   *\r
- * documentation strictly for non-commercial purposes is hereby granted   *\r
- * without fee, provided that the above copyright notice appears in all   *\r
- * copies and that both the copyright notice and this permission notice   *\r
- * appear in the supporting documentation. The authors make no claims     *\r
- * about the suitability of this software for any purpose. It is          *\r
- * provided "as is" without express or implied warranty.                  *\r
- **************************************************************************/\r
-\r
-// This class creates TH2D histogramms for Nch - Nch , Nch - Pt , Pt - Pt \r
-// dirtributions for given ETA windows and some supplementary data for Long Range Correlation (LRC) analysis .  \r
-// Class is designid to work with AliAnalysisTaskLRC\r
-\r
-// Authors : Andrey Ivanov, Igor Altsybeev, St.Peterburg State University\r
-// Email: Igor.Altsybeev@cern.ch\r
-\r
-#include "Riostream.h"\r
-#include "AliLRCProcess.h"\r
-//#include "THnSparse.h"\r
-#include "TH1F.h"\r
-#include "TH1D.h"\r
-#include "TH2D.h"\r
-#include "TProfile.h"\r
-#include "TList.h"\r
-#include "TString.h"\r
-#include "TMath.h"\r
-//#include "TClonesArray.h"\r
-\r
-//#include <AliPID.h> //for particle mass only\r
-ClassImp(AliLRCProcess)\r
-\r
-//const bool useSparse = false;//false;\r
-//const bool useAccumulatingHist = true;//false;\r
-using std::endl;\r
-using std::cout;\r
-\r
-AliLRCProcess::AliLRCProcess():fIsEventOpend(kFALSE), fIsOnline(kFALSE), fDisplayInitOnDemandWarning(kTRUE)\r
-  ,fUseSparse(false)\r
-  ,fUseAccumulatingHist(true)\r
-  ,fEventCount(0),fStartForwardETA(0), fEndForwardETA(0)\r
-  ,fStartForwardPhi(0)\r
-  ,fEndForwardPhi(0)\r
-  ,fStartBackwardETA(0)\r
-  ,fEndBackwardETA(0)\r
-  ,fStartBackwardPhi(0)\r
-  ,fEndBackwardPhi(0)\r
-  ,fDoubleSidedBackwardPhiWindow(kFALSE)\r
-  ,fHiPt(0)\r
-  ,fLoPt(0)\r
-  ,fHiMultHor(0)\r
-  ,fLowMultHor(0)\r
-  ,fHiMultVert(0)\r
-  ,fLowMultVert(0)\r
-  ,fMultBinsHor(0)\r
-  ,fMultBinsVert(0)\r
-  ,fPtBins(0)\r
-  ,fPtHistXaxisRebinFactor(1)\r
-  ,fSumPtFw(0)\r
-  ,fSumPtBw(0)\r
-  ,fSumPtBw2(0)\r
-  ,fNchFw(0)\r
-  ,fNchBw(0)\r
-  ,fNchFwPlus(0)\r
-  ,fNchBwPlus(0)\r
-  ,fNchFwMinus(0)\r
-  ,fNchBwMinus(0)\r
-  ,fOutList(0), fShortDef(0),fOutputSlot(0), fHistPt(0),fHistEta(0),fHistClouds(0),fHistNN(0),fHistPtN(0),fHistPtPt(0),fProfNberr(0),fProfNberrPtPt(0),fProfdPtB(0),fProfTestLRC(0),fHistSparseDimensionLabeling(0),fHistSparsePIDblocksLabeling(0)\r
-\r
-  ,fHistPtForward(0)\r
-  ,fHistEtaForward(0)\r
-  ,fHistNchForward(0)\r
-  ,fHistNchForwardPtPt(0)\r
-  ,fHistPhiForward(0)\r
-  ,fHistTracksChargeForward(0)\r
-  ,fHistPtPlusForward(0)\r
-  ,fHistPtMinusForward(0)\r
-  ,fHistNetChargeVsPtForward(0)\r
-\r
-  ,fHistPtBackward(0)\r
-  ,fHistEtaBackward(0)\r
-  ,fHistNchBackward(0)\r
-  ,fHistPhiBackward(0)\r
-  ,fHistTracksChargeBackward(0)\r
-  ,fHistPtPlusBackward(0)\r
-  ,fHistPtMinusBackward(0)\r
-  ,fHistNetChargeVsPtBackward(0)\r
-\r
-  ,fArrAccumulatedValues(0)\r
-  //  ,fHistArrayLabeling(0)\r
-  ,fEventCentrality(0)\r
-  ,fHistNfCentrality(0)\r
-  ,fHistTestPIDForward(0)\r
-  ,fHistTestPIDBackward(0)\r
-  ,fHistDifferenceNf(0)\r
-  ,fHistDifferenceNb(0)\r
-\r
-  ,fPidForward(-1)//kLRCany)\r
-  ,fPidBackward(-1)//kLRCany)\r
-  //,fWhichParticleToProcess(kLRCany)//kLRCany)\r
-  //,fPidFillCondition(kLRCpidIgnored)\r
-  //,fNumberOfSectors(1)\r
-  //,fNeedToRotateSector(kFALSE)\r
-{\r
-    //fWhichParticleToProcess = kLRCany;  //default - all particle types\r
-    //fPidFillCondition = kLRCpidIgnored;\r
-    SetCorrespondanceWithAliROOTpid();\r
-    ZeroPidArrays();\r
-}\r
-\r
-AliLRCProcess::AliLRCProcess(Double_t _StartForwardETA,Double_t _EndForwardETA,Double_t _StartBakwardETA,Double_t _EndBakwardETA ): fIsEventOpend(kFALSE), fIsOnline(kFALSE), fDisplayInitOnDemandWarning(kTRUE)\r
-  ,fUseSparse(false)\r
-  ,fUseAccumulatingHist(true)\r
-  ,fEventCount(0),fStartForwardETA(0), fEndForwardETA(0), fStartForwardPhi(0),fEndForwardPhi(0),fStartBackwardETA(0), fEndBackwardETA(0),fStartBackwardPhi(0)\r
-  ,fEndBackwardPhi(0)\r
-  ,fDoubleSidedBackwardPhiWindow(kFALSE)\r
-  ,fHiPt(0)\r
-  ,fLoPt(0)\r
-  ,fHiMultHor(0)\r
-  ,fLowMultHor(0)\r
-  ,fHiMultVert(0)\r
-  ,fLowMultVert(0)\r
-  ,fMultBinsHor(0)\r
-  ,fMultBinsVert(0)\r
-  ,fPtBins(0)\r
-  ,fPtHistXaxisRebinFactor(1)\r
-  ,fSumPtFw(0),  fSumPtBw(0), fSumPtBw2(0),fNchFw(0)\r
-  ,/*fNchFwPtPt(0),*/ fNchBw(0)\r
-  ,fNchFwPlus(0)\r
-  ,fNchBwPlus(0)\r
-  ,fNchFwMinus(0)\r
-  ,fNchBwMinus(0)\r
-  ,fOutList(0), fShortDef(0),fOutputSlot(0), fHistPt(0),fHistEta(0),fHistClouds(0),fHistNN(0),fHistPtN(0),fHistPtPt(0),fProfNberr(0),fProfNberrPtPt(0),fProfdPtB(0),fProfTestLRC(0),fHistSparseDimensionLabeling(0),fHistSparsePIDblocksLabeling(0)\r
-\r
-  ,fHistPtForward(0)\r
-  ,fHistEtaForward(0)\r
-  ,fHistNchForward(0)\r
-  ,fHistNchForwardPtPt(0)\r
-  ,fHistPhiForward(0)\r
-  ,fHistTracksChargeForward(0)\r
-  ,fHistPtPlusForward(0)\r
-  ,fHistPtMinusForward(0)\r
-  ,fHistNetChargeVsPtForward(0)\r
-\r
-  ,fHistPtBackward(0)\r
-  ,fHistEtaBackward(0)\r
-  ,fHistNchBackward(0)\r
-  ,fHistPhiBackward(0)\r
-  ,fHistTracksChargeBackward(0)\r
-  ,fHistPtPlusBackward(0)\r
-  ,fHistPtMinusBackward(0)\r
-  ,fHistNetChargeVsPtBackward(0)\r
-\r
-  ,fArrAccumulatedValues(0)\r
-  //  ,fHistArrayLabeling(0)\r
-  ,fEventCentrality(0)\r
-  ,fHistNfCentrality(0)\r
-  ,fHistTestPIDForward(0)\r
-  ,fHistTestPIDBackward(0)\r
-  ,fHistDifferenceNf(0)\r
-  ,fHistDifferenceNb(0)\r
-  ,fPidForward(-1)//kLRCany)\r
-  ,fPidBackward(-1)//kLRCany)\r
-  //,fWhichParticleToProcess(kLRCany)//kLRCany)\r
-  //,fPidFillCondition(kLRCpidIgnored)\r
-  //,fNumberOfSectors(1)\r
-  //,fNeedToRotateSector(kFALSE)\r
-{\r
-    // Constructor with window setup makes ready-to-run processor\r
-    fEventCount=0;\r
-\r
-    //fWhichParticleToProcess = kLRCany;  //default - all particle types\r
-    //fPidFillCondition = kLRCpidIgnored;\r
-    \r
-    //cout << "TEST" << endl;\r
-    SetETAWindows( _StartForwardETA, _EndForwardETA,_StartBakwardETA,_EndBakwardETA);\r
-    SetHistPtRange( 0.15, 1.5, 270 );\r
-    SetHistMultRange( 0, 0, 100 );\r
-    SetForwardWindowPhi( 0, 2*TMath::Pi() );\r
-    SetBackwardWindowPhi( 0, 2*TMath::Pi() );\r
-\r
-    SetCorrespondanceWithAliROOTpid();\r
-    ZeroPidArrays();\r
-\r
-    \r
-\r
-}\r
-\r
-Bool_t AliLRCProcess::InitDataMembers()\r
-{\r
-    //Printf("INITDATAMEMBERS");\r
-    // This method is actualy creating output histogramms\r
-    // Thist method  is to be called in CreateOutputObjects method of AliAnalysisTask\r
-    //cout<<" # Init for "<<fShortDef<<" this="<<this<<"\n";\r
-    if( fIsOnline )\r
-    {\r
-        Printf("Can't init data members more then one time! \n");\r
-        return kFALSE;\r
-    }\r
-    fEventCount=0;\r
-    fOutList = new TList();\r
-    fOutList->SetOwner();  // IMPORTANT!\r
-\r
-    fOutList->SetName(fShortDef);\r
-\r
-    Double_t lowMultHor, hiMultHor;\r
-    Double_t lowMultVert, hiMultVert;\r
-\r
-    lowMultHor = fLowMultHor - 0.5;\r
-    hiMultHor = fHiMultHor + 0.5;\r
-\r
-    lowMultVert = fLowMultVert - 0.5;\r
-    hiMultVert = fHiMultVert + 0.5;\r
-\r
-\r
-    //TArray to accumulate data, with names hist\r
-    //26.01.2013: array with accumulated values\r
-    //fArrAccumulatedValues = new TClonesArray("Float_t", en_arr_labels_total );//TArrayF(en_arr_labels_total);\r
-    if ( fUseAccumulatingHist )\r
-    {\r
-        fArrAccumulatedValues = new TH1D( "fArrAccumulatedValues", "Accumulating hist with labeling", en_arr_labels_total,-0.5,en_arr_labels_total-0.5);\r
-        TString gArrayMemberNames[en_arr_labels_total];\r
-        gArrayMemberNames[ en_arr_labels_NN_Nevents  ] = "NN_Nevents"       ;\r
-        gArrayMemberNames[ en_arr_labels_NN_Nf       ] = "NN_Nf"            ;\r
-        gArrayMemberNames[ en_arr_labels_NN_Nb       ] = "NN_Nb"            ;\r
-        gArrayMemberNames[ en_arr_labels_NN_N2_f     ] = "NN_N2_f"          ;\r
-        gArrayMemberNames[ en_arr_labels_NN_Nf_Nb    ] = "NN_Nf_Nb"         ;\r
-        gArrayMemberNames[ en_arr_labels_NN_N2_b     ] = "NN_N2_b"          ;\r
-\r
-        gArrayMemberNames[ en_arr_labels_PtN_Nevents ] = "PtN_Nevents"      ;\r
-        gArrayMemberNames[ en_arr_labels_PtN_Nf      ] = "PtN_Nf"           ;\r
-        gArrayMemberNames[ en_arr_labels_PtN_PtB     ] = "PtN_PtB"          ;\r
-        gArrayMemberNames[ en_arr_labels_PtN_N2_f    ] = "PtN_N2_f"         ;\r
-        gArrayMemberNames[ en_arr_labels_PtN_Ptb_Nf  ] = "PtN_Ptb_Nf"       ;\r
-\r
-        gArrayMemberNames[ en_arr_labels_PtPt_Nevents] = "PtPt_Nevents"     ;\r
-        gArrayMemberNames[ en_arr_labels_PtPt_PtF    ] = "PtPt_PtF"         ;\r
-        gArrayMemberNames[ en_arr_labels_PtPt_PtB    ] = "PtPt_PtB"         ;\r
-        gArrayMemberNames[ en_arr_labels_PtPt_Pt2_f  ] = "PtPt_Pt2_f"       ;\r
-        gArrayMemberNames[ en_arr_labels_PtPt_Ptf_Ptb] = "PtPt_Ptf_Ptb"     ;\r
-\r
-        for( Int_t i = 1; i <= en_arr_labels_total; i++ )\r
-            fArrAccumulatedValues->GetXaxis()->SetBinLabel(i,gArrayMemberNames[i-1].Data());\r
-        //fOutList->Add(fArrAccumulatedValues);\r
-        fOutList->Add(fArrAccumulatedValues);\r
-    }\r
-\r
-\r
-\r
-    \r
-    // Window statistics histograms\r
-\r
-    // ########## Forward\r
-\r
-    fHistPtForward = new TH1D("fHistPtForward", "P_{T} distribution in Forward window", 100, 0.0, 5);\r
-    fHistPtForward->GetXaxis()->SetTitle("P_{T} (GeV/c)");\r
-    fHistPtForward->GetYaxis()->SetTitle("dN/dP_{T} (c/GeV)");\r
-    fHistPtForward->SetMarkerStyle(kFullCircle);\r
-\r
-\r
-    fHistEtaForward = new TH1D("fEtaForward", "#eta distribution in Forward window", 200, -2, 2);\r
-    fHistEtaForward->GetXaxis()->SetTitle("ETA");\r
-    fHistEtaForward->GetYaxis()->SetTitle("dN/ETA");\r
-    fHistEtaForward->SetMarkerStyle(kFullCircle);\r
-\r
-    \r
-    fHistNchForward = new TH1D("fHistNchForward", "N_{ch} distribution in Forward window", fMultBinsHor, lowMultHor, hiMultHor);\r
-    fHistNchForward->GetXaxis()->SetTitle("N_{ch}");\r
-    fHistNchForward->GetYaxis()->SetTitle("dN/dN_{ch}");\r
-    fHistNchForward->SetMarkerStyle(kFullCircle);\r
-\r
-    fHistNchForwardPtPt = new TH1D("fHistNchForwardPtPt", "N_{ch} distribution in Forward window for PtPt accept conditions", fMultBinsHor, lowMultHor, hiMultHor);\r
-    fHistNchForwardPtPt->GetXaxis()->SetTitle("N_{ch}");\r
-    fHistNchForwardPtPt->GetYaxis()->SetTitle("dN/dN_{ch}");\r
-    fHistNchForwardPtPt->SetMarkerStyle(kFullCircle);\r
-\r
-    fHistPhiForward = new TH1D("fPhiForward", "#phi distribution in Forward window", 144, 0, 2*TMath::Pi());\r
-    fHistPhiForward->GetXaxis()->SetTitle("Phi");\r
-    fHistPhiForward->GetYaxis()->SetTitle("dN/Phi");\r
-    fHistPhiForward->SetMarkerStyle(kFullCircle);\r
-\r
-    fHistTestPIDForward = new TH1D("fHistTestPIDForward","PID distribution in Forward window;PID;N",5,-0.5,4.5);\r
-    TString gBinParticleNames[5] = {/*"Other",*/"Electron","Muon","Pion","Kaon", "Proton"};\r
-    for(Int_t i = 1; i <= 5; i++)\r
-        fHistTestPIDForward->GetXaxis()->SetBinLabel(i,gBinParticleNames[i-1].Data());\r
-\r
-    //15/12/2012: charge hist\r
-    fHistTracksChargeForward = new TH1D("fHistTracksChargeForward","Accepted tracks charge;charge;Entries",3,-1.5,1.5);\r
-\r
-\r
-    // ### net charge vs pt study (July 2013)\r
-    const int kPtNetChargePtBins = 200;\r
-    const double kPtNetChargePtMin = 0.1;\r
-    const double kPtNetChargePtMax = 2.1;\r
-\r
-    //pt plus\r
-    fHistPtPlusForward = new TH1D("fHistPtPlusForward","p_{T} +;p_{T};dN/dpT", kPtNetChargePtBins,  kPtNetChargePtMin, kPtNetChargePtMax                                  );\r
-    fOutList->Add(fHistPtPlusForward);\r
-    //pt minus\r
-    fHistPtMinusForward = new TH1D("fHistPtMinusForward","p_{T} -;p_{T};dN/dpT", kPtNetChargePtBins,  kPtNetChargePtMin, kPtNetChargePtMax                                  );\r
-    fOutList->Add(fHistPtMinusForward);\r
-    //net charge vs pT\r
-    fHistNetChargeVsPtForward = new TH1D("fHistNetChargeVsPtForward","charge vs p_{T};p_{T};Q", kPtNetChargePtBins,  kPtNetChargePtMin, kPtNetChargePtMax                                  );\r
-    fOutList->Add(fHistNetChargeVsPtForward);\r
-\r
-\r
-    // ########## Backward\r
-\r
-    fHistPtBackward = new TH1D("fHistPtBakward", "P_{T} distribution in Backward window", 100, 0.0, 5);\r
-    fHistPtBackward->GetXaxis()->SetTitle("P_{T} (GeV/c)");\r
-    fHistPtBackward->GetYaxis()->SetTitle("dN/dP_{T} (c/GeV)");\r
-    fHistPtBackward->SetMarkerStyle(kFullCircle);\r
-\r
-\r
-    fHistEtaBackward = new TH1D("fEtaBakward", "#eta distribution in Backward window", 200, -2, 2);\r
-    fHistEtaBackward->GetXaxis()->SetTitle("ETA");\r
-    fHistEtaBackward->GetYaxis()->SetTitle("dN/ETA");\r
-    fHistEtaBackward->SetMarkerStyle(kFullCircle);\r
-\r
-\r
-    fHistNchBackward = new TH1D("fHistNchBakward", "N_{ch} distribution in Backward window", fMultBinsVert, lowMultVert, hiMultVert);\r
-    fHistNchBackward->GetXaxis()->SetTitle("N_{ch}");\r
-    fHistNchBackward->GetYaxis()->SetTitle("dN/dN_{ch}");\r
-    fHistNchBackward->SetMarkerStyle(kFullCircle);\r
-\r
-    fHistPhiBackward = new TH1D("fPhiBakward", "#phi distribution in Backward window", 144, 0, 2*TMath::Pi());\r
-    fHistPhiBackward->GetXaxis()->SetTitle("Phi");\r
-    fHistPhiBackward->GetYaxis()->SetTitle("dN/Phi");\r
-    fHistPhiBackward->SetMarkerStyle(kFullCircle);\r
-\r
-    fHistTestPIDBackward = new TH1D("fHistTestPIDBackward","PID distribution in Backward window;PID;N",5,-0.5,4.5);\r
-    for(Int_t i = 1; i <= 5; i++)\r
-        fHistTestPIDBackward->GetXaxis()->SetBinLabel(i,gBinParticleNames[i-1].Data());\r
-\r
-\r
-    //15/12/2012: charge hist\r
-    fHistTracksChargeBackward = new TH1D("fHistTracksChargeBackward","Accepted tracks charge;charge;Entries",3,-1.5,1.5);\r
-\r
-    // ### net charge vs pt study (July 2013)\r
-    //pt plus\r
-    fHistPtPlusBackward = new TH1D("fHistPtPlusBackward","p_{T} +;p_{T};dN/dpT", kPtNetChargePtBins,  kPtNetChargePtMin, kPtNetChargePtMax                                  );\r
-    fOutList->Add(fHistPtPlusBackward);\r
-    //pt minus\r
-    fHistPtMinusBackward = new TH1D("fHistPtMinusBackward","p_{T} -;p_{T};dN/dpT", kPtNetChargePtBins,  kPtNetChargePtMin, kPtNetChargePtMax                                  );\r
-    fOutList->Add(fHistPtMinusBackward);\r
-    //net charge vs pT\r
-    fHistNetChargeVsPtBackward = new TH1D("fHistNetChargeVsPtBackward","charge vs p_{T};p_{T};Q", kPtNetChargePtBins,  kPtNetChargePtMin, kPtNetChargePtMax                                  );\r
-    fOutList->Add(fHistNetChargeVsPtBackward);\r
-\r
-\r
-\r
-\r
-\r
-    //Overal statistics histograms\r
-\r
-    fHistPt = new TH1F("fHistPt", "P_{T} distribution", 100, 0.0, 5.0);\r
-    fHistPt->GetXaxis()->SetTitle("P_{T} (GeV/c)");\r
-    fHistPt->GetYaxis()->SetTitle("dN/dP_{T} (c/GeV)");\r
-    fHistPt->SetMarkerStyle(kFullCircle);\r
-\r
-\r
-    fHistEta = new TH1F("fHistEta", "#eta distribution", 200, -2, 2);\r
-    fHistEta->GetXaxis()->SetTitle("ETA");\r
-    fHistEta->GetYaxis()->SetTitle("dN/ETA");\r
-    fHistEta->SetMarkerStyle(kFullCircle);\r
-    \r
-    \r
-    \r
-    // -------- LRC histograms\r
-    //new cloud implementation\r
-    //const int lSparseDim = en_sparse_total;\r
-    //const int nSparseBins = 1000;\r
-\r
-\r
-    /* from AliROOT //deprecated!\r
-        enum EParticleType {\r
-            kElectron = 0,\r
-            kMuon = 1,\r
-            kPion = 2,\r
-            kKaon = 3,\r
-            kProton = 4,\r
-            kPhoton = 5,\r
-            kPi0 = 6,\r
-            kNeutron = 7,\r
-            kKaon0 = 8,\r
-            kEleCon = 9,\r
-            kDeuteron = 10,\r
-            kTriton = 11,\r
-            kHe3 = 12,\r
-            kAlpha = 13,\r
-            kUnknown = 14\r
-        };*/\r
-\r
-\r
-    if ( fUseSparse )\r
-    {\r
-\r
-        //correspondance of PID blocks\r
-        //it's a way to unlink THnSparse data dimenstion from enum\r
-        fHistSparsePIDblocksLabeling = new TH1D("fHistSparsePIDblocksLabeling","THnSparse PID blocks labeling", kSparsePIDtotal,-0.5,kSparsePIDtotal-0.5);\r
-        TString gEventCutBinPIDblocksNames[kSparsePIDtotal];    // = {"Total","No trigger","Centrality","No vertex","Bad vertex position","HighMult cut","LowMult cut","Analyzed"};\r
-        gEventCutBinPIDblocksNames[kSparsePIDany]               = "any";\r
-        gEventCutBinPIDblocksNames[kSparsePIDdefined]       = "defined";\r
-        gEventCutBinPIDblocksNames[kSparsePIDpion]      = "pion";\r
-        gEventCutBinPIDblocksNames[kSparsePIDkaon]      = "kaon";\r
-        gEventCutBinPIDblocksNames[kSparsePIDproton]    = "proton";\r
-\r
-\r
-        for(Int_t i = 1; i <= kSparsePIDtotal; i++)fHistSparsePIDblocksLabeling->GetXaxis()->SetBinLabel(i,gEventCutBinPIDblocksNames[i-1].Data());\r
-        //for(Int_t i = 0; i < nEnumBins; i++)fHistSparseDimensionLabeling->Fill( i );\r
-\r
-        //dimensions labelling\r
-\r
-        fHistSparseDimensionLabeling = new TH1D("fHistSparseDimensionLabeling","THnSparse labeling", kSparseTotal,-0.5,kSparseTotal-0.5);\r
-        TString gSparseDimensionsNames[kSparseTotal];    // = {"Total","No trigger","Centrality","No vertex","Bad vertex position","HighMult cut","LowMult cut","Analyzed"};\r
-        gSparseDimensionsNames[kSparseNf] = "N_f";\r
-        gSparseDimensionsNames[kSparseNb] = "N_b";\r
-        gSparseDimensionsNames[kSparsePtF] = "Pt_f";\r
-        gSparseDimensionsNames[kSparsePtB] = "Pt_b";\r
-        gSparseDimensionsNames[en_sparse_N2_f] = "N2_f";\r
-        gSparseDimensionsNames[en_sparse_Nf_Nb] = "Nf_Nb";\r
-        gSparseDimensionsNames[en_sparse_Ptb_Nf] = "Ptb_Nf";\r
-        gSparseDimensionsNames[en_sparse_Pt2_f] = "Pt2_f";\r
-        gSparseDimensionsNames[en_sparse_Ptf_Ptb] = "Ptf_Ptb";\r
-\r
-        for( Int_t i = 1; i <= kSparseTotal; i++ )\r
-            fHistSparseDimensionLabeling->GetXaxis()->SetBinLabel(i,gSparseDimensionsNames[i-1].Data());\r
-\r
-\r
-\r
-        Int_t* lSparseBins     = new Int_t[kSparseTotal*kSparsePIDtotal];\r
-        Double_t *lSparseXmin  = new Double_t[kSparseTotal*kSparsePIDtotal];\r
-        Double_t *lSparseXmax  = new Double_t[kSparseTotal*kSparsePIDtotal];\r
-        TString *lSparseAxisNames      = new TString[kSparseTotal*kSparsePIDtotal];\r
-\r
-        TString *lPIDNames     = new TString[kSparsePIDtotal];\r
-        lPIDNames[ kSparsePIDany      ] = Form( "any" );\r
-        lPIDNames[ kSparsePIDdefined  ] = Form( "defined" );\r
-        lPIDNames[ kSparsePIDpion     ] = Form( "pion" );\r
-        lPIDNames[ kSparsePIDkaon     ] = Form( "kaon" );\r
-        lPIDNames[ kSparsePIDproton   ] = Form( "proton" );\r
-\r
-\r
-\r
-        for ( Int_t d = 0; d < kSparsePIDtotal; ++d )\r
-        {\r
-            Int_t binShift = kSparseTotal*d;\r
-\r
-            lSparseAxisNames[kSparseNf + binShift] = Form( "axisNf_%s", lPIDNames[ d ].Data() );\r
-            lSparseAxisNames[kSparseNb + binShift] = Form( "axisNb_%s", lPIDNames[ d ].Data() );\r
-            lSparseAxisNames[kSparsePtF + binShift] = Form( "axisPtf_%s", lPIDNames[ d ].Data() );\r
-            lSparseAxisNames[kSparsePtB + binShift] = Form( "axisPtb_%s", lPIDNames[ d ].Data() );\r
-\r
-            lSparseAxisNames[en_sparse_N2_f + binShift]     = Form( "axisN2_%s", lPIDNames[ d ].Data() );\r
-            lSparseAxisNames[en_sparse_Nf_Nb + binShift]    = Form( "axisNf_Nb_%s", lPIDNames[ d ].Data() );\r
-            lSparseAxisNames[en_sparse_Ptb_Nf + binShift]   = Form( "axisPtb_Nf_%s", lPIDNames[ d ].Data() );\r
-            lSparseAxisNames[en_sparse_Pt2_f + binShift]    = Form( "axisPt2_f_%s", lPIDNames[ d ].Data() );\r
-            lSparseAxisNames[en_sparse_Ptf_Ptb + binShift]  = Form( "axisPtf_Ptb_%s", lPIDNames[ d ].Data() );\r
-\r
-\r
-            lSparseBins[kSparseNf + binShift ] = fMultBinsHor;\r
-            lSparseXmin[kSparseNf + binShift ] = lowMultHor;\r
-            lSparseXmax[kSparseNf + binShift ] = hiMultHor;\r
-            lSparseBins[kSparseNb + binShift ] = fMultBinsVert;\r
-            lSparseXmin[kSparseNb + binShift ] = lowMultVert;\r
-            lSparseXmax[kSparseNb + binShift ] = hiMultVert;\r
-            //}\r
-            //for (Int_t d = 2; d < lSparseDim; ++d) {\r
-            lSparseBins[kSparsePtF + binShift ] = fPtBins;\r
-            lSparseXmin[kSparsePtF + binShift ] = fLoPt;\r
-            lSparseXmax[kSparsePtF + binShift ] = fHiPt;\r
-            lSparseBins[kSparsePtB + binShift ] = fPtBins;\r
-            lSparseXmin[kSparsePtB + binShift ] = fLoPt;\r
-            lSparseXmax[kSparsePtB + binShift ] = fHiPt;\r
-\r
-\r
-\r
-\r
-\r
-            //}\r
-            /*\r
-                lSparseBins[en_sparse_Et_f + binShift ] = 500;\r
-            lSparseXmin[en_sparse_Et_f + binShift ] = 0.2;\r
-            lSparseXmax[en_sparse_Et_f + binShift ] = 2.7;\r
-            lSparseBins[en_sparse_Et_b + binShift ] = 500;\r
-            lSparseXmin[en_sparse_Et_b + binShift ] = 0.2;\r
-            lSparseXmax[en_sparse_Et_b + binShift ] = 2.7;\r
-*/\r
-\r
-            lSparseBins[en_sparse_N2_f + binShift ] = (fMultBinsHor-1)*(fMultBinsHor-1)+1;\r
-            lSparseXmin[en_sparse_N2_f + binShift ] = fLowMultHor*fLowMultHor-0.5; // ! use global mult without shift\r
-            lSparseXmax[en_sparse_N2_f + binShift ] = fHiMultHor*fHiMultHor+0.5;\r
-            //lSparseBins[en_sparse_N_b] = fMultBinsVert;\r
-            //lSparseXmin[en_sparse_N_b] = lowMultVert;\r
-            //lSparseXmax[en_sparse_N_b] = hiMultVert;\r
-            lSparseBins[en_sparse_Nf_Nb + binShift ] = (fMultBinsHor-1)*(fMultBinsVert-1)+1;\r
-            lSparseXmin[en_sparse_Nf_Nb + binShift ] = fLowMultHor*fLowMultVert-0.5;\r
-            lSparseXmax[en_sparse_Nf_Nb + binShift ] = fHiMultHor*fHiMultVert+0.5;\r
-\r
-\r
-\r
-            lSparseBins[en_sparse_Ptb_Nf + binShift ] = /*(fMultBinsHor-1)**/(10*fPtBins);//+1;\r
-            lSparseXmin[en_sparse_Ptb_Nf + binShift ] = fLowMultHor*fLoPt-0.5;\r
-            lSparseXmax[en_sparse_Ptb_Nf + binShift ] = fHiMultHor*fHiPt+0.5;\r
-\r
-            lSparseBins[en_sparse_Pt2_f + binShift ] = (10*fPtBins);//*(fPtBins);//+1;\r
-            lSparseXmin[en_sparse_Pt2_f + binShift ] = fLoPt*fLoPt;\r
-            lSparseXmax[en_sparse_Pt2_f + binShift ] = fHiPt*fHiPt;\r
-\r
-            lSparseBins[en_sparse_Ptf_Ptb + binShift ] = (10*fPtBins);//*(fPtBins)+1;\r
-            lSparseXmin[en_sparse_Ptf_Ptb + binShift ] = fLoPt*fLoPt;\r
-            lSparseXmax[en_sparse_Ptf_Ptb + binShift ] = fHiPt*fHiPt;\r
-\r
-            /*\r
-                lSparseBins[en_sparse_Nf_plus + binShift ] = fMultBinsHor;\r
-            lSparseXmin[en_sparse_Nf_plus + binShift ] = lowMultHor;\r
-            lSparseXmax[en_sparse_Nf_plus + binShift ] = hiMultHor;\r
-                lSparseBins[en_sparse_Nf_minus + binShift ] = fMultBinsHor;\r
-            lSparseXmin[en_sparse_Nf_minus + binShift ] = lowMultHor;\r
-            lSparseXmax[en_sparse_Nf_minus + binShift ] = hiMultHor;\r
-\r
-                lSparseBins[en_sparse_Nb_plus + binShift ] = fMultBinsVert;\r
-            lSparseXmin[en_sparse_Nb_plus + binShift ] = lowMultVert;\r
-            lSparseXmax[en_sparse_Nb_plus + binShift ] = hiMultVert;\r
-                lSparseBins[en_sparse_Nb_minus + binShift ] = fMultBinsVert;\r
-            lSparseXmin[en_sparse_Nb_minus + binShift ] = lowMultVert;\r
-            lSparseXmax[en_sparse_Nb_minus + binShift ] = hiMultVert;\r
-\r
-                lSparseBins[en_sparse_Nf_plus_Nb_minus + binShift ] = (fMultBinsHor-1)*(fMultBinsVert-1)+1;\r
-            lSparseXmin[en_sparse_Nf_plus_Nb_minus + binShift ] = fLowMultHor*fLowMultVert-0.5;\r
-            lSparseXmax[en_sparse_Nf_plus_Nb_minus + binShift ] = fHiMultHor*fHiMultVert+0.5;\r
-\r
-                lSparseBins[en_sparse_Nb_plus_Nf_minus + binShift ] = (fMultBinsHor-1)*(fMultBinsVert-1);\r
-            lSparseXmin[en_sparse_Nb_plus_Nf_minus + binShift ] = fLowMultHor*fLowMultVert-0.5;\r
-            lSparseXmax[en_sparse_Nb_plus_Nf_minus + binShift ] = fHiMultHor*fHiMultVert+0.5;\r
-        */\r
-        }\r
-\r
-        fHistClouds = new THnSparseD("cloudLRC", "cloudLRC", kSparseTotal*kSparsePIDtotal, lSparseBins, lSparseXmin, lSparseXmax);\r
-        //end of cloud implementation\r
-\r
-        //set axis names\r
-        TAxis *lSparseAxis = 0x0;\r
-        for ( Int_t d = 0; d < kSparseTotal*kSparsePIDtotal; ++d )\r
-        {\r
-            lSparseAxis = fHistClouds->GetAxis( d );\r
-            lSparseAxis->SetNameTitle( lSparseAxisNames[d], lSparseAxisNames[d] );\r
-        }\r
-\r
-\r
-        delete [] lSparseBins;\r
-        delete [] lSparseXmin;\r
-        delete [] lSparseXmax;\r
-        delete [] lSparseAxisNames;\r
-\r
-\r
-        fOutList->Add(fHistSparseDimensionLabeling);\r
-        fOutList->Add(fHistSparsePIDblocksLabeling);\r
-\r
-        //    bool useSparse = false;\r
-\r
-        // !!!!!! temp comment!\r
-        fOutList->Add(fHistClouds);\r
-    }\r
-\r
-\r
-    fHistNN = new TH2D("NN","NN",fMultBinsHor, lowMultHor, hiMultHor,fMultBinsVert, lowMultVert, hiMultVert );\r
-    fHistPtN = new TH2D("PtN","PtN",fMultBinsHor, lowMultHor, hiMultHor,fPtBins/* /fPtHistXaxisRebinFactor*/,fLoPt,fHiPt);\r
-    fHistPtPt = new TH2D("PtPt","PtPt",fPtBins/fPtHistXaxisRebinFactor,fLoPt,fHiPt,fPtBins,fLoPt,fHiPt);\r
-    fProfNberr = new TProfile("nber","nber",fMultBinsHor, lowMultHor, hiMultHor);\r
-    fProfNberrPtPt = new TProfile("nberPtPt","nberPtPt",fPtBins/fPtHistXaxisRebinFactor,fLoPt,fHiPt);\r
-    fProfdPtB = new TProfile("dPtB","Overal multievent Pt_Backward (first bin) Pt_Backward^2 (sec. bin) ",16,0.5,16.5);\r
-    fProfTestLRC = new TProfile("TestLRC","Test LRC calculaion via TProfile",fMultBinsHor, lowMultHor, hiMultHor);\r
-\r
-    fHistNfCentrality = new TH2D("NfCentrality","NfCentrality",fMultBinsHor, lowMultHor, hiMultHor,101,-1.01,100.01);\r
-    fHistDifferenceNf = new TH2D("fHistDifferenceNf","Hist nF-nB;nF;nF-nB",fMultBinsHor, lowMultHor, hiMultHor,fMultBinsHor,-hiMultHor,hiMultHor);\r
-    fHistDifferenceNb = new TH2D("fHistDifferenceNb","Hist nB-nF;nB;nB-nF",fMultBinsVert, lowMultVert, hiMultVert,fMultBinsVert,-hiMultVert,hiMultVert);\r
-\r
-    // ---------- Adding data members to output list\r
-\r
-    // Adding overal statistics\r
-\r
-    //commented: to save memory\r
-    //fOutList->Add(fHistPt);\r
-    //fOutList->Add(fHistEta);\r
-\r
-    //Adding LRC hists\r
-\r
-    \r
-    if (1)\r
-    {\r
-        fOutList->Add(fHistNN);\r
-        fOutList->Add(fHistPtN);\r
-        fOutList->Add(fHistPtPt);\r
-    }\r
-    fOutList->Add(fProfNberr);\r
-    fOutList->Add(fProfNberrPtPt);\r
-    fOutList->Add(fProfdPtB);\r
-    fOutList->Add(fProfTestLRC);\r
-\r
-\r
-    //Adding window statistics\r
-    \r
-\r
-\r
-    fOutList->Add(fHistNchForward);\r
-    fOutList->Add(fHistNchBackward);\r
-    fOutList->Add(fHistNchForwardPtPt);\r
-\r
-    fOutList->Add(fHistPtForward);\r
-    fOutList->Add(fHistPtBackward);\r
-\r
-    fOutList->Add(fHistEtaForward);\r
-    fOutList->Add(fHistEtaBackward);\r
-\r
-    fOutList->Add(fHistPhiForward);\r
-    fOutList->Add(fHistPhiBackward);\r
-\r
-    fOutList->Add(fHistTracksChargeForward);\r
-    fOutList->Add(fHistTracksChargeBackward);\r
-\r
-    fOutList->Add(fHistTestPIDForward);\r
-    fOutList->Add(fHistTestPIDBackward);\r
-\r
-    //    fOutList->Add(fHistNfCentrality);\r
-    \r
-    \r
-    //fOutList->Add(fHistDifferenceNf);\r
-    //fOutList->Add(fHistDifferenceNb);\r
-\r
-    // Adding status to dPtB\r
-\r
-    fProfdPtB->Fill(3 , fStartForwardETA);\r
-    fProfdPtB->Fill(4 , fEndForwardETA);\r
-    fProfdPtB->Fill(5 , fStartBackwardETA);\r
-    fProfdPtB->Fill(6 , fEndBackwardETA);\r
-    fProfdPtB->Fill(7 , fStartForwardPhi);\r
-    fProfdPtB->Fill(8 , fEndForwardPhi);\r
-    fProfdPtB->Fill(9 , fStartBackwardPhi);\r
-    fProfdPtB->Fill(10 , fEndBackwardPhi);\r
-\r
-\r
-\r
-\r
-    fIsOnline = kTRUE;\r
-    return kTRUE;\r
-}\r
-AliLRCProcess::~AliLRCProcess()\r
-{\r
-    //Destructor\r
-\r
-}\r
-\r
-// ---------------------------------------  Setters ------------------\r
-void AliLRCProcess::SetShortDef()\r
-{\r
-    // Creating task and output container name\r
-    char str[200];\r
-    snprintf(str,200, "TaskLRCw%3.1fto%3.1fvs%3.1fto%3.1f",fStartForwardETA,fEndForwardETA,fStartBackwardETA,fEndBackwardETA);\r
-    /*if ( fWhichParticleToProcess != kLRCany\r
-        && (int)fWhichParticleToProcess > 0 && (int)fWhichParticleToProcess <= 6 ) //to avoid program falling\r
-    {\r
-        char str2[80];\r
-        TString gBinParticleNames[6] = {"Other","Electron","Muon","Pion","Kaon", "Proton"};\r
-        snprintf(str2,80, "%s_%s",str,gBinParticleNames[(int)fWhichParticleToProcess].Data());\r
-        fShortDef= str2;\r
-    }\r
-    else*/\r
-    fShortDef= str;\r
-\r
-}\r
-\r
-void AliLRCProcess::SetForwardWindow(Double_t StartETA,Double_t EndETA)\r
-{\r
-    //setter for the forward eta window\r
-    fStartForwardETA=StartETA;\r
-    fEndForwardETA=EndETA;\r
-    SetShortDef();\r
-}\r
-void AliLRCProcess::SetBackwardWindow(Double_t StartETA,Double_t EndETA)\r
-{\r
-    //setter for the backward eta window\r
-    fStartBackwardETA=StartETA;\r
-    fEndBackwardETA=EndETA;\r
-    SetShortDef();\r
-}\r
-void AliLRCProcess::SetETAWindows(Double_t _StartForwardETA,Double_t _EndForwardETA,Double_t _StartBakwardETA,Double_t _EndBakwardETA)\r
-{\r
-    //setter for the eta windows\r
-    fStartForwardETA=_StartForwardETA;\r
-    fEndForwardETA=_EndForwardETA;\r
-    fStartBackwardETA=_StartBakwardETA;\r
-    fEndBackwardETA=_EndBakwardETA;\r
-    SetShortDef();\r
-}\r
-void AliLRCProcess::GetETAWindows(Double_t &_StartForwardETA,Double_t &_EndForwardETA,Double_t &_StartBakwardETA,Double_t &_EndBakwardETA)\r
-{\r
-    //getter for the eta windows\r
-    _StartForwardETA    = fStartForwardETA;\r
-    _EndForwardETA      = fEndForwardETA;\r
-    _StartBakwardETA    = fStartBackwardETA;\r
-    _EndBakwardETA      = fEndBackwardETA;\r
-}\r
-\r
-void AliLRCProcess::GetPhiWindows(Double_t &_StartForwardPhi,Double_t &_EndForwardPhi,Double_t &_StartBakwardPhi,Double_t &_EndBakwardPhi)\r
-{\r
-    //getter for the eta windows\r
-    _StartForwardPhi    = fStartForwardPhi;\r
-    _EndForwardPhi      = fEndForwardPhi;\r
-    _StartBakwardPhi    = fStartBackwardPhi;\r
-    _EndBakwardPhi      = fEndBackwardPhi;\r
-}\r
-\r
-void AliLRCProcess::SetParticleType( char* strForwardOrBackward, char* strPid )\r
-{\r
-    //cout << "hm! strForwardOrBackward = " << strForwardOrBackward\r
-    // << ", strPid = " << strPid << endl;\r
-    //cout << "before ae! fPidForward = " << fPidForward << ", fPidBackward = " << fPidBackward << endl;\r
-\r
-    int lPid = -1;//kLRCany;\r
-    if ( !strcmp( strPid, "pion") )\r
-        lPid = 2;//kLRCpion;\r
-    else if ( !strcmp( strPid, "kaon") )\r
-        lPid = 3;//kLRCkaon;\r
-    else if ( !strcmp( strPid, "proton") )\r
-        lPid = 4;//kLRCproton;\r
-    else if ( !strcmp( strPid, "knownpid") )\r
-        lPid = 100;//will will histos if we KNOW PID! (not important which)\r
-\r
-    //set pid for window\r
-    if ( !strcmp( strForwardOrBackward, "fwd") )\r
-        fPidForward = lPid;\r
-    else if ( !strcmp( strForwardOrBackward, "bkwd") )\r
-        fPidBackward = lPid;\r
-    //cout << "ae! lPid = " << lPid << ", fPidForward = " << fPidForward << ", fPidBackward = " << fPidBackward << endl;\r
-    //int aaaa;\r
-    //cin>> aaaa;\r
-}\r
-\r
-\r
-void AliLRCProcess::SetHistPtRangeForwardWindowRebinFactor( Int_t ptHistXaxisRebinFactor )\r
-{\r
-    // Rebining for Pt histograms X-axis\r
-    if(fIsOnline)\r
-    {\r
-        Printf("Can't change histos paramiters after InitDataMembers() was called! \n");\r
-        return ;\r
-    }\r
-    fPtHistXaxisRebinFactor = ptHistXaxisRebinFactor;\r
-}\r
-\r
-void AliLRCProcess::SetHistPtRange(Double_t LoPt,Double_t HiPt,Int_t PtBins)\r
-{\r
-    // Sets Pt range and number of bins for Pt axis of histos\r
-    if(fIsOnline)\r
-    {\r
-        Printf("Can't change histos paramiters after InitDataMembers() was called! \n");\r
-        return ;\r
-    }\r
-    // Setter for Pt range and N bins in histos\r
-    fLoPt=LoPt;\r
-    fHiPt=HiPt;\r
-    fPtBins=PtBins;\r
-}\r
-void AliLRCProcess::SetHistMultRange( Int_t whichWindow, Int_t LoMult,Int_t HiMult,Int_t MultBins)\r
-{\r
-    // Setter for multiplicity range and N bins in histos\r
-    if ( whichWindow == 0 ) //set range for both windows\r
-    {\r
-        SetHistMultRangeHor( LoMult, HiMult, MultBins) ;\r
-        SetHistMultRangeVert( LoMult, HiMult, MultBins) ;\r
-    }\r
-    else if ( whichWindow == 1 ) //for fwd\r
-        SetHistMultRangeHor( LoMult, HiMult, MultBins) ;\r
-    else if ( whichWindow == 2 ) //for bwd\r
-        SetHistMultRangeVert( LoMult, HiMult, MultBins) ;\r
-    /*\r
-\r
-    if(fIsOnline)\r
-    {\r
-        Printf("Can't change histos paramiters after InitDataMembers() was called! \n");\r
-        return ;\r
-    }\r
-    fLoMult=LoMult;\r
-    fHiMult=HiMult;\r
-    if(!MultBins)\r
-    {\r
-    fMultBins=fHiMult-fLoMult+1;\r
-    }else\r
-    {\r
-    fMultBins=MultBins;\r
-    }*/\r
-}\r
-\r
-void AliLRCProcess::SetHistMultRangeHor(Int_t LoMult,Int_t HiMult,Int_t MultBins)\r
-{\r
-    // Setter for multiplicity range and N bins in histos\r
-    if(fIsOnline)\r
-    {\r
-        Printf("Can't change histos paramiters after InitDataMembers() was called! \n");\r
-        return ;\r
-    }\r
-    fLowMultHor        = LoMult;\r
-    fHiMultHor         = HiMult;\r
-    if(!MultBins)\r
-    {\r
-        fMultBinsHor = fHiMultHor-fLowMultHor+1;\r
-    }else\r
-    {\r
-        fMultBinsHor = MultBins;\r
-    }\r
-}\r
-\r
-void AliLRCProcess::SetHistMultRangeVert(Int_t LoMult,Int_t HiMult,Int_t MultBins)\r
-{\r
-    // Setter for multiplicity range and N bins in histos\r
-    if(fIsOnline)\r
-    {\r
-        Printf("Can't change histos parameters after InitDataMembers() was called! \n");\r
-        return ;\r
-    }\r
-    fLowMultVert       = LoMult;\r
-    fHiMultVert        = HiMult;\r
-    if(!MultBins)\r
-    {\r
-        fMultBinsVert = fHiMultVert-fLowMultVert+1;\r
-    }else\r
-    {\r
-        fMultBinsVert = MultBins;\r
-    }\r
-}\r
-\r
-void AliLRCProcess::SetOutputSlotNumber(Int_t SlotNumber)\r
-{\r
-    //Sets number of output slot for LRCProcessor\r
-    fOutputSlot=SlotNumber;\r
-}\r
-\r
-//________________________________________________________________________\r
-\r
-\r
-\r
-TList*   AliLRCProcess::CreateOutput() const\r
-{\r
-    // Creates a link to output data TList\r
-    return fOutList;\r
-}\r
-\r
-TString  AliLRCProcess::GetShortDef() const\r
-{\r
-    return fShortDef;\r
-}\r
-\r
-Int_t AliLRCProcess::GetOutputSlotNumber() const\r
-{\r
-    // Returns number of output slot for LRCProcessor\r
-    return fOutputSlot;\r
-}\r
-\r
-void AliLRCProcess::StartEvent()\r
-{\r
-    // Open new Event for track by track event import\r
-    if(fIsEventOpend)                     // Check if trying to open event more than once !\r
-    {\r
-        Printf("Event is already opened! Auto finishing ! \n");\r
-//        cout<<fShortDef<<": event count = "<<fEventCount<<" ";\r
-        Printf("NchF = %i,NchB = %i \n",fNchFw,fNchBw);\r
-\r
-        FinishEvent();\r
-    }\r
-    if(!fIsOnline)                        // Autocreating histos if InitDataMembers was not called by hand\r
-    {\r
-        Printf("InitDataMembers was not called by hand ! Autocreating histos...\n");\r
-        InitDataMembers();\r
-    }\r
-\r
-    fNchFw=0;\r
-    fSumPtFw=0;\r
-    fNchBw=0;\r
-    fSumPtBw=0;\r
-    fSumPtBw2=0;\r
-    \r
-    fNchFwPlus = 0;\r
-    fNchBwPlus = 0;\r
-    fNchFwMinus = 0;\r
-    fNchBwMinus = 0;\r
-    \r
-    ZeroPidArrays();\r
-        \r
-    //fNchFwPtPt = 0;\r
-\r
-    fIsEventOpend=kTRUE;\r
-}\r
-void AliLRCProcess::AddTrackForward(Double_t Pt, Double_t Eta ,Double_t Phi, Short_t Charge, Int_t particleType  )\r
-{\r
-    // Imports track to the event directly to Forward window\r
-    if(!fIsEventOpend)\r
-    {Printf("Event is not opened!\n");\r
-        return;}\r
-\r
-    //Bool_t lAddDecision = kFALSE;\r
-\r
-    //if ( fPidForward == 100 ) //add particle if we know pid (i.e. particleType != -1)\r
-    //{\r
-    //if ( particleType != -1 )\r
-    //{\r
-    // lAddDecision = kTRUE;\r
-    //cout << "fill fwd with pid " << particleType << endl;\r
-    //}\r
-    //}\r
-    //else if ( fPidForward != -1 ) //if we specify pid for this window - just check it\r
-    //{\r
-    //if ( particleType == fPidForward )\r
-    //{\r
-    //lAddDecision = kTRUE;\r
-    //cout << "fill fwd with pid " << particleType << endl;\r
-    //}\r
-    //}\r
-    //else\r
-    //lAddDecision = kTRUE;\r
-\r
-    //if ( !lAddDecision )\r
-    //return;\r
-\r
-    fHistTestPIDForward->Fill( particleType );\r
-\r
-    fNchFw++;\r
-    Charge > 0 ? fNchFwPlus++ : fNchFwMinus++;\r
-    fSumPtFw+=Pt;\r
-    fHistPtForward->Fill(Pt);\r
-    fHistEtaForward->Fill(Eta);\r
-    fHistPhiForward->Fill(Phi);\r
-\r
-    //added 15.12.12\r
-    fHistTracksChargeForward->Fill(Charge);\r
-    \r
-    //added 23.03\r
-    for ( int pid = 0; pid < kSparsePIDtotal; pid++ )\r
-    {\r
-        if (   pid == kSparsePIDany //write ALL pid types\r
-               ||\r
-               ( pid == kSparsePIDdefined && particleType != -1 ) //write defined particles\r
-               ||\r
-               ( fCorrespondanceWithAliROOTpid[pid] == particleType ) //write not defined particles\r
-               )\r
-        {\r
-            fNchFwPID[pid]++;\r
-            Charge > 0 ? fNchFwPlusPID[pid]++ : fNchFwMinusPID[pid]++;\r
-            fSumPtFwPID[pid] += Pt;\r
-            if ( pid != kSparsePIDany )\r
-            {\r
-                Double_t lMass = 0;//AliPID::ParticleMass( particleType );\r
-                fSumEtFwPID[pid] += sqrt( Pt*Pt + lMass*lMass ) ;\r
-            }\r
-        }\r
-    }\r
-\r
-    //netcharge part (July 2013)\r
-    fHistNetChargeVsPtForward->Fill( Pt, Charge );\r
-    if ( Charge > 0 )\r
-        fHistPtPlusForward->Fill( Pt );\r
-    else if ( Charge < 0 )\r
-        fHistPtMinusForward->Fill( Pt );\r
-\r
-\r
-}\r
-void AliLRCProcess::AddTrackBackward(Double_t Pt, Double_t Eta ,Double_t Phi, Short_t Charge, Int_t particleType  )\r
-{\r
-    // Imports track to the event directly to Backward window\r
-    if(!fIsEventOpend)\r
-    {Printf("Event is not opened!\n");\r
-        return;}\r
-\r
-    /*Bool_t lAddDecision = kFALSE;\r
-\r
-    if ( fPidBackward == 100 ) //add particle if we know pid (i.e. particleType != -1)\r
-    {\r
-        if ( particleType != -1 )\r
-        {\r
-            lAddDecision = kTRUE;\r
-            //cout << "fill fwd with pid " << particleType << endl;\r
-        }\r
-    }\r
-    else if ( fPidBackward != -1 ) //if we specify pid for this window - just check it\r
-    {\r
-        if ( particleType == fPidBackward )\r
-        {\r
-            lAddDecision = kTRUE;\r
-            //cout << "fill fwd with pid " << particleType << endl;\r
-        }\r
-    }\r
-    else\r
-        lAddDecision = kTRUE;\r
-\r
-    if ( !lAddDecision )\r
-        return;\r
-        */\r
-    fHistTestPIDBackward->Fill( particleType );\r
-\r
-    fNchBw++;\r
-    Charge > 0 ? fNchBwPlus++ : fNchBwMinus++;\r
-    fSumPtBw += Pt;\r
-    fSumPtBw2 += Pt*Pt;\r
-    fProfdPtB->Fill( 1, Pt );\r
-    fProfdPtB->Fill( 2, Pt*Pt );\r
-    fHistPtBackward->Fill( Pt );\r
-    fHistEtaBackward->Fill( Eta );\r
-    fHistPhiBackward->Fill( Phi );\r
-\r
-    //added 15.12.12\r
-    fHistTracksChargeBackward->Fill(Charge);\r
-\r
-    //added 23.03\r
-    for ( int pid = 0; pid < kSparsePIDtotal; pid++ )\r
-    {\r
-        if (   pid == kSparsePIDany //write ALL pid types\r
-               ||\r
-               ( pid == kSparsePIDdefined && particleType != -1 ) //write defined particles\r
-               ||\r
-               ( fCorrespondanceWithAliROOTpid[pid] == particleType )\r
-               )\r
-        {\r
-            fNchBwPID[pid]++;\r
-            Charge > 0 ? fNchBwPlusPID[pid]++ : fNchBwMinusPID[pid]++;\r
-            fSumPtBwPID[pid] += Pt;\r
-            if ( pid != kSparsePIDany )\r
-            {\r
-                Double_t lMass = 0;//AliPID::ParticleMass( particleType );\r
-                fSumEtBwPID[pid] += sqrt( Pt*Pt + lMass*lMass ) ;\r
-            }\r
-            \r
-        }\r
-    }\r
-\r
-    //netcharge part (July 2013)\r
-    fHistNetChargeVsPtBackward->Fill( Pt, Charge );\r
-    if ( Charge > 0 )\r
-        fHistPtPlusBackward->Fill( Pt );\r
-    else if ( Charge < 0 )\r
-        fHistPtMinusBackward->Fill( Pt );\r
-\r
-}\r
-\r
-\r
-\r
-void AliLRCProcess::AddTrackPtEta(Double_t Pt, Double_t Eta ,Double_t Phi, Short_t Charge, Int_t particleType  )\r
-{\r
-    //cout << Pt << endl;\r
-\r
-\r
-    //if particle type is different - ignore the track\r
-    //if ( fWhichParticleToFill != -1 && ParticleType != fWhichParticleToFill )\r
-    // return;\r
-    //Track by track event import :  Imports track to the event\r
-\r
-    //cout << "fWhichParticleToProcess = " << fWhichParticleToProcess\r
-    // << ", particleType = " << particleType << endl;\r
-    if(!fIsEventOpend)\r
-    {Printf("Event is not opened!\n");\r
-        return;}\r
-\r
-    //  Global track data\r
-    fHistPt->Fill(Pt);\r
-    fHistEta->Fill(Eta);\r
-\r
-    //Bool_t lAddForwardDecision = kFALSE;\r
-    //Bool_t lAddBackwardDecision = kFALSE;\r
-\r
-    //Forward window\r
-    if( ( fStartForwardETA < Eta ) && ( Eta < fEndForwardETA ) )\r
-        if( IsPhiInRange( Phi, fStartForwardPhi, fEndForwardPhi) )//( fStartForwardPhi < Phi ) && ( Phi < fEndForwardPhi ) )\r
-        {\r
-            AddTrackForward( Pt, Eta, Phi, Charge, particleType );\r
-            //if ( fPidFillCondition == kLRCpidForForwardOnly\r
-            // || fPidFillCondition == kLRCpidForBoth )\r
-            //if ( fPidForward != -1 )//kLRCany )\r
-            //{\r
-            // if ( particleType == fPidForward )//kLRCpion )//particleType )\r
-            // {\r
-            //         lAddForwardDecision = kTRUE;//AddTrackForward( Pt, Eta, Phi );\r
-            //cout << "fill fwd with pid " << particleType << endl;\r
-            // }\r
-            //}\r
-            //else\r
-            // lAddForwardDecision = kTRUE;//AddTrackForward( Pt, Eta, Phi );\r
-        }\r
-    //if ( lAddForwardDecision )\r
-    //{\r
-    // AddTrackForward( Pt, Eta, Phi, particleType );\r
-    // fHistTestPIDForward->Fill( particleType );\r
-    //}\r
-\r
-    //Backward window\r
-    if( ( fStartBackwardETA < Eta ) && ( Eta < fEndBackwardETA ) )\r
-        if (\r
-                (\r
-                    IsPhiInRange( Phi, fStartBackwardPhi, fEndBackwardPhi)  //( fStartBackwardPhi < Phi ) && ( Phi < fEndBackwardPhi )\r
-                    )\r
-                ||\r
-                (\r
-                    fDoubleSidedBackwardPhiWindow //if this option is true\r
-                    && IsPhiInRange( Phi, fStartBackwardPhi + TMath::Pi(), fEndBackwardPhi + TMath::Pi() )  //\r
-                    //&& ( fStartBackwardPhi + TMath::Pi() < Phi )\r
-                    //&& ( Phi < fEndBackwardPhi + TMath::Pi() )\r
-                    )\r
-                )\r
-        {\r
-            AddTrackBackward( Pt, Eta, Phi, Charge, particleType );\r
-            //if ( fPidFillCondition == kLRCpidForBackwardOnly\r
-            // || fPidFillCondition == kLRCpidForBoth )\r
-            //if ( fPidBackward != -1 )//kLRCany )\r
-            //{\r
-            // if ( particleType == fPidBackward )//kLRCpion )//particleType )\r
-            // {\r
-            //         lAddBackwardDecision = kTRUE;//AddTrackBackward( Pt, Eta, Phi );\r
-            //cout << "fill bkwd with pid " << particleType << endl;\r
-            // }\r
-\r
-            //}\r
-            //else\r
-            // lAddBackwardDecision = kTRUE;//AddTrackBackward( Pt, Eta, Phi );\r
-        }\r
-    //if ( lAddBackwardDecision )\r
-    //{\r
-    // AddTrackBackward( Pt, Eta, Phi, particleType );\r
-    // fHistTestPIDBackward->Fill( particleType );\r
-    //}\r
-\r
-}\r
-\r
-\r
-\r
-void AliLRCProcess::AddTrackPtEtaMixing( Int_t winFB, Double_t Pt, Double_t Eta ,Double_t Phi, Short_t Charge, Int_t particleType  )\r
-{\r
-    // put track in F or B window using varible winFB\r
-    if(!fIsEventOpend)\r
-    {\r
-        Printf("Event is not opened!\n");\r
-        return;\r
-    }\r
-\r
-    //  Global track data\r
-    fHistPt->Fill(Pt);\r
-    fHistEta->Fill(Eta);\r
-\r
-\r
-    //Forward window\r
-    if( winFB == 0\r
-            && ( fStartForwardETA < Eta ) && ( Eta < fEndForwardETA ) )\r
-        if( IsPhiInRange( Phi, fStartForwardPhi, fEndForwardPhi) ) // (fStartForwardPhi < Phi ) && ( Phi < fEndForwardPhi ) )\r
-        {\r
-            AddTrackForward( Pt, Eta, Phi, Charge, particleType );\r
-        }\r
-\r
-    //Backward window\r
-    if( winFB == 1\r
-            && ( fStartBackwardETA < Eta ) && ( Eta < fEndBackwardETA ) )\r
-        if (\r
-                (\r
-                    IsPhiInRange( Phi, fStartBackwardPhi, fEndBackwardPhi)  //( fStartBackwardPhi < Phi ) && ( Phi < fEndBackwardPhi )\r
-                    )\r
-                ||\r
-                (\r
-                    fDoubleSidedBackwardPhiWindow //if this option is true\r
-                    && IsPhiInRange( Phi, fStartBackwardPhi + TMath::Pi(), fEndBackwardPhi + TMath::Pi() )\r
-                    //&& ( fStartBackwardPhi + TMath::Pi() < Phi )\r
-                    //&& ( Phi < fEndBackwardPhi + TMath::Pi() )\r
-                    )\r
-                )\r
-        {\r
-            AddTrackBackward( Pt, Eta, Phi, Charge, particleType );\r
-        }\r
-\r
-\r
-}\r
-\r
-void AliLRCProcess::FinishEvent(Bool_t kDontCount)\r
-{\r
-    // Track by track event import : Close opened event and fill event summary histos\r
-\r
-    if(!fIsEventOpend)\r
-    {\r
-        Printf("Event is not opened!\n");\r
-        return;\r
-    }\r
-    if ( kDontCount ) //don't count this event! just ignore it\r
-    {\r
-        fIsEventOpend = kFALSE;\r
-        return;\r
-    }\r
-    //fHistSparseDimensionLabeling->Fill(1);\r
-    //Filling even-total data\r
-    //cout << "filling" << endl;\r
-    /*Double_t lCloudData[en_sparse_total*en_sparse_PID_total];\r
-    lCloudData[en_sparse_N_f] = fNchFw;     //write Nf\r
-    lCloudData[en_sparse_N_b] = fNchBw;     //write Nb\r
-    lCloudData[en_sparse_N2_f] = fNchFw*fNchFw;     //write Nf^2\r
-    lCloudData[en_sparse_Nf_Nb] = fNchFw*fNchBw;     //write Nb\r
-    \r
-    lCloudData[en_sparse_Pt_f] = 0; //fill bin 0, if don't have appropriate PtSum\r
-    lCloudData[en_sparse_Pt_b] = 0; //fill bin 0, if don't have appropriate PtSum\r
-\r
-    lCloudData[en_sparse_Nf_plus] = fNchFwPlus;\r
-    lCloudData[en_sparse_Nf_minus] = fNchFwMinus;\r
-    lCloudData[en_sparse_Nb_plus] = fNchBwPlus;\r
-    lCloudData[en_sparse_Nb_minus] = fNchBwMinus;\r
-    lCloudData[en_sparse_Nf_plus_Nb_minus] = fNchFwPlus * fNchBwMinus;\r
-    lCloudData[en_sparse_Nb_plus_Nf_minus] = fNchBwPlus * fNchFwMinus; */\r
-    \r
-    fHistNN->Fill(fNchFw,fNchBw);\r
-\r
-    if ( fUseAccumulatingHist )\r
-    {\r
-        fArrAccumulatedValues->Fill( en_arr_labels_NN_Nevents,   1                  );\r
-        fArrAccumulatedValues->Fill( en_arr_labels_NN_Nf     ,   fNchFw             );\r
-        fArrAccumulatedValues->Fill( en_arr_labels_NN_Nb     ,   fNchBw             );\r
-        fArrAccumulatedValues->Fill( en_arr_labels_NN_N2_f   ,   fNchFw*fNchFw      );\r
-        fArrAccumulatedValues->Fill( en_arr_labels_NN_Nf_Nb  ,   fNchFw*fNchBw      );\r
-        fArrAccumulatedValues->Fill( en_arr_labels_NN_N2_b   ,   fNchBw*fNchBw      );\r
-    }\r
-\r
-    if( fNchBw != 0 )\r
-    {\r
-        fSumPtBw = fSumPtBw / fNchBw;\r
-        //lCloudData[en_sparse_Pt_b] = fSumPtBw; //write <PtB>\r
-        fProfTestLRC->Fill( fNchFw, fSumPtBw );\r
-        fHistPtN->Fill( fNchFw, fSumPtBw );\r
-        //cout << "fill PtN: fNchFw = " << fNchFw << ", fSumPtBw=" << fSumPtBw <<  endl;\r
-        fProfNberr->Fill(fNchFw, 1.0 / fNchBw);\r
-\r
-        if ( fUseAccumulatingHist )\r
-        {\r
-            fArrAccumulatedValues->Fill( en_arr_labels_PtN_Nevents,  1                  );\r
-            fArrAccumulatedValues->Fill( en_arr_labels_PtN_Nf     ,  fNchFw             );\r
-            fArrAccumulatedValues->Fill( en_arr_labels_PtN_PtB    ,  fSumPtBw           );\r
-            fArrAccumulatedValues->Fill( en_arr_labels_PtN_N2_f   ,  fNchFw*fNchFw      );\r
-            fArrAccumulatedValues->Fill( en_arr_labels_PtN_Ptb_Nf ,  fSumPtBw*fNchFw    );\r
-        }\r
-\r
-        if( fNchFw != 0 )\r
-        {\r
-            fSumPtFw = fSumPtFw / fNchFw;\r
-            //lCloudData[en_sparse_Pt_f] = fSumPtFw; //write <PtF>\r
-            fHistPtPt->Fill( fSumPtFw, fSumPtBw );\r
-            fProfNberrPtPt->Fill( fSumPtFw, 1.0 / fNchBw );\r
-            // dPtB for PtPt\r
-            fProfdPtB->Fill( 15, fSumPtBw, fNchBw );\r
-            fProfdPtB->Fill( 16, fSumPtBw2 / fNchBw, fNchBw );\r
-            fHistNchForwardPtPt->Fill(fNchFw);\r
-\r
-            if ( fUseAccumulatingHist )\r
-            {\r
-                fArrAccumulatedValues->Fill( en_arr_labels_PtPt_Nevents,   1                   );\r
-                fArrAccumulatedValues->Fill( en_arr_labels_PtPt_PtF    ,   fSumPtFw            );\r
-                fArrAccumulatedValues->Fill( en_arr_labels_PtPt_PtB    ,   fSumPtBw            );\r
-                fArrAccumulatedValues->Fill( en_arr_labels_PtPt_Pt2_f  ,   fSumPtFw*fSumPtFw   );\r
-                fArrAccumulatedValues->Fill( en_arr_labels_PtPt_Ptf_Ptb,   fSumPtBw*fSumPtFw   );\r
-            }\r
-\r
-        }\r
-    }\r
-\r
-\r
-\r
-\r
-\r
-    if ( fUseSparse )\r
-    {\r
-        Double_t lCloudData[kSparseTotal*kSparsePIDtotal];\r
-\r
-        for (Int_t d = 0; d < kSparsePIDtotal; ++d)\r
-        {\r
-            Int_t binShift = kSparseTotal*d; //step over dimension set\r
-\r
-            lCloudData[kSparseNf + binShift ] = fNchFwPID[d];     //write Nf\r
-            lCloudData[kSparseNb + binShift ] = fNchBwPID[d];     //write Nb\r
-            lCloudData[en_sparse_N2_f + binShift ] = fNchFwPID[d]*fNchFwPID[d];     //write Nf^2\r
-            lCloudData[en_sparse_Nf_Nb + binShift ] = fNchFwPID[d]*fNchBwPID[d];     //write Nb\r
-\r
-            lCloudData[kSparsePtF + binShift ] = 0; //fill bin 0, if don't have appropriate PtSum\r
-            lCloudData[kSparsePtB + binShift ] = 0; //fill bin 0, if don't have appropriate PtSum\r
-\r
-            lCloudData[en_sparse_Ptb_Nf + binShift ] = 0;\r
-            lCloudData[en_sparse_Pt2_f + binShift ] = 0;\r
-            lCloudData[en_sparse_Ptf_Ptb + binShift ] = 0;\r
-\r
-\r
-            if( fNchBwPID[d] != 0 )\r
-            {\r
-                double lSumPtBwPID = fSumPtBwPID[d] / fNchBwPID[d];\r
-                lCloudData[kSparsePtB + binShift ] = lSumPtBwPID; //write <PtB>\r
-\r
-                fSumEtBwPID[d] = fSumEtBwPID[d] / fNchBwPID[d];\r
-                //lCloudData[en_sparse_Et_b + binShift ] = fSumEtBwPID[d]; //write <PtB>\r
-                lCloudData[en_sparse_Ptb_Nf + binShift ] = lSumPtBwPID * fNchFwPID[d];\r
-\r
-                //fProfTestLRC->Fill( fNchFw, fSumPtBw );\r
-                //fHistPtN->Fill( fNchFw, fSumPtBw );\r
-                //cout << "fill PtN: fNchFw = " << fNchFw << ", fSumPtBw=" << fSumPtBw <<  endl;\r
-\r
-                //fProfNberr->Fill(fNchFw, 1.0 / fNchBw);\r
-\r
-\r
-                if( fNchFwPID[d] != 0 )\r
-                {\r
-                    double lSumPtFwPID = fSumPtFwPID[d] / fNchFwPID[d];\r
-                    lCloudData[kSparsePtF + binShift ] = lSumPtFwPID; //write <PtF>\r
-\r
-                    fSumEtFwPID[d] = fSumEtFwPID[d] / fNchFwPID[d];\r
-\r
-                    lCloudData[en_sparse_Pt2_f + binShift ] = lSumPtFwPID * lSumPtFwPID;\r
-                    lCloudData[en_sparse_Ptf_Ptb + binShift ] = lSumPtFwPID*lSumPtBwPID;\r
-\r
-                    //lCloudData[en_sparse_Et_f + binShift ] = fSumEtFwPID[d]; //write <PtF>\r
-                    //fHistPtPt->Fill( fSumPtFw, fSumPtBw );\r
-                    //fProfNberrPtPt->Fill( fSumPtFw, 1.0 / fNchBw );\r
-                    // dPtB for PtPt\r
-                    //fProfdPtB->Fill( 15, fSumPtBw, fNchBw );\r
-                    //fProfdPtB->Fill( 16, fSumPtBw2 / fNchBw, fNchBw );\r
-                    //fHistNchForwardPtPt->Fill(fNchFw);\r
-\r
-                }\r
-            }\r
-            /*\r
-            lCloudData[en_sparse_Nf_plus + binShift ] = fNchFwPlusPID[d];\r
-            lCloudData[en_sparse_Nf_minus + binShift ] = fNchFwMinusPID[d];\r
-            lCloudData[en_sparse_Nb_plus + binShift ] = fNchBwPlusPID[d];\r
-            lCloudData[en_sparse_Nb_minus + binShift ] = fNchBwMinusPID[d];\r
-            lCloudData[en_sparse_Nf_plus_Nb_minus + binShift ] = fNchFwPlusPID[d] * fNchBwMinusPID[d];\r
-            lCloudData[en_sparse_Nb_plus_Nf_minus + binShift ] = fNchBwPlusPID[d] * fNchFwMinusPID[d];\r
-             */\r
-        }\r
-\r
-        //tmp (22.03): fill pid with fignya data\r
-        /* for (Int_t d = 1; d < en_sparse_PID_total; ++d)\r
-        {\r
-            Int_t binShift = en_sparse_total*d;\r
-            lCloudData[en_sparse_N_f + binShift ] = 1+d;     //write Nf\r
-            lCloudData[en_sparse_N_b + binShift ] = 2+d;     //write Nb\r
-            lCloudData[en_sparse_N2_f + binShift ] = 3+d;     //write Nf^2\r
-            lCloudData[en_sparse_Nf_Nb + binShift ] = 4+d;     //write Nb\r
-\r
-            lCloudData[en_sparse_Pt_f + binShift ] = 5+d; //fill bin 0, if don't have appropriate PtSum\r
-            lCloudData[en_sparse_Pt_b + binShift ] = 6+d; //fill bin 0, if don't have appropriate PtSum\r
-\r
-            lCloudData[en_sparse_Nf_plus + binShift ] = 7+d;\r
-            lCloudData[en_sparse_Nf_minus + binShift ] = 8+d;\r
-            lCloudData[en_sparse_Nb_plus + binShift ] = 9+d;\r
-            lCloudData[en_sparse_Nb_minus + binShift ] = 10+d;\r
-            lCloudData[en_sparse_Nf_plus_Nb_minus + binShift ] = 11+d;\r
-            lCloudData[en_sparse_Nb_plus_Nf_minus + binShift ] = 12+d;\r
-        }\r
-    */\r
-\r
-        //    cout << "before filling" << endl;\r
-        fHistClouds->Fill( lCloudData ); //fill sparse hist with Nf, Nb, <PtF>, <PtB>\r
-        //        cout << "filled." << endl;\r
-    }\r
-\r
-\r
-\r
-\r
-    //additional info-hist\r
-    if ( fNchFw > 0 || fNchBw > 0 )\r
-    {\r
-        Double_t lAvMult = ( fNchFw + fNchBw ) / 2.;\r
-        fHistDifferenceNf->Fill( fNchFw, ( fNchFw-fNchBw ) / lAvMult );\r
-        fHistDifferenceNb->Fill( fNchBw, ( fNchBw-fNchFw ) / lAvMult);\r
-    }\r
-\r
-    //cout << "n particles: " << fNchFw << " , Back = " << fNchBw << endl;\r
-    //cout << "fHistNN: " << fHistNN->GetEntries() <<  endl;\r
-    //cout << "mean= " << fHistNN->GetMean() <<  endl;\r
-\r
-\r
-    fHistNchForward->Fill(fNchFw);\r
-    fHistNchBackward->Fill(fNchBw);\r
-\r
-    fEventCount++;\r
-    fIsEventOpend = kFALSE;\r
-    \r
-    //fill nf-centr plot\r
-    fHistNfCentrality->Fill( fNchFw, fEventCentrality );\r
-    \r
-    //cout<<fShortDef<<": event count = "<<fEventCount<<" ";\r
-    //  Printf("NchF = %i,NchB = %i",fNchFw,fNchBw);\r
-}\r
-\r
-Bool_t AliLRCProcess::IsPhiInRange( Double_t phi, Double_t phiBoundMin, Double_t phiBoundMax )\r
-{\r
-    if ( ( phiBoundMin < phi ) && ( phi < phiBoundMax ) )\r
-        return kTRUE;\r
-\r
-    //when bound is more than 2pi - check phi+2pi!\r
-    phi += 2 * TMath::Pi();\r
-    if ( ( phiBoundMin < phi ) && ( phi < phiBoundMax ) )\r
-        return kTRUE;\r
-\r
-    return kFALSE; //phi not in range\r
-}\r
-\r
-void AliLRCProcess::SetCorrespondanceWithAliROOTpid()\r
-{\r
-    fCorrespondanceWithAliROOTpid[kSparsePIDany] = kSparsePIDany;\r
-    fCorrespondanceWithAliROOTpid[kSparsePIDdefined] = -1000;\r
-    fCorrespondanceWithAliROOTpid[kSparsePIDpion] = 2;\r
-    fCorrespondanceWithAliROOTpid[kSparsePIDkaon] = 3;\r
-    fCorrespondanceWithAliROOTpid[kSparsePIDproton] = 4;\r
-}\r
-\r
-void AliLRCProcess::ZeroPidArrays()\r
-{\r
-    //added 23.03\r
-    for ( int pid = 0; pid < kSparsePIDtotal; pid++ )\r
-    {\r
-        fNchFwPID[pid] = 0;\r
-        fNchFwPlusPID[pid] = 0;\r
-        fNchFwMinusPID[pid] = 0;\r
-        fSumPtFwPID[pid] = 0;\r
-        fSumEtFwPID[pid] = 0;\r
-\r
-        fNchBwPID[pid] = 0;\r
-        fNchBwPlusPID[pid] = 0;\r
-        fNchBwMinusPID[pid] = 0;\r
-        fSumPtBwPID[pid] = 0;\r
-        fSumEtBwPID[pid] = 0;\r
-    }\r
-}\r
+/**************************************************************************
+ * Authors: Andrey Ivanov, Igor Altsybeev.                                                 *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+
+// This class creates TH2D histogramms for Nch - Nch , Nch - Pt , Pt - Pt 
+// dirtributions for given ETA windows and some supplementary data for Long Range Correlation (LRC) analysis .  
+// Class is designid to work with AliAnalysisTaskLRC
+
+// Authors : Andrey Ivanov, Igor Altsybeev, St.Peterburg State University
+// Email: Igor.Altsybeev@cern.ch
+
+#include "Riostream.h"
+#include "AliLRCProcess.h"
+//#include "THnSparse.h"
+#include "TH1F.h"
+#include "TH1D.h"
+#include "TH2D.h"
+#include "TProfile.h"
+#include "TList.h"
+#include "TString.h"
+#include "TMath.h"
+//#include "TClonesArray.h"
+
+//#include <AliPID.h> //for particle mass only
+ClassImp(AliLRCProcess)
+
+//const bool useSparse = false;//false;
+//const bool useAccumulatingHist = true;//false;
+using std::endl;
+using std::cout;
+
+AliLRCProcess::AliLRCProcess():fIsEventOpend(kFALSE), fIsOnline(kFALSE), fDisplayInitOnDemandWarning(kTRUE)
+  ,fUseSparse(false)
+  ,fUseAccumulatingHist(true)
+  ,fEventCount(0),fStartForwardETA(0), fEndForwardETA(0)
+  ,fStartForwardPhi(0)
+  ,fEndForwardPhi(0)
+  ,fStartBackwardETA(0)
+  ,fEndBackwardETA(0)
+  ,fStartBackwardPhi(0)
+  ,fEndBackwardPhi(0)
+  ,fDoubleSidedBackwardPhiWindow(kFALSE)
+  ,fHiPt(0)
+  ,fLoPt(0)
+  ,fHiMultHor(0)
+  ,fLowMultHor(0)
+  ,fHiMultVert(0)
+  ,fLowMultVert(0)
+  ,fMultBinsHor(0)
+  ,fMultBinsVert(0)
+  ,fPtBins(0)
+  ,fPtHistXaxisRebinFactor(1)
+  ,fSumPtFw(0)
+  ,fSumPtBw(0)
+  ,fSumPtBw2(0)
+  ,fNchFw(0)
+  ,fNchBw(0)
+  ,fNchFwPlus(0)
+  ,fNchBwPlus(0)
+  ,fNchFwMinus(0)
+  ,fNchBwMinus(0)
+  ,fOutList(0), fShortDef(0),fOutputSlot(0), fHistPt(0),fHistEta(0),fHistClouds(0),fHistNN(0),fHistPtN(0),fHistPtPt(0),fProfNberr(0),fProfNberrPtPt(0),fProfdPtB(0),fProfTestLRC(0),fHistSparseDimensionLabeling(0),fHistSparsePIDblocksLabeling(0)
+
+  ,fHistPtForward(0)
+  ,fHistEtaForward(0)
+  ,fHistNchForward(0)
+  ,fHistNchForwardPtPt(0)
+  ,fHistPhiForward(0)
+  ,fHistTracksChargeForward(0)
+  ,fHistPtPlusForward(0)
+  ,fHistPtMinusForward(0)
+  ,fHistNetChargeVsPtForward(0)
+
+  ,fHistPtBackward(0)
+  ,fHistEtaBackward(0)
+  ,fHistNchBackward(0)
+  ,fHistPhiBackward(0)
+  ,fHistTracksChargeBackward(0)
+  ,fHistPtPlusBackward(0)
+  ,fHistPtMinusBackward(0)
+  ,fHistNetChargeVsPtBackward(0)
+
+  ,fArrAccumulatedValues(0)
+  //  ,fHistArrayLabeling(0)
+  ,fEventCentrality(0)
+  ,fHistNfCentrality(0)
+  ,fHistTestPIDForward(0)
+  ,fHistTestPIDBackward(0)
+  ,fHistDifferenceNf(0)
+  ,fHistDifferenceNb(0)
+
+  ,fPidForward(-1)//kLRCany)
+  ,fPidBackward(-1)//kLRCany)
+  //,fWhichParticleToProcess(kLRCany)//kLRCany)
+  //,fPidFillCondition(kLRCpidIgnored)
+  //,fNumberOfSectors(1)
+  //,fNeedToRotateSector(kFALSE)
+{
+    //fWhichParticleToProcess = kLRCany;  //default - all particle types
+    //fPidFillCondition = kLRCpidIgnored;
+    SetCorrespondanceWithAliROOTpid();
+    ZeroPidArrays();
+}
+
+AliLRCProcess::AliLRCProcess(Double_t _StartForwardETA,Double_t _EndForwardETA,Double_t _StartBakwardETA,Double_t _EndBakwardETA ): fIsEventOpend(kFALSE), fIsOnline(kFALSE), fDisplayInitOnDemandWarning(kTRUE)
+  ,fUseSparse(false)
+  ,fUseAccumulatingHist(true)
+  ,fEventCount(0),fStartForwardETA(0), fEndForwardETA(0), fStartForwardPhi(0),fEndForwardPhi(0),fStartBackwardETA(0), fEndBackwardETA(0),fStartBackwardPhi(0)
+  ,fEndBackwardPhi(0)
+  ,fDoubleSidedBackwardPhiWindow(kFALSE)
+  ,fHiPt(0)
+  ,fLoPt(0)
+  ,fHiMultHor(0)
+  ,fLowMultHor(0)
+  ,fHiMultVert(0)
+  ,fLowMultVert(0)
+  ,fMultBinsHor(0)
+  ,fMultBinsVert(0)
+  ,fPtBins(0)
+  ,fPtHistXaxisRebinFactor(1)
+  ,fSumPtFw(0),  fSumPtBw(0), fSumPtBw2(0),fNchFw(0)
+  ,/*fNchFwPtPt(0),*/ fNchBw(0)
+  ,fNchFwPlus(0)
+  ,fNchBwPlus(0)
+  ,fNchFwMinus(0)
+  ,fNchBwMinus(0)
+  ,fOutList(0), fShortDef(0),fOutputSlot(0), fHistPt(0),fHistEta(0),fHistClouds(0),fHistNN(0),fHistPtN(0),fHistPtPt(0),fProfNberr(0),fProfNberrPtPt(0),fProfdPtB(0),fProfTestLRC(0),fHistSparseDimensionLabeling(0),fHistSparsePIDblocksLabeling(0)
+
+  ,fHistPtForward(0)
+  ,fHistEtaForward(0)
+  ,fHistNchForward(0)
+  ,fHistNchForwardPtPt(0)
+  ,fHistPhiForward(0)
+  ,fHistTracksChargeForward(0)
+  ,fHistPtPlusForward(0)
+  ,fHistPtMinusForward(0)
+  ,fHistNetChargeVsPtForward(0)
+
+  ,fHistPtBackward(0)
+  ,fHistEtaBackward(0)
+  ,fHistNchBackward(0)
+  ,fHistPhiBackward(0)
+  ,fHistTracksChargeBackward(0)
+  ,fHistPtPlusBackward(0)
+  ,fHistPtMinusBackward(0)
+  ,fHistNetChargeVsPtBackward(0)
+
+  ,fArrAccumulatedValues(0)
+  //  ,fHistArrayLabeling(0)
+  ,fEventCentrality(0)
+  ,fHistNfCentrality(0)
+  ,fHistTestPIDForward(0)
+  ,fHistTestPIDBackward(0)
+  ,fHistDifferenceNf(0)
+  ,fHistDifferenceNb(0)
+  ,fPidForward(-1)//kLRCany)
+  ,fPidBackward(-1)//kLRCany)
+  //,fWhichParticleToProcess(kLRCany)//kLRCany)
+  //,fPidFillCondition(kLRCpidIgnored)
+  //,fNumberOfSectors(1)
+  //,fNeedToRotateSector(kFALSE)
+{
+    // Constructor with window setup makes ready-to-run processor
+    fEventCount=0;
+
+    //fWhichParticleToProcess = kLRCany;  //default - all particle types
+    //fPidFillCondition = kLRCpidIgnored;
+    
+    //cout << "TEST" << endl;
+    SetETAWindows( _StartForwardETA, _EndForwardETA,_StartBakwardETA,_EndBakwardETA);
+    SetHistPtRange( 0.15, 1.5, 270 );
+    SetHistMultRange( 0, 0, 100 );
+    SetForwardWindowPhi( 0, 2*TMath::Pi() );
+    SetBackwardWindowPhi( 0, 2*TMath::Pi() );
+
+    SetCorrespondanceWithAliROOTpid();
+    ZeroPidArrays();
+
+    
+
+}
+
+Bool_t AliLRCProcess::InitDataMembers()
+{
+    //Printf("INITDATAMEMBERS");
+    // This method is actualy creating output histogramms
+    // Thist method  is to be called in CreateOutputObjects method of AliAnalysisTask
+    //cout<<" # Init for "<<fShortDef<<" this="<<this<<"\n";
+    if( fIsOnline )
+    {
+        Printf("Can't init data members more then one time! \n");
+        return kFALSE;
+    }
+    fEventCount=0;
+    fOutList = new TList();
+    fOutList->SetOwner();  // IMPORTANT!
+
+    fOutList->SetName(fShortDef);
+
+    Double_t lowMultHor, hiMultHor;
+    Double_t lowMultVert, hiMultVert;
+
+    lowMultHor = fLowMultHor - 0.5;
+    hiMultHor = fHiMultHor + 0.5;
+
+    lowMultVert = fLowMultVert - 0.5;
+    hiMultVert = fHiMultVert + 0.5;
+
+
+    //TArray to accumulate data, with names hist
+    //26.01.2013: array with accumulated values
+    //fArrAccumulatedValues = new TClonesArray("Float_t", en_arr_labels_total );//TArrayF(en_arr_labels_total);
+    if ( fUseAccumulatingHist )
+    {
+        fArrAccumulatedValues = new TH1D( "fArrAccumulatedValues", "Accumulating hist with labeling", en_arr_labels_total,-0.5,en_arr_labels_total-0.5);
+        TString gArrayMemberNames[en_arr_labels_total];
+        gArrayMemberNames[ en_arr_labels_NN_Nevents  ] = "NN_Nevents"       ;
+        gArrayMemberNames[ en_arr_labels_NN_Nf       ] = "NN_Nf"            ;
+        gArrayMemberNames[ en_arr_labels_NN_Nb       ] = "NN_Nb"            ;
+        gArrayMemberNames[ en_arr_labels_NN_N2_f     ] = "NN_N2_f"          ;
+        gArrayMemberNames[ en_arr_labels_NN_Nf_Nb    ] = "NN_Nf_Nb"         ;
+        gArrayMemberNames[ en_arr_labels_NN_N2_b     ] = "NN_N2_b"          ;
+
+        gArrayMemberNames[ en_arr_labels_PtN_Nevents ] = "PtN_Nevents"      ;
+        gArrayMemberNames[ en_arr_labels_PtN_Nf      ] = "PtN_Nf"           ;
+        gArrayMemberNames[ en_arr_labels_PtN_PtB     ] = "PtN_PtB"          ;
+        gArrayMemberNames[ en_arr_labels_PtN_N2_f    ] = "PtN_N2_f"         ;
+        gArrayMemberNames[ en_arr_labels_PtN_Ptb_Nf  ] = "PtN_Ptb_Nf"       ;
+
+        gArrayMemberNames[ en_arr_labels_PtPt_Nevents] = "PtPt_Nevents"     ;
+        gArrayMemberNames[ en_arr_labels_PtPt_PtF    ] = "PtPt_PtF"         ;
+        gArrayMemberNames[ en_arr_labels_PtPt_PtB    ] = "PtPt_PtB"         ;
+        gArrayMemberNames[ en_arr_labels_PtPt_Pt2_f  ] = "PtPt_Pt2_f"       ;
+        gArrayMemberNames[ en_arr_labels_PtPt_Ptf_Ptb] = "PtPt_Ptf_Ptb"     ;
+
+        for( Int_t i = 1; i <= en_arr_labels_total; i++ )
+            fArrAccumulatedValues->GetXaxis()->SetBinLabel(i,gArrayMemberNames[i-1].Data());
+        //fOutList->Add(fArrAccumulatedValues);
+        fOutList->Add(fArrAccumulatedValues);
+    }
+
+
+
+    
+    // Window statistics histograms
+
+    // ########## Forward
+
+    fHistPtForward = new TH1D("fHistPtForward", "P_{T} distribution in Forward window", 100, 0.0, 5);
+    fHistPtForward->GetXaxis()->SetTitle("P_{T} (GeV/c)");
+    fHistPtForward->GetYaxis()->SetTitle("dN/dP_{T} (c/GeV)");
+    fHistPtForward->SetMarkerStyle(kFullCircle);
+
+
+    fHistEtaForward = new TH1D("fEtaForward", "#eta distribution in Forward window", 200, -2, 2);
+    fHistEtaForward->GetXaxis()->SetTitle("ETA");
+    fHistEtaForward->GetYaxis()->SetTitle("dN/ETA");
+    fHistEtaForward->SetMarkerStyle(kFullCircle);
+
+    
+    fHistNchForward = new TH1D("fHistNchForward", "N_{ch} distribution in Forward window", fMultBinsHor, lowMultHor, hiMultHor);
+    fHistNchForward->GetXaxis()->SetTitle("N_{ch}");
+    fHistNchForward->GetYaxis()->SetTitle("dN/dN_{ch}");
+    fHistNchForward->SetMarkerStyle(kFullCircle);
+
+    fHistNchForwardPtPt = new TH1D("fHistNchForwardPtPt", "N_{ch} distribution in Forward window for PtPt accept conditions", fMultBinsHor, lowMultHor, hiMultHor);
+    fHistNchForwardPtPt->GetXaxis()->SetTitle("N_{ch}");
+    fHistNchForwardPtPt->GetYaxis()->SetTitle("dN/dN_{ch}");
+    fHistNchForwardPtPt->SetMarkerStyle(kFullCircle);
+
+    fHistPhiForward = new TH1D("fPhiForward", "#phi distribution in Forward window", 144, 0, 2*TMath::Pi());
+    fHistPhiForward->GetXaxis()->SetTitle("Phi");
+    fHistPhiForward->GetYaxis()->SetTitle("dN/Phi");
+    fHistPhiForward->SetMarkerStyle(kFullCircle);
+
+    fHistTestPIDForward = new TH1D("fHistTestPIDForward","PID distribution in Forward window;PID;N",5,-0.5,4.5);
+    TString gBinParticleNames[5] = {/*"Other",*/"Electron","Muon","Pion","Kaon", "Proton"};
+    for(Int_t i = 1; i <= 5; i++)
+        fHistTestPIDForward->GetXaxis()->SetBinLabel(i,gBinParticleNames[i-1].Data());
+
+    //15/12/2012: charge hist
+    fHistTracksChargeForward = new TH1D("fHistTracksChargeForward","Accepted tracks charge;charge;Entries",3,-1.5,1.5);
+
+
+    // ### net charge vs pt study (July 2013)
+    const int kPtNetChargePtBins = 200;
+    const double kPtNetChargePtMin = 0.1;
+    const double kPtNetChargePtMax = 2.1;
+
+    //pt plus
+    fHistPtPlusForward = new TH1D("fHistPtPlusForward","p_{T} +;p_{T};dN/dpT", kPtNetChargePtBins,  kPtNetChargePtMin, kPtNetChargePtMax                                  );
+    fOutList->Add(fHistPtPlusForward);
+    //pt minus
+    fHistPtMinusForward = new TH1D("fHistPtMinusForward","p_{T} -;p_{T};dN/dpT", kPtNetChargePtBins,  kPtNetChargePtMin, kPtNetChargePtMax                                  );
+    fOutList->Add(fHistPtMinusForward);
+    //net charge vs pT
+    fHistNetChargeVsPtForward = new TH1D("fHistNetChargeVsPtForward","charge vs p_{T};p_{T};Q", kPtNetChargePtBins,  kPtNetChargePtMin, kPtNetChargePtMax                                  );
+    fOutList->Add(fHistNetChargeVsPtForward);
+
+
+    // ########## Backward
+
+    fHistPtBackward = new TH1D("fHistPtBakward", "P_{T} distribution in Backward window", 100, 0.0, 5);
+    fHistPtBackward->GetXaxis()->SetTitle("P_{T} (GeV/c)");
+    fHistPtBackward->GetYaxis()->SetTitle("dN/dP_{T} (c/GeV)");
+    fHistPtBackward->SetMarkerStyle(kFullCircle);
+
+
+    fHistEtaBackward = new TH1D("fEtaBakward", "#eta distribution in Backward window", 200, -2, 2);
+    fHistEtaBackward->GetXaxis()->SetTitle("ETA");
+    fHistEtaBackward->GetYaxis()->SetTitle("dN/ETA");
+    fHistEtaBackward->SetMarkerStyle(kFullCircle);
+
+
+    fHistNchBackward = new TH1D("fHistNchBakward", "N_{ch} distribution in Backward window", fMultBinsVert, lowMultVert, hiMultVert);
+    fHistNchBackward->GetXaxis()->SetTitle("N_{ch}");
+    fHistNchBackward->GetYaxis()->SetTitle("dN/dN_{ch}");
+    fHistNchBackward->SetMarkerStyle(kFullCircle);
+
+    fHistPhiBackward = new TH1D("fPhiBakward", "#phi distribution in Backward window", 144, 0, 2*TMath::Pi());
+    fHistPhiBackward->GetXaxis()->SetTitle("Phi");
+    fHistPhiBackward->GetYaxis()->SetTitle("dN/Phi");
+    fHistPhiBackward->SetMarkerStyle(kFullCircle);
+
+    fHistTestPIDBackward = new TH1D("fHistTestPIDBackward","PID distribution in Backward window;PID;N",5,-0.5,4.5);
+    for(Int_t i = 1; i <= 5; i++)
+        fHistTestPIDBackward->GetXaxis()->SetBinLabel(i,gBinParticleNames[i-1].Data());
+
+
+    //15/12/2012: charge hist
+    fHistTracksChargeBackward = new TH1D("fHistTracksChargeBackward","Accepted tracks charge;charge;Entries",3,-1.5,1.5);
+
+    // ### net charge vs pt study (July 2013)
+    //pt plus
+    fHistPtPlusBackward = new TH1D("fHistPtPlusBackward","p_{T} +;p_{T};dN/dpT", kPtNetChargePtBins,  kPtNetChargePtMin, kPtNetChargePtMax                                  );
+    fOutList->Add(fHistPtPlusBackward);
+    //pt minus
+    fHistPtMinusBackward = new TH1D("fHistPtMinusBackward","p_{T} -;p_{T};dN/dpT", kPtNetChargePtBins,  kPtNetChargePtMin, kPtNetChargePtMax                                  );
+    fOutList->Add(fHistPtMinusBackward);
+    //net charge vs pT
+    fHistNetChargeVsPtBackward = new TH1D("fHistNetChargeVsPtBackward","charge vs p_{T};p_{T};Q", kPtNetChargePtBins,  kPtNetChargePtMin, kPtNetChargePtMax                                  );
+    fOutList->Add(fHistNetChargeVsPtBackward);
+
+
+
+
+
+    //Overal statistics histograms
+
+    fHistPt = new TH1F("fHistPt", "P_{T} distribution", 100, 0.0, 5.0);
+    fHistPt->GetXaxis()->SetTitle("P_{T} (GeV/c)");
+    fHistPt->GetYaxis()->SetTitle("dN/dP_{T} (c/GeV)");
+    fHistPt->SetMarkerStyle(kFullCircle);
+
+
+    fHistEta = new TH1F("fHistEta", "#eta distribution", 200, -2, 2);
+    fHistEta->GetXaxis()->SetTitle("ETA");
+    fHistEta->GetYaxis()->SetTitle("dN/ETA");
+    fHistEta->SetMarkerStyle(kFullCircle);
+    
+    
+    
+    // -------- LRC histograms
+    //new cloud implementation
+    //const int lSparseDim = en_sparse_total;
+    //const int nSparseBins = 1000;
+
+
+    /* from AliROOT //deprecated!
+        enum EParticleType {
+            kElectron = 0,
+            kMuon = 1,
+            kPion = 2,
+            kKaon = 3,
+            kProton = 4,
+            kPhoton = 5,
+            kPi0 = 6,
+            kNeutron = 7,
+            kKaon0 = 8,
+            kEleCon = 9,
+            kDeuteron = 10,
+            kTriton = 11,
+            kHe3 = 12,
+            kAlpha = 13,
+            kUnknown = 14
+        };*/
+
+
+    if ( fUseSparse )
+    {
+
+        //correspondance of PID blocks
+        //it's a way to unlink THnSparse data dimenstion from enum
+        fHistSparsePIDblocksLabeling = new TH1D("fHistSparsePIDblocksLabeling","THnSparse PID blocks labeling", kSparsePIDtotal,-0.5,kSparsePIDtotal-0.5);
+        TString gEventCutBinPIDblocksNames[kSparsePIDtotal];    // = {"Total","No trigger","Centrality","No vertex","Bad vertex position","HighMult cut","LowMult cut","Analyzed"};
+        gEventCutBinPIDblocksNames[kSparsePIDany]               = "any";
+        gEventCutBinPIDblocksNames[kSparsePIDdefined]       = "defined";
+        gEventCutBinPIDblocksNames[kSparsePIDpion]      = "pion";
+        gEventCutBinPIDblocksNames[kSparsePIDkaon]      = "kaon";
+        gEventCutBinPIDblocksNames[kSparsePIDproton]    = "proton";
+
+
+        for(Int_t i = 1; i <= kSparsePIDtotal; i++)fHistSparsePIDblocksLabeling->GetXaxis()->SetBinLabel(i,gEventCutBinPIDblocksNames[i-1].Data());
+        //for(Int_t i = 0; i < nEnumBins; i++)fHistSparseDimensionLabeling->Fill( i );
+
+        //dimensions labelling
+
+        fHistSparseDimensionLabeling = new TH1D("fHistSparseDimensionLabeling","THnSparse labeling", kSparseTotal,-0.5,kSparseTotal-0.5);
+        TString gSparseDimensionsNames[kSparseTotal];    // = {"Total","No trigger","Centrality","No vertex","Bad vertex position","HighMult cut","LowMult cut","Analyzed"};
+        gSparseDimensionsNames[kSparseNf] = "N_f";
+        gSparseDimensionsNames[kSparseNb] = "N_b";
+        gSparseDimensionsNames[kSparsePtF] = "Pt_f";
+        gSparseDimensionsNames[kSparsePtB] = "Pt_b";
+        gSparseDimensionsNames[en_sparse_N2_f] = "N2_f";
+        gSparseDimensionsNames[en_sparse_Nf_Nb] = "Nf_Nb";
+        gSparseDimensionsNames[en_sparse_Ptb_Nf] = "Ptb_Nf";
+        gSparseDimensionsNames[en_sparse_Pt2_f] = "Pt2_f";
+        gSparseDimensionsNames[en_sparse_Ptf_Ptb] = "Ptf_Ptb";
+
+        for( Int_t i = 1; i <= kSparseTotal; i++ )
+            fHistSparseDimensionLabeling->GetXaxis()->SetBinLabel(i,gSparseDimensionsNames[i-1].Data());
+
+
+
+        Int_t* lSparseBins     = new Int_t[kSparseTotal*kSparsePIDtotal];
+        Double_t *lSparseXmin  = new Double_t[kSparseTotal*kSparsePIDtotal];
+        Double_t *lSparseXmax  = new Double_t[kSparseTotal*kSparsePIDtotal];
+        TString *lSparseAxisNames      = new TString[kSparseTotal*kSparsePIDtotal];
+
+        TString *lPIDNames     = new TString[kSparsePIDtotal];
+        lPIDNames[ kSparsePIDany      ] = Form( "any" );
+        lPIDNames[ kSparsePIDdefined  ] = Form( "defined" );
+        lPIDNames[ kSparsePIDpion     ] = Form( "pion" );
+        lPIDNames[ kSparsePIDkaon     ] = Form( "kaon" );
+        lPIDNames[ kSparsePIDproton   ] = Form( "proton" );
+
+
+
+        for ( Int_t d = 0; d < kSparsePIDtotal; ++d )
+        {
+            Int_t binShift = kSparseTotal*d;
+
+            lSparseAxisNames[kSparseNf + binShift] = Form( "axisNf_%s", lPIDNames[ d ].Data() );
+            lSparseAxisNames[kSparseNb + binShift] = Form( "axisNb_%s", lPIDNames[ d ].Data() );
+            lSparseAxisNames[kSparsePtF + binShift] = Form( "axisPtf_%s", lPIDNames[ d ].Data() );
+            lSparseAxisNames[kSparsePtB + binShift] = Form( "axisPtb_%s", lPIDNames[ d ].Data() );
+
+            lSparseAxisNames[en_sparse_N2_f + binShift]     = Form( "axisN2_%s", lPIDNames[ d ].Data() );
+            lSparseAxisNames[en_sparse_Nf_Nb + binShift]    = Form( "axisNf_Nb_%s", lPIDNames[ d ].Data() );
+            lSparseAxisNames[en_sparse_Ptb_Nf + binShift]   = Form( "axisPtb_Nf_%s", lPIDNames[ d ].Data() );
+            lSparseAxisNames[en_sparse_Pt2_f + binShift]    = Form( "axisPt2_f_%s", lPIDNames[ d ].Data() );
+            lSparseAxisNames[en_sparse_Ptf_Ptb + binShift]  = Form( "axisPtf_Ptb_%s", lPIDNames[ d ].Data() );
+
+
+            lSparseBins[kSparseNf + binShift ] = fMultBinsHor;
+            lSparseXmin[kSparseNf + binShift ] = lowMultHor;
+            lSparseXmax[kSparseNf + binShift ] = hiMultHor;
+            lSparseBins[kSparseNb + binShift ] = fMultBinsVert;
+            lSparseXmin[kSparseNb + binShift ] = lowMultVert;
+            lSparseXmax[kSparseNb + binShift ] = hiMultVert;
+            //}
+            //for (Int_t d = 2; d < lSparseDim; ++d) {
+            lSparseBins[kSparsePtF + binShift ] = fPtBins;
+            lSparseXmin[kSparsePtF + binShift ] = fLoPt;
+            lSparseXmax[kSparsePtF + binShift ] = fHiPt;
+            lSparseBins[kSparsePtB + binShift ] = fPtBins;
+            lSparseXmin[kSparsePtB + binShift ] = fLoPt;
+            lSparseXmax[kSparsePtB + binShift ] = fHiPt;
+
+
+
+
+
+            //}
+            /*
+                lSparseBins[en_sparse_Et_f + binShift ] = 500;
+            lSparseXmin[en_sparse_Et_f + binShift ] = 0.2;
+            lSparseXmax[en_sparse_Et_f + binShift ] = 2.7;
+            lSparseBins[en_sparse_Et_b + binShift ] = 500;
+            lSparseXmin[en_sparse_Et_b + binShift ] = 0.2;
+            lSparseXmax[en_sparse_Et_b + binShift ] = 2.7;
+*/
+
+            lSparseBins[en_sparse_N2_f + binShift ] = (fMultBinsHor-1)*(fMultBinsHor-1)+1;
+            lSparseXmin[en_sparse_N2_f + binShift ] = fLowMultHor*fLowMultHor-0.5; // ! use global mult without shift
+            lSparseXmax[en_sparse_N2_f + binShift ] = fHiMultHor*fHiMultHor+0.5;
+            //lSparseBins[en_sparse_N_b] = fMultBinsVert;
+            //lSparseXmin[en_sparse_N_b] = lowMultVert;
+            //lSparseXmax[en_sparse_N_b] = hiMultVert;
+            lSparseBins[en_sparse_Nf_Nb + binShift ] = (fMultBinsHor-1)*(fMultBinsVert-1)+1;
+            lSparseXmin[en_sparse_Nf_Nb + binShift ] = fLowMultHor*fLowMultVert-0.5;
+            lSparseXmax[en_sparse_Nf_Nb + binShift ] = fHiMultHor*fHiMultVert+0.5;
+
+
+
+            lSparseBins[en_sparse_Ptb_Nf + binShift ] = /*(fMultBinsHor-1)**/(10*fPtBins);//+1;
+            lSparseXmin[en_sparse_Ptb_Nf + binShift ] = fLowMultHor*fLoPt-0.5;
+            lSparseXmax[en_sparse_Ptb_Nf + binShift ] = fHiMultHor*fHiPt+0.5;
+
+            lSparseBins[en_sparse_Pt2_f + binShift ] = (10*fPtBins);//*(fPtBins);//+1;
+            lSparseXmin[en_sparse_Pt2_f + binShift ] = fLoPt*fLoPt;
+            lSparseXmax[en_sparse_Pt2_f + binShift ] = fHiPt*fHiPt;
+
+            lSparseBins[en_sparse_Ptf_Ptb + binShift ] = (10*fPtBins);//*(fPtBins)+1;
+            lSparseXmin[en_sparse_Ptf_Ptb + binShift ] = fLoPt*fLoPt;
+            lSparseXmax[en_sparse_Ptf_Ptb + binShift ] = fHiPt*fHiPt;
+
+            /*
+                lSparseBins[en_sparse_Nf_plus + binShift ] = fMultBinsHor;
+            lSparseXmin[en_sparse_Nf_plus + binShift ] = lowMultHor;
+            lSparseXmax[en_sparse_Nf_plus + binShift ] = hiMultHor;
+                lSparseBins[en_sparse_Nf_minus + binShift ] = fMultBinsHor;
+            lSparseXmin[en_sparse_Nf_minus + binShift ] = lowMultHor;
+            lSparseXmax[en_sparse_Nf_minus + binShift ] = hiMultHor;
+
+                lSparseBins[en_sparse_Nb_plus + binShift ] = fMultBinsVert;
+            lSparseXmin[en_sparse_Nb_plus + binShift ] = lowMultVert;
+            lSparseXmax[en_sparse_Nb_plus + binShift ] = hiMultVert;
+                lSparseBins[en_sparse_Nb_minus + binShift ] = fMultBinsVert;
+            lSparseXmin[en_sparse_Nb_minus + binShift ] = lowMultVert;
+            lSparseXmax[en_sparse_Nb_minus + binShift ] = hiMultVert;
+
+                lSparseBins[en_sparse_Nf_plus_Nb_minus + binShift ] = (fMultBinsHor-1)*(fMultBinsVert-1)+1;
+            lSparseXmin[en_sparse_Nf_plus_Nb_minus + binShift ] = fLowMultHor*fLowMultVert-0.5;
+            lSparseXmax[en_sparse_Nf_plus_Nb_minus + binShift ] = fHiMultHor*fHiMultVert+0.5;
+
+                lSparseBins[en_sparse_Nb_plus_Nf_minus + binShift ] = (fMultBinsHor-1)*(fMultBinsVert-1);
+            lSparseXmin[en_sparse_Nb_plus_Nf_minus + binShift ] = fLowMultHor*fLowMultVert-0.5;
+            lSparseXmax[en_sparse_Nb_plus_Nf_minus + binShift ] = fHiMultHor*fHiMultVert+0.5;
+        */
+        }
+
+        fHistClouds = new THnSparseD("cloudLRC", "cloudLRC", kSparseTotal*kSparsePIDtotal, lSparseBins, lSparseXmin, lSparseXmax);
+        //end of cloud implementation
+
+        //set axis names
+        TAxis *lSparseAxis = 0x0;
+        for ( Int_t d = 0; d < kSparseTotal*kSparsePIDtotal; ++d )
+        {
+            lSparseAxis = fHistClouds->GetAxis( d );
+            lSparseAxis->SetNameTitle( lSparseAxisNames[d], lSparseAxisNames[d] );
+        }
+
+
+        delete [] lSparseBins;
+        delete [] lSparseXmin;
+        delete [] lSparseXmax;
+        delete [] lSparseAxisNames;
+
+
+        fOutList->Add(fHistSparseDimensionLabeling);
+        fOutList->Add(fHistSparsePIDblocksLabeling);
+
+        //    bool useSparse = false;
+
+        // !!!!!! temp comment!
+        fOutList->Add(fHistClouds);
+    }
+
+
+    fHistNN = new TH2D("NN","NN",fMultBinsHor, lowMultHor, hiMultHor,fMultBinsVert, lowMultVert, hiMultVert );
+    fHistPtN = new TH2D("PtN","PtN",fMultBinsHor, lowMultHor, hiMultHor,fPtBins/* /fPtHistXaxisRebinFactor*/,fLoPt,fHiPt);
+    fHistPtPt = new TH2D("PtPt","PtPt",fPtBins/fPtHistXaxisRebinFactor,fLoPt,fHiPt,fPtBins,fLoPt,fHiPt);
+    fProfNberr = new TProfile("nber","nber",fMultBinsHor, lowMultHor, hiMultHor);
+    fProfNberrPtPt = new TProfile("nberPtPt","nberPtPt",fPtBins/fPtHistXaxisRebinFactor,fLoPt,fHiPt);
+    fProfdPtB = new TProfile("dPtB","Overal multievent Pt_Backward (first bin) Pt_Backward^2 (sec. bin) ",16,0.5,16.5);
+    fProfTestLRC = new TProfile("TestLRC","Test LRC calculaion via TProfile",fMultBinsHor, lowMultHor, hiMultHor);
+
+    fHistNfCentrality = new TH2D("NfCentrality","NfCentrality",fMultBinsHor, lowMultHor, hiMultHor,101,-1.01,100.01);
+    fHistDifferenceNf = new TH2D("fHistDifferenceNf","Hist nF-nB;nF;nF-nB",fMultBinsHor, lowMultHor, hiMultHor,fMultBinsHor,-hiMultHor,hiMultHor);
+    fHistDifferenceNb = new TH2D("fHistDifferenceNb","Hist nB-nF;nB;nB-nF",fMultBinsVert, lowMultVert, hiMultVert,fMultBinsVert,-hiMultVert,hiMultVert);
+
+    // ---------- Adding data members to output list
+
+    // Adding overal statistics
+
+    //commented: to save memory
+    //fOutList->Add(fHistPt);
+    //fOutList->Add(fHistEta);
+
+    //Adding LRC hists
+
+    
+    if (1)
+    {
+        fOutList->Add(fHistNN);
+        fOutList->Add(fHistPtN);
+        fOutList->Add(fHistPtPt);
+    }
+    fOutList->Add(fProfNberr);
+    fOutList->Add(fProfNberrPtPt);
+    fOutList->Add(fProfdPtB);
+    fOutList->Add(fProfTestLRC);
+
+
+    //Adding window statistics
+    
+
+
+    fOutList->Add(fHistNchForward);
+    fOutList->Add(fHistNchBackward);
+    fOutList->Add(fHistNchForwardPtPt);
+
+    fOutList->Add(fHistPtForward);
+    fOutList->Add(fHistPtBackward);
+
+    fOutList->Add(fHistEtaForward);
+    fOutList->Add(fHistEtaBackward);
+
+    fOutList->Add(fHistPhiForward);
+    fOutList->Add(fHistPhiBackward);
+
+    fOutList->Add(fHistTracksChargeForward);
+    fOutList->Add(fHistTracksChargeBackward);
+
+    fOutList->Add(fHistTestPIDForward);
+    fOutList->Add(fHistTestPIDBackward);
+
+    //    fOutList->Add(fHistNfCentrality);
+    
+    
+    //fOutList->Add(fHistDifferenceNf);
+    //fOutList->Add(fHistDifferenceNb);
+
+    // Adding status to dPtB
+
+    fProfdPtB->Fill(3 , fStartForwardETA);
+    fProfdPtB->Fill(4 , fEndForwardETA);
+    fProfdPtB->Fill(5 , fStartBackwardETA);
+    fProfdPtB->Fill(6 , fEndBackwardETA);
+    fProfdPtB->Fill(7 , fStartForwardPhi);
+    fProfdPtB->Fill(8 , fEndForwardPhi);
+    fProfdPtB->Fill(9 , fStartBackwardPhi);
+    fProfdPtB->Fill(10 , fEndBackwardPhi);
+
+
+
+
+    fIsOnline = kTRUE;
+    return kTRUE;
+}
+AliLRCProcess::~AliLRCProcess()
+{
+    //Destructor
+
+}
+
+// ---------------------------------------  Setters ------------------
+void AliLRCProcess::SetShortDef()
+{
+    // Creating task and output container name
+    char str[200];
+    snprintf(str,200, "TaskLRCw%3.1fto%3.1fvs%3.1fto%3.1f",fStartForwardETA,fEndForwardETA,fStartBackwardETA,fEndBackwardETA);
+    /*if ( fWhichParticleToProcess != kLRCany
+        && (int)fWhichParticleToProcess > 0 && (int)fWhichParticleToProcess <= 6 ) //to avoid program falling
+    {
+        char str2[80];
+        TString gBinParticleNames[6] = {"Other","Electron","Muon","Pion","Kaon", "Proton"};
+        snprintf(str2,80, "%s_%s",str,gBinParticleNames[(int)fWhichParticleToProcess].Data());
+        fShortDef= str2;
+    }
+    else*/
+    fShortDef= str;
+
+}
+
+void AliLRCProcess::SetForwardWindow(Double_t StartETA,Double_t EndETA)
+{
+    //setter for the forward eta window
+    fStartForwardETA=StartETA;
+    fEndForwardETA=EndETA;
+    SetShortDef();
+}
+void AliLRCProcess::SetBackwardWindow(Double_t StartETA,Double_t EndETA)
+{
+    //setter for the backward eta window
+    fStartBackwardETA=StartETA;
+    fEndBackwardETA=EndETA;
+    SetShortDef();
+}
+void AliLRCProcess::SetETAWindows(Double_t _StartForwardETA,Double_t _EndForwardETA,Double_t _StartBakwardETA,Double_t _EndBakwardETA)
+{
+    //setter for the eta windows
+    fStartForwardETA=_StartForwardETA;
+    fEndForwardETA=_EndForwardETA;
+    fStartBackwardETA=_StartBakwardETA;
+    fEndBackwardETA=_EndBakwardETA;
+    SetShortDef();
+}
+void AliLRCProcess::GetETAWindows(Double_t &_StartForwardETA,Double_t &_EndForwardETA,Double_t &_StartBakwardETA,Double_t &_EndBakwardETA)
+{
+    //getter for the eta windows
+    _StartForwardETA    = fStartForwardETA;
+    _EndForwardETA      = fEndForwardETA;
+    _StartBakwardETA    = fStartBackwardETA;
+    _EndBakwardETA      = fEndBackwardETA;
+}
+
+void AliLRCProcess::GetPhiWindows(Double_t &_StartForwardPhi,Double_t &_EndForwardPhi,Double_t &_StartBakwardPhi,Double_t &_EndBakwardPhi)
+{
+    //getter for the eta windows
+    _StartForwardPhi    = fStartForwardPhi;
+    _EndForwardPhi      = fEndForwardPhi;
+    _StartBakwardPhi    = fStartBackwardPhi;
+    _EndBakwardPhi      = fEndBackwardPhi;
+}
+
+void AliLRCProcess::SetParticleType( char* strForwardOrBackward, char* strPid )
+{
+    //cout << "hm! strForwardOrBackward = " << strForwardOrBackward
+    // << ", strPid = " << strPid << endl;
+    //cout << "before ae! fPidForward = " << fPidForward << ", fPidBackward = " << fPidBackward << endl;
+
+    int lPid = -1;//kLRCany;
+    if ( !strcmp( strPid, "pion") )
+        lPid = 2;//kLRCpion;
+    else if ( !strcmp( strPid, "kaon") )
+        lPid = 3;//kLRCkaon;
+    else if ( !strcmp( strPid, "proton") )
+        lPid = 4;//kLRCproton;
+    else if ( !strcmp( strPid, "knownpid") )
+        lPid = 100;//will will histos if we KNOW PID! (not important which)
+
+    //set pid for window
+    if ( !strcmp( strForwardOrBackward, "fwd") )
+        fPidForward = lPid;
+    else if ( !strcmp( strForwardOrBackward, "bkwd") )
+        fPidBackward = lPid;
+    //cout << "ae! lPid = " << lPid << ", fPidForward = " << fPidForward << ", fPidBackward = " << fPidBackward << endl;
+    //int aaaa;
+    //cin>> aaaa;
+}
+
+
+void AliLRCProcess::SetHistPtRangeForwardWindowRebinFactor( Int_t ptHistXaxisRebinFactor )
+{
+    // Rebining for Pt histograms X-axis
+    if(fIsOnline)
+    {
+        Printf("Can't change histos paramiters after InitDataMembers() was called! \n");
+        return ;
+    }
+    fPtHistXaxisRebinFactor = ptHistXaxisRebinFactor;
+}
+
+void AliLRCProcess::SetHistPtRange(Double_t LoPt,Double_t HiPt,Int_t PtBins)
+{
+    // Sets Pt range and number of bins for Pt axis of histos
+    if(fIsOnline)
+    {
+        Printf("Can't change histos paramiters after InitDataMembers() was called! \n");
+        return ;
+    }
+    // Setter for Pt range and N bins in histos
+    fLoPt=LoPt;
+    fHiPt=HiPt;
+    fPtBins=PtBins;
+}
+void AliLRCProcess::SetHistMultRange( Int_t whichWindow, Int_t LoMult,Int_t HiMult,Int_t MultBins)
+{
+    // Setter for multiplicity range and N bins in histos
+    if ( whichWindow == 0 ) //set range for both windows
+    {
+        SetHistMultRangeHor( LoMult, HiMult, MultBins) ;
+        SetHistMultRangeVert( LoMult, HiMult, MultBins) ;
+    }
+    else if ( whichWindow == 1 ) //for fwd
+        SetHistMultRangeHor( LoMult, HiMult, MultBins) ;
+    else if ( whichWindow == 2 ) //for bwd
+        SetHistMultRangeVert( LoMult, HiMult, MultBins) ;
+    /*
+
+    if(fIsOnline)
+    {
+        Printf("Can't change histos paramiters after InitDataMembers() was called! \n");
+        return ;
+    }
+    fLoMult=LoMult;
+    fHiMult=HiMult;
+    if(!MultBins)
+    {
+    fMultBins=fHiMult-fLoMult+1;
+    }else
+    {
+    fMultBins=MultBins;
+    }*/
+}
+
+void AliLRCProcess::SetHistMultRangeHor(Int_t LoMult,Int_t HiMult,Int_t MultBins)
+{
+    // Setter for multiplicity range and N bins in histos
+    if(fIsOnline)
+    {
+        Printf("Can't change histos paramiters after InitDataMembers() was called! \n");
+        return ;
+    }
+    fLowMultHor        = LoMult;
+    fHiMultHor         = HiMult;
+    if(!MultBins)
+    {
+        fMultBinsHor = fHiMultHor-fLowMultHor+1;
+    }else
+    {
+        fMultBinsHor = MultBins;
+    }
+}
+
+void AliLRCProcess::SetHistMultRangeVert(Int_t LoMult,Int_t HiMult,Int_t MultBins)
+{
+    // Setter for multiplicity range and N bins in histos
+    if(fIsOnline)
+    {
+        Printf("Can't change histos parameters after InitDataMembers() was called! \n");
+        return ;
+    }
+    fLowMultVert       = LoMult;
+    fHiMultVert        = HiMult;
+    if(!MultBins)
+    {
+        fMultBinsVert = fHiMultVert-fLowMultVert+1;
+    }else
+    {
+        fMultBinsVert = MultBins;
+    }
+}
+
+void AliLRCProcess::SetOutputSlotNumber(Int_t SlotNumber)
+{
+    //Sets number of output slot for LRCProcessor
+    fOutputSlot=SlotNumber;
+}
+
+//________________________________________________________________________
+
+
+
+TList*   AliLRCProcess::CreateOutput() const
+{
+    // Creates a link to output data TList
+    return fOutList;
+}
+
+TString  AliLRCProcess::GetShortDef() const
+{
+    return fShortDef;
+}
+
+Int_t AliLRCProcess::GetOutputSlotNumber() const
+{
+    // Returns number of output slot for LRCProcessor
+    return fOutputSlot;
+}
+
+void AliLRCProcess::StartEvent()
+{
+    // Open new Event for track by track event import
+    if(fIsEventOpend)                     // Check if trying to open event more than once !
+    {
+        Printf("Event is already opened! Auto finishing ! \n");
+//        cout<<fShortDef<<": event count = "<<fEventCount<<" ";
+        Printf("NchF = %i,NchB = %i \n",fNchFw,fNchBw);
+
+        FinishEvent();
+    }
+    if(!fIsOnline)                        // Autocreating histos if InitDataMembers was not called by hand
+    {
+        Printf("InitDataMembers was not called by hand ! Autocreating histos...\n");
+        InitDataMembers();
+    }
+
+    fNchFw=0;
+    fSumPtFw=0;
+    fNchBw=0;
+    fSumPtBw=0;
+    fSumPtBw2=0;
+    
+    fNchFwPlus = 0;
+    fNchBwPlus = 0;
+    fNchFwMinus = 0;
+    fNchBwMinus = 0;
+    
+    ZeroPidArrays();
+        
+    //fNchFwPtPt = 0;
+
+    fIsEventOpend=kTRUE;
+}
+void AliLRCProcess::AddTrackForward(Double_t Pt, Double_t Eta ,Double_t Phi, Short_t Charge, Int_t particleType  )
+{
+    // Imports track to the event directly to Forward window
+    if(!fIsEventOpend)
+    {Printf("Event is not opened!\n");
+        return;}
+
+    //Bool_t lAddDecision = kFALSE;
+
+    //if ( fPidForward == 100 ) //add particle if we know pid (i.e. particleType != -1)
+    //{
+    //if ( particleType != -1 )
+    //{
+    // lAddDecision = kTRUE;
+    //cout << "fill fwd with pid " << particleType << endl;
+    //}
+    //}
+    //else if ( fPidForward != -1 ) //if we specify pid for this window - just check it
+    //{
+    //if ( particleType == fPidForward )
+    //{
+    //lAddDecision = kTRUE;
+    //cout << "fill fwd with pid " << particleType << endl;
+    //}
+    //}
+    //else
+    //lAddDecision = kTRUE;
+
+    //if ( !lAddDecision )
+    //return;
+
+    fHistTestPIDForward->Fill( particleType );
+
+    fNchFw++;
+    Charge > 0 ? fNchFwPlus++ : fNchFwMinus++;
+    fSumPtFw+=Pt;
+    fHistPtForward->Fill(Pt);
+    fHistEtaForward->Fill(Eta);
+    fHistPhiForward->Fill(Phi);
+
+    //added 15.12.12
+    fHistTracksChargeForward->Fill(Charge);
+    
+    //added 23.03
+    for ( int pid = 0; pid < kSparsePIDtotal; pid++ )
+    {
+        if (   pid == kSparsePIDany //write ALL pid types
+               ||
+               ( pid == kSparsePIDdefined && particleType != -1 ) //write defined particles
+               ||
+               ( fCorrespondanceWithAliROOTpid[pid] == particleType ) //write not defined particles
+               )
+        {
+            fNchFwPID[pid]++;
+            Charge > 0 ? fNchFwPlusPID[pid]++ : fNchFwMinusPID[pid]++;
+            fSumPtFwPID[pid] += Pt;
+            if ( pid != kSparsePIDany )
+            {
+                Double_t lMass = 0;//AliPID::ParticleMass( particleType );
+                fSumEtFwPID[pid] += sqrt( Pt*Pt + lMass*lMass ) ;
+            }
+        }
+    }
+
+    //netcharge part (July 2013)
+    fHistNetChargeVsPtForward->Fill( Pt, Charge );
+    if ( Charge > 0 )
+        fHistPtPlusForward->Fill( Pt );
+    else if ( Charge < 0 )
+        fHistPtMinusForward->Fill( Pt );
+
+
+}
+void AliLRCProcess::AddTrackBackward(Double_t Pt, Double_t Eta ,Double_t Phi, Short_t Charge, Int_t particleType  )
+{
+    // Imports track to the event directly to Backward window
+    if(!fIsEventOpend)
+    {Printf("Event is not opened!\n");
+        return;}
+
+    /*Bool_t lAddDecision = kFALSE;
+
+    if ( fPidBackward == 100 ) //add particle if we know pid (i.e. particleType != -1)
+    {
+        if ( particleType != -1 )
+        {
+            lAddDecision = kTRUE;
+            //cout << "fill fwd with pid " << particleType << endl;
+        }
+    }
+    else if ( fPidBackward != -1 ) //if we specify pid for this window - just check it
+    {
+        if ( particleType == fPidBackward )
+        {
+            lAddDecision = kTRUE;
+            //cout << "fill fwd with pid " << particleType << endl;
+        }
+    }
+    else
+        lAddDecision = kTRUE;
+
+    if ( !lAddDecision )
+        return;
+        */
+    fHistTestPIDBackward->Fill( particleType );
+
+    fNchBw++;
+    Charge > 0 ? fNchBwPlus++ : fNchBwMinus++;
+    fSumPtBw += Pt;
+    fSumPtBw2 += Pt*Pt;
+    fProfdPtB->Fill( 1, Pt );
+    fProfdPtB->Fill( 2, Pt*Pt );
+    fHistPtBackward->Fill( Pt );
+    fHistEtaBackward->Fill( Eta );
+    fHistPhiBackward->Fill( Phi );
+
+    //added 15.12.12
+    fHistTracksChargeBackward->Fill(Charge);
+
+    //added 23.03
+    for ( int pid = 0; pid < kSparsePIDtotal; pid++ )
+    {
+        if (   pid == kSparsePIDany //write ALL pid types
+               ||
+               ( pid == kSparsePIDdefined && particleType != -1 ) //write defined particles
+               ||
+               ( fCorrespondanceWithAliROOTpid[pid] == particleType )
+               )
+        {
+            fNchBwPID[pid]++;
+            Charge > 0 ? fNchBwPlusPID[pid]++ : fNchBwMinusPID[pid]++;
+            fSumPtBwPID[pid] += Pt;
+            if ( pid != kSparsePIDany )
+            {
+                Double_t lMass = 0;//AliPID::ParticleMass( particleType );
+                fSumEtBwPID[pid] += sqrt( Pt*Pt + lMass*lMass ) ;
+            }
+            
+        }
+    }
+
+    //netcharge part (July 2013)
+    fHistNetChargeVsPtBackward->Fill( Pt, Charge );
+    if ( Charge > 0 )
+        fHistPtPlusBackward->Fill( Pt );
+    else if ( Charge < 0 )
+        fHistPtMinusBackward->Fill( Pt );
+
+}
+
+
+
+void AliLRCProcess::AddTrackPtEta(Double_t Pt, Double_t Eta ,Double_t Phi, Short_t Charge, Int_t particleType  )
+{
+    //cout << Pt << endl;
+
+
+    //if particle type is different - ignore the track
+    //if ( fWhichParticleToFill != -1 && ParticleType != fWhichParticleToFill )
+    // return;
+    //Track by track event import :  Imports track to the event
+
+    //cout << "fWhichParticleToProcess = " << fWhichParticleToProcess
+    // << ", particleType = " << particleType << endl;
+    if(!fIsEventOpend)
+    {Printf("Event is not opened!\n");
+        return;}
+
+    //  Global track data
+    fHistPt->Fill(Pt);
+    fHistEta->Fill(Eta);
+
+    //Bool_t lAddForwardDecision = kFALSE;
+    //Bool_t lAddBackwardDecision = kFALSE;
+
+    //Forward window
+    if( ( fStartForwardETA < Eta ) && ( Eta < fEndForwardETA ) )
+        if( IsPhiInRange( Phi, fStartForwardPhi, fEndForwardPhi) )//( fStartForwardPhi < Phi ) && ( Phi < fEndForwardPhi ) )
+        {
+            AddTrackForward( Pt, Eta, Phi, Charge, particleType );
+            //if ( fPidFillCondition == kLRCpidForForwardOnly
+            // || fPidFillCondition == kLRCpidForBoth )
+            //if ( fPidForward != -1 )//kLRCany )
+            //{
+            // if ( particleType == fPidForward )//kLRCpion )//particleType )
+            // {
+            //         lAddForwardDecision = kTRUE;//AddTrackForward( Pt, Eta, Phi );
+            //cout << "fill fwd with pid " << particleType << endl;
+            // }
+            //}
+            //else
+            // lAddForwardDecision = kTRUE;//AddTrackForward( Pt, Eta, Phi );
+        }
+    //if ( lAddForwardDecision )
+    //{
+    // AddTrackForward( Pt, Eta, Phi, particleType );
+    // fHistTestPIDForward->Fill( particleType );
+    //}
+
+    //Backward window
+    if( ( fStartBackwardETA < Eta ) && ( Eta < fEndBackwardETA ) )
+        if (
+                (
+                    IsPhiInRange( Phi, fStartBackwardPhi, fEndBackwardPhi)  //( fStartBackwardPhi < Phi ) && ( Phi < fEndBackwardPhi )
+                    )
+                ||
+                (
+                    fDoubleSidedBackwardPhiWindow //if this option is true
+                    && IsPhiInRange( Phi, fStartBackwardPhi + TMath::Pi(), fEndBackwardPhi + TMath::Pi() )  //
+                    //&& ( fStartBackwardPhi + TMath::Pi() < Phi )
+                    //&& ( Phi < fEndBackwardPhi + TMath::Pi() )
+                    )
+                )
+        {
+            AddTrackBackward( Pt, Eta, Phi, Charge, particleType );
+            //if ( fPidFillCondition == kLRCpidForBackwardOnly
+            // || fPidFillCondition == kLRCpidForBoth )
+            //if ( fPidBackward != -1 )//kLRCany )
+            //{
+            // if ( particleType == fPidBackward )//kLRCpion )//particleType )
+            // {
+            //         lAddBackwardDecision = kTRUE;//AddTrackBackward( Pt, Eta, Phi );
+            //cout << "fill bkwd with pid " << particleType << endl;
+            // }
+
+            //}
+            //else
+            // lAddBackwardDecision = kTRUE;//AddTrackBackward( Pt, Eta, Phi );
+        }
+    //if ( lAddBackwardDecision )
+    //{
+    // AddTrackBackward( Pt, Eta, Phi, particleType );
+    // fHistTestPIDBackward->Fill( particleType );
+    //}
+
+}
+
+
+
+void AliLRCProcess::AddTrackPtEtaMixing( Int_t winFB, Double_t Pt, Double_t Eta ,Double_t Phi, Short_t Charge, Int_t particleType  )
+{
+    // put track in F or B window using varible winFB
+    if(!fIsEventOpend)
+    {
+        Printf("Event is not opened!\n");
+        return;
+    }
+
+    //  Global track data
+    fHistPt->Fill(Pt);
+    fHistEta->Fill(Eta);
+
+
+    //Forward window
+    if( winFB == 0
+            && ( fStartForwardETA < Eta ) && ( Eta < fEndForwardETA ) )
+        if( IsPhiInRange( Phi, fStartForwardPhi, fEndForwardPhi) ) // (fStartForwardPhi < Phi ) && ( Phi < fEndForwardPhi ) )
+        {
+            AddTrackForward( Pt, Eta, Phi, Charge, particleType );
+        }
+
+    //Backward window
+    if( winFB == 1
+            && ( fStartBackwardETA < Eta ) && ( Eta < fEndBackwardETA ) )
+        if (
+                (
+                    IsPhiInRange( Phi, fStartBackwardPhi, fEndBackwardPhi)  //( fStartBackwardPhi < Phi ) && ( Phi < fEndBackwardPhi )
+                    )
+                ||
+                (
+                    fDoubleSidedBackwardPhiWindow //if this option is true
+                    && IsPhiInRange( Phi, fStartBackwardPhi + TMath::Pi(), fEndBackwardPhi + TMath::Pi() )
+                    //&& ( fStartBackwardPhi + TMath::Pi() < Phi )
+                    //&& ( Phi < fEndBackwardPhi + TMath::Pi() )
+                    )
+                )
+        {
+            AddTrackBackward( Pt, Eta, Phi, Charge, particleType );
+        }
+
+
+}
+
+void AliLRCProcess::FinishEvent(Bool_t kDontCount)
+{
+    // Track by track event import : Close opened event and fill event summary histos
+
+    if(!fIsEventOpend)
+    {
+        Printf("Event is not opened!\n");
+        return;
+    }
+    if ( kDontCount ) //don't count this event! just ignore it
+    {
+        fIsEventOpend = kFALSE;
+        return;
+    }
+    //fHistSparseDimensionLabeling->Fill(1);
+    //Filling even-total data
+    //cout << "filling" << endl;
+    /*Double_t lCloudData[en_sparse_total*en_sparse_PID_total];
+    lCloudData[en_sparse_N_f] = fNchFw;     //write Nf
+    lCloudData[en_sparse_N_b] = fNchBw;     //write Nb
+    lCloudData[en_sparse_N2_f] = fNchFw*fNchFw;     //write Nf^2
+    lCloudData[en_sparse_Nf_Nb] = fNchFw*fNchBw;     //write Nb
+    
+    lCloudData[en_sparse_Pt_f] = 0; //fill bin 0, if don't have appropriate PtSum
+    lCloudData[en_sparse_Pt_b] = 0; //fill bin 0, if don't have appropriate PtSum
+
+    lCloudData[en_sparse_Nf_plus] = fNchFwPlus;
+    lCloudData[en_sparse_Nf_minus] = fNchFwMinus;
+    lCloudData[en_sparse_Nb_plus] = fNchBwPlus;
+    lCloudData[en_sparse_Nb_minus] = fNchBwMinus;
+    lCloudData[en_sparse_Nf_plus_Nb_minus] = fNchFwPlus * fNchBwMinus;
+    lCloudData[en_sparse_Nb_plus_Nf_minus] = fNchBwPlus * fNchFwMinus; */
+    
+    fHistNN->Fill(fNchFw,fNchBw);
+
+    if ( fUseAccumulatingHist )
+    {
+        fArrAccumulatedValues->Fill( en_arr_labels_NN_Nevents,   1                  );
+        fArrAccumulatedValues->Fill( en_arr_labels_NN_Nf     ,   fNchFw             );
+        fArrAccumulatedValues->Fill( en_arr_labels_NN_Nb     ,   fNchBw             );
+        fArrAccumulatedValues->Fill( en_arr_labels_NN_N2_f   ,   fNchFw*fNchFw      );
+        fArrAccumulatedValues->Fill( en_arr_labels_NN_Nf_Nb  ,   fNchFw*fNchBw      );
+        fArrAccumulatedValues->Fill( en_arr_labels_NN_N2_b   ,   fNchBw*fNchBw      );
+    }
+
+    if( fNchBw != 0 )
+    {
+        fSumPtBw = fSumPtBw / fNchBw;
+        //lCloudData[en_sparse_Pt_b] = fSumPtBw; //write <PtB>
+        fProfTestLRC->Fill( fNchFw, fSumPtBw );
+        fHistPtN->Fill( fNchFw, fSumPtBw );
+        //cout << "fill PtN: fNchFw = " << fNchFw << ", fSumPtBw=" << fSumPtBw <<  endl;
+        fProfNberr->Fill(fNchFw, 1.0 / fNchBw);
+
+        if ( fUseAccumulatingHist )
+        {
+            fArrAccumulatedValues->Fill( en_arr_labels_PtN_Nevents,  1                  );
+            fArrAccumulatedValues->Fill( en_arr_labels_PtN_Nf     ,  fNchFw             );
+            fArrAccumulatedValues->Fill( en_arr_labels_PtN_PtB    ,  fSumPtBw           );
+            fArrAccumulatedValues->Fill( en_arr_labels_PtN_N2_f   ,  fNchFw*fNchFw      );
+            fArrAccumulatedValues->Fill( en_arr_labels_PtN_Ptb_Nf ,  fSumPtBw*fNchFw    );
+        }
+
+        if( fNchFw != 0 )
+        {
+            fSumPtFw = fSumPtFw / fNchFw;
+            //lCloudData[en_sparse_Pt_f] = fSumPtFw; //write <PtF>
+            fHistPtPt->Fill( fSumPtFw, fSumPtBw );
+            fProfNberrPtPt->Fill( fSumPtFw, 1.0 / fNchBw );
+            // dPtB for PtPt
+            fProfdPtB->Fill( 15, fSumPtBw, fNchBw );
+            fProfdPtB->Fill( 16, fSumPtBw2 / fNchBw, fNchBw );
+            fHistNchForwardPtPt->Fill(fNchFw);
+
+            if ( fUseAccumulatingHist )
+            {
+                fArrAccumulatedValues->Fill( en_arr_labels_PtPt_Nevents,   1                   );
+                fArrAccumulatedValues->Fill( en_arr_labels_PtPt_PtF    ,   fSumPtFw            );
+                fArrAccumulatedValues->Fill( en_arr_labels_PtPt_PtB    ,   fSumPtBw            );
+                fArrAccumulatedValues->Fill( en_arr_labels_PtPt_Pt2_f  ,   fSumPtFw*fSumPtFw   );
+                fArrAccumulatedValues->Fill( en_arr_labels_PtPt_Ptf_Ptb,   fSumPtBw*fSumPtFw   );
+            }
+
+        }
+    }
+
+
+
+
+
+    if ( fUseSparse )
+    {
+        Double_t lCloudData[kSparseTotal*kSparsePIDtotal];
+
+        for (Int_t d = 0; d < kSparsePIDtotal; ++d)
+        {
+            Int_t binShift = kSparseTotal*d; //step over dimension set
+
+            lCloudData[kSparseNf + binShift ] = fNchFwPID[d];     //write Nf
+            lCloudData[kSparseNb + binShift ] = fNchBwPID[d];     //write Nb
+            lCloudData[en_sparse_N2_f + binShift ] = fNchFwPID[d]*fNchFwPID[d];     //write Nf^2
+            lCloudData[en_sparse_Nf_Nb + binShift ] = fNchFwPID[d]*fNchBwPID[d];     //write Nb
+
+            lCloudData[kSparsePtF + binShift ] = 0; //fill bin 0, if don't have appropriate PtSum
+            lCloudData[kSparsePtB + binShift ] = 0; //fill bin 0, if don't have appropriate PtSum
+
+            lCloudData[en_sparse_Ptb_Nf + binShift ] = 0;
+            lCloudData[en_sparse_Pt2_f + binShift ] = 0;
+            lCloudData[en_sparse_Ptf_Ptb + binShift ] = 0;
+
+
+            if( fNchBwPID[d] != 0 )
+            {
+                double lSumPtBwPID = fSumPtBwPID[d] / fNchBwPID[d];
+                lCloudData[kSparsePtB + binShift ] = lSumPtBwPID; //write <PtB>
+
+                fSumEtBwPID[d] = fSumEtBwPID[d] / fNchBwPID[d];
+                //lCloudData[en_sparse_Et_b + binShift ] = fSumEtBwPID[d]; //write <PtB>
+                lCloudData[en_sparse_Ptb_Nf + binShift ] = lSumPtBwPID * fNchFwPID[d];
+
+                //fProfTestLRC->Fill( fNchFw, fSumPtBw );
+                //fHistPtN->Fill( fNchFw, fSumPtBw );
+                //cout << "fill PtN: fNchFw = " << fNchFw << ", fSumPtBw=" << fSumPtBw <<  endl;
+
+                //fProfNberr->Fill(fNchFw, 1.0 / fNchBw);
+
+
+                if( fNchFwPID[d] != 0 )
+                {
+                    double lSumPtFwPID = fSumPtFwPID[d] / fNchFwPID[d];
+                    lCloudData[kSparsePtF + binShift ] = lSumPtFwPID; //write <PtF>
+
+                    fSumEtFwPID[d] = fSumEtFwPID[d] / fNchFwPID[d];
+
+                    lCloudData[en_sparse_Pt2_f + binShift ] = lSumPtFwPID * lSumPtFwPID;
+                    lCloudData[en_sparse_Ptf_Ptb + binShift ] = lSumPtFwPID*lSumPtBwPID;
+
+                    //lCloudData[en_sparse_Et_f + binShift ] = fSumEtFwPID[d]; //write <PtF>
+                    //fHistPtPt->Fill( fSumPtFw, fSumPtBw );
+                    //fProfNberrPtPt->Fill( fSumPtFw, 1.0 / fNchBw );
+                    // dPtB for PtPt
+                    //fProfdPtB->Fill( 15, fSumPtBw, fNchBw );
+                    //fProfdPtB->Fill( 16, fSumPtBw2 / fNchBw, fNchBw );
+                    //fHistNchForwardPtPt->Fill(fNchFw);
+
+                }
+            }
+            /*
+            lCloudData[en_sparse_Nf_plus + binShift ] = fNchFwPlusPID[d];
+            lCloudData[en_sparse_Nf_minus + binShift ] = fNchFwMinusPID[d];
+            lCloudData[en_sparse_Nb_plus + binShift ] = fNchBwPlusPID[d];
+            lCloudData[en_sparse_Nb_minus + binShift ] = fNchBwMinusPID[d];
+            lCloudData[en_sparse_Nf_plus_Nb_minus + binShift ] = fNchFwPlusPID[d] * fNchBwMinusPID[d];
+            lCloudData[en_sparse_Nb_plus_Nf_minus + binShift ] = fNchBwPlusPID[d] * fNchFwMinusPID[d];
+             */
+        }
+
+        //tmp (22.03): fill pid with fignya data
+        /* for (Int_t d = 1; d < en_sparse_PID_total; ++d)
+        {
+            Int_t binShift = en_sparse_total*d;
+            lCloudData[en_sparse_N_f + binShift ] = 1+d;     //write Nf
+            lCloudData[en_sparse_N_b + binShift ] = 2+d;     //write Nb
+            lCloudData[en_sparse_N2_f + binShift ] = 3+d;     //write Nf^2
+            lCloudData[en_sparse_Nf_Nb + binShift ] = 4+d;     //write Nb
+
+            lCloudData[en_sparse_Pt_f + binShift ] = 5+d; //fill bin 0, if don't have appropriate PtSum
+            lCloudData[en_sparse_Pt_b + binShift ] = 6+d; //fill bin 0, if don't have appropriate PtSum
+
+            lCloudData[en_sparse_Nf_plus + binShift ] = 7+d;
+            lCloudData[en_sparse_Nf_minus + binShift ] = 8+d;
+            lCloudData[en_sparse_Nb_plus + binShift ] = 9+d;
+            lCloudData[en_sparse_Nb_minus + binShift ] = 10+d;
+            lCloudData[en_sparse_Nf_plus_Nb_minus + binShift ] = 11+d;
+            lCloudData[en_sparse_Nb_plus_Nf_minus + binShift ] = 12+d;
+        }
+    */
+
+        //    cout << "before filling" << endl;
+        fHistClouds->Fill( lCloudData ); //fill sparse hist with Nf, Nb, <PtF>, <PtB>
+        //        cout << "filled." << endl;
+    }
+
+
+
+
+    //additional info-hist
+    if ( fNchFw > 0 || fNchBw > 0 )
+    {
+        Double_t lAvMult = ( fNchFw + fNchBw ) / 2.;
+        fHistDifferenceNf->Fill( fNchFw, ( fNchFw-fNchBw ) / lAvMult );
+        fHistDifferenceNb->Fill( fNchBw, ( fNchBw-fNchFw ) / lAvMult);
+    }
+
+    //cout << "n particles: " << fNchFw << " , Back = " << fNchBw << endl;
+    //cout << "fHistNN: " << fHistNN->GetEntries() <<  endl;
+    //cout << "mean= " << fHistNN->GetMean() <<  endl;
+
+
+    fHistNchForward->Fill(fNchFw);
+    fHistNchBackward->Fill(fNchBw);
+
+    fEventCount++;
+    fIsEventOpend = kFALSE;
+    
+    //fill nf-centr plot
+    fHistNfCentrality->Fill( fNchFw, fEventCentrality );
+    
+    //cout<<fShortDef<<": event count = "<<fEventCount<<" ";
+    //  Printf("NchF = %i,NchB = %i",fNchFw,fNchBw);
+}
+
+Bool_t AliLRCProcess::IsPhiInRange( Double_t phi, Double_t phiBoundMin, Double_t phiBoundMax )
+{
+    if ( ( phiBoundMin < phi ) && ( phi < phiBoundMax ) )
+        return kTRUE;
+
+    //when bound is more than 2pi - check phi+2pi!
+    phi += 2 * TMath::Pi();
+    if ( ( phiBoundMin < phi ) && ( phi < phiBoundMax ) )
+        return kTRUE;
+
+    return kFALSE; //phi not in range
+}
+
+void AliLRCProcess::SetCorrespondanceWithAliROOTpid()
+{
+    fCorrespondanceWithAliROOTpid[kSparsePIDany] = kSparsePIDany;
+    fCorrespondanceWithAliROOTpid[kSparsePIDdefined] = -1000;
+    fCorrespondanceWithAliROOTpid[kSparsePIDpion] = 2;
+    fCorrespondanceWithAliROOTpid[kSparsePIDkaon] = 3;
+    fCorrespondanceWithAliROOTpid[kSparsePIDproton] = 4;
+}
+
+void AliLRCProcess::ZeroPidArrays()
+{
+    //added 23.03
+    for ( int pid = 0; pid < kSparsePIDtotal; pid++ )
+    {
+        fNchFwPID[pid] = 0;
+        fNchFwPlusPID[pid] = 0;
+        fNchFwMinusPID[pid] = 0;
+        fSumPtFwPID[pid] = 0;
+        fSumEtFwPID[pid] = 0;
+
+        fNchBwPID[pid] = 0;
+        fNchBwPlusPID[pid] = 0;
+        fNchBwMinusPID[pid] = 0;
+        fSumPtBwPID[pid] = 0;
+        fSumEtBwPID[pid] = 0;
+    }
+}