Int_t dieleAna(TString inputlist, TString outfile, Int_t nev=-1, Int_t whichweight = 0)
{

    TH1::SetDefaultSumw2();
    TH3F *p3DEffEle[6][NWEIGHTS+1]; // mult bins, MLP weights + HC
    TH3F *p3DEffPos[6][NWEIGHTS+1];
    TH3F *p3DAccEle[6][NWEIGHTS+1];
    TH3F *p3DAccPos[6][NWEIGHTS+1];
    readAccEffMatrices(p3DAccEle, p3DAccPos, p3DEffEle, p3DEffPos);
    TH2F *smear_ele, *smear_pos;
    TFile *file_smear = new TFile("smearing_matrix.root","read");
    smear_ele = (TH2F*)file_smear->Get("smear_ele");
    smear_pos = (TH2F*)file_smear->Get("smear_pos");

    TRandom random;

/*
    TFile *pEffFile;

    pEffFile = new TFile("Input/EffMatrixMVA2RefAccNewCP_100Mio.root");
    if (pEffFile)
    {
	pEffFile->cd();
	for(Int_t i = 0 ; i < 5 ; i++){
            p3DEffEle[i][6] = (TH3F*) pEffFile->Get(Form("hHistEff3DMult%iNeg",i));
            p3DEffPos[i][6] = (TH3F*) pEffFile->Get(Form("hHistEff3DMult%iPos",i));
     //       p3DEffEle[i] = (TH3F*) pEffFile->Get("hHistEff3DNeg");
      //      p3DEffPos[i] = (TH3F*) pEffFile->Get("hHistEff3DPos");
        }
    }
    else
    {
	Error("DrawFromNtuple constructor","pointer to eff matrix file is NULL");
	for(Int_t i = 0 ; i < 5 ; i++){
	    p3DEffEle[i][6] = NULL;
	    p3DEffPos[i][6] = NULL;
        }
    }
*/

    TH1F *pEventClass;
    TH1F *pEventClass_recur;
    TFile *pEventClassFile;
//    pEventClassFile = new TFile("eventClass_mult_nonempty_4secmult_200fpj_wait.root");
//    pEventClassFile = new TFile("eventClass_target_mult_rplane_nonempty_4secmult.root");
    pEventClassFile = new TFile("eventClass_target_mult_rplane_minmom_nmix_w6.root");
    if (pEventClassFile) {
        pEventClass = (TH1F*)pEventClassFile->Get("eventClass");
        pEventClass_recur = (TH1F*)pEventClassFile->Get("eventClass_recur");
        if (pEventClass == NULL || pEventClass_recur == NULL) {
            Error("DrawFromNtuple constructor","Histogram not found in the event class file");
            exit (-1);
        }
    }    
    else {
        Error("DrawFromNtuple constructor","Event class file not found");
        exit (-1);
    }
    HLoop* loop = new HLoop(kTRUE);  // kTRUE : create Hades  (needed to work with standard eventstructure)
    TString readCategories = "";
    if (inputlist.EndsWith(".list")) {
        loop->addFilesList(inputlist);
    }
    else {
        loop->addMultFiles(inputlist);
    }
    if(!loop->setInput(readCategories)) { exit(1); }
    loop->printCategories();
    loop->readSectorFileList("FileListLepton.list");
    int sectors[6];

    HGeantKine *kine1;
    HGeantKine *kine2;

    HCategory* kineCat = (HCategory*)HCategoryManager::getCategory(catGeantKine);

    HHistMap hM(outfile.Data());
    hM.setSilentFail(kTRUE);

    //------------------------------------------------------------------
    //--------------- begin histo booking -----------------------------------------------------
    //------------------------------------------------------------------------------------------

    const Int_t nbins = 26;
    Double_t xAxis1[nbins+1] = {0, 0.010, 0.020, 0.030, 0.040, 0.050, 0.060, 0.070, 0.080, 0.090, 0.110, 0.130, 0.150, 0.170, 0.200, 0.250, 0.300, 0.350, 0.400, 0.450, 0.500, 0.550, 0.600, 0.700, 0.800, 0.900, 1.};

    hM.addHist(new TH1F(TString("hmassNP"),TString("hmassNP"),nbins,xAxis1));
    hM.addHist(new TH1F(TString("hmassPP"),TString("hmassPP"),nbins,xAxis1));
    hM.addHist(new TH1F(TString("hmassNN"),TString("hmassNN"),nbins,xAxis1));
    hM.addHist(new TH1F(TString("hoAngleNP"),TString("hoAngleNP"),2000,0,200));
    hM.addHist(new TH1F(TString("hoAnglePP"),TString("hoAnglePP"),2000,0,200));
    hM.addHist(new TH1F(TString("hoAngleNN"),TString("hoAngleNN"),2000,0,200));
    hM.addHist(new TH1F(TString("hyNP"),TString("hyNP"),100,0,2));
    hM.addHist(new TH1F(TString("hyPP"),TString("hyPP"),100,0,2));
    hM.addHist(new TH1F(TString("hyNN"),TString("hyNN"),100,0,2));
    hM.addHist(new TH1F(TString("hptNP"),TString("hptNP"),100,0,1000));
    hM.addHist(new TH1F(TString("hptPP"),TString("hptPP"),100,0,1000));
    hM.addHist(new TH1F(TString("hptNN"),TString("hptNN"),100,0,1000));
    hM.addHist(new TH2F(TString("hoAnglemassNP"),TString("hoAnglemassNP"),90,0,180,nbins,xAxis1));
    hM.addHist(new TH2F(TString("hoAnglemassPP"),TString("hoAnglemassPP"),90,0,180,nbins,xAxis1));
    hM.addHist(new TH2F(TString("hoAnglemassNN"),TString("hoAnglemassNN"),90,0,180,nbins,xAxis1));
    hM.addHist(new TH2F(TString("hoAngleptNP"),TString("hoAngleptNP"),90,0,180,120,0,1200));
    hM.addHist(new TH2F(TString("hoAngleptPP"),TString("hoAngleptPP"),90,0,180,120,0,1200));
    hM.addHist(new TH2F(TString("hoAngleptNN"),TString("hoAngleptNN"),90,0,180,120,0,1200));
    hM.addHist(new TH2F(TString("hmassptNP"),TString("hmassptNP"),nbins,xAxis1,120,0,1200));
    hM.addHist(new TH2F(TString("hmassptPP"),TString("hmassptPP"),nbins,xAxis1,120,0,1200));
    hM.addHist(new TH2F(TString("hmassptNN"),TString("hmassptNN"),nbins,xAxis1,120,0,1200));
    hM.addHist(new TH2F(TString("hoAngleyNP"),TString("hoAngleyNP"),90,0,180,100,0,2));
    hM.addHist(new TH2F(TString("hoAngleyPP"),TString("hoAngleyPP"),90,0,180,100,0,2));
    hM.addHist(new TH2F(TString("hoAngleyNN"),TString("hoAngleyNN"),90,0,180,100,0,2));
    hM.addHist(new TH2F(TString("hmassyNP"),TString("hmassyNP"),nbins,xAxis1,100,0,2));
    hM.addHist(new TH2F(TString("hmassyPP"),TString("hmassyPP"),nbins,xAxis1,100,0,2));
    hM.addHist(new TH2F(TString("hmassyNN"),TString("hmassyNN"),nbins,xAxis1,100,0,2));
    hM.addHist(new TH2F(TString("hptyNP"),TString("hptyNP"),120,0,1200,100,0,2));
    hM.addHist(new TH2F(TString("hptyPP"),TString("hptyPP"),120,0,1200,100,0,2));
    hM.addHist(new TH2F(TString("hptyNN"),TString("hptyNN"),120,0,1200,100,0,2));
    hM.addHist(new TH2F(TString("hth1th2NP"),TString("hth1th2NP"),90,0,90,90,0,90));
    hM.addHist(new TH2F(TString("hth1th2PP"),TString("hth1th2PP"),90,0,90,90,0,90));
    hM.addHist(new TH2F(TString("hth1th2NN"),TString("hth1th2NN"),90,0,90,90,0,90));
    hM.addHist(new TH2F(TString("hp1p2NP"),TString("hp1p2NP"),100,0,1100,100,0,1100));
    hM.addHist(new TH2F(TString("hp1p2PP"),TString("hp1p2PP"),100,0,1100,100,0,1100));
    hM.addHist(new TH2F(TString("hp1p2NN"),TString("hp1p2NN"),100,0,1100,100,0,1100));

    for (int i = 0; i < 5; ++i) {
        hM.addHist(new TH1F(TString("hmassNP_eff_multbin")+TString::Itoa(i,10),TString("hmassNP_eff_multbin")+TString::Itoa(i,10),nbins,xAxis1));
        hM.addHist(new TH1F(TString("hmassPP_eff_multbin")+TString::Itoa(i,10),TString("hmassPP_eff_multbin")+TString::Itoa(i,10),nbins,xAxis1));
        hM.addHist(new TH1F(TString("hmassNN_eff_multbin")+TString::Itoa(i,10),TString("hmassNN_eff_multbin")+TString::Itoa(i,10),nbins,xAxis1));
        hM.addHist(new TH1F(TString("hoAngleNP_eff_multbin")+TString::Itoa(i,10),TString("hoAngleNP_eff_multbin")+TString::Itoa(i,10),2000,0,200));
        hM.addHist(new TH1F(TString("hoAnglePP_eff_multbin")+TString::Itoa(i,10),TString("hoAnglePP_eff_multbin")+TString::Itoa(i,10),2000,0,200));
        hM.addHist(new TH1F(TString("hoAngleNN_eff_multbin")+TString::Itoa(i,10),TString("hoAngleNN_eff_multbin")+TString::Itoa(i,10),2000,0,200));
        hM.addHist(new TH1F(TString("hyNP_eff_multbin")+TString::Itoa(i,10),TString("hyNP_eff_multbin")+TString::Itoa(i,10),100,0,2));
        hM.addHist(new TH1F(TString("hyPP_eff_multbin")+TString::Itoa(i,10),TString("hyPP_eff_multbin")+TString::Itoa(i,10),100,0,2));
        hM.addHist(new TH1F(TString("hyNN_eff_multbin")+TString::Itoa(i,10),TString("hyNN_eff_multbin")+TString::Itoa(i,10),100,0,2));
        hM.addHist(new TH1F(TString("hptNP_eff_multbin")+TString::Itoa(i,10),TString("hptNP_eff_multbin")+TString::Itoa(i,10),100,0,1000));
        hM.addHist(new TH1F(TString("hptPP_eff_multbin")+TString::Itoa(i,10),TString("hptPP_eff_multbin")+TString::Itoa(i,10),100,0,1000));
        hM.addHist(new TH1F(TString("hptNN_eff_multbin")+TString::Itoa(i,10),TString("hptNN_eff_multbin")+TString::Itoa(i,10),100,0,1000));
        hM.addHist(new TH2F(TString("hoAnglemassNP_eff_multbin")+TString::Itoa(i,10),TString("hoAnglemassNP_eff_multbin")+TString::Itoa(i,10),90,0,180,nbins,xAxis1));
        hM.addHist(new TH2F(TString("hoAnglemassPP_eff_multbin")+TString::Itoa(i,10),TString("hoAnglemassPP_eff_multbin")+TString::Itoa(i,10),90,0,180,nbins,xAxis1));
        hM.addHist(new TH2F(TString("hoAnglemassNN_eff_multbin")+TString::Itoa(i,10),TString("hoAnglemassNN_eff_multbin")+TString::Itoa(i,10),90,0,180,nbins,xAxis1));
        hM.addHist(new TH2F(TString("hoAngleptNP_eff_multbin")+TString::Itoa(i,10),TString("hoAngleptNP_eff_multbin")+TString::Itoa(i,10),90,0,180,120,0,1200));
        hM.addHist(new TH2F(TString("hoAngleptPP_eff_multbin")+TString::Itoa(i,10),TString("hoAngleptPP_eff_multbin")+TString::Itoa(i,10),90,0,180,120,0,1200));
        hM.addHist(new TH2F(TString("hoAngleptNN_eff_multbin")+TString::Itoa(i,10),TString("hoAngleptNN_eff_multbin")+TString::Itoa(i,10),90,0,180,120,0,1200));
        hM.addHist(new TH2F(TString("hmassptNP_eff_multbin")+TString::Itoa(i,10),TString("hmassptNP_eff_multbin")+TString::Itoa(i,10),nbins,xAxis1,120,0,1200));
        hM.addHist(new TH2F(TString("hmassptPP_eff_multbin")+TString::Itoa(i,10),TString("hmassptPP_eff_multbin")+TString::Itoa(i,10),nbins,xAxis1,120,0,1200));
        hM.addHist(new TH2F(TString("hmassptNN_eff_multbin")+TString::Itoa(i,10),TString("hmassptNN_eff_multbin")+TString::Itoa(i,10),nbins,xAxis1,120,0,1200));
        hM.addHist(new TH2F(TString("hoAngleyNP_eff_multbin")+TString::Itoa(i,10),TString("hoAngleyNP_eff_multbin")+TString::Itoa(i,10),90,0,180,100,0,2));
        hM.addHist(new TH2F(TString("hoAngleyPP_eff_multbin")+TString::Itoa(i,10),TString("hoAngleyPP_eff_multbin")+TString::Itoa(i,10),90,0,180,100,0,2));
        hM.addHist(new TH2F(TString("hoAngleyNN_eff_multbin")+TString::Itoa(i,10),TString("hoAngleyNN_eff_multbin")+TString::Itoa(i,10),90,0,180,100,0,2));
        hM.addHist(new TH2F(TString("hmassyNP_eff_multbin")+TString::Itoa(i,10),TString("hmassyNP_eff_multbin")+TString::Itoa(i,10),nbins,xAxis1,100,0,2));
        hM.addHist(new TH2F(TString("hmassyPP_eff_multbin")+TString::Itoa(i,10),TString("hmassyPP_eff_multbin")+TString::Itoa(i,10),nbins,xAxis1,100,0,2));
        hM.addHist(new TH2F(TString("hmassyNN_eff_multbin")+TString::Itoa(i,10),TString("hmassyNN_eff_multbin")+TString::Itoa(i,10),nbins,xAxis1,100,0,2));
        hM.addHist(new TH2F(TString("hptyNP_eff_multbin")+TString::Itoa(i,10),TString("hptyNP_eff_multbin")+TString::Itoa(i,10),120,0,1200,100,0,2));
        hM.addHist(new TH2F(TString("hptyPP_eff_multbin")+TString::Itoa(i,10),TString("hptyPP_eff_multbin")+TString::Itoa(i,10),120,0,1200,100,0,2));
        hM.addHist(new TH2F(TString("hptyNN_eff_multbin")+TString::Itoa(i,10),TString("hptyNN_eff_multbin")+TString::Itoa(i,10),120,0,1200,100,0,2));
        hM.addHist(new TH2F(TString("hth1th2NP_eff_multbin")+TString::Itoa(i,10),TString("hth1th2NP_eff_multbin")+TString::Itoa(i,10),90,0,90,90,0,90));
        hM.addHist(new TH2F(TString("hth1th2PP_eff_multbin")+TString::Itoa(i,10),TString("hth1th2PP_eff_multbin")+TString::Itoa(i,10),90,0,90,90,0,90));
        hM.addHist(new TH2F(TString("hth1th2NN_eff_multbin")+TString::Itoa(i,10),TString("hth1th2NN_eff_multbin")+TString::Itoa(i,10),90,0,90,90,0,90));
        hM.addHist(new TH2F(TString("hp1p2NP_eff_multbin")+TString::Itoa(i,10),TString("hp1p2NP_eff_multbin")+TString::Itoa(i,10),100,0,1100,100,0,1100));
        hM.addHist(new TH2F(TString("hp1p2PP_eff_multbin")+TString::Itoa(i,10),TString("hp1p2PP_eff_multbin")+TString::Itoa(i,10),100,0,1100,100,0,1100));
        hM.addHist(new TH2F(TString("hp1p2NN_eff_multbin")+TString::Itoa(i,10),TString("hp1p2NN_eff_multbin")+TString::Itoa(i,10),100,0,1100,100,0,1100));
    }

    //--------------- end histo booking -----------------------------------------------------

    HGenericEventMixer<HGeantKine> eventmixer;
    eventmixer.setPIDs(2,3,1);
    eventmixer.setBuffSize(80);
    //eventmixer.setBuffSize(2);
    HGenericEventMixer<HGeantKine> eventmixer_eff[5];
    for (int mb = 0; mb < 5; ++mb) {
        eventmixer_eff[mb].setPIDs(2,3,1);
        eventmixer_eff[mb].setBuffSize(80);
        //eventmixer_eff[mb].setBuffSize(2);
    }

    TStopwatch timer;
    timer.Reset();
    timer.Start();

    Float_t impB = -1.;
    Float_t impB_bins[]  = {9.3, 8.1, 6.6, 4.7, 0.};

    Int_t evtsInFile = loop->getEntries();
    if(nev < 0 || nev > evtsInFile ) nev = evtsInFile;

    for(Int_t i = 1; i < nev; i++)
    {
        //----------break if last event is reached-------------
        //if(!gHades->eventLoop(1)) break;
        if(loop->nextEvent(i) <= 0) { cout<<" end recieved "<<endl; break; } // last event reached
        HTool::printProgress(i,nev,1,"Analyze :");
        loop->getSectors(sectors);

	HPartialEvent *fSimul        = ((HRecEvent*)gHades->getCurrentEvent())->getPartialEvent(catSimul);
	HGeantHeader *fSubHeader = (HGeantHeader*)(fSimul->getSubHeader());
	impB = fSubHeader->getImpactParameter();

	Int_t multbin = 0;
        if (impB >= impB_bins[4] && impB <= impB_bins[3]) {multbin=1;} // most central
	if (impB >  impB_bins[3] && impB <= impB_bins[2]) {multbin=2;}
	if (impB >  impB_bins[2] && impB <= impB_bins[1]) {multbin=3;}
	if (impB >  impB_bins[1] && impB <= impB_bins[0]) {multbin=4;} // most peripheral
	if (impB >  impB_bins[0]) {multbin=5;}
/*
	HParticleEvtInfo* evtinfo;
	evtinfo = HCategoryManager::getObject(evtinfo,catParticleEvtInfo,0);

	Int_t multbin = 0;
	Int_t mult_meta = evtinfo->getSumTofMultCut() + evtinfo->getSumRpcMultHitCut();
        if (mult_meta >  60 && mult_meta <=  88) multbin = 4; // most peripheral
        if (mult_meta >  88 && mult_meta <= 121) multbin = 3;
        if (mult_meta > 121 && mult_meta <= 160) multbin = 2;
        if (mult_meta > 160 && mult_meta <= 250) multbin = 1; // most central
        if (mult_meta > 250) multbin = 5;
*/

        if (multbin == 0 || multbin == 5) continue;

        Int_t size = kineCat->getEntries();

        // Additional loop to fill vector
        vector<HGeantKine *> vep;
        vector<HGeantKine *> vem;
        vector<HGeantKine *> vep_eff;
        vector<HGeantKine *> vem_eff;
        vector<HGeantKine *> vep_eff_multbin;
        vector<HGeantKine *> vem_eff_multbin;
	for(Int_t j = 0; j < size; j ++){
	    kine1 = HCategoryManager::getObject(kine1,kineCat,j);
            Float_t vx,vy,vz;
            kine1->getVertex(vx,vy,vz);
	    Float_t vr = TMath::Sqrt(vx*vx+vy*vy);
            if (vz < -60 || vz > 0) continue;
            if (vr > 2) continue;
            Int_t mamaNum = kine1->getParentTrack();

            if (kine1->isInAcceptance()) {
                if (kine1->getTotalMomentum() > 100 && kine1->getTotalMomentum() < 1000) {
                    Float_t px,py,pz;
                    kine1->getMomentum(px,py,pz);
                    TH2F *smear_matr;
                    if (kine1->getID() == 2) {
                        smear_matr = smear_pos;
                    } else {
                        smear_matr = smear_ele;
                    }
                    Float_t mom_ideal = kine1->getTotalMomentum();
                    Float_t mom_reco = smear(mom_ideal,smear_matr,random);
                    Float_t reco_over_ideal = mom_reco / mom_ideal;
                    kine1->setMomentum(px*reco_over_ideal,py*reco_over_ideal,pz*reco_over_ideal);
                    TLorentzVector vec;
                    HParticleTool::getTLorentzVector(kine1,vec,kine1->getID());

                    Float_t mom = vec.Vect().Mag();
                    Float_t the = vec.Theta()*TMath::RadToDeg();
                    Float_t phi = (vec.Phi()+TMath::Pi())*TMath::RadToDeg();
                    Float_t chg = (kine1->getID() == 2) ? 1 : -1;

                    if (kine1->getID() == 3) {
                        vem.push_back(new HGeantKine(*kine1));
                    }
                    if (kine1->getID() == 2) {
                        vep.push_back(new HGeantKine(*kine1));
                    }
                    Float_t eff = 1./getEfficiencyFactor(p3DEffEle[0][6],p3DEffPos[0][6],mom_ideal,the,phi,chg,false,false); // don't debug, don't check min value
                    if (isinf(eff) || isnan(eff)) eff = 0.;
                    if (random.Uniform(1) > eff) {
                        if (kine1->getID() == 3) {
                            vem_eff.push_back(new HGeantKine(*kine1));
                        }
                        if (kine1->getID() == 2) {
                            vep_eff.push_back(new HGeantKine(*kine1));
                        }
                    }
                    Float_t eff_multbin = 1./getEfficiencyFactor(p3DEffEle[multbin][6],p3DEffPos[multbin][6],mom,the,phi,chg,false,false);
                    if (isinf(eff_multbin) || isnan(eff_multbin)) eff_multbin = 0.;
                    if (random.Uniform(1) > eff_multbin) {
                        if (kine1->getID() == 3) {
                            vem_eff_multbin.push_back(new HGeantKine(*kine1));
                        }
                        if (kine1->getID() == 2) {
                            vep_eff_multbin.push_back(new HGeantKine(*kine1));
                        }
                    }
                }
            }
        }

        eventmixer.nextEvent();
        eventmixer.addVector(vep,2);
        eventmixer.addVector(vem,3);
        vector<pair<HGeantKine *, HGeantKine* > >& pairsVec_acc = eventmixer.getMixedVector();

        eventmixer_eff[0].nextEvent();
        eventmixer_eff[0].addVector(vep_eff,2);
        eventmixer_eff[0].addVector(vem_eff,3);
        vector<pair<HGeantKine *, HGeantKine* > >& pairsVec_eff = eventmixer_eff[0].getMixedVector();

        eventmixer_eff[multbin].nextEvent();
        eventmixer_eff[multbin].addVector(vep_eff,2);
        eventmixer_eff[multbin].addVector(vem_eff,3);
        vector<pair<HGeantKine *, HGeantKine* > >& pairsVec_eff_multbin = eventmixer_eff[multbin].getMixedVector();

        for (int imix = 0; imix < 3; ++imix) {
            vector<pair<HGeantKine *, HGeantKine* > > pairsVec;
            TString suffix;
            switch (imix) {
                case 0: 
                    pairsVec = pairsVec_acc;
                    suffix = TString(""); 
                    break;
                case 1: 
                    pairsVec = pairsVec_eff;
                    suffix = TString("_eff_multbin0");
                    break;
                case 2: 
                    pairsVec = pairsVec_eff_multbin;
                    suffix = TString("_eff_multbin")+TString::Itoa(multbin,10);
                    break;
            }
            size = pairsVec.size();

            for (Int_t j = 0; j < size; j ++) {
                pair<HGeantKine*,HGeantKine*>& pair = pairsVec[j];

                kine1 = pair.first;
                kine2 = pair.second;
                TLorentzVector vec1, vec2;
                HParticleTool::getTLorentzVector(kine1,vec1,kine1->getID());
                HParticleTool::getTLorentzVector(kine2,vec2,kine2->getID());

                Float_t mom1 = vec1.Vect().Mag();
                Float_t the1 = vec1.Theta()*TMath::RadToDeg();
                Float_t mom2 = vec2.Vect().Mag();
                Float_t the2 = vec2.Theta()*TMath::RadToDeg();

                TLorentzVector dilep = vec1 + vec2;
                Float_t oAngle = vec1.Angle(vec2.Vect())*TMath::RadToDeg();
                Float_t mass   = dilep.M()/1000;
                Float_t pt     = dilep.Perp();
                Float_t y      = dilep.Rapidity();
                Float_t mbinw  = hM.get("hmassNP")->GetBinWidth(hM.get("hmassNP")->FindBin(mass));

                if (oAngle < 9) continue;

                TString chg = "NP";
                if (kine1->getID() == kine2->getID()) {
                    if (kine1->getID() == 2) chg = "PP";
                    if (kine1->getID() == 3) chg = "NN";
                }

                hM.get( TString("hmass")      +chg+suffix)->Fill(mass,       1./mbinw);
                hM.get( TString("hoAngle")    +chg+suffix)->Fill(oAngle      );
                hM.get( TString("hy")         +chg+suffix)->Fill(y           );
                hM.get( TString("hpt")        +chg+suffix)->Fill(pt          );
                hM.get2(TString("hoAnglemass")+chg+suffix)->Fill(oAngle,mass,1./mbinw);
                hM.get2(TString("hoAnglept")  +chg+suffix)->Fill(oAngle,pt   );
                hM.get2(TString("hmasspt")    +chg+suffix)->Fill(mass,pt,    1./mbinw);
                hM.get2(TString("hoAngley")   +chg+suffix)->Fill(oAngle,y    );
                hM.get2(TString("hmassy")     +chg+suffix)->Fill(mass,y,     1./mbinw);
                hM.get2(TString("hpty")       +chg+suffix)->Fill(pt,y        );
                hM.get2(TString("hth1th2")    +chg+suffix)->Fill(the1,the2   );
                hM.get2(TString("hp1p2")      +chg+suffix)->Fill(mom1,mom2   );
            }
        }
//#define DELETE_MIX
#ifdef DELETE_MIX
        vector <HGeantKine *>* toDel = eventmixer.getObjectsToDelete();
        for (unsigned int ii = 0; ii < toDel->size(); ++ii) {
            delete toDel->at(ii);
        }
        toDel->clear();
        delete toDel;
        vector <HGeantKine *>* toDel_eff = eventmixer_eff[0].getObjectsToDelete();
        for (unsigned int ii = 0; ii < toDel_eff->size(); ++ii) {
            delete toDel_eff->at(ii);
        }
        toDel_eff->clear();
        delete toDel_eff;
        vector <HGeantKine *>* toDel_eff_multbin = eventmixer_eff[multbin].getObjectsToDelete();
        for (unsigned int ii = 0; ii < toDel_eff_multbin->size(); ++ii) {
            delete toDel_eff_multbin->at(ii);
        }
        toDel_eff_multbin->clear();
        delete toDel_eff_multbin;
#endif

    } // end event loop

    timer.Stop();

    hM.getFile()->cd();
    TMacro m1(__DIELEANA_FILE__);
    m1.Write();
    hM.writeHists("nomap");

    cout<<"####################################################"<<endl;
    return 0;
}
Exemplo n.º 2
0
Int_t flowCount(TString inputlist, TString outfile, Int_t nev=-1)
{
    HLoop* loop = new HLoop   (kTRUE    );    // kTRUE : create Hades  (needed to work with standard eventstructure)
           loop ->addMultFiles(inputlist);
    //-----Inicialize-classes-we-need-to-use-----------------
    HMultCorr   cCorr;
    PidParticle p;
    //--------------------------------------------------------------------------------------------------------
    #include "/u/parfenov/anaflow/flowVar.C"     //include all constants and variables we need          
    TH2F*  hProtPtVsY_Eff;
    TFile* foutfile       = new TFile(outfile.Data(), "recreate"); 
    TFile* FileProtEff    = new TFile("EffCorrForProtPtVsY_WithWideBetaPcuts_ShieldGosia.root", "read");
           hProtPtVsY_Eff = (TH2F*) FileProtEff->Get("hProtPtVsY_EffSm");
           foutfile->cd();
    #include "/u/parfenov/anaflow/flowHisto.C"   //include all histograms we need                       
    //if(par!=0){
        FFlow pfy0pt[NC-4][NRAPI][NPTRN-5]; //--flow--9-bins-Yo--12-bins-in-Pt-in-3-centrality-sets--
        FFlow pfR0pt[NC-4][NRAPI][NPTRN-5];
        FFlow pfF0pt[NC-4][NRAPI][NPTRN-5];
        FHist phist[ NC-4][NRAPI][NPTRN-5];
        for (Int_t i=0; i<NC-4;i++){
            for(Int_t j=0; j<NRAPI; j++){
                for(Int_t k=0; k<NPTRN-5; k++){
                    //-proton------------------------------------------
                    pfy0pt[i][j][k].THDeclare("pCent",i,"Yo",j,"Pt",k);
                    pfR0pt[i][j][k].THDeclare("RCent",i,"Yo",j,"Pt",k);
                    pfF0pt[i][j][k].THDeclare("FCent",i,"Yo",j,"Pt",k);
                    phist[ i][j][k].THDeclare("pHist",i,"Yo",j,"Pt",k);
                }
            }
        }
    //}

    fBetaMeanP->SetParameter(0,HPhysicsConstants::mass(14));
    //--------------------------------------------------------------------------------------------------------
    if(!loop->setInput("-*,+HParticleCand,+HParticleEvtInfo,+HStart2Hit,+HStart2Cal,+HWallHit,+HRpcCluster,+HTofHit,+HWallEventPlane")) { exit(1); }
    loop->printCategories();
  
    HParticleEvtInfo* evtinfo;
  
    HParticleCand*   pParticleCand;   HCategory* candCat   = (HCategory*)HCategoryManager::getCategory(catParticleCand);   if(!candCat)  {exit(1);}
    HWallHit*        pWallHit;        HCategory* wallCat   = (HCategory*)HCategoryManager::getCategory(catWallHit);        if(!wallCat)  {exit(1);}
    HWallEventPlane* pWallEventPlane; HCategory* wallEPCat = (HCategory*)HCategoryManager::getCategory(catWallEventPlane); if(!wallEPCat){exit(1);}
    
    //--------------------------CONFIGURATION---------------------------------------------------
    //At begin of the program (outside the event loop)
    HParticleTrackSorter sorter;
    //sorter.setDebug();                          // for debug
    //sorter.setPrintLevel(3);                    // max prints
    //sorter.setIgnoreInnerMDC();                 // do not reject Double_t inner MDC hits
    //sorter.setIgnoreOuterMDC();                 // do not reject Double_t outer MDC hits
    //sorter.setIgnoreMETA();                     // do not reject Double_t META hits
    //sorter.setIgnorePreviousIndex();            // do not reject indices from previous selctions
    sorter.init();                                // get catgegory pointers etc...
    //--------------------------------------------------------------------------------------------

    HEnergyLossCorrPar *momCorPar = new HEnergyLossCorrPar();
    momCorPar->setDefaultPar("apr12");
      
    /////////////////////////////////////////////////////////
    //-----Loop-over-events----------------------------------
    /////////////////////////////////////////////////////////
  
    loop->addMultFiles(inputlist);
    Int_t events = loop->getEntries();
    if(nev < events && nev >= 0 ) events = nev;
  
    for (Int_t i=1; i<events;i++){
    
        if (loop->nextEvent(i)<=0){
            cout << "End recieved with IF exit" << endl;
            break;
        }
        if(par==0) hcuts->Fill(1.);
        if (i%1000 == 0){
            cout << "    event " << i << endl;
        }
    
        if( loop->isNewFile(currFName) ){ 
            printf("--New-file-started--> %s", currFName.Data() ); 
            currFName = currFName( currFName.Last('/')+1,currFName.Length()-currFName.Last('/')-1 );
            currBeName = currFName(0, 13); //-simply-the-file-name-w/o-EBchunk--
            currFDay = currFName( 4, 3 ); //-we-cut-out-day-number-position-starting-from-4th-digit-with-length-of-3digits--
            DAY_NUM = currFDay.Atoi();
            currTime = currFName( 7, 2 ); //-we-cut-out-day-hour--position-starting-from-4th-digit-with-length-of-3digits--
            HR=currTime.Atoi();
            currTime = currFName( 9, 2 ); //-we-cut-out-day-minute-position-starting-from-4th-digit-with-length-of-3digits--
            MN=currTime.Atoi();
            currTime = currFName(11, 2 ); //-we-cut-out-day-second-position-starting-from-4th-digit-with-length-of-3digits--
            SC=currTime.Atoi();
            AbsMinute = MN + HR*60 + DAY_NUM*24*60;
            #include "/u/parfenov/anaflow/FlatSinCos.cc"
            //#include "/u/parfenov/anaflow/FOPICorPar.cc"
            #include "/u/parfenov/anaflow/Recenter.cc"
            #include "/u/parfenov/anaflow/RecenterMETA.cc"
            #include "/u/parfenov/anaflow/RecenterFW.cc" //Q vect recenter FW;
            //#include "/u/parfenov/anaflow/FlatFourier.cc"//for flattening Psi_EP via fit;
            //--Now-we-read-multiplicity-parameters-for-this-beXXXXXXXXXX-file--------------------//
            mulVal = cCorr.getLineValuesAsVectFromCalibFile( currBeName );
            cout<<"mulVal "<< mulVal[0] <<" "<< mulVal[1] <<" "<< mulVal[2] <<" "<< mulVal[3] <<endl;
            fAverageMTS[0]=mulVal[4];  //multiplicity in tracking sector 1
            fAverageMTS[1]=mulVal[5];  //multiplicity in tracking sector 2
            fAverageMTS[2]=mulVal[6];  //...
            fAverageMTS[3]=mulVal[7];
            fAverageMTS[4]=mulVal[8];
            fAverageMTS[5]=mulVal[9];  //multiplicity in tracking sector 6
            printf("fAverageMTS[0,1,2,3,4,5]=[%6.3f,%6.3f,%6.3f,%6.3f,%6.3f,%6.3f,]\n", fAverageMTS[0], fAverageMTS[1], fAverageMTS[2], fAverageMTS[3], fAverageMTS[4], fAverageMTS[5]);
        
            //fTrkMultDay108
            if(mulVal[2]>0.0){
                //-if-correction-is-found-or-if-it-was-not-zero-defined-(in-case-of-not-working-MDCs)---
                fTrkMultScaler = fTrkMultDay108/mulVal[2];
                printf("==>Correction multiplier nTrkMult for this file is: (%f/%f)=%f\n", fTrkMultDay108, mulVal[2], fTrkMultScaler );
            }else{
                //--if-correction-entry-is-not-found-(may-be-not-created-once)------------------
                //--or-if-say-MDCs-were-not-working-and-tracking-multiplicity-was-exectly-zero--
                //-we-keep-correction-as-it-was-in-previous-file-or-if-not-defined-hence-it-would-be-exactly-one=1-or-
                printf("==>Correction multiplier nTrkMult for this file is: (%f/%f)=%f (default or old correction is used)\n", fTrkMultDay108, mulVal[2], fTrkMultScaler);
            }
        }
        HTool::printProgress(i,events,1,"Analyze pairs :");
        evtinfo = HCategoryManager::getObject(evtinfo,catParticleEvtInfo,0);

        if( evtinfo->getSumParticleCandMult()<2 ){if(par==0){ hcuts->Fill(2.); } continue; } //getSumParticleCandMult()>1
        if(!evtinfo->isGoodEvent(
                               Particle::kGoodVertexClust|
                               Particle::kGoodVertexCand|
                               Particle::kNoPileUpSTART|
                               Particle::kGoodSTART|      
                               Particle::kGoodTRIGGER|    
                               Particle::kNoVETO|         
                               Particle::kGoodSTARTVETO|  
                               Particle::kGoodSTARTMETA
                              )){ if(par==0){ hcuts->Fill(3.); } continue ; }// bitwise add flags as suggested by Manuel 

        //------------------------------------------------------------------------
        // clean vectors and index arrays
        sorter.cleanUp();
        //------------------------------------------------------------------------

        sorter.resetFlags(kTRUE,kTRUE,kTRUE,kTRUE);
        Int_t nCandHad        = sorter.fill(selectHadronsQa);
        Int_t nCandHadBest    = sorter.selectBest(HParticleTrackSorter::kIsBestRK,HParticleTrackSorter::kIsHadron);

        Int_t nCandNoLept     = sorter.fill(rejectLeptons);
        Int_t nCandNoLeptBest = sorter.selectBest(HParticleTrackSorter::kIsBestRK,HParticleTrackSorter::kIsLepton);

        //-------Get-vertex-from-combined-fit-of-fitted-inner-segments------------
        HVertex   fPrimVertReco = gHades->getCurrentEvent()->getHeader()->getVertexReco();
        vertexX = fPrimVertReco.getX();
        vertexY = fPrimVertReco.getY();
        vertexZ = fPrimVertReco.getZ();

        if(par==0){
            hvertexXZ->Fill(vertexZ,vertexX);
            hvertexXY->Fill(vertexY,vertexX);
            hvertexX ->Fill(vertexX);
            hvertexY ->Fill(vertexY);
            hvertexZ ->Fill(vertexZ);
        }

        //------Alexandr's-vertex-cuts---------
        tgtChi2 = (Float_t) fPrimVertReco.getChi2();
        if( tgtChi2<2.0 || tgtChi2>40.){ if(par==0){ hcuts->Fill(4.); } continue; }//-skip-events-with-badly-reconstructed-target-------
        if( vertexZ<-59.|| vertexZ>0. ){ if(par==0){ hcuts->Fill(5.); } continue; }//-skip-events-with-primary-vertex-outside-of-target-
        if( (vertexX-tgtXc)*(vertexX-tgtXc)+(vertexY-tgtYc)*(vertexY-tgtYc)>R2 ){ if(par==0){ hcuts->Fill(6.); } continue; }//-skip-events-with-primary-vertex-far-from-target---
        //----end-of-Alexandr's-vertex-cuts----
        if(par==0){ 
            hvtxCutXZ->Fill(vertexZ,vertexX);
            hvtxCutXY->Fill(vertexY,vertexX);
            hvtxCutX ->Fill(vertexX);
            hvtxCutY ->Fill(vertexY);
            hvtxCutZ ->Fill(vertexZ);
        }
                              
        Mtof = evtinfo->getSumTofMult();
        Mrpc = evtinfo->getSumRpcMult();
        Mult = Mtof+Mrpc;
        //---------centrality-classes--------------------------------------------------------------------(begin)--------//
        //-Centrality-selection-for-further-if-selection-statements------------------------//
        nTrkMult = getParticleTrkMult();
        Mtr   = nTrkMult; if(par==0) hTrkMult->Fill(nTrkMult);
        nTrkMultCorr = nTrkMult*fTrkMultScaler; if(par==0) hTrkMultCorr->Fill(nTrkMultCorr);
        if(par==0) hMETAvsTRK    ->Fill(Mtof+Mrpc,nTrkMult    );
        if(par==0) hMETAvsTRKcorr->Fill(Mtof+Mrpc,nTrkMultCorr);

        //--------------------------------------------//
        //--Event plane reconstruction loop-----------//
        //--------------------------------------------// 
        multWall=0;
        cellNum=0;
        cellTime=0.0;
        cellCharge=0.0;
        wallX=0.0,wallY=0.0,wallZ=0.0;
        wallXc=0.0, wallYc=0.0; //corrected-reCentered-
        XfwSmear=0.0, YfwSmear=0.0;
        for (Int_t a=0;a<QvRING;a++){//Ring: 0-full,1-small,2-medium,3-large;
            FWRing[a] = kFALSE;
            for (Int_t b=0;b<QvWGHT;b++){//Weight: 0-wght=1, 1-wght=2;
                for (Int_t c=0;c<QvTYPE;c++){//Type: 0-source from FW, 1-recentered;
                    Qvect[a][b][c].Set(0.,0.);
                    Qvsum[a][b][c].Set(0.,0.);
                }
            }
        }
        vect.Set(    0.,0.);
        vsum.Set(    0.,0.);
        vsumMETA.Set(0.,0.);
        vsumFW.Set(  0.,0.);
        vsumCorr.Set(0.,0.);
        vsumCorrA.Set(0.,0.);
        vsumCorrB.Set(0.,0.);
        eX  .Set(1.,0.);
        dEdxCut=0.0;
        xyRadius=0.0;
        phiA   = -1000;
        phiB   = -1000;
        phiAB  = -1000;
        phiCorA= -1000;
        phiCorB= -1000;
        PsiA   = -1000;
        PsiB   = -1000;
        cellsVect.Reset();
      
        //-weight-for-scalar-product-method-------------------
        wgh = 1.0;  //PCpt; //1.0; //-or-could-be-also-equal-to-Pt---
        nFWhits   = 0;
        nFWspect  = 0;
        nFWunderflow = 0;
        FWdEdxA=0.0;
        FWdEdxB=0.0;
  
        FWdEdxL=0.0;
        FWdEdxM=0.0;
        FWdEdxN=0.0;
        choiceA = 1; //
        choiceB = 1; // Preparing for A/B subevent method
        wmod    = 0.;
        wmodA   = 0.;
        wmodB   = 0.;
        //-------------------------------------------iteration-WallHits----(begin)--------------------------------------------------//
        for(Int_t j=0; j<(wallCat->getEntries()); j++){
            pWallHit = HCategoryManager::getObject(pWallHit,wallCat,j);
            cellNum    = pWallHit->getCell();
            cellTime   = pWallHit->getTime();
            cellCharge = pWallHit->getCharge();
            cellChargeCtime = cellTime;
            hFW_TimeCell_0->Fill(cellTime  , cellNum);
            hFW_dEdxCell_0->Fill(cellCharge, cellNum);
            if(cellNum>=0   && cellNum<304 ){                   FWRing[0] = kTRUE; }
            if(cellNum< 144                ){ dEdxCut=Z1_cut_s; FWRing[1] = kTRUE; }
            if(cellNum>=144 && cellNum<=207){ dEdxCut=Z1_cut_m; FWRing[2] = kTRUE; }
            if(cellNum> 207                ){ dEdxCut=Z1_cut_l; FWRing[3] = kTRUE; }
            if(cellTime>T1_cut && cellTime<T2_cut && cellCharge>dEdxCut){
           
                nFWspect++;
                hFW_TimeCell_1->Fill(cellTime  , cellNum);
                hFW_dEdxCell_1->Fill(cellCharge, cellNum);
                pWallHit->getXYZLab(wallX,wallY,wallZ);
                hFWxyCC->Fill(wallX,wallY); //cell centers
                
                //-recentering--FW-----------------------------------------------------
                for (Int_t im=1;im<12;im++){
                    if( (Mtof+Mrpc)>=Mrang[im-1] && (Mtof+Mrpc)<Mrang[im]){ wallXc = wallX - X_shM[im]; wallYc = wallY - Y_shM[im]; }
                }
                //-here-we-fill-d2N/(dxdy)-inX-band--and--y-band--for-auto-recentering-
                //-this-makes-realistic-distribution-on-FW-face------------------------
                if (cellNum>=0   && cellNum<=143) { cellSize = 40;  }
                if (cellNum>=144 && cellNum<=207) { cellSize = 80;  }
                if (cellNum>=210 && cellNum<=301) { cellSize = 160; }
                XfwSmear = wallX + ( Random.Rndm(1) - 0.5 )*cellSize;
                YfwSmear = wallY + ( Random.Rndm(1) - 0.5 )*cellSize;
           
                for (Int_t im=0;im<11;im++){                    
                    if( (Mtof+Mrpc)>=  Mrang[im] && (Mtof+Mrpc)< Mrang[im+1] ){
                        hFW_TimeCell_0->Fill(cellTime  , cellNum);
                        hFW_dEdxCell_0->Fill(cellCharge, cellNum);
                    }
                }
                //-this-cut-was-forgotten-for-Feb2014-HADES-CM-report--//
                //-I-reintroduce-it-14.03.2014----(c)-Sadovsky---------//
                if(  wallXc*wallXc + wallYc*wallYc >= R0_cut*R0_cut  /*50.*50.*/ ){
                    hFW_TimeCell_2->Fill(cellTime  , cellNum);
                    hFW_dEdxCell_2->Fill(cellCharge, cellNum);
                    //-spectators-selected--
                    multWall++;
                    /*for (Int_t a=0;a<QvRING;a++){
                       for (Int_t b=0;b<QvWGHT;b++){
                            if (FWRing[a]){
                                Qvect[a][b][0].Set(wallX, wallY);
                                Qvect[a][b][0] = Qvect[a][b][0].Unit();
                                if(b == 1) Qvect[a][b][0] *= cellCharge;
                                Qvsum[a][b][0] = Qvsum[a][b][0] + Qvect[a][b][0];
                            }
                        }
                    }*/
                    vect.Set(wallX, wallY);
                    vect = vect.Unit();
                    vect *= cellCharge;
                    wmod += cellCharge;
                    vsum += vect;
                    cellsVect.SetCellVect(vect, cellCharge); //-note-[vect]-is-a-unit-vector-this-is-for-further-subevent-(A/B)-split--
                    hFWxyCCsmear->Fill(XfwSmear        ,YfwSmear        ); //cells smeared but not shifted
                    hFWxySHsmear->Fill(XfwSmear-X_shift,YfwSmear-Y_shift); //cells smeared and shifted as a whole
                    //-center-of-gravity-study-as-a-course-of-centrality-----------------------------
                    for (Int_t im=0;im<11;im++){
                        if( (Mtof+Mrpc)>=Mrang[im] && (Mtof+Mrpc)<Mrang[im+1]){ 
                            hFWxyCCsmearM[im]->Fill(XfwSmear,YfwSmear); 
                            hFWxyCCsmearXscanM[im]->Fill(XfwSmear - X_shM[im],YfwSmear - Y_shM[im]); 
                        }
                    }
                }//-endif-R0_cut--//
            }//end-if-cells-cut---
        }//end-for-HitWall-loop---
        vsum      /= wmod;
        //mQx = mQxFW[nFWspect];
        //mQy = mQyFW[nFWspect];
        //if (mQx = mQxFW[nFWspect]) cout  << " ev = " << i << " * " << nFWspect << "| Qx = " << mQx << "; Qy = " << mQy <<"; vX = " << vsum.X() << "; vY = " << vsum.Y() << endl;
        //if(  nFWspect>=0    &&  nFWspect< 100   ) vsumFW.Set(vsum.X() - mQxFW[nFWspect],vsum.Y() - mQyFW[nFWspect]);
        mQx = vsum.X() - mQx;
        mQy = vsum.Y() - mQy;
        for (Int_t im=0;im<11;im++){
            if((Mtof+Mrpc)>=Mrang[im] && (Mtof+Mrpc)<Mrang[im+1]){
                //vsumCorr = cellsVect.Recenter(vsum,sumXmean[0][im][DAY_NUM-96],sumYmean[0][im][DAY_NUM-96],sumXsigma[0][im][DAY_NUM-96],sumYsigma[0][im][DAY_NUM-96]);
                //vsumRec  = cellsVect.Recenter(vsum,sumXmean[0][im][DAY_NUM-96],sumYmean[0][im][DAY_NUM-96]);
                vsumCorr   = cellsVect.Recenter(vsum,mQxFW[nFWspect][0]       ,mQyFW[nFWspect][0]         );
                //if( (Mtof+Mrpc)>=20 && (Mtof+Mrpc)< 215 ) vsumMETA = cellsVect.Recenter(vsum,Qxmean[Mtof+Mrpc][0],Qymean[Mtof+Mrpc][0]);
                //cout << "ev = " << i << " | QxR = " << vsumFW.X() << "; QyR = " << vsumFW.Y() << ";" << endl; 
            }
        }
        VectphiEP   = vsum.DeltaPhi(eX)      *rad2deg;
        VectphiEPr  = vsum.DeltaPhi(eX);     //radians
        VectphiCorr = vsumCorr.DeltaPhi(eX)  *rad2deg;
        VectphiCorrR= vsumCorr.DeltaPhi(eX); //radians
        hPhiEPvect->Fill(VectphiEP);
        //-now-we-go-over-spectators-and-make-calculations-for-A/B-subevents
        NA=0;
        NB=0;
        multFWcells = cellsVect.GetNumbOfCells();
        Float_t choice;
        vectA.Set(0.,0.);
        vectB.Set(0.,0.);
        vsumA.Set(0.,0.);
        vsumB.Set(0.,0.);
        for(Int_t ic=0; ic<multFWcells; ic++){
            choice = Random.Rndm(1);
            //-this-is-(A/B)-subevents-split--(begin)-(c)-Sadovsky-----------------------------
            //-I-can-be-proud-that-my-algorithm-has-more-flat-distribution--:)-(c)-Sadovsky----
            levelA = (multFWcells/2.-choiceA+1.)/Float_t(multFWcells);
            levelB = (multFWcells/2.-choiceB+1.)/Float_t(multFWcells);
            if(choice < levelA/(levelA+levelB)){
                vectA = cellsVect.GetCellVector(ic);
                vsumA += vectA;
                choiceA++;
                NA++;
                vsumA += vectA;
                choiceA++;
                NA++;
                FWdEdxA=FWdEdxA + cellsVect.GetCellCharge(ic); //-total-Eloss-from-all-spectators---
                wmodA += cellsVect.GetCellCharge(ic);
            }else{
                vectB = cellsVect.GetCellVector(ic);
                vsumB += vectB;
                choiceB++;
                NB++;
                vectB = cellsVect.GetCellVector(ic);
                vsumB += vectB;
                choiceB++;
                NB++;
                VectPhi_i = vectB.DeltaPhi(eX); //-Phi-of-i_th-spectator-particle-from-subevent-B--
                FWdEdxB=FWdEdxB + cellsVect.GetCellCharge(ic); //-total-Eloss-from-all-spectators---
                wmodB += cellsVect.GetCellCharge(ic);
            }//-HWallHit-second-loop-for-reaction-plane-resolution--( end )---//
            //-this-is-(A/B)-subevents-split--( end )------------------------------------------
        }//-endfor-multFWcells-loop--for-A/B-method--
        //-calculating-eventplane-angles---------------
        vsumA /= wmodA;
        vsumB /= wmodB;
        for (Int_t im=0;im<11;im++){
            if((Mtof+Mrpc)>=Mrang[im] && (Mtof+Mrpc)<Mrang[im+1]){
                vsumCorrA = cellsVect.Recenter(vsumA,mQxFW[nFWspect][1],mQyFW[nFWspect][1]);
                vsumCorrB = cellsVect.Recenter(vsumB,mQxFW[nFWspect][2],mQyFW[nFWspect][2]);
                //vsumRecA.Set(vsumCorrA.X()*sumXsigma[1][im][DAY_NUM-96],vsumCorrA.Y()*sumYsigma[1][im][DAY_NUM-96]);
                //vsumRecA.Set(vsumCorrA.X()*sumXsigma[2][im][DAY_NUM-96],vsumCorrA.Y()*sumYsigma[2][im][DAY_NUM-96]);
            }
        }
        phiA    = vsumA.DeltaPhi(eX)            *rad2deg;
        phiB    = vsumB.DeltaPhi(eX)            *rad2deg;
        phiAB   = vsumA.DeltaPhi(vsumB)         *rad2deg;
        phiCorAB= vsumCorrA.DeltaPhi(vsumCorrB) *rad2deg;
        phiCorA = vsumCorrA.DeltaPhi(eX)        *rad2deg;
        phiCorB = vsumCorrB.DeltaPhi(eX)        *rad2deg;
        Mfw     = NA+NB;
        if (Mfw > 3 && NA>1 && NB>1){
            for (Int_t im=0;im<11;im++){
                if((Mtof+Mrpc)>=Mrang[im] && (Mtof+Mrpc)<Mrang[im+1]){
                    hQvectX[0][im]->Fill(vsum.X());            hQvectY[0][im]->Fill(vsum.Y());
                    hQvXrec[0][im]->Fill(vsumCorr.X());        hQvYrec[0][im]->Fill(vsumCorr.Y());
                    hQvectX[1][im]->Fill(vsumA.X());           hQvectY[1][im]->Fill(vsumA.Y());
                    hQvXrec[1][im]->Fill(vsumCorrA.X());       hQvYrec[1][im]->Fill(vsumCorrA.Y());
                    hQvectX[2][im]->Fill(vsumB.X());           hQvectY[2][im]->Fill(vsumB.Y());
                    hQvXrec[2][im]->Fill(vsumCorrB.X());       hQvYrec[2][im]->Fill(vsumCorrB.Y());
                    hQvRaw[0][ im]->Fill(vsum.X(),vsum.Y());   hQvRec[0][ im]->Fill(vsumCorr.X(),vsumCorr.Y());
                    hQvRaw[1][ im]->Fill(vsumA.X(),vsumA.Y()); hQvRec[1][ im]->Fill(vsumCorrA.X(),vsumCorrA.Y());
                    hQvRaw[2][ im]->Fill(vsumB.X(),vsumB.Y()); hQvRec[2][ im]->Fill(vsumCorrB.X(),vsumCorrB.Y());
                }
            }
            for (Int_t n=1;n<=6;n++){
                for (Int_t im=0;im<11;im++){
                    if ((Mtof+Mrpc)>=Mrang[im] && (Mtof+Mrpc)<Mrang[im+1]){
                        hSinPsi[0][n-1][im]->Fill(DAY_NUM,sin(n*VectphiCorrR),1);
                        hCosPsi[0][n-1][im]->Fill(DAY_NUM,cos(n*VectphiCorrR),1);
                        hSinPsi[1][n-1][im]->Fill(DAY_NUM,sin(n*phiCorA*hpi/90.),1);
                        hCosPsi[1][n-1][im]->Fill(DAY_NUM,cos(n*phiCorA*hpi/90.),1);
                        hSinPsi[2][n-1][im]->Fill(DAY_NUM,sin(n*phiCorB*hpi/90.),1);
                        hCosPsi[2][n-1][im]->Fill(DAY_NUM,cos(n*phiCorB*hpi/90.),1);
                    }
                }
            }
            for (Int_t im=0;im<11;im++){
                if((Mtof+Mrpc)>=Mrang[im] && (Mtof+Mrpc)<Mrang[im+1]){
                    dPsi = 0.;
                    for (Int_t n=0;n<6;n++){
                        cellsVect.SetFlatt(n,FlatSin[0][n][im][DAY_NUM-96],FlatCos[0][n][im][DAY_NUM-96]);
                    }
                    PsiCorr = cellsVect.Flattening(VectphiCorr);
                    //hdPsi[im]->Fill(dPsi*rad2deg);
                    //PsiCorr = atan2(sin(VectphiCorrR+dPsi),cos(VectphiCorrR+dPsi))*rad2deg;
                    //PsiCorr2 = VectphiCorr + dPsi;
                    //hFlatDiff[im]->Fill(PsiCorr/PsiCorr2);
                    if (PsiCorr > 180. ) PsiCorr-=180.;
                    if (PsiCorr < -180.) PsiCorr+=180.;
                    hPsiEP[0][im]->Fill(VectphiEP); hPsiRcnt[0][im]->Fill(VectphiCorr); hPsiCorr[0][im]->Fill(PsiCorr);

                    hsumXmean[0][im]->Fill(DAY_NUM,vsum.X(),1); 
                    hsumYmean[0][im]->Fill(DAY_NUM,vsum.Y(),1); 

                    hQvsM_X[0][0]->Fill(Mtof+Mrpc,vsum.X()); 
                    hQvsM_Y[0][0]->Fill(Mtof+Mrpc,vsum.Y()); 
                    hQvFW_X[0][0]->Fill(nFWspect ,vsum.X()); 
                    hQvFW_Y[0][0]->Fill(nFWspect ,vsum.Y()); 
                    hQvsM_X[0][1]->Fill(Mtof+Mrpc,vsumA.X()); 
                    hQvsM_Y[0][1]->Fill(Mtof+Mrpc,vsumA.Y()); 
                    hQvFW_X[0][1]->Fill(nFWspect ,vsumA.X()); 
                    hQvFW_Y[0][1]->Fill(nFWspect ,vsumA.Y());
                    hQvsM_X[0][2]->Fill(Mtof+Mrpc,vsumB.X()); 
                    hQvsM_Y[0][2]->Fill(Mtof+Mrpc,vsumB.Y()); 
                    hQvFW_X[0][2]->Fill(nFWspect ,vsumB.X()); 
                    hQvFW_Y[0][2]->Fill(nFWspect ,vsumB.Y());
                    hQvsM_X[1][0]->Fill(Mtof+Mrpc,vsumCorr.X()); 
                    hQvsM_Y[1][0]->Fill(Mtof+Mrpc,vsumCorr.Y()); 
                    hQvFW_X[1][0]->Fill(nFWspect ,vsumCorr.X()); 
                    hQvFW_Y[1][0]->Fill(nFWspect ,vsumCorr.Y());
                    hQvsM_X[1][1]->Fill(Mtof+Mrpc,vsumCorrA.X()); 
                    hQvsM_Y[1][1]->Fill(Mtof+Mrpc,vsumCorrA.Y()); 
                    hQvFW_X[1][1]->Fill(nFWspect ,vsumCorrA.X()); 
                    hQvFW_Y[1][1]->Fill(nFWspect ,vsumCorrA.Y());
                    hQvsM_X[1][2]->Fill(Mtof+Mrpc,vsumCorrB.X()); 
                    hQvsM_Y[1][2]->Fill(Mtof+Mrpc,vsumCorrB.Y()); 
                    hQvFW_X[1][2]->Fill(nFWspect ,vsumCorrB.X()); 
                    hQvFW_Y[1][2]->Fill(nFWspect ,vsumCorrB.Y());   
                }
            }
            for (Int_t im=0;im<11;im++){
                if((Mtof+Mrpc)>=Mrang[im] && (Mtof+Mrpc)<Mrang[im+1]){
                    for (Int_t n=0;n<6;n++){
                        cellsVect.SetFlatt(n,FlatSin[1][n][im][DAY_NUM-96],FlatCos[1][n][im][DAY_NUM-96]);
                    }
                    PsiA = cellsVect.Flattening(phiCorA);
                    if (PsiA > 180. ) PsiA-=180.;
                    if (PsiA < -180.) PsiA+=180.;
                    hPsiEP[1][im]->Fill(phiA); hPsiRcnt[1][im]->Fill(phiCorA); hPsiCorr[1][im]->Fill(PsiA);

                    hsumXmean[1][im]->Fill(DAY_NUM,vsumA.X(),1); 
                    hsumYmean[1][im]->Fill(DAY_NUM,vsumA.Y(),1); 
                }
            }
            for (Int_t im=0;im<11;im++){
                if((Mtof+Mrpc)>=Mrang[im] && (Mtof+Mrpc)<Mrang[im+1]){
                    for (Int_t n=0;n<6;n++){
                        cellsVect.SetFlatt(n,FlatSin[2][n][im][DAY_NUM-96],FlatCos[2][n][im][DAY_NUM-96]);
                    }
                    cellsVect.SetNharm(6);
                    PsiB = cellsVect.Flattening(phiCorB);
                    if (PsiB > 180. ) PsiB-=180.;
                    if (PsiB < -180.) PsiB+=180.;
                    hPsiEP[2][im]->Fill(phiA); hPsiRcnt[2][im]->Fill(phiCorA); hPsiCorr[2][im]->Fill(PsiB);

                    hsumXmean[2][im]->Fill(DAY_NUM,vsumB.X(),1); 
                    hsumYmean[2][im]->Fill(DAY_NUM,vsumB.Y(),1); 
                }
            }

            PsiAB   = PsiA-PsiB;
            if (PsiAB> 180.){ PsiAB-=360; }
            if (PsiAB<-180.){ PsiAB+=360; }

            for(Int_t im=0;im<11;im++){
                if((Mtof+Mrpc)>=Mrang[im] && (Mtof+Mrpc)<Mrang[im+1]){
                    for(Int_t n=0;n<2;n++){
                        CosPsiAB_META[0][n]->Fill(Mtof+Mrpc,cos((n+1)*phiAB   ),1);
                        CosPsiAB_META[1][n]->Fill(Mtof+Mrpc,cos((n+1)*phiCorAB),1);
                        CosPsiAB_META[2][n]->Fill(Mtof+Mrpc,cos((n+1)*PsiAB   ),1);
                        SinPsiAB_META[0][n]->Fill(Mtof+Mrpc,sin((n+1)*phiAB   ),1);
                        SinPsiAB_META[1][n]->Fill(Mtof+Mrpc,sin((n+1)*phiCorAB),1);
                        SinPsiAB_META[2][n]->Fill(Mtof+Mrpc,sin((n+1)*PsiAB   ),1);

                        CosPsiAB_FW[  0][n]->Fill(nFWspect ,cos((n+1)*phiAB   ),1);
                        CosPsiAB_FW[  1][n]->Fill(nFWspect ,cos((n+1)*phiCorAB),1);
                        CosPsiAB_FW[  2][n]->Fill(nFWspect ,cos((n+1)*PsiAB   ),1);
                        SinPsiAB_FW[  0][n]->Fill(nFWspect ,sin((n+1)*phiAB   ),1);
                        SinPsiAB_FW[  1][n]->Fill(nFWspect ,sin((n+1)*phiCorAB),1);
                        SinPsiAB_FW[  2][n]->Fill(nFWspect ,sin((n+1)*PsiAB   ),1);

                        CosPsi_META[0][n][0]->Fill(Mtof+Mrpc,cos((n+1)*phiA   ),1);
                        CosPsi_META[1][n][0]->Fill(Mtof+Mrpc,cos((n+1)*phiCorA),1);
                        CosPsi_META[2][n][0]->Fill(Mtof+Mrpc,cos((n+1)*PsiA   ),1);
                        SinPsi_META[0][n][0]->Fill(Mtof+Mrpc,sin((n+1)*phiA   ),1);
                        SinPsi_META[1][n][0]->Fill(Mtof+Mrpc,sin((n+1)*phiCorA),1);
                        SinPsi_META[2][n][0]->Fill(Mtof+Mrpc,sin((n+1)*PsiA   ),1);

                        CosPsi_FW[  0][n][0]->Fill(nFWspect ,cos((n+1)*phiA   ),1);
                        CosPsi_FW[  1][n][0]->Fill(nFWspect ,cos((n+1)*phiCorA),1);
                        CosPsi_FW[  2][n][0]->Fill(nFWspect ,cos((n+1)*PsiA   ),1);
                        SinPsi_FW[  0][n][0]->Fill(nFWspect ,sin((n+1)*phiA   ),1);
                        SinPsi_FW[  1][n][0]->Fill(nFWspect ,sin((n+1)*phiCorA),1);
                        SinPsi_FW[  2][n][0]->Fill(nFWspect ,sin((n+1)*PsiA   ),1);

                        CosPsi_META[0][n][1]->Fill(Mtof+Mrpc,cos((n+1)*phiB   ),1);
                        CosPsi_META[1][n][1]->Fill(Mtof+Mrpc,cos((n+1)*phiCorB),1);
                        CosPsi_META[2][n][1]->Fill(Mtof+Mrpc,cos((n+1)*PsiB   ),1);
                        SinPsi_META[0][n][1]->Fill(Mtof+Mrpc,sin((n+1)*phiB   ),1);
                        SinPsi_META[1][n][1]->Fill(Mtof+Mrpc,sin((n+1)*phiCorB),1);
                        SinPsi_META[2][n][1]->Fill(Mtof+Mrpc,sin((n+1)*PsiB   ),1);

                        CosPsi_FW[  0][n][1]->Fill(nFWspect ,cos((n+1)*phiB   ),1);
                        CosPsi_FW[  1][n][1]->Fill(nFWspect ,cos((n+1)*phiCorB),1);
                        CosPsi_FW[  2][n][1]->Fill(nFWspect ,cos((n+1)*PsiB   ),1);
                        SinPsi_FW[  0][n][1]->Fill(nFWspect ,sin((n+1)*phiB   ),1);
                        SinPsi_FW[  1][n][1]->Fill(nFWspect ,sin((n+1)*phiCorB),1);
                        SinPsi_FW[  2][n][1]->Fill(nFWspect ,sin((n+1)*PsiB   ),1);
                    }
                    hMETAvsCent->Fill(im+1,Mtof+Mrpc    );
                    hFWvsCent  ->Fill(im+1,nFWspect     );
                    hMETAvsFW  ->Fill(nFWspect,Mtof+Mrpc);
                }
            }

            h0PhiEPvect->Fill(VectphiEP);
            h0PhiEP->Fill(VectphiEP);
            hPhiCor->Fill(VectphiCorr);
            h0PhiA ->Fill(phiA);
            h0PhiB ->Fill(phiB);
            h0PhiAB->Fill(phiAB);
        }
        wPhiRPA = 1.;
        //-extended-version-introduced-at-09.07.15--which-corresponds-to-META-mult-equivalent-to-numTracking-Glauber--//
        if(NA>1 && NB>1 && Mfw>3){
            hRPA->Fill(VectphiEP);
            for(Int_t im=0;im<11;im++){
                if( (Mtof+Mrpc)>=Mrang[im] && (Mtof+Mrpc)<Mrang[im+1]){ hPhiAB[im]->Fill(fabs(phiAB),wPhiRPA); }
            }
            hRPA6Ywc->Fill(VectphiCorr);
        }
        //-here-we-make-a-control-plot-for-pileup-events--//
        hMfwMmeta->Fill(Mtof+Mrpc, Mfw );
        hMfw     ->Fill(           Mfw );
        hMmeta   ->Fill(Mtof+Mrpc      );
        hMtof    ->Fill(           Mtof);
        hMrpc    ->Fill(           Mrpc);
        //-------------------------------------------iteration-WallHits----( end )--------------------------------------------------//
        
        ////////////////////////////////////////////
        //----getting-ready-to-loop-over-tracks---//
        ////////////////////////////////////////////
        size = candCat->getEntries();
        //note-new-event----------------------------
        //if(par!=0){
            for (Int_t icent=0;icent<NC-4;icent++){
                for (Int_t irpi=0;irpi<NRAPI;irpi++){
                    for (Int_t ipt=0;ipt<NPTRN-5;ipt++){
                        pfy0pt[icent][irpi][ipt].NewEvt();
                        pfR0pt[icent][irpi][ipt].NewEvt();
                        pfF0pt[icent][irpi][ipt].NewEvt();
                        phist[ icent][irpi][ipt].NewEvt();
                    }
                }
            }
        //}
        Ntrack = 0;
        /////////////////////////////////////////////////////
        //--------Now-lets-try-to-get-tracks-----------------
        /////////////////////////////////////////////////////
        for(Int_t j=0;j<size;j++){
            hPartCuts->Fill(1.);
            pParticleCand = HCategoryManager::getObject(pParticleCand,candCat,j);
            if(!pParticleCand->isFlagBit(Particle::kIsUsed)){ continue; }
            hPartCuts->Fill(2.);
            //pidFlag==kFALSE;
            
            sys      = pParticleCand->getSystem();           // sys == 0 - Rpc, sys == 1 - Tof
            mom      = pParticleCand->getMomentum();         //-later-shall-use: getMomentumPID()---(c)-Alexandr
            charge   = pParticleCand->getCharge();
            metaQa   = pParticleCand->getMetaMatchQuality(); 
            beta     = pParticleCand->getBeta();
            theta    = pParticleCand->getTheta();
            phi      = pParticleCand->getPhi();
            chi2     = pParticleCand->getChi2();
            sec      = pParticleCand->getSector();           // sector is the sixth part of the detector
            chi2In   = pParticleCand->getInnerSegmentChi2(); // chi2 of inner segment (mdc 1,2)
            chi2Out  = pParticleCand->getOuterSegmentChi2(); // chi2 of outer segment (mdc 3,4)
            mass2    = pParticleCand->getMass2();            // mass2 = mom*mom*(1-beta*beta)/(beta*beta);
            mass     = pParticleCand->getMass();             // mass  = sqrt(mass2);
            mdcdEdx  = pParticleCand->getMdcdEdx();
            tofdEdx  = pParticleCand->getTofdEdx();
            metaDx   = pParticleCand->getRkMetaDx();         
            metaDy   = pParticleCand->getRkMetaDy();         
            PCr      = pParticleCand->getR();
            PCz      = pParticleCand->getZ();
            hphi    -> Fill(phi);
            dphi     = phi - VectphiEP;
            if (dphi> 180.){dphi = dphi - 360.; }
            if (dphi<-180.){dphi = dphi + 360.; }
            dphiRec  = phi - VectphiCorr;
            if (dphiRec> 180.){dphiRec = dphiRec - 360.; }
            if (dphiRec<-180.){dphiRec = dphiRec + 360.; }
            dphiFlt  = phi - PsiCorr;
            if (dphiFlt> 180.){dphiFlt = dphiFlt - 360.; }
            if (dphiFlt<-180.){dphiFlt = dphiFlt + 360.; }
            // apply track QA cuts
            if (metaQa>2){ continue; }
            hPartCuts->Fill(3.);
            if (mass2 <0){ continue; }
            hPartCuts->Fill(4.);
            //Proton selection
            betaMeanP = fBetaMeanP->Eval(mom);
            hbetaMomAll ->Fill(mom*charge,beta);
            if(charge>0) hBetaMeanP  ->Fill(mom*charge,betaMeanP);
            if(charge>0) hBetaDownP  ->Fill(mom*charge,betaMeanP-0.05);
            if(charge>0) hBetaUpPro  ->Fill(mom*charge,betaMeanP+0.05);
            hdEdxMAll   ->Fill(charge*mass/1000 ,mdcdEdx);
            hdEdxMom    ->Fill(mom*charge,mdcdEdx);
            hfdEdxMomLow->Fill(mom*charge,fdEdxVsMomLowLimit(mom));
            hChi2In     ->Fill(chi2In);
            hChi2Out    ->Fill(chi2Out);
            hChi2       ->Fill(chi2);
            pt0       = mom*sin(theta*hpi/90.); //uncorrected pt
            y0        = (0.5*log((1+beta*cos(theta*hpi/90.))/(1-beta*cos(theta*hpi/90.)))-Ycm)/Ycm; //uncorrected Yo
            rapidity  = y0*Ycm;
            hAccept  -> Fill(rapidity,pt0/1e3);
            for(Int_t i=0;i<11-4;i++){
                for(Int_t j=0;j<9;j++){
                    for(Int_t k=0;k<18-5;k++){
                        if( (Mtof+Mrpc)>=Mrang[i+4] && (Mtof+Mrpc)<Mrang[i+5] && y0>Yrang[j] && y0<Yrang[j+1] && pt0>Prang[k] && pt0<Prang[k+1]){
                            phist[i][j][k].FillMass(mass2/1e6);
                        }
                    }
                }
            }
            if (p.fPID(14, mom,beta,charge)){ hbetaMomPro->Fill(mom*charge,beta); /*pidFlag == kTRUE;*/ }
            if ( mass>600 && mass<1250 && NA>0 && NB>0 && charge>0 && metaQa<5 && chi2<200. && chi2In>0.1 && chi2In<12. && chi2Out>0.1 && chi2Out<12. && sec>=0 && sec<=5 && mdcdEdx>fdEdxVsMomLowLimit(mom)){
                hphiPro     ->Fill(phi);
                hMom        ->Fill(mom*charge);
                hMomCorr    ->Fill(charge*momCorPar->getCorrMom(14,mom,theta));
                PCp         = pParticleCand->getCorrectedMomentumPID(14);
                hMomCorrPID ->Fill(charge*PCp);
                PCpz        = PCp*cos(theta*hpi/90.);
                PCE         = sqrt(mass2Pro + PCp*PCp        );
                PCY         = 0.5*(log((PCE+PCpz)/(PCE-PCpz))); //corrected rapidity for protons
                PCYn        = PCY/(2.*Ycm); //normalized to projectile rapidity Y/Yproj
                PCYo        = (PCY-Ycm)/Ycm; //normalized to projectile rapidity (Y(cm)/Yproj(cm))
                PCpt        = PCp*sin(theta*hpi/90.); //corrected pt
                hAcceptP    ->Fill((PCY-Ycm),PCpt/1e3);
                hPCpt       ->Fill(PCpt);
                hpt0        ->Fill( pt0);
                //---get-track-efficiency-------//
                binX      =   hProtPtVsY_Eff->GetXaxis()->FindBin((Double_t) PCY );  //-Pt:Y-correction--
                binY      =   hProtPtVsY_Eff->GetYaxis()->FindBin((Double_t) PCpt);  //-Pt:Y-correction--
                TrackEff  =   hProtPtVsY_Eff->GetBinContent(binX,binY);
                //------------------------------//

                CENT=-1;
                if( (Mtof+Mrpc)>=163 && (Mtof+Mrpc)<215 ){ CENT = 10; }
                if( (Mtof+Mrpc)>=144 && (Mtof+Mrpc)<163 ){ CENT =  9; }
                if( (Mtof+Mrpc)>=123 && (Mtof+Mrpc)<144 ){ CENT =  8; }
                if( (Mtof+Mrpc)>=103 && (Mtof+Mrpc)<123 ){ CENT =  7; }
                if( (Mtof+Mrpc)>= 85 && (Mtof+Mrpc)<103 ){ CENT =  6; }
                if( (Mtof+Mrpc)>= 72 && (Mtof+Mrpc)< 85 ){ CENT =  5; }
                if( (Mtof+Mrpc)>= 59 && (Mtof+Mrpc)< 72 ){ CENT =  4; }
                if( (Mtof+Mrpc)>= 50 && (Mtof+Mrpc)< 59 ){ CENT =  3; }
                if( (Mtof+Mrpc)>= 39 && (Mtof+Mrpc)< 50 ){ CENT =  2; }
                if( (Mtof+Mrpc)>= 30 && (Mtof+Mrpc)< 39 ){ CENT =  1; }
                if( (Mtof+Mrpc)>= 20 && (Mtof+Mrpc)< 30 ){ CENT =  0; }
                RAPI=-1;
                if( PCYo>-0.9 && PCYo<-0.7 ){ RAPI=0; }
                if( PCYo>-0.7 && PCYo<-0.5 ){ RAPI=1; }
                if( PCYo>-0.5 && PCYo<-0.3 ){ RAPI=2; }
                if( PCYo>-0.3 && PCYo<-0.1 ){ RAPI=3; }
                if( PCYo>-0.1 && PCYo< 0.1 ){ RAPI=4; }
                if( PCYo> 0.1 && PCYo< 0.3 ){ RAPI=5; }
                if( PCYo> 0.3 && PCYo< 0.5 ){ RAPI=6; }
                if( PCYo> 0.5 && PCYo< 0.7 ){ RAPI=7; }
                if( PCYo> 0.7 && PCYo< 0.9 ){ RAPI=8; }
                PTRN=-1;
                if( PCpt> 200 && PCpt< 300 ){ PTRN= 0; }
                if( PCpt> 300 && PCpt< 400 ){ PTRN= 1; }
                if( PCpt> 400 && PCpt< 500 ){ PTRN= 2; }
                if( PCpt> 500 && PCpt< 600 ){ PTRN= 3; }
                if( PCpt> 600 && PCpt< 700 ){ PTRN= 4; }
                if( PCpt> 700 && PCpt< 800 ){ PTRN= 5; }
                if( PCpt> 800 && PCpt< 900 ){ PTRN= 6; }
                if( PCpt> 900 && PCpt<1000 ){ PTRN= 7; }
                if( PCpt>1000 && PCpt<1100 ){ PTRN= 8; }
                if( PCpt>1100 && PCpt<1200 ){ PTRN= 9; }
                if( PCpt>1200 && PCpt<1300 ){ PTRN=10; }
                if( PCpt>1300 && PCpt<1400 ){ PTRN=11; }
                if( PCpt>1400 && PCpt<1500 ){ PTRN=12; }
                if( PCpt>1500 && PCpt<1600 ){ PTRN=13; }
                if( PCpt>1600 && PCpt<1700 ){ PTRN=14; }
                if( PCpt>1700 && PCpt<1800 ){ PTRN=15; }
                if( PCpt>1800 && PCpt<1900 ){ PTRN=16; }
                if( PCpt>1900 && PCpt<2000 ){ PTRN=17; }
                if( CENT>=4 && RAPI>=0 && PTRN>=0 && PTRN<=12 ){
                    pfy0pt[ CENT-4][RAPI][PTRN].Fill(dphi   , fabs(phiAB), VectphiEP  , 1.*TrackEff);
                    pfR0pt[ CENT-4][RAPI][PTRN].Fill(dphiRec, fabs(phiAB), VectphiCorr, 1.*TrackEff);
                    pfF0pt[ CENT-4][RAPI][PTRN].Fill(dphiFlt, fabs(phiAB), PsiCorr    , 1.*TrackEff); 
                    phist[  CENT-4][RAPI][PTRN].Fill(mass2/1e6,phi); 
                    hptvsphi->Fill(PCpt,phi);
                    hptvstheta->Fill(PCpt,theta);
                    hphivstheta->Fill(theta,phi);
                }
            }//end-proton-selection
            //------Now-make-PID----------end----------
            Ntrack++;
        }//j-----Loop-over-entries-----
        hNtrMult->Fill(Ntrack,Mtof+Mrpc);
    }//i-----Loop-over-events----------

    sorter.finalize();

    foutfile->Write();
    foutfile->Close();
  
    return 0;  
}
Exemplo n.º 3
0
Int_t EventCount(TString inputlist, TString outfile, Int_t nev=-1)
{  

  HLoop* loop = new HLoop   (kTRUE    );  // kTRUE : create Hades  (needed to work with standard eventstructure)
         loop ->addMultFiles(inputlist);

//-----Inicialize-classes-we-need-to-use-----------------
  PidParticle p;
  dEdx        d;
  HMultCorr   cCorr;
//-------------------------------------------------------

//--------------------------------------------------------------------------------------------------------
#include "/u/parfenov/anaflow/EventCountVar.h"     //include all constants and variables we need          
#include "/u/parfenov/anaflow/outsigma.C"          //Declaration of the 3-sigma cuts for our pt & rapidity
TH2F*  hProtPtVsY_Eff;
TFile* foutfile       = new TFile(outfile.Data(), "recreate"); 
TFile* FileProtEff    = new TFile("EffCorrForProtPtVsY_WithWideBetaPcuts_ShieldGosia.root", "read");
       hProtPtVsY_Eff = (TH2F*) FileProtEff->Get("hProtPtVsY_EffSm");
       foutfile->cd();

#include "/u/parfenov/anaflow/EventCountHisto.h"   //include all histograms we need                       

FFlow pfy0pt[NC][NRAPI][NPTRN]; //--flow--9-bins-Yo--12-bins-in-Pt-in-3-centrality-sets--
  for (Int_t i=0; i<NC;i++){
   for(Int_t j=0; j<NRAPI; j++){
     for(Int_t k=0; k<NPTRN; k++){
       //-proton------------------------------------------
       pfy0pt[i][j][k].THDeclare("pCent",i,"Yo",j,"Pt",k);
     }
   }
  }
//--------------------------------------------------------------------------------------------------------

  if(!loop->setInput("-*,+HParticleCand,+HParticleEvtInfo,+HStart2Hit,+HStart2Cal,+HWallHit,+HRpcCluster,+HTofHit,+HWallEventPlane")) { exit(1); }
  loop->printCategories();
  
  TIterator* iterWallHit = 0;
  if (loop->getCategory("HWallHit")  ) iterWallHit   = loop->getCategory("HWallHit")->MakeIterator();
  
  HParticleEvtInfo* evtinfo;
  
  HParticleCand* pParticleCand; HCategory* candCat = (HCategory*)HCategoryManager::getCategory(catParticleCand); if(!candCat){exit(1);}
  HWallHit*      pWallHit;      HCategory* wallCat = (HCategory*)HCategoryManager::getCategory(catWallHit);      if(!wallCat){exit(1);}

  HEnergyLossCorrPar *momCorPar = new HEnergyLossCorrPar();
  momCorPar->setDefaultPar("apr12");
      
  /////////////////////////////////////////////////////////
  //-----Loop-over-events----------------------------------
  /////////////////////////////////////////////////////////
  
  loop->addMultFiles(inputlist);

  Int_t events = loop->getEntries();
  if(nev < events && nev >= 0 ) events = nev;
  
  for (Int_t i=1; i<events;i++){
    
    if (loop->nextEvent(i)<=0){
      cout << "End recieved with IF exit" << endl;
      break;
    }
    if (i%1000 == 0){
      cout << "    event " << i << endl;
    }
    
    if( loop->isNewFile(currFName) ){ 
        currFName = currFName( currFName.Last('/')+1,currFName.Length()-currFName.Last('/')-1 );
        currBeName = currFName(0, 13); //-simply-the-file-name-w/o-EBchunk--
        currFDay = currFName( 4, 3 ); //-we-cut-out-day-number-position-starting-from-4th-digit-with-length-of-3digits--
        DAY_NUM = currFDay.Atoi();
        currTime = currFName( 7, 2 ); //-we-cut-out-day-hour--position-starting-from-4th-digit-with-length-of-3digits--
        HR=currTime.Atoi();
        currTime = currFName( 9, 2 ); //-we-cut-out-day-minute-position-starting-from-4th-digit-with-length-of-3digits--
        MN=currTime.Atoi();
        currTime = currFName(11, 2 ); //-we-cut-out-day-second-position-starting-from-4th-digit-with-length-of-3digits--
        SC=currTime.Atoi();
        AbsMinute = MN + HR*60 + DAY_NUM*24*60;

        #include "/u/parfenov/anaflow/anaKaons_params_gen7_Auto_RC_RW_updated_gen108RminEqZero_11MultRecent.cc" //-for recentering---

        //--Now-we-read-multiplicity-parameters-for-this-beXXXXXXXXXX-file--------------------//
        mulVal = cCorr.getLineValuesAsVectFromCalibFile( currBeName );
        cout<<"mulVal "<< mulVal[0] <<" "<< mulVal[1] <<" "<< mulVal[2] <<" "<< mulVal[3] <<endl;
        fAverageMTS[0]=mulVal[4];  //multiplicity in tracking sector 1
        fAverageMTS[1]=mulVal[5];  //multiplicity in tracking sector 2
        fAverageMTS[2]=mulVal[6];  //...
        fAverageMTS[3]=mulVal[7];
        fAverageMTS[4]=mulVal[8];
        fAverageMTS[5]=mulVal[9];  //multiplicity in tracking sector 6
        printf("fAverageMTS[0,1,2,3,4,5]=[%6.3f,%6.3f,%6.3f,%6.3f,%6.3f,%6.3f,]\n", fAverageMTS[0], fAverageMTS[1], fAverageMTS[2], fAverageMTS[3], fAverageMTS[4], fAverageMTS[5]);
        
        //fTrkMultDay108
        if(mulVal[2]>0.0){
          //-if-correction-is-found-or-if-it-was-not-zero-defined-(in-case-of-not-working-MDCs)---
          fTrkMultScaler = fTrkMultDay108/mulVal[2];
          printf("==>Correction multiplier nTrkMult for this file is: (%f/%f)=%f\n", fTrkMultDay108, mulVal[2], fTrkMultScaler );
        }else{
          //--if-correction-entry-is-not-found-(may-be-not-created-once)------------------
          //--or-if-say-MDCs-were-not-working-and-tracking-multiplicity-was-exectly-zero--
          //-we-keep-correction-as-it-was-in-previous-file-or-if-not-defined-hence-it-would-be-exactly-one=1-or-
          printf("==>Correction multiplier nTrkMult for this file is: (%f/%f)=%f (default or old correction is used)\n", fTrkMultDay108, mulVal[2], fTrkMultScaler);
        }
    }

    HTool::printProgress(i,events,1,"Analyze pairs :");

    evtinfo = HCategoryManager::getObject(evtinfo,catParticleEvtInfo,0);
    
      //-------Get-vertex-from-combined-fit-of-fitted-inner-segments------------
      HVertex            fPrimVertReco = gHades->getCurrentEvent()->getHeader()->getVertexReco();
      vertexX = fPrimVertReco.getX();
      vertexY = fPrimVertReco.getY();
      vertexZ = fPrimVertReco.getZ();
      
      hvertexXZ->Fill(vertexZ,vertexX);
      hvertexXY->Fill(vertexY,vertexX);
      hvertexX ->Fill(vertexX);
      hvertexY ->Fill(vertexY);
      hvertexZ ->Fill(vertexZ);
      
      //------Alexandr's-vertex-cuts---------
      
      tgtChi2 = (Float_t) fPrimVertReco.getChi2();

      hTargChi2->Fill(tgtChi2);


      if( tgtChi2<2.0 || tgtChi2>40.) continue; //-skip-events-with-badly-reconstructed-target-------
      if( vertexZ<-59.|| vertexZ>0. ) continue; //-skip-events-with-primary-vertex-outside-of-target-

      hTargX_EVT->Fill(vertexX);
      hTargY_EVT->Fill(vertexY);
      hTargZ_EVT->Fill(vertexZ);

      if( (vertexX-tgtXc)*(vertexX-tgtXc)+(vertexY-tgtYc)*(vertexY-tgtYc)>R2 ) continue; //-skip-events-with-primary-vertex-far-from-target---
      hCutSteps->Fill(5.5);

      hTargXYsel->Fill(vertexX,vertexY);
      hTargXZsel->Fill(vertexZ,vertexX);
      //---------end-of-Alexandr's-vertex-cut--------------
      
      //------HWall-iteration------------------------------
      if (iterWallHit){
    iterWallHit->Reset();
    HWallHit* pWallHit;
        
    while ( (pWallHit = (HWallHit*)iterWallHit->Next()) != 0 ){
         
         cellNum    = pWallHit->getCell();
             cellTime   = pWallHit->getTime();
             cellCharge = pWallHit->getCharge();
             cellPhi    = pWallHit->getPhi();
         
         hWallHitTIME->Fill(cellNum-0.1, cellTime  );
         hWallHitCHRG->Fill(cellNum-0.1, cellCharge);
         
         if (cellCharge > d.dEdxCut(cellNum)/10. && cellTime > 16. && cellTime < 44.){
           hWallHitTIMEcut->Fill(cellNum-0.1, cellTime  );
           hWallHitCHRGcut->Fill(cellNum-0.1, cellCharge);
         }//end-cut
         
    }//------end-HWall-iteration-----------------------
      }//endif

    if( evtinfo->getSumParticleCandMult()<2 ) continue;  //getSumParticleCandMult()>1
      if(!evtinfo->isGoodEvent(
                               Particle::kGoodVertexClust|
                               Particle::kGoodVertexCand|
                               Particle::kNoPileUpSTART|
                               Particle::kGoodSTART|      
                               Particle::kGoodTRIGGER|    
                               Particle::kNoVETO|         
                               Particle::kGoodSTARTVETO|  
                               Particle::kGoodSTARTMETA
                              )) continue ; // bitwise add flags as suggested by Manuel 
                              
      Mtof = evtinfo->getSumTofMult();
      Mrpc = evtinfo->getSumRpcMult();
      Mult = Mtof+Mrpc;
      
      hmultTofRpc->Fill(Mult);                                   // Fill( name , weight )
      
      
      //---------centrality-classes--------------------------------------------------------------------(begin)--------//
      //-Centrality-selection-for-further-if-selection-statements------------------------//
      Int_t   nTrkMult = getParticleTrkMult();
      Mtr   = nTrkMult;
      Float_t nTrkMultCorr = nTrkMult*fTrkMultScaler;
      MtrC  = nTrkMultCorr; //-after-correction-to-average-day108--

      if( nTrkMultCorr>33 && nTrkMultCorr<=49 ){ FOPI_blue=kTRUE; }else{ FOPI_blue=kFALSE; }        // Berusz's estimate
      if( nTrkMultCorr>49 && nTrkMultCorr<=82 ){ FOPI_gren=kTRUE; }else{ FOPI_gren=kFALSE; }        // based on Glauber model
      if( nTrkMultCorr>82                     ){ FOPI_redd=kTRUE; }else{ FOPI_redd=kFALSE; }        // (lucky me, seems very similar to my naive guess!)--Alexandr-(c)--

      if( FOPI_blue ){ hPhiAB_blue->Fill(fabs(phiAB), wPhiRPA); }
      if( FOPI_gren ){ hPhiAB_gren->Fill(fabs(phiAB), wPhiRPA); }
      if( FOPI_redd ){ hPhiAB_redd->Fill(fabs(phiAB), wPhiRPA); }

      multCand = evtinfo->getSumSelectedParticleCandMult();

      hmultSumSPCand->Fill(multCand);
     
     //--------------------------------------------//
     //--Event plane reconstruction loop-----------//
     //--------------------------------------------// 
      multWall=0;
      cellNum=0;
      cellTime=0.0;
      cellCharge=0.0;
      wallX=0.0,wallY=0.0,wallZ=0.0;
      wallXc=0.0, wallYc=0.0; //corrected-reCentered-
      XfwSmear=0.0, YfwSmear=0.0;
      vect.Set(0.,0.);
      vsum.Set(0.,0.);
      eX  .Set(1.,0.);
      dEdxCut=0.0;
      xyRadius=0.0;
      
      QLx=0.0, QLy=0.0, NL=0; 
      QMx=0.0, QMy=0.0, NM=0;
      QNx=0.0, QNy=0.0, NN=0;

      for(Int_t n=0; n<6; n++){
         Qx[ n]    =0.0; Qy[ n]   =0.0;
         QxRec[n]  =0.0; QyRec[n] =0.0;
         Qax[n]    =0.0; Qay[n]   =0.0;
         Qbx[n]    =0.0; Qby[n]   =0.0;
         phiEP[ n] = -1000.;
         phiEPr[n] = 0.;
      }

      phiA   = -1000;
      phiB   = -1000;
      cellsVect.Reset();
      
      //-weight-for-scalar-product-method-------------------
      wgh = 1.0;  //PCpt; //1.0; //-or-could-be-also-equal-to-Pt---

      nFWhits   = 0;
      nFWspect  = 0;
      nFWunderflow = 0;
      FWdEdxA=0.0;
      FWdEdxB=0.0;

      FWdEdxL=0.0;
      FWdEdxM=0.0;
      FWdEdxN=0.0;

      choiceA = 1; //
      choiceB = 1; // Preparing for A/B subevent method

      //-------------------------------------------iteration-WallHits----(begin)--------------------------------------------------//
      for(Int_t j=0; j<(wallCat->getEntries()); j++){
        pWallHit = HCategoryManager::getObject(pWallHit,wallCat,j);

         cellNum    = pWallHit->getCell();
         cellTime   = pWallHit->getTime();
         cellCharge = pWallHit->getCharge();

         cellChargeCtime = cellTime;
         hFW_TimeCell_0->Fill(cellTime  , cellNum);
         hFW_dEdxCell_0->Fill(cellCharge, cellNum);

         if(cellNum< 144                ){ dEdxCut=Z1_cut_s; }
         if(cellNum>=144 && cellNum<=207){ dEdxCut=Z1_cut_m; }
         if(cellNum> 207                ){ dEdxCut=Z1_cut_l; }

         if(cellTime>T1_cut && cellTime<T2_cut && cellCharge>dEdxCut){
           
           nFWspect++;

           hFW_TimeCell_1->Fill(cellTime  , cellNum);
           hFW_dEdxCell_1->Fill(cellCharge, cellNum);

           pWallHit->getXYZLab(wallX,wallY,wallZ);
           hFWxyCC->Fill(wallX,wallY); //cell centers
           
           for (Int_t im=1;im<12;im++){
            if( (Mtof+Mrpc)>=Mrang[im-1] && (Mtof+Mrpc)<Mrang[im]){ wallXc = wallX - X_shM[12-im]; wallYc = wallY - Y_shM[12-im]; }
           }

           //-here-we-fill-d2N/(dxdy)-inX-band--and--y-band--for-auto-recentering-
           //-this-makes-realistic-distribution-on-FW-face------------------------
           if (cellNum<=143)                 { cellSize = 40;  }
           if (cellNum>=144 && cellNum<=207) { cellSize = 80;  }
           if (cellNum>=210 && cellNum<=301) { cellSize = 160; }
           XfwSmear = wallXc + ( Random.Rndm(1) - 0.5 )*cellSize;
           YfwSmear = wallYc + ( Random.Rndm(1) - 0.5 )*cellSize;

           
           for (Int_t im=0;im<8;im++){
            //-X-beam-center-scan---
            if( (Mtof+Mrpc)>=  Mcent[im] && (Mtof+Mrpc)< Mcent[im+1] ){ hFWxyCCsmearXscanM[im]->Fill(XfwSmear,YfwSmear); }
            //-Y-beam-center-scan---
            if( (Mtof+Mrpc)>=  Mcent[im] && (Mtof+Mrpc)< Mcent[im+1] ){ hFWxyCCsmearYscanM[im]->Fill(XfwSmear,YfwSmear); }
           }


           //-this-cut-was-forgotten-for-Feb2014-HADES-CM-report--//
           //-I-reintroduce-it-14.03.2014----(c)-Sadovsky---------//
           if(  wallXc*wallXc + wallYc*wallYc >= R0_cut*R0_cut  /*50.*50.*/ ){
             hFW_TimeCell_2->Fill(cellTime  , cellNum);
             hFW_dEdxCell_2->Fill(cellCharge, cellNum);


             //-spectators-selected--
             multWall++;

             vect.Set(wallXc, wallYc);
             vect =  vect.Unit();
             vsum += vect;

             //-Qnx-method--for-n=1,2,3,4,5------
             VectPhi_i = TMath::ATan2(YfwSmear,XfwSmear); //-Phi-of-i_th-spectator-particle---
             for(Int_t n=1; n<6; n++){//-loop-over-harmonics-(n)--
               Qx[n] = Qx[n] + wgh*cos(double(n)*VectPhi_i);
               Qy[n] = Qy[n] + wgh*sin(double(n)*VectPhi_i);
             }

             cellsVect.SetCellVect(vect, cellCharge); //-note-[vect]-is-a-unit-vector-this-is-for-further-subevent-(A/B)-split--


             hFWxyCCsmear->Fill(XfwSmear+X_shift,YfwSmear+Y_shift); //cells smeared but not shifted
             hFWxySHsmear->Fill(XfwSmear        ,YfwSmear        ); //cells smeared and shifted as a whole

             //-center-of-gravity-study-as-a-course-of-centrality-----------------------------
             for (Int_t im=0;im<8;im++){
              if( (Mtof+Mrpc)>=Mcent[im] && (Mtof+Mrpc)<Mcent[im+1]){ hFWxyCCsmearM[im]->Fill(XfwSmear,YfwSmear); }
             }
             
           }//-endif-R0_cut--//
           
        }//end-if-cells-cut---
     }//end-for-HitWall-loop---

     VectphiEP =  vsum.DeltaPhi(eX)   *rad2deg;
     VectphiEPr=  vsum.DeltaPhi(eX); //radians
     hPhiEPvect->Fill(VectphiEP);

     //-now-we-go-over-spectators-and-make-calculations-for-A/B-subevents
      NA=0;
      NB=0;
      multFWcells = cellsVect.GetNumbOfCells();

      Float_t choice;
      vectA.Set(0.,0.);
      vectB.Set(0.,0.);
      vsumA.Set(0.,0.);
      vsumB.Set(0.,0.);

      for(Int_t ic=0; ic<multFWcells; ic++){
        choice = Random.Rndm(1);
        //-this-is-(A/B)-subevents-split--(begin)-(c)-Sadovsky-----------------------------
        //-I-can-be-proud-that-my-algorithm-has-more-flat-distribution--:)-(c)-Sadovsky----
        levelA = (multFWcells/2.-choiceA+1.)/Float_t(multFWcells);
        levelB = (multFWcells/2.-choiceB+1.)/Float_t(multFWcells);
        if(choice < levelA/(levelA+levelB)){
           vectA = cellsVect.GetCellVector(ic);
           vsumA += vectA;
           choiceA++;
           NA++;
           vsumA += vectA;
           choiceA++;
           NA++;
           VectPhi_i = vectA.DeltaPhi(eX); //-Phi-of-i_th-spectator-particle-from-subevent-A--
           
           for(Int_t n=1; n<6; n++){//-loop-over-harmonics-(n)--
              Qax[n] = Qax[n] + wgh*cos(double(n)*VectPhi_i);
              Qay[n] = Qay[n] + wgh*sin(double(n)*VectPhi_i);
           }

           FWdEdxA=FWdEdxA + cellsVect.GetCellCharge(ic); //-total-Eloss-from-all-spectators---
           
        }else{

           vectB = cellsVect.GetCellVector(ic);
           vsumB += vectB;
           choiceB++;
           NB++;
           vectB = cellsVect.GetCellVector(ic);
           vsumB += vectB;
           choiceB++;
           NB++;
           VectPhi_i = vectB.DeltaPhi(eX); //-Phi-of-i_th-spectator-particle-from-subevent-B--
           
           for(Int_t n=1; n<6; n++){//-loop-over-harmonics-(n)--
              Qbx[n] = Qbx[n] + wgh*cos(double(n)*VectPhi_i);
              Qby[n] = Qby[n] + wgh*sin(double(n)*VectPhi_i);
           }

           FWdEdxB=FWdEdxB + cellsVect.GetCellCharge(ic); //-total-Eloss-from-all-spectators---
        }//-HWallHit-second-loop-for-reaction-plane-resolution--( end )---//
        //-this-is-(A/B)-subevents-split--( end )------------------------------------------
      }//-endfor-multFWcells-loop--for-A/B-method--

      //-calculating-eventplane-angles---------------
      phiA   = vsumA.DeltaPhi(eX)       *rad2deg;
      phiB   = vsumB.DeltaPhi(eX)       *rad2deg;
      phiAB  = vsumA.DeltaPhi(vsumB)    *rad2deg;
      Mfw = NA+NB;

      if (Mfw > 1){
        for (Int_t n=1;n<6;n++){
            QxRec[n]     = Qx[n] - MeanQx[n];
            QyRec[n]     = Qy[n] - MeanQy[n];
            phiEP[n ]    =  TMath::ATan2(Qy[n],Qx[n])/n       *rad2deg;
            phiEPr[n]    =  TMath::ATan2(Qy[n],Qx[n])/n               ;//radians
            phiEPrec[n]  =  TMath::ATan2(QyRec[n],QxRec[n])/n *rad2deg;
            hPhiEP[n-1]  -> Fill(phiEP[n]);
            hPhiEPrec[n-1]->Fill(phiEPrec[n]);
            hQvX  [n-1]  -> Fill(Qx[n]);
            hQvY  [n-1]  -> Fill(Qy[n]);
            hQvXrec[n-1] -> Fill(QxRec[n]);
            hQvYrec[n-1] -> Fill(QyRec[n]);
        }
        h0PhiEPvect->Fill(VectphiEP);
      }

      if(Mfw>=0){
        h0PhiEP->Fill(VectphiEP);
        h0PhiA ->Fill(phiA);
        h0PhiB ->Fill(phiB);
        h0PhiAB->Fill(phiAB);
      }
      //-extended-version-introduced-at-09.07.15--which-corresponds-to-META-mult-equivalent-to-numTracking-Glauber--//
      if(NA>0 && NB>0){
        hRPA->Fill(VectphiEP);
        for(Int_t im=0;im<11;im++){
            if( (Mtof+Mrpc)>=Mrang[im] && (Mtof+Mrpc)<Mrang[im+1] ){ hRPAy[im] ->Fill(VectphiEP); wPhiRPA = 1./fRPAy[im] ->Eval(VectphiEP); hRPAyc[im] ->Fill(VectphiEP,wPhiRPA); }
        }
        hRPA6Ywc->Fill(VectphiEP,wPhiRPA);
      }

      //-here-we-make-a-control-plot-for-pileup-events--//
      hMfwMmeta->Fill(Mtof+Mrpc, Mfw );
      hMfw     ->Fill(           Mfw );
      hMmeta   ->Fill(Mtof+Mrpc      );
      hMtof    ->Fill(           Mtof);
      hMrpc    ->Fill(           Mrpc);
      
      //-------------------------------------------iteration-WallHits----( end )--------------------------------------------------//


      ////////////////////////////////////////////
      //----getting-ready-to-loop-over-tracks---//
      ////////////////////////////////////////////
                     size = candCat->getEntries();
      Bool_t pimFlag[size];    // pi-
      Bool_t pipFlag[size];    // pi+
      Bool_t proFlag[size];    // proton
      Bool_t kapFlag[size];    // K+ meson        
      
      //note-new-event----------------------------
      for (Int_t icent=0;icent<NC;icent++){
        for (Int_t irpi=0;irpi<NRAPI;irpi++){
            for (Int_t ipt=0;ipt<NPTRN;ipt++){
                pfy0pt[icent][irpi][ipt].NewEvt();
            }
        }
      }   
      
      /////////////////////////////////////////////////////
      //--------Now-lets-try-to-get-tracks-----------------
      /////////////////////////////////////////////////////
      for(Int_t j=0;j<size;j++){
    
    pimFlag[j] = kFALSE;
    pipFlag[j] = kFALSE;
    proFlag[j] = kFALSE;
    kapFlag[j] = kFALSE;
        
    hEntries->Fill(size);
    
    pParticleCand = HCategoryManager::getObject(pParticleCand,candCat,j);
    if(!pParticleCand->isFlagBit(Particle::kIsUsed)) continue;
    
    
    sys      = pParticleCand->getSystem();           // sys == 0 - Rpc, sys == 1 - Tof
    mom      = pParticleCand->getMomentum();         //-later-shall-use: getMomentumPID()---(c)-Alexandr
    charge   = pParticleCand->getCharge();
    metaQa   = pParticleCand->getMetaMatchQuality(); 
    beta     = pParticleCand->getBeta();
    theta    = pParticleCand->getTheta();
    phi      = pParticleCand->getPhi();
    chi2     = pParticleCand->getChi2();
    sec      = pParticleCand->getSector();           // sector is the sixth part of the detector
    chi2In   = pParticleCand->getInnerSegmentChi2(); // chi2 of inner segment
    chi2Out  = pParticleCand->getOuterSegmentChi2(); // chi2 of outer segment
    mass2    = pParticleCand->getMass2();            // mass2 = mom*mom*(1-beta*beta)/(beta*beta);
    mass     = pParticleCand->getMass();             // mass  = sqrt(mass2);
    mdcdEdx  = pParticleCand->getMdcdEdx();
    tofdEdx  = pParticleCand->getTofdEdx();
    metaDx   = pParticleCand->getRkMetaDx();         
    metaDy   = pParticleCand->getRkMetaDy();         
    
    PCr              = pParticleCand->getR();
        PCz              = pParticleCand->getZ();
    
    pz       = mom*cos(theta*hpi/90.)/1000;
    pt0      = mom*sin(theta*hpi/90.)/1000;
    px       = pt0*cos(phi*hpi/90.);
    py       = pt0*sin(phi*hpi/90.);
    
    rapid    = 0.5*TMath::Log((1+beta)/(1-beta));
    eta      =    -TMath::Log(tan(theta/2));
    
    betaL    = beta*cos(theta*hpi/90.);
    rapidity = 0.5*TMath::Log((1+betaL)/(1-betaL));
    Y0       = (rapidity - Ycm)/Ycm;
    dphi     = phi - VectphiEP;
    if (dphi>180.){dphi = dphi - 360.; }
    if (dphi<-180.){dphi = dphi + 360.; }

    hPhi->Fill(phi);
    
        // apply track QA cuts
        if (metaQa>2) continue;
    if (mass2 <0) continue;
    
    hRapidity->Fill(rapidity);
    
    hM2fromM->Fill(mass);
    
    hCharge->Fill(charge);
    
     //-Tetiana's-plots-----------
           hChi2       ->Fill(chi2);
           hChi2In     ->Fill(chi2In);
           hChi2Out    ->Fill(chi2Out);
           //Fill Theta vs Phi Plots
           hthetaPhiAll->Fill(phi,theta);
           //Fill Beta vs Momentum
           hbetaMomAll ->Fill(mom*charge,beta);
           hmommassAll ->Fill(charge*mass,mom);
       
       hsys    ->Fill(sys);
       hmom    ->Fill(mom);
       hmetaQa ->Fill(metaQa);
       hsec    ->Fill(sec);
       hmdcdEdx->Fill(mdcdEdx);
       htofdEdx->Fill(tofdEdx);
       hmetaDx ->Fill(metaDx);
       hmetaDy ->Fill(metaDy);
       hPCr    ->Fill(PCr);
       hPCz    ->Fill(PCz);
       
       hpx     ->Fill(px);
       hpy     ->Fill(py);
       hpz     ->Fill(pz);
       hpt     ->Fill(pt);
       
       hdEdxMAll->Fill(mass/1000,mdcdEdx);
       
       
       //------Now-make-PID-------begin-----------
       
       pimFlag[j] = p.fPID(9, mom,beta,charge);
       pipFlag[j] = p.fPID(8, mom,beta,charge);
       kapFlag[j] = p.fPID(11,mom,beta,charge);
       proFlag[j] = p.fPID(14,mom,beta,charge);
       
       //fill-particle-numeration-integral-----------------------------------------------------
                                      hmassAll->Fill(charge*mass2/1000000);
       if (pipFlag[j] == kTRUE && mdcdEdx < 5) {
         hPIDPip ->Fill(charge*mass2/1000000); 
         pParticleCand->calc4vectorProperties(HPhysicsConstants::mass( 8));
         vector = (*pParticleCand);
         pt     = vector.Pt();
         y      = vector.Rapidity();
         hyPIDPip->Fill(y);
         hRPIDPip->Fill(rapidity);
         npip++;
      } // pi+    selection (Pip);
       if (pimFlag[j] == kTRUE && mdcdEdx < 5) {
         hPIDPim ->Fill(charge*mass2/1000000);
         pParticleCand->calc4vectorProperties(HPhysicsConstants::mass( 9));
         vector = (*pParticleCand);
         pt     = vector.Pt();
         y      = vector.Rapidity();
         hyPIDPim->Fill(y);
         hRPIDPim->Fill(rapidity);
         npim++;
      } // pi-    selection (Pim);
       if (kapFlag[j] == kTRUE && mdcdEdx < 5) { 
         hPIDKap ->Fill(charge*mass2/1000000);
         pParticleCand->calc4vectorProperties(HPhysicsConstants::mass(11));
         vector = (*pParticleCand);
         pt     = vector.Pt();
         y      = vector.Rapidity();
         hyPIDKap->Fill(y);
         hRPIDKap->Fill(rapidity);
         nkap++;
      } // K+     selection (Kap);
       if (proFlag[j] == kTRUE && mdcdEdx < 5) { 
         hPIDPro ->Fill(charge*mass2/1000000);
         pParticleCand->calc4vectorProperties(HPhysicsConstants::mass(14));
         vector = (*pParticleCand);
         pt     = vector.Pt();
         y      = vector.Rapidity();
         hyPIDPro->Fill(y);
         hRPIDPro->Fill(rapidity);
         npro++;
      } // proton selection (Pro);
       //--------------------------------------------------------------------------------------
           
       for (Int_t ipt=0; ipt<npt-1;ipt++){
        
         if (pt0>binpt[ipt] && pt0<binpt[ipt+1]){
                                    hM2Y   [ipt]->Fill(charge*mass2/1000000,rapidity);
         if (pipFlag[j] == kTRUE) { hM2YPip[ipt]->Fill(charge*mass2/1000000,rapidity); }
         if (pimFlag[j] == kTRUE) { hM2YPim[ipt]->Fill(charge*mass2/1000000,rapidity); }
         if (kapFlag[j] == kTRUE) { hM2YKap[ipt]->Fill(charge*mass2/1000000,rapidity); }
         if (proFlag[j] == kTRUE) { hM2YPro[ipt]->Fill(charge*mass2/1000000,rapidity); }
         }
         
         for (Int_t irpdt=0; irpdt<nrpdt-1;irpdt++){
           if (pt0>binpt[ipt] && pt0<binpt[ipt+1] && rapidity>binrpdt[irpdt] && rapidity<binrpdt[irpdt+1]){
         if (                                                                                                       mdcdEdx < 5) { hM2   [ipt][irpdt]->Fill( charge*mass2/1000000);}
             
         if (pipFlag[j] == kTRUE && mass2/1e6<=mass2Pip+sPip[ipt][irpdt] && mass2/1e6>=mass2Pip-sPip[ipt][irpdt] && mdcdEdx < 5) { hM2Pip[ipt][irpdt]->Fill( charge*mass2/1000000);}
         if (pimFlag[j] == kTRUE && mass2/1e6<=mass2Pim+sPim[ipt][irpdt] && mass2/1e6>=mass2Pim-sPim[ipt][irpdt] && mdcdEdx < 5) { hM2Pim[ipt][irpdt]->Fill( charge*mass2/1000000);}
         if (kapFlag[j] == kTRUE && mass2/1e6<=mass2Kap+sKap[ipt][irpdt] && mass2/1e6>=mass2Kap-sKap[ipt][irpdt] && mdcdEdx < 5) { hM2Kap[ipt][irpdt]->Fill( charge*mass2/1000000);}
         if (proFlag[j] == kTRUE && mass2/1e6<=mass2Pro+sPro[ipt][irpdt] && mass2/1e6>=mass2Pro-sPro[ipt][irpdt] && mdcdEdx < 5) { hM2P  [ipt][irpdt]->Fill( charge*mass2/1000000);} 
         
         hdEdxMass[ipt][irpdt]->Fill(charge*mass/1000,mdcdEdx);
         
           }//endif
         }//irpdt
       }//ipt

        for (Int_t ipt=0; ipt<npt-1;ipt++){
        
         if (pt0>binpt[ipt] && pt0<binpt[ipt+1] && (rapidity-Ycm)>=-Ycm && (rapidity-Ycm)<=Ycm){
          v2            = cos(2*((phi-180-VectphiEP)*hpi/90.));
          v2sum [ipt]  += v2;
          ncount[ipt]++;
          hv2phi[ipt]->Fill((phi-180-VectphiEP),v2,wgh);

          hNphi [ipt]->Fill((phi-180-VectphiEP),wgh);
         }
        }
        
        if (mass>600 && mass<1250 && NA>0 && NB>0 && charge>0 && metaQa<5 && chi2<200. && chi2In>0.1 && chi2In<12. && chi2Out>0.1 && chi2Out<12. && sec>=0 && sec<=5 && mdcdEdx>fdEdxVsMomLowLimit(mom)){

            PCp     = pParticleCand->getCorrectedMomentumPID(14);
            PCpz      = PCp*cos(theta*hpi/90.);

            PCE     = sqrt(938.272*938.272 + PCp*PCp );
            PCY     = 0.5*(log((PCE+PCpz)/(PCE-PCpz))); //corrected rapidity for protons
            PCYn    = PCY/(2.*Ycm); //normalized to projectile rapidity Y/Yproj
            PCYo    = (PCY-Ycm)/Ycm; //normalized to projectile rapidity (Y(cm)/Yproj(cm))
            PCpt    = PCp*sin(theta*hpi/90.); //corrected pt

            //---get-track-efficiency-------//
            binX     =   hProtPtVsY_Eff->GetXaxis()->FindBin((Double_t) rapidity );  //-Pt:Y-correction--
            binY     =   hProtPtVsY_Eff->GetYaxis()->FindBin((Double_t) PCpt );  //-Pt:Y-correction--
            TrackEff =   hProtPtVsY_Eff->GetBinContent(binX,binY);
            //------------------------------//
            for (Int_t n=1; n<6; n++){
                hPhiEPc[n-1]->Fill(phiEP[n],wgh*TrackEff);
            }

            CENT=-1;
            if( FOPI_redd ){ CENT=0; }
            if( FOPI_gren ){ CENT=1; }
            if( FOPI_blue ){ CENT=2; }
            RAPI=-1;
            if( PCYo>-0.9 && PCYo<-0.7 ){ RAPI=0; }
            if( PCYo>-0.7 && PCYo<-0.5 ){ RAPI=1; }
            if( PCYo>-0.5 && PCYo<-0.3 ){ RAPI=2; }
            if( PCYo>-0.3 && PCYo<-0.1 ){ RAPI=3; }
            if( PCYo>-0.1 && PCYo< 0.1 ){ RAPI=4; }
            if( PCYo> 0.1 && PCYo< 0.3 ){ RAPI=5; }
            if( PCYo> 0.3 && PCYo< 0.5 ){ RAPI=6; }
            if( PCYo> 0.5 && PCYo< 0.7 ){ RAPI=7; }
            if( PCYo> 0.7 && PCYo< 0.9 ){ RAPI=8; }
            PTRN=-1;
            if( PCpt> 200 && PCpt< 300 ){ PTRN= 0; }
            if( PCpt> 300 && PCpt< 400 ){ PTRN= 1; }
            if( PCpt> 400 && PCpt< 500 ){ PTRN= 2; }
            if( PCpt> 500 && PCpt< 600 ){ PTRN= 3; }
            if( PCpt> 600 && PCpt< 700 ){ PTRN= 4; }
            if( PCpt> 700 && PCpt< 800 ){ PTRN= 5; }
            if( PCpt> 800 && PCpt< 900 ){ PTRN= 6; }
            if( PCpt> 900 && PCpt<1000 ){ PTRN= 7; }
            if( PCpt>1000 && PCpt<1100 ){ PTRN= 8; }
            if( PCpt>1100 && PCpt<1200 ){ PTRN= 9; }
            if( PCpt>1200 && PCpt<1300 ){ PTRN=10; }
            if( PCpt>1300 && PCpt<1400 ){ PTRN=11; }
            if( PCpt>1400 && PCpt<1500 ){ PTRN=12; }
            if( PCpt>1500 && PCpt<1600 ){ PTRN=13; }
            if( PCpt>1600 && PCpt<1700 ){ PTRN=14; }
            if( PCpt>1700 && PCpt<1800 ){ PTRN=15; }
            if( PCpt>1800 && PCpt<1900 ){ PTRN=16; }
            if( PCpt>1900 && PCpt<2000 ){ PTRN=17; }
            if( CENT>=0 && RAPI>=0 && PTRN>=0 ){
                   pfy0pt[CENT][RAPI][PTRN].Fill(dphi, fabs(phiAB), VectphiEP, wgh*TrackEff);
                 }
        }
        
       
       //------Now-make-PID----------end----------
       
      }//j-----Loop-over-entries-----

  }//i-----Loop-over-events----------

  for (Int_t i=0;i<npt-1;i++){
        v2x[i] = binpt[i] + 0.5*(binpt[i+1]-binpt[i]);
        v2w[i] = hv2phi[i]->GetMean(2);
        hv2   -> Fill(v2x[i],v2w[i]);
  }

  Float_t yPID [4] = {hyPIDPim->GetMean(), hyPIDPip->GetMean(), hyPIDKap->GetMean(), hyPIDPro->GetMean()};
  Float_t ybet [4] = {hRPIDPim->GetMean(), hRPIDPip->GetMean(), hRPIDKap->GetMean(), hRPIDPro->GetMean()};
  Float_t dyPID[4] = {hyPIDPim->GetRMS() , hyPIDPip->GetRMS() , hyPIDKap->GetRMS() , hyPIDPro->GetRMS() };
  Float_t dybet[4] = {hRPIDPim->GetRMS() , hRPIDPip->GetRMS() , hRPIDKap->GetRMS() , hRPIDPro->GetRMS() };
  Float_t dy   [4];
  Float_t MeanY = 0.0;
  for (Int_t i=0;i<4;i++){
    dy[i] = 0.5*sqrt(ybet[i]*ybet[i]*dyPID[i]*dyPID[i]+yPID[i]*yPID[i]*dybet[i]*dybet[i])/(ybet[i]*ybet[i]);
    MeanY+=yPID[i]/ybet[i];
  }
  MeanY = MeanY/4;
  
  for (Int_t i=0;i<4;i++){
    hyvsPID ->Fill(i+0.5,yPID[i]/ybet[i]);
    hnormPID->Fill(i+0.5,MeanY);
  }
  
  foutfile->Write();
  foutfile->Close();
  
  return 0;
  
}