Пример #1
0
void stdsort(int startline = 0, string flist = "")
{
  //! Define the input and output file and HiForest
  string buffer;
  vector<string> listoffiles;
  int nlines = 0;
  ifstream infile(flist.data());

  if (!infile.is_open()) {
    cout << "Error opening file. Exiting." << endl;
    return;
  } else {
    while (!infile.eof()) {
      infile >> buffer;
      listoffiles.push_back(buffer);
      nlines++;
    }
  }
  cout<<" here"<<endl;
  HiForest *c = new HiForest(listoffiles[startline].data(),0,0,0,0,true);
  TFile * outf = new TFile(Form("sortedHiForest_%d.root",startline),"recreate");
  c->outf = outf;
  c->SetOutputFile("null",true);

  c->LoadNoTrees();
  c->hasEvtTree = true;
  //! loop through all the events once to construct the cent,vz pair array we'll be sorting over
  cout << "Constructing the cent:vz pair array..." << endl;
  for (int i=0;i<c->GetEntries();i++)
  {
    c->GetEntry(i);
    pair<int,double> centvz;
    centvz.first = c->evt->hiBin;
    centvz.second = c->evt->vz;
    evtCentVz.push_back(centvz);
    if (i%1000==0) cout <<i<<" / "<<c->GetEntries()<<" "<<c->setupOutput<<endl;
  }
  c->ResetBooleans();
  //! Make the index array which will get sorted on first centrality
  int evtindecies[c->GetEntries()];
  for (int i=0;i<c->GetEntries();i++)
  {
    evtindecies[i] = i;
  }
  
  cout << "Sorting the cent:vz pair array..." << " "<<c->setupOutput<<endl;
  //! Sort the index array first on the centrality bin, then on the vz of the entry at that index
  qsort (evtindecies, c->GetEntries(), sizeof(int), comparecentvz);
  
  //! Now fill the tree in the new order
  cout << "Filling the tree in the sorted order..." << " "<<c->setupOutput<<endl;
  for (int i=0;i<c->GetEntries();i++)
  {
    c->GetEntry(evtindecies[i]);
    c->FillOutput();
    if (i%1000==0) cout <<i<<" / "<<c->GetEntries()<<" "<<c->setupOutput<<endl;
  }

  delete c;
}
Пример #2
0
void correlateEvent(char *infname = "0.root", char *mbname = "mb.root", char *outfname = "matched_Jet.root",int startEntry=0,int endEntry=0)
{
   // Define the input file and HiForest

   HiForest *d = new HiForest(mbname);
   turnOffBranches(d);
   d->SetOutputFile(outfname);
   cout <<"good good"<<endl;

   HiForest *c = new HiForest(infname);
   turnOffBranches(c);
   int filtered=0;
   int idx=0;
   // Main loop
   if (endEntry==0) endEntry=c->GetEntries();

   for (int i=startEntry;i<=endEntry;i++)
   {
      c->GetEntry(i);
      if (i%100==0) cout <<filtered<<" "<<i<<" / "<<c->GetEntries()<<endl;
      int nMatched=0;

      while (nMatched<20)
      {
         idx++;
         cout <<i<<" / " << c->GetEntries() << " / "<<idx<<" / "<<nMatched<<"\r";
         if (idx>=d->GetEntries()) idx=0;
         if (idx==i) continue;
         d->evtTree->GetEntry(idx);
         if ((fabs(c->evt.hiBin-d->evt.hiBin)/(double)c->evt.hiBin)>0.05) continue;
         if ((fabs(c->evt.vz-d->evt.vz)>1)) continue;

         d->skimTree->GetEntry(idx);
         if (!(d->skim.pcollisionEventSelection && d->skim.pHBHENoiseFilter )) continue;        
         
         nMatched++;
         d->GetEntry(idx);
         d->FillOutput(); // Write output forest 
      }   
         cout <<std::endl;
   }

   delete c;
   delete d;
}
Пример #3
0
void skimTree(char *infname = "../JetSample/hiForest_Jet80or95_GR_R_53_LV6_12Mar2014_0000CET_Track8_Jet21_0.root")
{
   // Define the input file and HiForest
   HiForest *c = new HiForest(infname);
    c->hasHltTree=0;
   c->hasPFTree=0;
   c->hasPhotonTree=0;
   c->hasTowerTree=0;
   c->hasHbheTree=0;
   c->hasEbTree=0;
   c->hasGenpTree=0;
   c->hasGenParticleTree=0;   
   c->hasAk5CaloJetTree=0;
   c->hasAkPu2CaloJetTree=0;
   c->hasAkPu3CaloJetTree=0;
   c->hasAkPu4CaloJetTree=0;
   c->hasAkPu5CaloJetTree=0;
   c->hasAkPu2JetTree=0;
   c->hasAkPu3JetTree=0;
   c->hasAkPu4JetTree=0;
   c->hasAkPu5JetTree=0;
   c->hasAkVs2PFJetTree=0;
   c->hasAkVs3PFJetTree=0;
   c->hasAkVs4PFJetTree=0;
   c->hasAkVs5PFJetTree=0;
   c->SetOutputFile("skim_jet.root");

   int filtered=0;
   // Main loop
   for (int i=0;i<c->GetEntries();i++)
   {
      c->GetEntry(i);
      if (i%1000==0) cout <<filtered<<" "<<i<<" / "<<c->GetEntries()<<endl;
      //if (c->evt.hiBin>=20) continue;
      int flag=0;
      int flag2=0;
      for (int j=0;j<c->akVs3Calo.nref;j++) {
        if (fabs(c->akVs3Calo.jteta[j])>2) continue;
	if (c->akVs3Calo.jtpt[j]>120) flag=1;
	if (c->akVs3Calo.jtpt[j]>50) flag2++;
	if (flag>=1&&flag2>=2) break;
      }
        if (flag>=1&&flag2>=2) {
	   c->FillOutput(); // Write output forest
	   filtered++;
	}  
   }

   delete c;
}
Пример #4
0
void noiseSkim(char *infname = "/d100/yjlee/hiForest/PromptReco2011/HIHighPt/skim_Photon35/merged_HIData2011_HIHighPt_highPtExercise_photonSkim35GeVEB.root")
{
   // Define the input file and HiForest
   HiForest *c = new HiForest(infname);
   c->SetOutputFile("skim_jet.root");

   // Main loop
   for (int i=0;i<c->GetEntries();i++)
   {
      c->GetEntry(i);
      if (i%1000==0) cout <<i<<" / "<<c->GetEntries()<<endl;
      
      if (c->akPu3PF.jtpt[0]>=98||c->akPu2PF.jtpt[0]>=98&&c->akPu4PF.jtpt[0]>98){
         c->FillOutput(); // Write output forest
      }
   }

   delete c;
}
Пример #5
0
int writentuple(char *ksp="ppJet40")
{

  timer.Start();

  LoadLib();

  TString inname="";
  if(strcmp(ksp,"ppJet40")==0)inname = "root://eoscms//eos/cms/store/group/phys_heavyions/yjlee/pp2013/promptReco/PP2013_HiForest_PromptReco_JSon_Jet40Jet60_ppTrack_forestv84.root";
  else if(strcmp(ksp,"ppJet80")==0)inname = "root://eoscms//eos/cms/store/caf/user/yjlee/pp2013/promptReco/PP2013_HiForest_PromptReco_JsonPP_Jet80_PPReco_forestv82.root";

  //! Load Lib
  //gSystem->Load("/afs/cern.ch/user/p/pawan/scratch0/CMSSW_6_2_0/src/work/pPb/HiForest/V3/hiForest_h.so");

  //! Define the input file and HiForest
  //! CMSSW_5_3_3
  HiForest *c = new HiForest(inname,Form("Forest%s",ksp),cPP);
  cout<<"Loaded the hiforest tree : "<<c->GetName()<<endl;
  ShutoffBranches(c);

  //! Output file
  //! HIHighPt
  TFile *fout = new TFile(Form("ntuple_2013_%s.root",ksp),"RECREATE");  

  std::cout<<"\t"<<std::endl;
  std::cout<<"\t"<<std::endl;
  std::cout<<"**************************************************** "<<std::endl;
  std::cout<<Form("Running for %s ",ksp)<<std::endl;
  std::cout<<Form("pT  cut for %0.3f ",kptrecocut)<<std::endl;
  std::cout<<Form("eta cut for %0.3f ",ketacut)<<std::endl;
  std::cout<<"My hiForest Tree : " <<c->GetName()<<"\t Entries "<<c->GetEntries()<<std::endl;
  std::cout<<"Output file  "<<fout->GetName()<<std::endl;
  std::cout<<"**************************************************** "<<std::endl;
  std::cout<<"\t"<<std::endl;
  std::cout<<"\t"<<std::endl;

  //! shut off jet trees
  c->hasAk2CaloJetTree=0;
  c->hasAk4CaloJetTree=0;
  c->hasAk3CaloJetTree=0;
  c->hasAk5CaloJetTree=0;

  c->hasAkPu2CaloJetTree=0;
  c->hasAkPu4CaloJetTree=0;
  c->hasAkPu3CaloJetTree=0;
  c->hasAkPu5CaloJetTree=0;

  c->hasAk2PFJetTree=0;
  c->hasAk4PFJetTree=0;
  c->hasAk5PFJetTree=0;

  c->hasAkPu2PFJetTree=0;
  c->hasAkPu4PFJetTree=0;
  c->hasAkPu5PFJetTree=0;

  c->hasTrackTree=0;

  //! For jets
  Jets *mJets=0;
  Long64_t nentries = c->GetEntries();
  std::cout<<Form("# of entries in TTree for %s : ",ksp)<<nentries<<std::endl;

  string jetVars = "";
  jetVars += "evt:run:vz:trig:jet40:jet60:jet80:jet100:ntrk:pt1:raw1:eta1:phi1:chMax1:chSum1:phSum1:neSum1:pt2:raw2:eta2:phi2:chMax2:chSum2:phSum2:neSum2:pt3:raw3:eta3:phi3:chMax3:chSum3:phSum3:neSum3";
  TNtuple *ntjet=0;
  ntjet = new TNtuple("ntjet","",jetVars.data());

  for (Long64_t ievt=0; ievt<nentries;ievt++) {//! event loop
  //for (Long64_t ievt=0; ievt<100;ievt++) {//! event loop
    //! load the hiForest event
    c->GetEntry(ievt);
    
    //! events with Single vertex
    bool evSel = false;
    float trig=-9;
    if(strcmp(ksp,"ppJet40")==0){
      evSel = fabs(c->evt.vz)<15. && c->skim.pHBHENoiseFilter  && c->skim.pPAcollisionEventSelectionPA && (c->hlt.HLT_PAJet40_NoJetID_v1 || c->hlt.HLT_PAJet60_NoJetID_v1); 
      trig=1;
    }
    else if(strcmp(ksp,"ppJet80")==0){
      evSel = fabs(c->evt.vz)<15. && c->skim.pHBHENoiseFilter  && c->skim.pPAcollisionEventSelectionPA && (c->hlt.HLT_PAJet80_NoJetID_v1 || c->hlt.HLT_PAJet100_NoJetID_v1); 
      trig=2;
    }
    if(!evSel)continue;

    float pt1 = -9, pt2    = -9, pt3    = -9,
      raw1    = -9, raw2   = -9, raw3   = -9,
      eta1    = -9, eta2   = -9, eta3   = -9,
      phi1    = -9, phi2   = -9, phi3   = -9,
      chMax1  = -9, chMax2 = -9, chMax3 = -9,
      chSum1  = -9, chSum2 = -9, chSum3 = -9,
      phSum1  = -9, phSum2 = -9, phSum3 = -9,
      neSum1  = -9, neSum2 = -9, neSum3 = -9;

    
    float run   = c->evt.run;
    float evt   = c->evt.evt;
    float vz    = c->evt.vz;
    
    float jet40  = c->hlt.HLT_PAJet40_NoJetID_v1;
    float jet60  = c->hlt.HLT_PAJet60_NoJetID_v1;
    float jet80  = c->hlt.HLT_PAJet80_NoJetID_v1;
    float jet100 = c->hlt.HLT_PAJet100_NoJetID_v1;
    
    float ntrk    = c->evt.hiNtracks;

    if(ievt%10000==0)std::cout<<" ********** Event # " <<ievt<<"\t Run : "<<run<<std::endl;
    
    mJets = &(c->ak3PF);
    
    int *ljet = new int[3];
    FindLeadSubLeadJets(mJets,ljet);
    
    int jtLead = -1, jtSubLead = -1, jtThird = -1;
    
    if(ljet[0] >=0 ) jtLead    = ljet[0];
    if(ljet[1] >=0 ) jtSubLead = ljet[1];    
    if(ljet[2] >=0 ) jtThird   = ljet[2];    
    
    if(jtLead<0)continue;
    
    if(jtLead > -1){
      pt1     = mJets->jtpt[jtLead];
      eta1    = mJets->jteta[jtLead];
      phi1    = mJets->jtphi[jtLead];
      raw1    = mJets->rawpt[jtLead];
      chMax1  = mJets->chargedMax[jtLead];
      chSum1  = mJets->chargedSum[jtLead];
      phSum1  = mJets->photonSum[jtLead];
      neSum1  = mJets->neutralSum[jtLead];
    }
    
    if(jtSubLead > -1){
      pt2     = mJets->jtpt[jtSubLead];
      eta2    = mJets->jteta[jtSubLead];
      phi2    = mJets->jtphi[jtSubLead];
      raw2    = mJets->rawpt[jtSubLead];
      chMax2  = mJets->chargedMax[jtSubLead];
      chSum2  = mJets->chargedSum[jtSubLead];
      phSum2  = mJets->photonSum [jtSubLead];
      neSum2  = mJets->neutralSum[jtSubLead];
    }
    
    if(jtThird > -1){
      pt3     = mJets->jtpt[jtThird];
      eta3    = mJets->jteta[jtThird];
      phi3    = mJets->jtphi[jtThird];
      raw3    = mJets->rawpt[jtThird];
      chMax3  = mJets->chargedMax[jtThird];
      chSum3  = mJets->chargedSum[jtThird];
      phSum3  = mJets->photonSum [jtThird];
      neSum3  = mJets->neutralSum[jtThird];
    }
    
    float jentry[] = {evt,run,vz,trig,jet40,jet60,jet80,jet100,ntrk,
		       pt1,raw1,eta1,phi1,chMax1,chSum1,phSum1,neSum1,
		       pt2,raw2,eta2,phi2,chMax2,chSum2,phSum2,neSum2,
		       pt3,raw3,eta3,phi3,chMax3,chSum3,phSum3,neSum3
    };
    
    ntjet->Fill(jentry);
    delete [] ljet;
  }//! event loop ends


  //! Write to output file
  fout->cd();
  fout->Write();
  fout->Close();

  //! Check
  timer.Stop();
  float rtime  = timer.RealTime();
  float ctime  = timer.CpuTime();

  std::cout<<"\t"<<std::endl;
  std::cout<<Form("RealTime=%f seconds, CpuTime=%f seconds",rtime,ctime)<<std::endl;
  std::cout<<"\t"<<std::endl;
  std::cout<<"Good bye : " <<"\t"<<std::endl;

  return 0;
}
Пример #6
0
void test(char * tag= "0", char *infName = "/d102/yjlee/hiForest2MC/Pythia80_HydjetDrum_mix01_HiForest2_v22_simTrack05.root")
{
   // Define the input file and HiForest
   HiForest *c = new HiForest(infName,"",cPPb);
   c->hasPFTree=0;
   c->hasPhotonTree=0;
   c->hasTowerTree=0;
   c->hasHbheTree=0;
   c->hasEbTree=0;
   c->hasGenpTree=0;
   c->hasGenParticleTree=0;   
   c->hasAkPu2CaloJetTree=0;
   c->hasAkPu3CaloJetTree=0;
   c->hasAkPu4CaloJetTree=0;
//   c->doTrackCorrections=1;
//   c->InitTree();
   
   // Output file
   TFile *output = new TFile(Form("output-%s.root",tag),"recreate");
   
   // Output
   TTree * t = new TTree("t","gammajet");
   
   JetData data(t,1);

   HistoData histos_MergedGeneralCalo("MergedGeneral");
   HistoData histos2_MergedGeneral("MergedGeneral2");   // phi dependent corr
   
   TH1D *hWeight = new TH1D("hWeight","",1000,0,100);
   TH1D *hWeight2 = new TH1D("hWeight2","",1000,0,100);
   TH1D *hPt = new TH1D("hPt","",100,0,100);
   TH1D *hNoWPt = new TH1D("hNoWPt","",100,0,100);


   TNtuple *nt = new TNtuple("nt","","m:eta:phi:pt:pt1:pt2:ch1:ch2:phi1:phi2:dxy1:dxy2:hiBin:N");
   TNtuple *ntEvt = new TNtuple("ntEvt","","N");
   nt->SetAutoFlush(30000);
   cout <<nt->GetAutoFlush()<<endl;
   TCanvas *cc = new TCanvas("cc","",600,600);   
//	 nt->SetCircular(1000);
   // Main loop

   TLorentzVector *v2 = new TLorentzVector;
   TLorentzVector *v = new TLorentzVector;
   TLorentzVector phi;

   for (int i=0;i<c->GetEntries()/1.;i++) {
      c->GetEntry(i);
      if (!c->selectEvent()) continue;
      if (i%1000==0){
         cout <<i<<" / "<<c->GetEntries()<<endl;
       } 
      int N=0;   
      for (int j=0;j<c->track.nTrk;j++) {
         if (!c->selectTrack(j)) continue;
         if (fabs(c->track.trkEta[j])>2.4) continue;
         if (fabs(c->track.trkPt[j])<0.4) continue;
         N++;
      }   
      ntEvt->Fill(N);
      for (int j=0;j<c->track.nTrk;j++) {
         if (!c->selectTrack(j)) continue;
         if (fabs(c->track.trkPt[j])<1) continue; 
//      if (fabs(c->track.trkDxy1[j]/c->track.trkDxyError1[j])<1) continue;
         for (int k=j+1;k<c->track.nTrk;k++) {
            if (j==k) continue;
            if (!c->selectTrack(k)) continue;
//            if (c->track.trkCharge[k]==c->track.trkCharge[j]) continue; 
     	    if (fabs(c->track.trkPt[k])<1) continue;
            v->SetPtEtaPhiM(c->track.trkPt[j],c->track.trkEta[j],c->track.trkPhi[j],0.493677);
            v2->SetPtEtaPhiM(c->track.trkPt[k],c->track.trkEta[k],c->track.trkPhi[k],0.493677);
//          v2->SetPtEtaPhiM(c->track.trkPt[k],c->track.trkEta[k],c->track.trkPhi[k],0.13957);
//          v->SetPtEtaPhiM(c->track.trkPt[j],c->track.trkEta[j],c->track.trkPhi[j],0.938272);
//          v->SetPtEtaPhiM(c->track.trkPt[j],c->track.trkEta[j],c->track.trkPhi[j],0.13957);
//          v2->SetPtEtaPhiM(c->track.trkPt[k],c->track.trkEta[k],c->track.trkPhi[k],0.13957);
  	    phi = (*v) + (*v2);
//         if ((phi.M())>5) {
            if ((phi.M())>1.2||phi.M()<0.0) {
//	       phi.Delete();
	       continue;
	    }    
	    nt->Fill(phi.M(),phi.Eta(),phi.Phi(),phi.Pt(),v->Pt(),v2->Pt(),c->track.trkCharge[j],c->track.trkCharge[k],v->Phi(),v2->Phi(),c->track.trkDxy1[j],c->track.trkDxy1[k],c->evt.hiBin,N);
//	       phi.Delete();
   }
      }

      //cout <<data.mpt<<endl;
      t->Fill();
   }
  // t->Write();
   histos_MergedGeneralCalo.calcEff();
   histos2_MergedGeneral.calcEff();
   output->Write();
   output->Close();
}
Пример #7
0
void anaJetTrackRpA()
{
    std::cout << "start working\n";
     TFile *fcrel3 ; 
     TH1D *C_rel ;
   //for ak3PF jets, applied for pPb data only 
//    TFile* fcrel3 = TFile::Open("/afs/cern.ch/user/d/dgulhan/public/Corrections/Casym_pPb_double_hcalbins_algo_ak3PF_pt100_140_jet80_alphahigh_20_phicut250.root", "readonly");
    //for akPu3PF jets and pPb data
    if(coll=="PPb") fcrel3 = TFile::Open(Form("/afs/cern.ch/user/d/dgulhan/public/Corrections/Casym_pPb_double_hcalbins_algo_%s_pt100_140_jet80_alphahigh_20_phicut250.root", algo.Data()), "readonly");
    if(coll=="PbP") fcrel3 = TFile::Open(Form("/afs/cern.ch/user/d/dgulhan/public/Corrections/Casym_Pbp_double_hcalbins_algo_%s_pt100_140_jet80_alphahigh_20_phicut250.root", algo.Data()), "readonly");
    if(fcrel3)  C_rel=(TH1D*)fcrel3->Get("C_asym");
  //  fcrel3->Close();

   TrigName=getenv("TRIG"); 
   hist_class *my_hists = new hist_class("pfjet");
    cout <<my_hists->IsMC<<endl ;
   cout <<"analysis trig = " <<TrigName <<endl ;

  //this function is to correct for UE subtraction (we are using akPu3PF algorithm)
   TF1 * fUE ;
   TF1 * fgaus ;
    fgaus=new TF1("fgaus","gaus(0)",-20,20);
   if(my_hists->IsMC==kTRUE){
    fUE = new TF1("fUE","[0]/pow(x,[1])");
  //   //for ak3PF jets
 //    fUE->SetParameters(0.4183,0.4244);
   //  //for akPu3PF jets
    if(algo=="akPu3PF") fUE->SetParameters(1.052,0.5261);
     else  fUE->SetParameters(0.4183,0.4244);
    //for gauss smearing
    fgaus->SetParameters(1,0,1);
    }
   else {
       fUE = new TF1("fUE","1-[0]/pow(x,[1])",20,300);
        //   //for ak3PF jets
  //   fUE->SetParameters(0.8648,0.8167);
   //  //for akPu3PF jets
     if(algo=="akPu3PF") fUE->SetParameters(0.3015,0.8913);
     else  fUE->SetParameters(0.8648,0.8167); 
    }

   TF1 * fVz = new TF1("fVx","[0]+[1]*x+[2]*TMath::Power(x,2)+[3]*TMath::Power(x,3)+[4]*TMath::Power(x,4)", -15., 15.);
    fVz->SetParameters(1.60182e+00,1.08425e-03,-1.29156e-02,-7.24899e-06,2.80750e-05);

    if(my_hists->IsMC==kTRUE){
      pthat=atoi(getenv("PTHAT")) ;
      ptmax=atoi(getenv("PTMAX")) ;
       cout <<"pthat = " <<pthat <<"  pthatmax =" <<ptmax <<endl ;
     }
    if(my_hists->IsMC!=kTRUE){ 
      if(coll=="HI")
        dataPath="/net/hidsk0001/d00/scratch/yjlee/merge/pbpbDijet_v20" ;//mit PbPb data path
    else {
    /*  if(TrigName=="Jet20")   
          dataPath="root://eoscms//eos/cms/store/group/phys_heavyions/krajczar/inbound/mnt/hadoop/cms/store/user/krajczar/pPb_Jet20_Full_v1" ;
   else if(TrigName=="Jet40" || TrigName=="Jet60")
          dataPath="root://eoscms//eos/cms/store/group/phys_heavyions/krajczar/inbound/mnt/hadoop/cms/store/user/krajczar/pPb_Jet40Jet60_Full_v1" ;
    else  
          dataPath="root://eoscms//eos/cms/store/group/phys_heavyions/yjlee/pPb2013/promptReco";
      */
     if(TrigName=="Jet80" || TrigName=="Jet100")
        dataPath="root://eoscms//eos/cms/store/group/phys_heavyions/yjlee/pPb2013/promptReco";
     else  
        dataPath="root://eoscms//eos/cms/store/caf/user/ymao";
    }
  } //data Path
    else { //MC analysis
        if(coll=="HI") {
          if(pthat==50||pthat==80||pthat==100||pthat==170)
             dataPath= Form("/mnt/hadoop/cms/store/user/yenjie/HiForest_v27/"); //MIT MC normial
           else 
                dataPath= Form("/mnt/hadoop/cms/store/user/yenjie/HiForest_v28/"); //MIT MC normial
       }
       else if(coll=="PPb")
      //  dataPath=Form("/mnt/hadoop/cms/store/user/dgulhan/pPb/HP04/prod16/Hijing_Pythia_pt%d/HiForest_v77_merged01", pthat);
        dataPath=Form("/mnt/hadoop/cms/store/user/dgulhan/pPb/HP04/prod16/Signal_Pythia_pt%d/HiForest_v77_v2_merged01", pthat);
       else if(coll=="PbP")
        dataPath=Form("/mnt/hadoop/cms/store/user/dgulhan/Pbp/HP05/prod24/Hijing_Pythia_pt%d/HiForest_v84_merged02", pthat);
        else if(coll=="PP2011")
         dataPath= Form("/net/hisrv0001/home/zhukova/scratch/HIHighPt/forest/pthat%d", pthat); //lxplus path for pp
       else {       
       if(pthat==220)
         dataPath= Form("/mnt/hadoop/cms/store/user/dgulhan/pPb/HP04/prod16/Signal_Pythia_pt%d/HiForest_v77_v2_merged02", pthat); //2013 pp tracking for 5.02TeV
      else 
       dataPath= Form("/mnt/hadoop/cms/store/user/dgulhan/pPb/HP04/prod16/Signal_Pythia_pt%d/HiForest_v77_v2_merged01", pthat); //2013 pp tracking for 5.02TeV
        }
    }
    if(my_hists->IsMC!=kTRUE){  //real data analysis
        if(coll=="HI")             
            intputFile="promptskim-hihighpt-hltjet80-pt90-v20.root" ; //full dataset
	else if(coll=="PP2011")  
             intputFile="hiForest2_pp_ppreco_415_90percent.root";  //! 2011 pp data rereco
        else if(coll=="PbPb")
           intputFile="PbPHiForest2_PbPbPAHighPtJet80_cent50-100_pprereco.root"; 	
        else if(coll=="PPb"){
         if(TrigName=="Jet20")
       //     intputFile="mergedJet20_KK.root" ;
            intputFile="mergedJet20_pPb_Jet20_Full_UsingKKForest_v1.root" ;
         else    if(TrigName=="Jet40" || TrigName=="Jet60")
         //   intputFile="mergedJet40Jet60_KK.root" ;
            intputFile="mergedJet40Jet60_pPb_Jet40Jet60_Full_UsingKKForest_v1.root" ;
         else    if(TrigName=="Jet80" || TrigName=="Jet100")
            intputFile="PA2013_HiForest_PromptReco_JSonPPb_forestv77.root" ;
         else
          //  intputFile="PA2013_HiForest_PromptReco_KrisztianMB_JSonPPb_forestv84.root" ;
            intputFile="mergedMB_pPb_SingleTrack_Full_UsingKKForest_v1.root" ;
        }
        else if(coll=="PbP"){
            if(TrigName=="Jet20")
          //  intputFile="mergedJet20_KK.root" ;
            intputFile="mergedJet20_pPb_Jet20_Full_UsingKKForest_v1.root" ;
     else    if(TrigName=="Jet40" || TrigName=="Jet60")
          //  intputFile="mergedJet40Jet60_KK.root" ;
            intputFile="mergedJet40Jet60_pPb_Jet40Jet60_Full_UsingKKForest_v1.root" ;
         else    if(TrigName=="Jet80" || TrigName=="Jet100")
         intputFile="PA2013_HiForest_PromptReco_JSonPbp_JECdb_forestv84.root" ;
         else
          //  intputFile="PA2013_HiForest_PromptReco_KrisztianMB_JSonPPb_forestv84.root" ;
            intputFile="mergedMB_pPb_SingleTrack_Full_UsingKKForest_v1.root" ;
         }
        else 
         //  intputFile="PP2013_HiForest_PromptReco_JsonPP_Jet80_HIReco_forestv84_v2.root";  //! 2013 pp data with HI tracking
           intputFile="PP2013_HiForest_PromptReco_JsonPP_Jet80_PPReco_forestv82.root";  //! 2013 pp data with pp tracking
    }
    else { //MC sample
        if(coll=="HI"){             
          if(pthat==50||pthat==80||pthat==100||pthat==170)
              intputFile=Form("Dijet%d_HydjetDrum_v27_mergedV1.root", pthat);
         else 
              intputFile=Form("Dijet%d_HydjetDrum_v28_mergedV1.root", pthat);
   }
      else if(coll=="PPb")
      //  intputFile=Form("pt%d_HP04_prod16_v77_merged_forest_0.root", pthat);
        intputFile=Form("pt%d_HP04_hiforest77_hiSignal.root", pthat);
      else if(coll=="PbP")
        intputFile=Form("pt%d_HP05_prod24_v84_merged_forest_0.root", pthat);
      else if(coll=="PP2011")
          intputFile=Form("mergedFile.root");  // 2011 pp MC
        else 
         intputFile=Form("pt%d_HP04_hiforest77_hiSignal.root", pthat); // ! 2013 pp 5.02TeV MC with pp tracking 
    }
    
    TString inname=Form("%s/%s", dataPath.Data(),intputFile.Data());
    // Define the input file and HiForest
   HiForest * c ; 
   if(coll=="PP" || coll=="PP2011")
        c = new HiForest(inname,"forest",cPP);
     else if(coll=="PPb" || coll=="PbP")
        c = new HiForest(inname,"forest",cPPb);
     else 
        c = new HiForest(inname,"forest",cPbPb);
       c->doTrackCorrections = false;
    c->doTrackingSeparateLeadingSubleading = false;
    c->InitTree();
  //  cout << "start working222222\n";
  //  TFile *my_file=TFile::Open(Form("%s/%s", dataPath.Data(),intputFile.Data()));
    cout <<"Input file" << inname<<endl ;
    
/*    TrackCorrector corr("trackCorrections_HIN12017v4_HijingCombined.root");
   if(doTrackCorrections){
   corr.load("trkCorr_HIN12017");
   corr.setOption1(true);
   corr.setOption2(true);
  }
*/
   TrackCorrector2D corr("/afs/cern.ch/work/y/ymao/analysis/AsymmetryPA/Corrections/trackCorrections_HIN12017v5_XSecWeighted.root");
   if(doTrackCorrections) corr.load("trkCorr_HIN12017");

    Evts * offSel = &(c->evt); 

    Skims * my_skim = &(c->skim); 

    Hlts * trigSel = &(c->hlt); 
    //jet tree
//    if(coll=="HI") 
        Jets * my_ct = &(c->akPu4PF); 
   //     Jets * my_ct = &(c->akPu4Calo); 
 //   else 
 //   Jets * my_ct = &(c->ak3PF);
    //  Jets * jetthres =  &(c->icPu5); 
   //track tree
    Tracks * my_tr = &(c->track);
    
    //GenParticle tree
    GenParticles * my_GenPart = &(c->genparticle);

    int curr_bin = nbin-1 ;
    int Nevents[nbin] = {0} ;
      Int_t Nevt_40_60[nbin] = {0} ;
      Int_t Nevt_60_75[nbin] = {0} ;
      Int_t Nevt_75_95[nbin] = {0} ;
      Int_t Nevt_95_120[nbin] = {0} ;
      Int_t Nevt_120[nbin] = {0} ;
    cout <<"Number of events ="<<c->GetEntries()<<endl ;
    for(int evi = 0; evi < c->GetEntries(); evi++) {
        c->GetEntry(evi);
        int noise_evt = my_skim->pHBHENoiseFilter ;
        //        int ecal_noise = my_skim->phiEcalRecHitSpikeFilter ;
        //        if(ecal_noise==0) continue ;
        
        double vz = offSel->vz ;
        int hiBin = offSel->hiBin ;
        weight = 1. ;      
 
         int pileup_Gplus ;
        double HFbin ;
        HFbin = (offSel->hiHFplusEta4)+(offSel->hiHFminusEta4);
    /*    if(coll=="PPb")
          HFbin = (offSel->hiHFplus);
        else 
         HFbin = (offSel->hiHFminus);
*/
       if(my_hists->IsMC!=kTRUE){
            int evt_sel ;
            pileup_Gplus = my_skim->pVertexFilterCutGplus ;
           if(coll=="PbPb"|| coll=="HI"|| coll=="PP2011")  evt_sel = my_skim->pcollisionEventSelection ;
            else  evt_sel = my_skim->pPAcollisionEventSelectionPA;
         //   if(evt_sel==0) continue ;
            if(!evt_sel) continue ;
           //for 0-90% selection using HF sum energy at |eta|>4
          //  if(HFbin<2.87) continue ; 
           //for 0-90% selection using HF sum energy at eta>4
         //   if(HFbin<2.66) continue ; 
        }
        if(my_hists->IsMC!=kTRUE){
          //  if(noise_evt==0) continue ;
            if(!noise_evt) continue ;
             int jetTr2 ;
              if(coll=="HI"|| coll=="PbPb")
               jetTr2 = trigSel->HLT_HIJet80_v1 ;
                else if (coll=="PP2011")
                 jetTr2 = trigSel->HLT_Jet60_v1 ;
               else {
               //  jetTr2 = trigSel->HLT_PAJet80_NoJetID_v1 ;
                if(TrigName=="Jet20") jetTr2 = trigSel->HLT_PAJet20_NoJetID_v1  ;
                else  if(TrigName=="Jet40") jetTr2 = trigSel->HLT_PAJet40_NoJetID_v1  ;
                else  if(TrigName=="Jet60") jetTr2 = trigSel->HLT_PAJet60_NoJetID_v1  ;
                else  if(TrigName=="Jet80") jetTr2 = trigSel->HLT_PAJet80_NoJetID_v1  ;
                else  if(TrigName=="Jet100") jetTr2 = trigSel->HLT_PAJet100_NoJetID_v1  ;
                else  jetTr2 = trigSel->HLT_PAZeroBiasPixel_SingleTrack_v1 ;
               }
            if(!jetTr2) continue ;
            int run=offSel->run ;
             if( !(my_skim->phfPosFilter1 && my_skim->phfNegFilter1 && my_skim->pBeamScrapingFilter && my_skim->pprimaryvertexFilter)) continue ;
            if(coll=="PPb"){
            // if( my_skim->phfPosFilter1==0 || my_skim->phfNegFilter1==0 ||my_skim->pBeamScrapingFilter==0 || my_skim->pprimaryvertexFilter==0) continue ;
             if(!pileup_Gplus) continue ;
             if(run>211256) continue ;
             if(run<210676) continue ;  //remove the runs with old alignment
            }
           if(coll=="PbP"){
             if(pileup_Gplus==0) continue ;
            if(run<=211256) continue ;
           }
        }

    //      if(evi%10000==1)cout <<" coll = " <<coll <<" weight = " <<weight <<" evt = " <<evi <<endl ;
        if(TMath::Abs(vz)>15.) continue ;
        if(my_hists->IsMC==kTRUE) weight*=fVz->Eval(vz);
     //run selection
    if(my_hists->IsMC!=kTRUE && coll=="PPb") {
       if(offSel->run<210676 ||offSel->run>211256) //211256: last pPb run (Pb goes to +eta)
         continue;
     }
      bool event_accepted = true;
/*      if(!(my_skim->pPAcollisionEventSelectionPA && my_skim->phfPosFilter1 && my_skim->phfNegFilter1
          && my_skim->pBeamScrapingFilter
          && my_skim->pprimaryvertexFilter
          && my_skim->pVertexFilterCutGplus
          && TMath::Abs(offSel->vz)<15.
          )
        ) event_accepted = false;
*/
      if(event_accepted == false)
         continue;

                
    /*    //if there is no jets or no PF candidates, skip the event
        if(my_ct->nref==0) continue ;
   */     //put the higher pthat cut
        if(my_hists->IsMC==kTRUE && my_ct->pthat>ptmax) continue ;
         if(my_ct->pthat>ptmax) cout <<"pthat =" <<my_ct->pthat <<endl ;
       if(coll=="HI"|| coll=="PP2011") 
        my_hists->CenBin->Fill(hiBin*2.5);
      else my_hists->CenBin->Fill(hiBin);

        my_hists->Vertex->Fill(vz);

        //   cout <<"vz =" <<vz <<endl ;
        
         if(coll=="HI"){
            double centrality = hiBin*2.5 ;
            //   my_hists->CenBin->Fill(offSel->hiBin);
            
            for(int ibin = 0 ; ibin <nbin; ibin++){
                if(centrality >=centr[ibin] && centrality<centr[ibin+1]) curr_bin = ibin ;
            }
        }
       else if(coll=="PPb" || coll=="PbP"){
         double centrality = HFbin ;
                      for(int ibin = 0 ; ibin <nbin; ibin++){
                if(centrality <hfEta4[ibin] && centrality>=hfEta4[ibin+1]) curr_bin = ibin ;
            }
        }
        else {
            curr_bin=nbin-1 ;
         //    weight = 1. ;
        }
       //   weight = 1. ;

       //    cout << "  cent_bin:" <<curr_bin <<endl ;
        if(evi%10000==1)cout <<" coll = " <<coll <<" weight = " <<weight <<" evt = " <<evi <<endl ;
        
        //cout << "start working222222\n";
        
        
        //  cout << "still working222222\n";
        if(my_hists->IsMC==kFALSE)my_hists->VertexWt->Fill(vz+0.4847, weight);
        else  my_hists->VertexWt->Fill(vz, weight);
         if(coll=="HI"|| coll=="PP2011")     
           my_hists->CenBinWt->Fill(offSel->hiBin*2.5,weight);
        else
         my_hists->CenBinWt->Fill(offSel->hiBin,weight);

 
     //Tracks for event weights; eta-pt cut removed
      int trackMult = 0;
      for(int j=0;j<my_tr->nTrk;j++) {
         if(!((my_tr->highPurity[j])
             && (fabs(my_tr->trkDz1[j]/my_tr->trkDzError1[j])<3)
             && (fabs(my_tr->trkDxy1[j]/my_tr->trkDxyError1[j])<3)
             && (my_tr->trkPtError[j]/my_tr->trkPt[j]<0.1)
            ))
            continue;
         trackMult++;
      }
      // Don't analyze 0 multiplicity events; correction added later
      if(trackMult==0)
         continue;
    //  double evtWeight = 1.;
   //   evtWeight = corr.getEventWeight(trackMult);
      weight*=corr.getEventWeight(trackMult);
 
       my_hists->NEvents[curr_bin]->Fill(1, weight);
     
     //Jets for event classification
      int jetMult = 0;
      double leadingJet = -999.;
    for(int j4i = 0; j4i < my_ct->nref ; j4i++) {
  //  if( my_hists->IsMC==kTRUE && my_ct->subid[j4i] != 0) continue;
	    if(TMath::Abs(my_ct->jteta[j4i])>3.) continue ;
		 jetMult++;
    if (my_ct->rawpt[j4i]<15) continue;
        if (my_ct->jtpt[j4i]>leadingJet) {
            leadingJet = my_ct->jtpt[j4i];
        }
 }
/*   
       if(leadingJet<0.) continue ;
       
      // Don't analyze 0 multiplicity events; correction added later
      if(trackMult==0)
         continue;
*/
 
     //Tracks for event classification: same as for analysis
      bool jetAbove = false ;
      bool  jetAbove40 = false;
      bool  jetAbove60 = false;
      bool  jetAbove75 = false;
      bool  jetAbove95 = false;
      bool  jetAbove120 = false;
      if(leadingJet>40. ){ 
         jetAbove40 = true ;
       }
      if(leadingJet>60. ){                   
         jetAbove60 = true ;
       }
      if(leadingJet>75. ){                   
         jetAbove75 = true ;
       }
       if(leadingJet>95. ){
         jetAbove95 = true ;
       }
       if(leadingJet>120. ){
         jetAbove120 = true ;
       }
      if(!jetAbove40)                 Nevents[curr_bin]++ ;
      else if(jetAbove40 && !jetAbove60) Nevt_40_60[curr_bin]++;
      else if(jetAbove60 && !jetAbove75) Nevt_60_75[curr_bin]++;
      else if(jetAbove75 && !jetAbove95) Nevt_75_95[curr_bin]++;
      else if(jetAbove95 && !jetAbove120) Nevt_95_120[curr_bin]++;
     // if(jetAbove120)                  Nevt_120[curr_bin]++;
      else                               Nevt_120[curr_bin]++;
    
      if(TrigName=="Jet20") jetAbove = jetAbove40 && !jetAbove60 ;
      else if(TrigName=="Jet40") jetAbove = jetAbove60 && !jetAbove75 ;
      else   if(TrigName=="Jet60") jetAbove = jetAbove75 && !jetAbove95  ;
      else   if(TrigName=="Jet80") jetAbove = jetAbove95 && !jetAbove120  ;
      else   if(TrigName=="Jet100") jetAbove = jetAbove120  ;
      else jetAbove = !jetAbove40 ;

      if(!jetAbove) continue ;
    
   // for inclusive jet analysis
   for(int j4i = 0; j4i < my_ct->nref ; j4i++) {
    double jetweight = 1; 
    double jet_pt= my_ct->jtpt[j4i];
    double raw_pt= my_ct->rawpt[j4i];
    double jet_eta = my_ct->jteta[j4i];
    if (my_ct->rawpt[j4i]<15) continue;
    int dEtaBin = -1. ;
 //   if( my_hists->IsMC==kTRUE && my_ct->subid[j4i] != 0) continue;
     //for jet kinematcis cuts
     if(TMath::Abs(jet_eta)<=3.){
          my_hists->jetptJES[curr_bin]->Fill(jet_pt, raw_pt/jet_pt, weight);
       if( my_hists->IsMC!=kTRUE ) jetweight*=(fUE->Eval(jet_pt))*C_rel->GetBinContent(C_rel->FindBin(jet_eta));
       else
          jetweight*=((fUE->Eval(jet_pt))*fgaus->GetRandom()+1);
          my_hists->jetptEta[curr_bin]->Fill(jet_pt*jetweight, jet_eta, weight);
   if(coll=="PPb"){       
       if(TMath::Abs(jet_eta+0.465)<=1.) my_hists->jetpt[curr_bin]->Fill(jet_pt*jetweight, weight);
     }
   if(coll=="PbP"){  
       if(TMath::Abs(jet_eta-0.465)<=1.) my_hists->jetpt[curr_bin]->Fill(jet_pt*jetweight, weight);
     } 
       if((jet_pt*jetweight)>100.) my_hists->jetEta[curr_bin]->Fill(jet_eta, weight);
         for(Int_t ieta = 0 ; ieta <netabin; ieta++){
            if(coll=="PPb"){
               if((jet_eta+0.465)>deta[ieta]&&(jet_eta+0.465)<=deta[ieta+1]) dEtaBin = ieta ;
             }
            else if(coll=="PbP"){
              if((jet_eta-0.465)>deta[ieta]&&(jet_eta-0.465)<=deta[ieta+1]) dEtaBin = ieta ;
             }
           else {
             if((jet_eta+0.465)>deta[ieta]&&(jet_eta+0.465)<=deta[ieta+1]) dEtaBin = ieta ;
            } 
         } //assign the eta bin for jets
      if(dEtaBin!=-1){
        my_hists->jetptEtaBin[curr_bin][dEtaBin]->Fill(jet_pt*jetweight, weight);   
        my_hists->NjetsEtaBin[curr_bin][dEtaBin]->Fill(1);
     } 
    }// for jet kinematics cuts
   } //! jet loop

/*        //Leading Jets seach, for tracking efficiency
      double leadingJetPt = -1. ;
      Int_t leadingJetIndex = -1 ;
     for(int j = 0; j < my_ct->nref ; j++) {
         if (fabs(my_ct->jteta[j])>2.5) continue;
         if (my_ct->rawpt[j]<15) continue;
       //    if( my_hists->IsMC==kTRUE && my_ct->subid[j] != 0) continue;
         if (my_ct->jtpt[j]>leadingJetPt) {
            leadingJetPt = my_ct->jtpt[j];
            leadingJetIndex = j;
         }
      }
      if(leadingJetPt==-1) //for corrections
            leadingJetPt=10.;
*/

     //for inclusive track analysis, without jet selection and requirement
       for(int itr = 0 ; itr < my_tr->nTrk ; itr++){
                            double tr_pt = my_tr->trkPt[itr];
                            double tr_phi = my_tr->trkPhi[itr];
                            double tr_eta = my_tr->trkEta[itr];
                            if(TMath::Abs(tr_eta)>2.4) continue ;
         //                    if(my_tr->trkPtError[itr]/my_tr->trkPt[itr]>=0.1 || TMath::Abs(my_tr->trkDz1[itr]/my_tr->trkDzError1[itr])>=3.0 ||TMath::Abs(my_tr->trkDxy1[itr]/my_tr->trkDxyError1[itr])>=3.0) continue ; //ridge cut for tracks                           
         if(!((my_tr->highPurity[itr])
             && (fabs(my_tr->trkDz1[itr]/my_tr->trkDzError1[itr])<3)
             && (fabs(my_tr->trkDxy1[itr]/my_tr->trkDxyError1[itr])<3)
             && (my_tr->trkPtError[itr]/my_tr->trkPt[itr]<0.1)
            ))
            continue;
                            Int_t TrkEtaBin = -1 ;
                       for(Int_t ieta = 0 ; ieta <ntrketabin; ieta++){
                        if(coll=="PPb"){             
                           if((tr_eta+0.465)>dtrketa[ieta]&&(tr_eta+0.465)<=dtrketa[ieta+1]) TrkEtaBin = ieta ;
                           }
                        else if(coll=="PbP"){
                            if((tr_eta-0.465)>dtrketa[ieta]&&(tr_eta-0.465)<=dtrketa[ieta+1]) TrkEtaBin = ieta ;
                           }
                        else  
                      if((tr_eta+0.465)>dtrketa[ieta]&&(tr_eta+0.465)<=dtrketa[ieta+1]) TrkEtaBin = ieta ; 
                     } 
                            if((my_tr->highPurity[itr])){
                              //  if(tr_pt<trackcut) continue ;
                            double trkweight=1. ;
                            if(doTrackCorrections){
                             //   if(corrMet=="Hist")trkweight = c->getTrackCorrection(itr);
                             //   else trkweight = c->getTrackCorrectionPara(itr);
                           //  trkweight = corr.getWeight(tr_pt,tr_eta,leadingJetPt);
                             trkweight = corr.getWeight(tr_pt,tr_eta,0.);
                            }
                        my_hists->inctrkpt[curr_bin]->Fill(tr_pt, weight*trkweight);
                        if(coll=="PPb"){
                           if(TMath::Abs(tr_eta+0.465)<=1.) my_hists->inctrkptM1P1[curr_bin]->Fill(tr_pt, weight*trkweight);
                         }
                       else if(coll=="PbP"){
                           if( TMath::Abs(tr_eta-0.465)<=1.) my_hists->inctrkptM1P1[curr_bin]->Fill(tr_pt, weight*trkweight);
                        }
                       else {
                         if(TMath::Abs(tr_eta+0.465)<=1.) my_hists->inctrkptM1P1[curr_bin]->Fill(tr_pt, weight*trkweight);
                       }
                        my_hists->Ntrack[curr_bin]->Fill(1);
                        if(TrkEtaBin!=-1) my_hists->inctrkptEtaBin[curr_bin][TrkEtaBin]->Fill(tr_pt, weight*trkweight);
                        if(TrkEtaBin!=-1) my_hists->NtrkEtaBin[curr_bin][TrkEtaBin]->Fill(1);
                      } //! high purity track cuts
              }  //! inclusive track loop

// for jet-track analysis
    TVector3 jet_vec;
    TVector3 track_vec;
   for(int j4i = 0; j4i < my_ct->nref ; j4i++) {
    jet_vec.SetPtEtaPhi(0, 0, 0);
     track_vec.SetPtEtaPhi(0, 0, 0);
    double jetweight = 1;
    double jet_pt= my_ct->jtpt[j4i];
    double jet_eta = my_ct->jteta[j4i];
    double jet_phi = my_ct->jtphi[j4i];
    if (my_ct->rawpt[j4i]<15) continue;
    int dEtaBin = -1. ;
  //  if( my_hists->IsMC==kTRUE && my_ct->subid[j4i]!= 0) continue;
     //for jet kinematcis cuts
     if(TMath::Abs(jet_eta)<=3.){
       if( my_hists->IsMC!=kTRUE ) jetweight*=(fUE->Eval(jet_pt))*C_rel->GetBinContent(C_rel->FindBin(jet_eta));
       else
          jetweight*=((fUE->Eval(jet_pt))*fgaus->GetRandom()+1);
     
       jet_vec.SetPtEtaPhi(jet_pt, jet_eta, jet_phi);
    // for track loop in each jet, do jet-track analysis
           for(int itr = 0 ; itr < my_tr->nTrk ; itr++){
                            double tr_pt = my_tr->trkPt[itr];
                            double tr_phi = my_tr->trkPhi[itr];
                            double tr_eta = my_tr->trkEta[itr];
                            if(TMath::Abs(tr_eta)>2.4) continue ;
         if(!((my_tr->highPurity[itr])
             && (fabs(my_tr->trkDz1[itr]/my_tr->trkDzError1[itr])<3)
             && (fabs(my_tr->trkDxy1[itr]/my_tr->trkDxyError1[itr])<3)
             && (my_tr->trkPtError[itr]/my_tr->trkPt[itr]<0.1)
            ))
            continue;
          
                            Int_t TrkEtaBin = -1 ;
                              for(Int_t ieta = 0 ; ieta <ntrketabin; ieta++){
                        if(coll=="PPb"){
                           if((tr_eta+0.465)>dtrketa[ieta]&&(tr_eta+0.465)<=dtrketa[ieta+1]) TrkEtaBin = ieta ;
                           }
                        else if(coll=="PbP"){
                            if((tr_eta-0.465)>dtrketa[ieta]&&(tr_eta-0.465)<=dtrketa[ieta+1]) TrkEtaBin = ieta ;
                           }
                        else
                      if((tr_eta+0.465)>dtrketa[ieta]&&(tr_eta+0.465)<=dtrketa[ieta+1]) TrkEtaBin = ieta ;
                     }
            track_vec.SetPtEtaPhi(tr_pt, tr_eta, tr_phi);
                            if((my_tr->highPurity[itr])){
                              //  if(tr_pt<trackcut) continue ;
                            double trkweight=1. ;
                   double  dr = jet_vec.DeltaR(track_vec);
                   if(dr>conesize) continue ; 
                             if(doTrackCorrections){
                             //   if(corrMet=="Hist")trkweight = c->getTrackCorrection(itr);
                             //   else trkweight = c->getTrackCorrectionPara(itr);
                            // trkweight = corr.getWeight(tr_pt,tr_eta,leadingJetPt);
                             trkweight = corr.getWeight(tr_pt,tr_eta,0.);
                            }
                        my_hists->jettrkpt[curr_bin]->Fill(jet_pt*jetweight, tr_pt, weight*trkweight);
                        if(coll=="PPb" && TMath::Abs(tr_eta+0.465)<=1.) my_hists->jettrkptM1P1[curr_bin]->Fill(tr_pt, weight*trkweight);
                        if(coll=="PbP" && TMath::Abs(tr_eta-0.465)<=1.) my_hists->jettrkptM1P1[curr_bin]->Fill(tr_pt, weight*trkweight);
                        if(TrkEtaBin!=-1) my_hists->jettrkPtEtaBin[curr_bin][TrkEtaBin]->Fill(tr_pt, weight*trkweight);
                      } //! high purity track cuts
            
           } //end of track loop
        } //jet kinematics
} //jet loop 

            if(my_hists->IsMC==kTRUE&&DoGenAna){
                          //using the sim track to calculate the tracking efficiency 
                    for(int ipart = 0 ; ipart < my_tr->nParticle ; ipart++){ //sim track loop 
                        double gen_pt = my_tr->pPt[ipart];
                        double gen_phi = my_tr->pPhi[ipart];
                        double gen_eta = my_tr->pEta[ipart];
                     //   if(gen_pt<trackcut)continue ;
                        if(TMath::Abs(gen_eta)>2.4)continue ;
                              if(my_tr->pNRec[ipart]>0&&((my_tr->mtrkQual[ipart]))) {
                                 if((my_tr->mtrkPtError[ipart]/my_tr->mtrkPt[ipart]<0.1 && TMath::Abs(my_tr->mtrkDz1[ipart]/my_tr->mtrkDzError1[ipart])<3.0 && TMath::Abs(my_tr->mtrkDxy1[ipart]/my_tr->mtrkDxyError1[ipart])<3.0)){
                                my_hists->incgenmatchpt[curr_bin]->Fill(gen_pt, weight);
                                 } //tracking cut
                              } // matching hist
                             my_hists->incgenpartpt[curr_bin]->Fill(gen_pt,weight);
                       } //! sim track loop
      } //only runs on MC
       my_hists->NevtCounter[curr_bin]->SetBinContent(1, Nevents[curr_bin]*weight);
       my_hists->JetAbove40[curr_bin]->SetBinContent(1, Nevt_40_60[curr_bin]*weight);
       my_hists->JetAbove60[curr_bin]->SetBinContent(1, Nevt_60_75[curr_bin]*weight);
       my_hists->JetAbove75[curr_bin]->SetBinContent(1, Nevt_75_95[curr_bin]*weight);
       my_hists->JetAbove95[curr_bin]->SetBinContent(1, Nevt_95_120[curr_bin]*weight);
       my_hists->JetAbove120[curr_bin]->SetBinContent(1, Nevt_120[curr_bin]*weight);
    }  ///event loop
    
    my_hists->Write();
    //   my_hists->Delete();
    //  delete my_hists;
    std::cout << "working done\n";
}
Пример #8
0
void partonFlavorTree(double tag=0, char *infName = "/mnt/hadoop/cms/store/user/dgulhan/HIMC/Jet80/Track8_Jet21_STARTHI53_LV1/merged3/HiForest_Pythia_Hydjet_Jet80_Track8_Jet21_STARTHI53_LV1_merged_forest_0.root",collisionType cType = cPbPb)
{
   // Define the input file and HiForest
   HiForest *c = new HiForest(infName,"",cType);
   c->hasHltTree=0;
   c->hasPFTree=0;
   c->hasPhotonTree=0;
   c->hasTowerTree=0;
   c->hasHbheTree=0;
   c->hasEbTree=0;
   c->hasGenpTree=0;
   c->hasGenParticleTree=0;   
   c->hasAk5CaloJetTree=0;
   c->hasAkPu2CaloJetTree=0;
   c->hasAkPu3CaloJetTree=0;
   c->hasAkPu4CaloJetTree=0;
   c->hasAkPu5CaloJetTree=0;
   c->hasAkPu2JetTree=0;
   c->hasAkPu3JetTree=0;
   c->hasAkPu4JetTree=0;
   c->hasAkPu5JetTree=0;
   c->hasAkVs2PFJetTree=0;
   c->hasAkVs3PFJetTree=0;
   c->hasAkVs4PFJetTree=0;
   c->hasAkVs5PFJetTree=0;
//   c->doTrackCorrections=1;
//   c->InitTree();
   
   // Output file
   TFile *output = new TFile(Form("output-%.0f.root",tag),"recreate");
   
   // Output
   TTree * t = new TTree("t","gammajet");
   
   JetData data(t,1);

   TH1D *hWeight = new TH1D("hWeight","",1000,0,100);
   TH1D *hWeight2 = new TH1D("hWeight2","",1000,0,100);
   TH1D *hPt = new TH1D("hPt","",150,0,150);
   TH1D *hGenPt = new TH1D("hGenPt","",150,0,150);
   TH1D *hNoWPt = new TH1D("hNoWPt","",150,0,150);
   TH1D *hRmin = new TH1D("hRmin","",100,0,10);
   // Main loop
   for (int i=0;i<c->GetEntries();i++) {
      c->GetEntry(i);
      data.hiBin = c->evt.hiBin;
      if (i % 1000 == 0) cout <<i<<" / "<<c->GetEntries()<<endl;
      
      // Event selection
//      if (fabs(c->evt.vz)>15) continue;
//      if (!c->selectEvent()) continue;
      // Select leading and subleading jet
      
      data.nJet=0;
      for (int j=0;j<c->akVs3Calo.nref;j++) {
         if (fabs(c->akVs3Calo.jteta[j])>2) continue;
	 if (c->akVs3Calo.jtpt[j]<100) continue;
	 data.jetPt[data.nJet]=c->akVs3Calo.jtpt[j];
	 data.jetEta[data.nJet]=c->akVs3Calo.jteta[j];
	 data.jetPhi[data.nJet]=c->akVs3Calo.jtphi[j];
	 data.jetFlavor[data.nJet]=c->akVs3Calo.refparton_flavor[j];
	 data.refPt[data.nJet]=c->akVs3Calo.refpt[j];
//	 cout <<data.nJet<<endl;
	 
	 data.jetTrkMult1[data.nJet]=0;
	 data.jetTrkMult2[data.nJet]=0;
	 data.jetTrkMult3[data.nJet]=0;
	 data.jetTrkMult4[data.nJet]=0;
	 data.jetTrkMult5[data.nJet]=0;
	 data.jetTrkMult6[data.nJet]=0;
	 data.jetTrkMult7[data.nJet]=0;
	 data.jetTrkMult8[data.nJet]=0;
	 data.jetTrkSum1[data.nJet]=0;
	 data.jetTrkSum2[data.nJet]=0;
	 data.jetTrkSum3[data.nJet]=0;
	 data.jetTrkSum4[data.nJet]=0;
	 data.jetTrkSum5[data.nJet]=0;
	 data.jetTrkSum6[data.nJet]=0;
	 data.jetTrkSum7[data.nJet]=0;
	 data.jetTrkSum8[data.nJet]=0;
	 data.jetTrkW1[data.nJet]=0;
	 data.jetTrkW2[data.nJet]=0;
	 data.jetTrkW3[data.nJet]=0;
	 data.jetTrkW4[data.nJet]=0;
	 data.jetTrkW5[data.nJet]=0;
	 data.jetTrkW6[data.nJet]=0;
	 data.jetTrkW7[data.nJet]=0;
	 data.jetTrkW8[data.nJet]=0;
	 
	 
         for (int k=0;k<c->track.nTrk;k++) {
            if (fabs(c->track.trkEta[k])>2.4) continue;
   	    if ((c->track.trkPt[k])<4) continue;
            if (!(c->track.highPurity[k] &&
              fabs(c->track.trkDxy1[k]/c->track.trkDxyError1[k])<3.0 &&
              fabs(c->track.trkDz1[k]/c->track.trkDzError1[k])<3.0 && 
              (c->track.trkPtError[k]/c->track.trkPt[k])<0.1)) continue;

            
            double dR = c->getDR( c->track.trkEta[k], c->track.trkPhi[k], data.jetEta[data.nJet], data.jetPhi[data.nJet]);
            double dR2 = c->getDR( c->track.trkEta[k], c->track.trkPhi[k], -data.jetEta[data.nJet], data.jetPhi[data.nJet]);
	    if (dR<0.1) data.jetTrkMult1[data.nJet]++;
	    if (dR<0.2) data.jetTrkMult2[data.nJet]++;
	    if (dR<0.3) data.jetTrkMult3[data.nJet]++;
	    if (dR<0.4) data.jetTrkMult4[data.nJet]++;
	    if (dR<0.5) data.jetTrkMult5[data.nJet]++;
	    if (dR<0.6) data.jetTrkMult6[data.nJet]++;
	    if (dR<0.7) data.jetTrkMult7[data.nJet]++;
	    if (dR<0.8) data.jetTrkMult8[data.nJet]++;

	    if (dR2<0.1) data.jetTrkMult1[data.nJet]--;
	    if (dR2<0.2) data.jetTrkMult2[data.nJet]--;
	    if (dR2<0.3) data.jetTrkMult3[data.nJet]--;
	    if (dR2<0.4) data.jetTrkMult4[data.nJet]--;
	    if (dR2<0.5) data.jetTrkMult5[data.nJet]--;
	    if (dR2<0.6) data.jetTrkMult6[data.nJet]--;
	    if (dR2<0.7) data.jetTrkMult7[data.nJet]--;
	    if (dR2<0.8) data.jetTrkMult8[data.nJet]--;

	    if (dR<0.1) data.jetTrkW1[data.nJet]+=c->track.trkPt[k]*dR;
	    if (dR<0.2) data.jetTrkW2[data.nJet]+=c->track.trkPt[k]*dR;
	    if (dR<0.3) data.jetTrkW3[data.nJet]+=c->track.trkPt[k]*dR;
	    if (dR<0.4) data.jetTrkW4[data.nJet]+=c->track.trkPt[k]*dR;
	    if (dR<0.5) data.jetTrkW5[data.nJet]+=c->track.trkPt[k]*dR;
	    if (dR<0.6) data.jetTrkW6[data.nJet]+=c->track.trkPt[k]*dR;
	    if (dR<0.7) data.jetTrkW7[data.nJet]+=c->track.trkPt[k]*dR;
	    if (dR<0.8) data.jetTrkW8[data.nJet]+=c->track.trkPt[k]*dR;
/*
	    if (dR2<0.1) data.jetTrkW1[data.nJet]-=c->track.trkPt[k]*dR;
	    if (dR2<0.2) data.jetTrkW2[data.nJet]-=c->track.trkPt[k]*dR;
	    if (dR2<0.3) data.jetTrkW3[data.nJet]-=c->track.trkPt[k]*dR;
	    if (dR2<0.4) data.jetTrkW4[data.nJet]-=c->track.trkPt[k]*dR;
	    if (dR2<0.5) data.jetTrkW5[data.nJet]-=c->track.trkPt[k]*dR;
	    if (dR2<0.6) data.jetTrkW6[data.nJet]-=c->track.trkPt[k]*dR;
	    if (dR2<0.7) data.jetTrkW7[data.nJet]-=c->track.trkPt[k]*dR;
	    if (dR2<0.8) data.jetTrkW8[data.nJet]-=c->track.trkPt[k]*dR;
*/
	    if (dR<0.1) data.jetTrkSum1[data.nJet]+=c->track.trkPt[k];
	    if (dR<0.2) data.jetTrkSum2[data.nJet]+=c->track.trkPt[k];
	    if (dR<0.3) data.jetTrkSum3[data.nJet]+=c->track.trkPt[k];
	    if (dR<0.4) data.jetTrkSum4[data.nJet]+=c->track.trkPt[k];
	    if (dR<0.5) data.jetTrkSum5[data.nJet]+=c->track.trkPt[k];
	    if (dR<0.6) data.jetTrkSum6[data.nJet]+=c->track.trkPt[k];
	    if (dR<0.7) data.jetTrkSum7[data.nJet]+=c->track.trkPt[k];
	    if (dR<0.8) data.jetTrkSum8[data.nJet]+=c->track.trkPt[k];
/*

	    if (dR2<0.1) data.jetTrkSum1[data.nJet]-=c->track.trkPt[k];
	    if (dR2<0.2) data.jetTrkSum2[data.nJet]-=c->track.trkPt[k];
	    if (dR2<0.3) data.jetTrkSum3[data.nJet]-=c->track.trkPt[k];
	    if (dR2<0.4) data.jetTrkSum4[data.nJet]-=c->track.trkPt[k];
	    if (dR2<0.5) data.jetTrkSum5[data.nJet]-=c->track.trkPt[k];
	    if (dR2<0.6) data.jetTrkSum6[data.nJet]-=c->track.trkPt[k];
	    if (dR2<0.7) data.jetTrkSum7[data.nJet]-=c->track.trkPt[k];
	    if (dR2<0.8) data.jetTrkSum8[data.nJet]-=c->track.trkPt[k];
*/
	 }       
	 
	 if (data.jetTrkSum1[data.nJet]!=0) data.jetTrkW1[data.nJet]/=data.jetTrkSum1[data.nJet];
	 if (data.jetTrkSum2[data.nJet]!=0) data.jetTrkW2[data.nJet]/=data.jetTrkSum2[data.nJet];
	 if (data.jetTrkSum3[data.nJet]!=0) data.jetTrkW3[data.nJet]/=data.jetTrkSum3[data.nJet];
	 if (data.jetTrkSum4[data.nJet]!=0) data.jetTrkW4[data.nJet]/=data.jetTrkSum4[data.nJet];
	 if (data.jetTrkSum5[data.nJet]!=0) data.jetTrkW5[data.nJet]/=data.jetTrkSum5[data.nJet];
	 if (data.jetTrkSum6[data.nJet]!=0) data.jetTrkW6[data.nJet]/=data.jetTrkSum6[data.nJet];
	 if (data.jetTrkSum7[data.nJet]!=0) data.jetTrkW7[data.nJet]/=data.jetTrkSum7[data.nJet];
	 if (data.jetTrkSum8[data.nJet]!=0) data.jetTrkW8[data.nJet]/=data.jetTrkSum8[data.nJet];
	 
	 data.nJet++;
      } 

/*            
      // Select generator level leading and subleading jet
      for (int j=0;j<c->akVs3Calo.ngen;j++) {
         if (fabs(c->akVs3Calo.geneta[j])>2) continue;
      } 
      data.nTrk=0;

      for (int j=0;j<c->track.nTrk;j++) {
         if (fabs(c->track.trkEta[j])>2.4) continue;
	 if ((c->track.trkPt[j])<0.5) continue;
         if (!(c->track.highPurity[j] &&
              fabs(c->track.trkDxy1[j]/c->track.trkDxyError1[j])<3.0 &&
              fabs(c->track.trkDz1[j]/c->track.trkDzError1[j])<3.0 && 
              (c->track.trkPtError[j]/c->track.trkPt[j])<0.1)) continue;
	 data.trkWt[data.nTrk]=c->getTrackCorrection(j);
	 data.trkPt[data.nTrk]=c->track.trkPt[j];
         data.trkEta[data.nTrk]=c->track.trkEta[j];
	 data.trkPhi[data.nTrk]=c->track.trkPhi[j];
	 //data.trkRmin[data.nTrk]=c->getTrkRMin(c->track.trkPhi[j],c->track.trkEta[j],c->akVs3Calo);
	 //hPt->Fill(data.trkPt[data.nTrk],data.trkWt[data.nTrk]);
         //hRmin->Fill(data.trkRmin[data.nTrk]);
         data.nTrk++;
      }

      data.nP=0;

      for (int j=0;j<c->track.nParticle;j++) {
         if (fabs(c->track.pEta[j])>2.4) continue;
	 if (fabs(c->track.pPt[j])<0.5) continue;

	 data.pPt[data.nP]=c->track.pPt[j];
         data.pEta[data.nP]=c->track.pEta[j];
	 data.pPhi[data.nP]=c->track.pPhi[j];
         data.nP++;

      }
*/
      //cout <<data.mpt<<endl;
      t->Fill();
   }

   output->Write();
   output->Close();
}
Пример #9
0
// void sortforestCentVz(double etCut=40, char *infname = "/mnt/hadoop/cms/store/user/velicanu/forest/HiForestTrack_v3.root")
// void sortforestCentVz(double etCut=40, char *infname = "/mnt/hadoop/cms/store/user/velicanu/HIHighPt/HIRun2011_hiHighPtTrack_PromptSkim_forest_v0/9902eec616cc8b0649a7a8bb69754615/HiForest_998_1_rJ1.root")
// void sortforestCentVz(double etCut=40, char *infname = "/net/hisrv0001/home/dav2105/hdir/HIHighPt/HIRun2011_hiHighPtTrack_PromptSkim_forest_v0/9902eec616cc8b0649a7a8bb69754615/HiForest_1000_1_8wo.root")
// void sortforestCentVz(double etCut=40, char *infname = "/net/hisrv0001/home/dav2105/hdir/HIHighPt/HIRun2011_hiHighPtTrack_PromptSkim_forest_v0/9902eec616cc8b0649a7a8bb69754615/HiForest_1001_1_TRm.root")
void frankforestsort(int startline = 0)
{
  //! Define the input and output file and HiForest
  string buffer;
  vector<string> listoffiles;
  int nlines = 0;
  // ifstream infile("/net/hidsk0001/d00/scratch/dav2105/forest/jobsort/jet80sortlist.txt");
  ifstream infile("/net/hidsk0001/d00/scratch/dav2105/forest/jobsort/frankjet80sortlist.txt");
  // ifstream infile("/net/hidsk0001/d00/scratch/dav2105/forest/jobsort/sortlist.txt");

  if (!infile.is_open()) {
    cout << "Error opening file. Exiting." << endl;
    return;
  } else {
    while (!infile.eof()) {
      infile >> buffer;
      listoffiles.push_back(buffer);
      nlines++;
    }
  }
  cout<<" here"<<endl;
  HiForest *c = new HiForest(listoffiles[startline].data(),0,0,0,0,true);
  // c->SetOutputFile(Form("sortedHiForest_%d.root",startline));
  TFile * outf = new TFile(Form("sortedHiForest_%d.root",startline),"recreate");
  c->outf = outf;
  c->SetOutputFile("null",true);

  
  //! loop through all the events once to construct the cent,vz pair array we'll be sorting over
  cout << "Constructing the cent:vz pair array..." << endl;
  for (int i=0;i<c->GetEntries();i++)
  {
    c->GetEntry(i);
    pair<int,double> centvz;
    centvz.first = c->evt->hiBin;
    centvz.second = c->evt->vz;
    evtCentVz.push_back(centvz);
    if (i%1000==0) cout <<i<<" / "<<c->GetEntries()<<" "<<c->setupOutput<<endl;
    // if (i > 1000) break;
  }
  
  //! Make the index array which will get sorted on first centrality
  int evtindecies[c->GetEntries()];
  for (int i=0;i<c->GetEntries();i++)
  {
    evtindecies[i] = i;
    // if (i > 1000) break;
	// cout << "In original loop | " << evtindecies[i] << " : (" << evtCentVz[evtindecies[i]].first <<" , "<<evtCentVz[evtindecies[i]].second << endl;
  }
  
  cout << "Sorting the cent:vz pair array..." << " "<<c->setupOutput<<endl;
  //! Sort the index array first on the centrality bin, then on the vz of the entry at that index
  qsort (evtindecies, c->GetEntries(), sizeof(int), comparecentvz);
  // qsort (evtindecies, 1000, sizeof(int), comparecentvz);
  
  //! Now fill the tree in the new order
  cout << "Filling the tree in the sorted order..." << " "<<c->setupOutput<<endl;
  for (int i=0;i<c->GetEntries();i++)
  {
    c->GetEntry(evtindecies[i]);
    c->FillOutput();
	// cout << "In fill loop | " << evtindecies[i] << " : (" << evtCentVz[evtindecies[i]].first <<" , "<<evtCentVz[evtindecies[i]].second << endl;
    if (i%1000==0) cout <<i<<" / "<<c->GetEntries()<<" "<<c->setupOutput<<endl;
    // if (i > 1000) break;
  }

  delete c;
}
Пример #10
0
void correlate(
    const char* infname = "/data_CMS/cms/yilmaz/HiForest_HYDJET_Track8_Jet21_STARTHI53_LV1_merged_forest_0.root",
    const char* outname = "histograms_01.root",
    bool MC = 1,
    bool PbPb = 1,
    double jetEtaMax = 1.6,
    int centIndex = 0, int etaBin = 0, int leadJetPtBin = 0, int trackPtBin = 0
) {

    cout<<"Begin"<<endl;

    bool mini = 1;

    int Nevents = 1000;

    bool usePF = 1;
    int R = 3;

    double etaCOM = -0.465;

    bool doFlow = 0;
    bool doInclusiveJets = 1;
    bool doTracks = 1;
    bool doGenParticles = 1;

    bool fillTracks = 0;

    if(mini) {
        fillTracks = 0;
        doTracks = 0;
    }

    double pi = TMath::Pi();

    double trkMin = 0.5;

    double leadPtMin = 120;
    double subleadPtMin = 50;
    double dphiMin = 2.*pi/3.;

    int frame = 1; // Dijet frame for z

    int analysisId = 0;

    double ptSubLeadMin = 30;
    double ptLeadMin = 120;

    double etLeadMin[10] = {100, 100,120,150,180,200  };
    double etLeadMax[10] = {1000,120,150,180,200,1000 };

    double tkMin[10] = {4.,  4.,5.,7.,10., 20.};
    double tkMax[10] = {100.,5.,7.,10.,20.,1000.};

    TF1* gaus = new TF1("gaus","gaus",-5,5);
    gaus->SetParameter(0,1);
    gaus->SetParameter(1,0);
    gaus->SetParameter(2,1);

    TRandom* engin = new TRandom();

    //  double fitMin[10] = {100,80,60,50,100};
    //  double fitMax[10] = {250,200,150,100,250};

    double fitMin[10] = {100,90,80,70,100};
    double fitMax[10] = {300,300,300,300,300};

    TH1::SetDefaultSumw2();
    TH2::SetDefaultSumw2();
    cout<<"x"<<endl;

    string name[10] = {"c0to10","c10to20","c20to30","c30to50","c50to100","c0to30","c30to100","c0to100"};
    cout<<"x"<<endl;

    TFile* outf = new TFile(outname,"recreate");

    TNtuple *nt;
    nt = new TNtuple("nt","nt","x");

    TH3D* hAxisLead = new TH3D("hAxisLead","",500,0,500,160,-1.6,1.6,200,-pi,pi);
    TH3D* hAxisSubLead = new TH3D("hAxisSubLead","",500,0,500,160,-1.6,1.6,200,-pi,pi);

    TH3D* hCorrLead = new TH3D("hCorrLead","",500,0,500,160,-1.6,1.6,200,-pi,pi);
    TH3D* hCorrSubLead = new TH3D("hCorrSubLead","",500,0,500,160,-1.6,1.6,200,-pi,pi);

    TH3D* hGenParticleLead = new TH3D("hGenParticleLead","",500,0,500,160,-1.6,1.6,200,-pi,pi);
    TH3D* hGenParticleSubLead = new TH3D("hGenParticleSubLead","",500,0,500,160,-1.6,1.6,200,-pi,pi);

    TH1D* hPtLead = new TH1D("hPtLead","",500,0,500);
    TH1D* hPtSubLead = new TH1D("hPtSubLead","",500,0,500);

    bool pp = 0;

    double ajMin[10] = {0,    0.11, 0.22, 0.33, 0. , 0, 0};
    double ajMax[10] = {0.11, 0.22, 0.33, 1.,   1. , 0 ,0};

    int nEta = 4;
    double etaMin[10] = {0,  0,    0.5,  1.};
    double etaMax[10] = {5., 0.5,  1.,   2.};

    outf->cd();

    int NxsiBin = 20;
    int NptBin = 100;
    double zBins[21];
    double ptBins[101];

    cout<<"BINS : "<<endl;
    for(int i = 0; i < NxsiBin+1; ++i) {
        double xsi = -1+(10./NxsiBin)*(NxsiBin-i-1);
        cout<<"xsi : "<<xsi<<endl;
        zBins[i] = exp(-xsi);
    }

    for(int i = 0; i < NptBin+1; ++i) {
        ptBins[i] = i*1000./NptBin;
    }

    HiForest * t;
    if(PbPb) {
        t = new HiForest(infname,"",cPbPb,MC);
    } else {
        t = new HiForest(infname,"",cPPb,MC);
    }

    t->hasPhotonTree *= 0;
    t->hasMetTree *= 0;
    t->hasPFTree *= 0;
    t->hasPFTree *= 0;


    t->hasAk2JetTree *= 0;
    t->hasAk3JetTree *= 1;
    t->hasAk4JetTree *= 0;
    t->hasAk5JetTree *= 1;

    t->hasAkPu2JetTree *= 0;
    t->hasAkPu3JetTree *= 1;
    t->hasAkPu4JetTree *= 0;
    t->hasAkPu5JetTree *= 1;

    t->hasAk2CaloJetTree *= 0;
    t->hasAk3CaloJetTree *= 1;
    t->hasAk4CaloJetTree *= 0;
    t->hasAk5CaloJetTree *= 1;

    t->hasAkPu2CaloJetTree *= 0;
    t->hasAkPu3CaloJetTree *= 1;
    t->hasAkPu4CaloJetTree *= 0;
    t->hasAkPu5CaloJetTree *= 1;

    t->hasTrackTree *= 1;
    t->hasPixTrackTree *= 0;
    t->hasTowerTree *= 0;
    t->hasHbheTree *= 0;
    t->hasEbTree *= 0;
    t->hasGenpTree *= 0;
    t->hasGenParticleTree *= MC;

    t->InitTree();

    cout<<"a"<<endl;


    if(Nevents > 0) {
        t->nEntries = Nevents;
    } else {
        Nevents = t->nEntries;
    }

    outf->cd();

    vector<JetIndex> vecs;
    vecs.reserve(maxEntry);

    float z1[4], z2[4],
          z1a[4], z2a[4],
          z1b[4], z2b[4],
          z1c[4], z2c[4];

    float tdt1[4], tdt2[4], tdt1a[4], tdt2a[4], tdt1b[4], tdt2b[4], tdt1c[4], tdt2c[4];

    Jets *jets0 = 0, * jets1 = 0, *jets2 = 0;
    TTree  *jetTree0 = 0, * jetTree1 = 0, *jetTree2 = 0;

    if(usePF) {
        if(R == 3) {
            jets1 = &(t->akPu3PF);
            jetTree1 = t->akPu3PFJetTree;
        }
        if(R == 5) {
            jets1 = &(t->akPu5PF);
            jetTree1 = t->akPu5PFJetTree;
        }
    } else {
        if(R == 3) {
            jets1 = &(t->akPu3Calo);
            jetTree1 = t->akPu3CaloJetTree;
        }
        if(R == 5) {
            jets1 = &(t->akPu5Calo);
            jetTree1 = t->akPu5CaloJetTree;
        }
    }

    cout<<"a"<<endl;

    for(int iev = 0; iev < Nevents; ++iev) {
        if(iev%1000==0) {
            cout<<"Processing entry : "<<iev<<endl;
        }
        t->GetEntry(iev);

        if(!MC && !PbPb && !(t->skim.pPAcollisionEventSelectionPA && t->skim.pHBHENoiseFilter)) continue;
        if(!MC && PbPb && !(t->skim.pcollisionEventSelection && t->skim.pHBHENoiseFilter)) continue;

        // add other selection

        int noise = -1;

        if(!MC && noise >= 2) continue;

        cout<<"passed event selection"<<endl;

        float pthat = jets1->pthat;

        double pt1 = -9, pt2 = -9, pt3 = -9, aj = -9,
               eta1 = -9,eta2 = -9,phi1 = -9,phi2 = -9,
               dphi  = -9, adphi  = -9,
               eta3 = -9, phi3 = -9, dr = -9,
               ch1 = 0,ch2 = 0, ch1alt = 0, ch2alt = 0,

               refpt1 = 0, refpt2 = 0, refpt3 = 0,
               genpt1 = 0, genpt2 = 0, genpt3 = 0,

               pu1=-9,pu2=-9, pu3 = -9,
               puc1=-9,puc2=-9, puc3 = -9,

               raw1=-9,raw2=-9, raw3 = -9,

               drm1=-9,drm2=-9, drm3=-9,
               psi1=-9, psi2=-9, psi=-9, psiP=-9, psiM=-9, psiPS=-9, psiMS=-9, psiS=-9,
               psiTri = -9, psiTriP = -9, psiTriM = -9, psiTriS = -9, psiTriPS = -9, psiTriMS = -9;

        float etsum=0,etx=0,ety=0,v2=0,
              etp=0,etxp=0,etyp=0,v2p=0,
              etm=0,etxm=0,etym=0,v2m=0,
              v2pm=0,v2mp=0,v2pp=0,v2mm=0,etx1=0,ety1=0,
              v2s,v2ps,v2ms;

        int dijetType = -9,njt10=0,njt20=0,njt30=0,njt40=0,njt50=0,njt100=0;
        int ngen10 = 0, ngen20=0, ngen30 = 0, ngen50 = 0;

        float trkMax1 = -9,trkMax2=-9,trkMax3=-9,
              trkSum1=-9,trkSum2=-9,trkSum3=-9,
              had1=-9,had2=-9,had3=-9,
              matchPt1=-9,matchPt2=-9,matchPt3=-9;

        int nSide = -9;

        int iPlane = 21; //21 HF, 0 tracks

        double flowEtaMin = 3;

        double hfp = t->evt.hiHFplusEta4;
        double hfm = t->evt.hiHFminusEta4;
        double zdc = t->evt.hiZDCplus;
        double vz = t->track.zVtx[t->track.maxVtx];

        double ntrk = t->evt.hiNtracks;
        double npix = t->evt.hiNpix;

        int nside = 0;
        int nps = 0;
        int npb = 0;
        int npscom = 0;
        int npbcom = 0;
        double hfs = 0, hfb = 0;
        int nls = 0, nlb = 0, nlscom = 0, nlbcom = 0;

        psi = t->evt.hiEvtPlanes[iPlane];
        psiM = t->evt.hiEvtPlanes[iPlane+2];
        psiP = t->evt.hiEvtPlanes[iPlane+1];

        v2 = 0;

        vecs.clear();

        for(int j = 0; j < jets1->nref; ++j) {
            if(jets1->rawpt[j] < 15) continue;

            if( fabs(jets1->jteta[j]) > jetEtaMax ) continue;

            JetIndex entry;
            entry.pt = jets1->jtpt[j];
            entry.index = j;
            vecs.push_back(entry);

            if(jets1->jtpt[j]>10) njt10++;
            if(jets1->jtpt[j]>20) njt20++;
            if(jets1->jtpt[j]>30) njt30++;
            if(jets1->jtpt[j]>40) njt40++;
            if(jets1->jtpt[j]>50) njt50++;
            if(jets1->jtpt[j]>100) njt100++;
        }

        sort(vecs.begin(),vecs.end(),comparePt);

        int jtLead = -1, jtSubLead = -1, jtThird = -1;

        if(vecs.size() > 0) jtLead = vecs[0].index;
        if(vecs.size() > 1) jtSubLead = vecs[1].index;
        if(vecs.size() > 2) jtThird = vecs[2].index;

        cout<<"Got some jets "<<vecs.size()<<endl;
        if(vecs.size() > 0) cout<<"pt1 : "<<jets1->jtpt[jtLead]<<endl;
        if(vecs.size() > 1) cout<<"pt2 : "<<jets1->jtpt[jtSubLead]<<endl;

        if(!MC && (vecs.size() < 1 || jets1->jtpt[jtLead] < leadPtMin)) continue;
        if(vecs.size() < 2 || jets1->jtpt[jtSubLead] < subleadPtMin) continue;
        if(fabs(deltaPhi(phi1,phi2)) < dphiMin) continue;

        cout<<"Got dijets"<<endl;

        int evt = t->hlt.Event;
        int run = t->hlt.Run;

        if(jtLead > -1) {
            pt1 = jets1->jtpt[jtLead];
            eta1 = jets1->jteta[jtLead];
            phi1 = jets1->jtphi[jtLead];
            raw1 = jets1->rawpt[jtLead];
            trkMax1 = jets1->trackMax[jtLead];
            trkSum1 = jets1->trackSum[jtLead];
            matchPt1 = jets1->matchedPt[jtLead];

            if(MC) refpt1 = jets1->refpt[jtLead];
        }

        if(jtSubLead > -1) {
            pt2 = jets1->jtpt[jtSubLead];
            eta2 = jets1->jteta[jtSubLead];
            phi2 = jets1->jtphi[jtSubLead];
            raw2 = jets1->rawpt[jtSubLead];
            trkMax2 = jets1->trackMax[jtSubLead];
            trkSum2 = jets1->trackSum[jtSubLead];
            matchPt2 = jets1->matchedPt[jtSubLead];

            if(MC) refpt2 = jets1->refpt[jtSubLead];

            aj = (pt1-pt2)/(pt1+pt2);
            dphi = deltaPhi(phi1,phi2);
            adphi = fabs(dphi);

            dr= deltaR(eta2,phi2,eta1,phi1);
            //       correlateTracks(t->track,eta2,phi2,trkMin,ch2,trk2,ntrk2);
        }

        if(jtThird > -1) {
            pt3 = jets1->jtpt[jtThird];
            eta3 = jets1->jteta[jtThird];
            phi3 = jets1->jtphi[jtThird];
            raw3 = jets1->rawpt[jtThird];
            trkMax3 = jets1->trackMax[jtThird];
            trkSum3 = jets1->trackSum[jtThird];
            matchPt3 = jets1->matchedPt[jtThird];

            if(MC) refpt3 = jets1->refpt[jtThird];

        }

        if(MC) {
            vecs.clear();
            for(int j = 0; j < jets1->ngen; ++j) {
                JetIndex entry;
                if(fabs(jets1->geneta[j]) > 2) continue;
                entry.pt = jets1->genpt[j];
                entry.index = j;
                vecs.push_back(entry);

                if(jets1->genpt[j] > 10)ngen10++;
                if(jets1->genpt[j] > 20)ngen20++;
                if(jets1->genpt[j] > 30)ngen30++;
                if(jets1->genpt[j] > 50)ngen50++;

            }

            sort(vecs.begin(),vecs.end(),comparePt);

            int ig1 = -1, ig2 = -1, ig3 = -1;
            if(vecs.size() > 0) {
                ig1 = jets1->genmatchindex[vecs[0].index];
                genpt1 = jets1->genpt[vecs[0].index];
            }
            if(vecs.size() > 1) {
                ig2 = jets1->genmatchindex[vecs[1].index];
                genpt2 = jets1->genpt[vecs[1].index];
            }
            if(vecs.size() > 2) {
                ig3 = jets1->genmatchindex[vecs[2].index];
                genpt3 = jets1->genpt[vecs[2].index];
            }

        }

        double dijetEta = (eta1+eta2)/2;

        cout<<"Filling jets"<<endl;

        double weight = 1;
        hPtLead->Fill(pt1,weight);
        hPtSubLead->Fill(pt2,weight);

        hAxisLead->Fill(pt1,eta1,phi1,weight);
        hAxisSubLead->Fill(pt2,eta2,phi2,weight);

        if(doGenParticles) {

            for(int i = 0; i < t->genparticle.mult; ++i) {
                if(t->genparticle.chg[i] == 0 || t->genparticle.sta[i] != 1) continue;
                double peta = t->genparticle.eta[i];
                double pphi = t->genparticle.phi[i];
                hGenParticleLead->Fill(pt1,deltaEta(peta,eta1),deltaPhi(pphi,phi1),weight);
                hGenParticleSubLead->Fill(pt2,deltaEta(peta,eta2),deltaPhi(pphi,phi2),weight);
            }
        }

        if(doTracks) {

            for(int i = 0; i < t->track.nTrk; ++i) {
                if(!t->selectTrack(i)) continue;
                if(t->track.trkPt[i] < trkMin) continue;
                double peta = t->track.trkEta[i];
                double pphi = t->track.trkPhi[i];
                hCorrLead->Fill(pt1,deltaEta(peta,eta1),deltaPhi(pphi,phi1),weight);
                hCorrSubLead->Fill(pt2,deltaEta(peta,eta2),deltaPhi(pphi,phi2),weight);

            }
        }

    }

    outf->Write();

    cout<<"Congrats!!!"<<endl;


}
Пример #11
0
void randomcone(int condor_iter, string flist, string tag, int centmin, int centmax)
{
  using namespace std;
  
  string buffer;
  vector<string> listoffiles;
  int nlines = 0;
  ifstream infile(flist.data());
  if (!infile.is_open()) {
    cout << "Error opening file. Exiting." << endl;
    return;
  } else {
    while (!infile.eof()) {
      infile >> buffer;
      listoffiles.push_back(buffer);
      nlines++;
    }
  }
  
  HiForest * c = new HiForest(listoffiles[condor_iter].data(),"forest",cPPb,0);
  
  // TH2D * etaphi = new TH2D();
  int nevents = c->GetEntries();
  const int netabins = 48;
  
  TRandom3 r;
  float rConeEta = 0;
  float rConePhi = 0;
  float dR = 0.3;
  float thisdR = 0;
  float pfPtSum;
  float pfVsPtSum;
  float pfVsPtInitialSum;
  
  TFile * outf = new TFile(Form("randcone_%s_centmin%d_centmax%d_%d.root",tag.data(),centmin,centmax,condor_iter),"recreate");
  TH1D * hpfPtSum = new TH1D("hpfPtSum","pfPtSum;#Sigma p_{T}",240,0,120);
  TH1D * hpfVsPtSum = new TH1D("hpfVsPtSum","pfVsPtSum;#Sigma p_{T}",200,-50,50);
  TH1D * hpfVsPtInitialSum = new TH1D("hpfVsPtInitialSum","hpfVsPtInitialSum;#Sigma p_{T}",200,-50,50);
  
  TH1D * hpfPtSumEta[netabins];
  TH1D * hpfVsPtSumEta[netabins];
  TH1D * hpfVsPtInitialSumEta[netabins];
  for(int i = 0 ; i < netabins ; ++i)
  {
    hpfPtSumEta[i] = new TH1D(Form("hpfPtSumEta_%d",i),Form("pfPtSum_%d;#Sigma p_{T}",i),200,-100,100);
    hpfVsPtSumEta[i] = new TH1D(Form("hpfVsPtSumEta_%d",i),Form("pfVsPtSum_%d;#Sigma p_{T}",i),200,-100,100);
    hpfVsPtInitialSumEta[i] = new TH1D(Form("hpfVsPtInitialSumEta_%d",i),Form("hpfVsPtInitialSum_%d;#Sigma p_{T}",i),200,-100,100);
  }
  
  TH1D * hConeEta = new TH1D("hConeEta","hConeEta;#eta",netabins,-2.4,2.4);
  
  for(int i = 0 ; i < nevents ; ++i)
  {
    if(i%1000==0) cout<<i<<"/"<<nevents<<endl;
    c->GetEntry(i);
    if(c->evt.hiBin < centmin || c->evt.hiBin >= centmax) continue;
    rConeEta = 4.8*(r.Rndm()-0.5); // uniform dist. +- 2.4 eta
    rConePhi = 2*TMath::Pi()*(r.Rndm()-0.5); // uniform dist. +- pi
    hConeEta->Fill(rConeEta);
    int whichbin = hConeEta->FindBin(rConeEta);
    pfPtSum = 0.0;
    pfVsPtSum = 0.0;
    pfVsPtInitialSum = 0.0;
    for(int j = 0 ; j < c->pf.nPFpart ; ++j)
    {
      thisdR = getdR(rConeEta,c->pf.pfEta[j],rConePhi,c->pf.pfPhi[j]);
      if(thisdR < dR)
      {
        pfPtSum+=c->pf.pfPt[j];
        pfVsPtSum+=c->pf.pfVsPt[j];
        pfVsPtInitialSum+=c->pf.pfVsPtInitial[j];
      }
    }
    hpfPtSum->Fill(pfPtSum);
    hpfVsPtSum->Fill(pfVsPtSum);
    hpfVsPtInitialSum->Fill(pfVsPtInitialSum);
    hpfPtSumEta[whichbin-1]->Fill(pfPtSum);
    hpfVsPtSumEta[whichbin-1]->Fill(pfVsPtSum);
    hpfVsPtInitialSumEta[whichbin-1]->Fill(pfVsPtInitialSum);
  }
  TH1D * hmeanpfPtSumEta = new TH1D("hmeanpfPtSumEta","hmeanpfPtSumEta;#eta;mean #Sigma p_{T}",netabins,-2.4,2.4);
  TH1D * hmeanpfVsPtSumEta = new TH1D("hmeanpfVsPtSumEta","hmeanpfVsPtSumEta;#eta;mean #Sigma p_{T}",netabins,-2.4,2.4);
  TH1D * hmeanpfVsPtInitialSumEta = new TH1D("hmeanpfVsPtInitialSumEta","hmeanpfVsPtInitialSumEta;#eta;mean #Sigma p_{T}",netabins,-2.4,2.4);
  for(int i = 1 ; i <= netabins ; ++i)
  {
    hmeanpfPtSumEta->SetBinContent(i,hpfPtSumEta[i-1]->GetMean());
    hmeanpfPtSumEta->SetBinError(i,hpfPtSumEta[i-1]->GetMeanError());
    hmeanpfVsPtSumEta->SetBinContent(i,hpfVsPtSumEta[i-1]->GetMean());
    hmeanpfVsPtSumEta->SetBinError(i,hpfVsPtSumEta[i-1]->GetMeanError());
    hmeanpfVsPtInitialSumEta->SetBinContent(i,hpfVsPtInitialSumEta[i-1]->GetMean());
    hmeanpfVsPtInitialSumEta->SetBinError(i,hpfVsPtInitialSumEta[i-1]->GetMeanError());
  }
  TH1D * one = new TH1D("one","",1,0,1);
  one->Fill(0.5);
  outf->Write();
  outf->Close();
}
Пример #12
0
int IndResponse(double kPt=80,const char *ksp="pbpb")
{

  timer.Start();

  //! Load Lib
  gSystem->Load("hiForest_h.so");
  
  //! Load the hiforest input root file
  HiForest *c = 0;
  if(strcmp("pp",ksp)==0)c = new HiForest(Form("/net/hisrv0001/home/icali/hadoop/Pythia/Z2/ppDijet_merged/pp276Dijet%0.0f_merged.root",kPt),"pp2012",1,1);
  else  {
    if(kPt==30)c = new HiForest("/d102/yjlee/hiForest2MC/Pythia30_HydjetDrum_mix01_HiForest2_v19.root","pbpb2012",0,1);
    else if(kPt==50)c = new HiForest("/d102/yjlee/hiForest2MC/Pythia50_HydjetDrum_mix01_HiForest2_v19.root","pbpb2012",0,1);
    else if(kPt==80)c = new HiForest("/d102/yjlee/hiForest2MC/Pythia80_HydjetDrum_mix01_HiForest2_v20.root","pbpb2012",0,1);
    else if(kPt==120)c = new HiForest("/d102/yjlee/hiForest2MC/Pythia120_HydjetDrum_mix01_HiForest2_v21_ivan.root","pbpb2012",0,1);
    else if(kPt==170)c = new HiForest("/d102/yjlee/hiForest2MC/Pythia170_HydjetDrum_mix01_HiForest2_v19.root","pbpb2012",0,1);
    else if(kPt==200)c = new HiForest("/d102/yjlee/hiForest2MC/Pythia200_HydjetDrum_mix01_HiForest2_v21_ivan.root","pbpb2012",0,1);
    else if(kPt==250)c = new HiForest("/d102/yjlee/hiForest2MC/Pythia250_HydjetDrum_mix01_HiForest2_v21_ivan.root","pbpb2012",0,1);
    //c = new HiForest(Form("/net/hisrv0001/home/icali/hadoop/Hydjet1.8/Z2/Dijet_merged/Dijet%0.0f_merged.root",kPt),"pbpb2012",0,1);
  }


  double xsection=0;
  double xup=0;
  double xsub=0;
  double maxpthat=9999;
  if(kPt==15){
    maxpthat=30;
    xup=1.566e-01;
    xsub=1.079e-02;
  }
  else if(kPt==30){
    maxpthat=50;
    xup=1.079e-02;
    xsub=1.021e-03;
  }
  else if(kPt==50){
    maxpthat=80;
    xup=1.021e-03;
    xsub=9.913e-05;
  }
  else if(kPt==80){
    maxpthat=120;
    xup=9.913e-05;
    xsub=1.128e-05;
  }
  else if(kPt==120){
    maxpthat=170;
    xup=1.128e-05;
    xsub=1.470e-06;
  }
  else if(kPt==170){
    maxpthat=200;
    xup=1.470e-06;
    xsub=5.310e-07;
  }
  else if(kPt==200){
    maxpthat=250;
    xup=5.310e-07;
    xsub=1.192e-07;
  }
  else if(kPt==250){
    maxpthat=300;
    xup=1.192e-07;
    xsub=3.176e-08;
  }
  else if(kPt==300){
    maxpthat=9999;
    xup=3.176e-08;
    xsub=0;
  }
  xsection = xup-xsub;


  std::cout<<std::endl;
  std::cout<<std::endl;


  //! Don't want to loop over trees which is not used in the analysis
  //! event trees
  //c->hasEvtTree=0;

  //! jet trees
  //! Switch on only the jet trees which you  require
  const char *cjets[7] = {"icPu5","ak2PF","ak3PF","ak4PF","akPu2PF","akPu3PF","akPu4PF"};
  c->SelectJetAlgo(cjets,7);
  

  //! photon tree
  //c->hasPhotonTree=0;


  //! Select only the jet branches which you are going to use
  //! This increases the speed for running over trees with lot of branches.
  //! This is currently for only jet algos and evtTree  uniformly applied to all the 

  //! Event Tree 
  const char *evlist[]={"hiBin","vz","hiHF"};
  const int kevbr = sizeof(evlist)/sizeof(const char *);
  c->SelectBranches("evtTree",evlist,kevbr);

  //! jet Tree algorithms
  const char *jtlist[]={"nref","pthat","rawpt","jtpt","jteta","jtphi","jtpu","refpt","refeta","refphi","refdrjt","refparton_flavor",
			"ngen","gensubid","genmatchindex"
  };
  const int kjtbr = sizeof(jtlist)/sizeof(const char *);
  c->SelectBranches("JetTree",jtlist,kjtbr);

  std::cout<<"Selected the branches of need from evtTree and JetTrees : "<<std::endl;

  //! To get the jet object from hiforest
  Jets *iJet=0;
  const int knj = 7;//c->GetNAlgo(); //! # of jet algorithms in this hiforest 
  std::cout<<"Loaded all tree variables and # of jet algorithms : "<<knj<<std::endl;
  std::cout<<"\t"<<std::endl;

  //! Away-side jet definition
  const char *cdphi="2pi3";
  double kdphicut = 7.*pi/8.;
  if(strcmp(cdphi,"2pi3")==0)kdphicut=2.*pi/3.;
  else if(strcmp(cdphi,"1pi4")==0)kdphicut=1.*pi/4.;

  //! Open a output file for histos
  TFile *fout = new TFile(Form("Output/%s/Response_newHiForest_DJ_%0.0fGeV_%s_%d.root",ksp,kPt,ksp,iYear),"RECREATE");
  //TFile *fout = new TFile(Form("Output/%s/novtxcut/Response_newHiForest_DJ_%0.0fGeV_%s_%d.root",ksp,kPt,ksp,iYear),"RECREATE");
  //TFile *fout = new TFile(Form("test_newHiForest_DJ_%0.0fGeV_%s_%d.root",kPt,ksp,iYear),"RECREATE");

  std::cout<<"\t"<<std::endl;
  std::cout<<"\t"<<std::endl;
  std::cout<<"**************************************************** "<<std::endl;
  std::cout<<Form("Running for %s ",ksp)<<std::endl;
  std::cout<<Form("pT  cut for %0.3f ",kptrecocut)<<std::endl;
  std::cout<<Form("eta cut for %0.3f ",ketacut)<<std::endl;
  std::cout<<"My hiForest TTree : " <<c->GetName()<<std::endl;
  std::cout<<"Output file  "<<fout->GetName()<<std::endl;
  std::cout<<"**************************************************** "<<std::endl;
  std::cout<<"\t"<<std::endl;
  std::cout<<"\t"<<std::endl;


  //! 
  //! Define histograms here
  TH1::SetDefaultSumw2();
  TH2::SetDefaultSumw2();
  TProfile::SetDefaultSumw2();

  ////////////////////////////////////////////////////////////////////////////////////////////////////////
  TH1F *hEvt    = new TH1F("hEvt","# of events ",4,0,4);
  TH1F *hVz     = new TH1F("hVz","# of events ",80,-20,20);
  TH1F *hBin    = new TH1F("hBin","Centrality bin",40,0,40);
  TH1F *hHF     = new TH1F("hHF","Centrality variable from HF",600,0,6000);
  TH1F *hTotEve = new TH1F("hTotEve","# of events in the skimmed files",4,0,4);

  TH1F *hgenpt [knj][ncen], *hrecopt[knj][ncen], *hrawpt[knj][ncen];
  TH1F *hgenptC [knj][ncen], *hrecoptC[knj][ncen], *hrawptC[knj][ncen];
  TH1F *hgeneta[knj][ncen], *hrecoeta[knj][ncen];
  TH1F *hgenphi[knj][ncen], *hrecophi[knj][ncen];

  //! Ratios of the pt distributions
  TProfile *hrecogen[knj][ncen], *hrecoraw[knj][ncen], *hrawgen[knj][ncen], *hrecoraw_ref[knj][ncen];

  //! Resposnse
  TH2F *hcorrptrefpt[knj][ncen], *hrawptrefpt[knj][ncen], *hcorrptrawpt[knj][ncen];
  TH2F *hrescrpt[knj][ncen], *hresrrpt[knj][ncen], *hresrcrpt[knj][ncen];
  TH2F *hratiorawrefpt[knj][ncen], *hratiocorrrefpt[knj][ncen], *hratiocorrrawpt[knj][ncen];
  TH2F *hratiorawrefpt_eta[knj][ncen][2], *hratiocorrrefpt_eta[knj][ncen][2];

  TH2F *hratiocorrrefpt_genm[knj][ncen];
  TH2F *hratiocorrrefpt_lead[knj][ncen], *hratiocorrrefpt_slead[knj][ncen], *hratiocorrrefpt_remain[knj][ncen];
  TH2F *hratiocorrrefpt_pthat[knj][ncen];


  TH2F *hpteta[knj][ncen][maxe], *hptphi[knj][ncen][maxph];

  TH2F *hgenjrecoj[knj][ncen];
  TH2F *hgenjrecoj_pflavor[knj][ncen];

  TH2F *hFracjets[knj][ncen];
  TH2F *hAvjets[knj][ncen];
  TH2F *hMeanPtjets[knj][ncen];
  TH1F *hNjets[knj][ncen];
  TH1F *hNevt [knj][ncen];

  //! Pileup effect study
  TH2F *hjetptpu[knj][ncen];             //! centrality                                                                       
  TH2F *hjetptpu_etab[knj][ncen][ketar]; //! eta dependence             

  //! Efficency histos
  TH1F *hPtAll [knj][ncen], *hPtSel[knj][ncen];
  TH1F *hEtaAll[knj][ncen], *hEtaSel[knj][ncen];
  TH1F *hPhiAll[knj][ncen], *hPhiSel[knj][ncen];

  //! Response vs deltar
  TH1F *hRspVsDeltaR[knj][ncen][25];

  //! DeltaR efficiency                                                                                                                                                              
  TH1F *hDeltaR[knj][ncen];
  TH1F *hDeltaRAll[knj][ncen];
  TH1F *hDeltaRSel[knj][ncen];

  for(int nj=0;nj<knj;nj++){
    //const char *algoname = c->GetAlgoName(nj);
    //char *algoname = cjets[nj];
    //strcpy(algoname,cjets[nj]);

    for(int icen=0;icen<ncen;icen++){
      hFracjets[nj][icen]   = new TH2F(Form("hFracjets%d_%d",nj,icen),Form("Fraction of jets in given pt hat cent %d %s",icen,cjets[nj]),500,0,1000,500,0.,1000.);
      hAvjets[nj][icen]     = new TH2F(Form("hAvjets%d_%d",nj,icen),Form("<#> of jets cent %d %s",icen,cjets[nj]),500,0,1000,30,0,30);
      hMeanPtjets[nj][icen] = new TH2F(Form("hMeanPtjets%d_%d",nj,icen),Form("<pT> of jets cent %d %s",icen,cjets[nj]),500,0,1000,500,0,1000);

      hNjets[nj][icen] = new TH1F(Form("hNjets%d_%d",nj,icen),Form("# of jets cent %d jets %s",icen,cjets[nj]),3,0.0,3.0);
      hNevt [nj][icen] = new TH1F(Form("hNevt%d_%d",nj,icen),Form("# of events cent %d %s",icen,cjets[nj]),40,-40,40);
      hgeneta[nj][icen] = new TH1F(Form("hgeneta%d_%d",nj,icen),Form("gen eta distribution jet centb %d %s",icen,cjets[nj]),60,-3.0,3.0);
      hrecoeta[nj][icen] = new TH1F(Form("hrecoeta%d_%d",nj,icen),Form("reco eta distribution jet centb %d %s",icen,cjets[nj]),60,-3.0,3.0);

      hgenphi[nj][icen] = new TH1F(Form("hgenphi%d_%d",nj,icen),Form("gen phi distribution jet centb %d %s",icen,cjets[nj]),36,-pi,pi);
      hrecophi[nj][icen] = new TH1F(Form("hrecophi%d_%d",nj,icen),Form("reco phi distribution jet centb %d %s",icen,cjets[nj]),36,-pi,pi);

      hgenpt[nj][icen]  = new TH1F(Form("hgenpt%d_%d",nj,icen),Form("gen p_{T} distribution jet centb %d %s",icen,cjets[nj]),500,0,1000);
      hrecopt[nj][icen] = new TH1F(Form("hrecopt%d_%d",nj,icen),Form("reco p_{T} distribution jet centb %d %s",icen,cjets[nj]),500,0,1000);
      hrawpt[nj][icen]  = new TH1F(Form("hrawpt%d_%d",nj,icen),Form("raw p_{T} distribution jet centb %d %s",icen,cjets[nj]),500,0,1000);

      //! with pt bins
      hgenptC[nj][icen]  = new TH1F(Form("hgenptC%d_%d",nj,icen),Form("gen p_{T} distribution jet centb %d %s",icen,cjets[nj]),bins,ptbins);
      hrecoptC[nj][icen] = new TH1F(Form("hrecoptC%d_%d",nj,icen),Form("reco p_{T} distribution jet centb %d %s",icen,cjets[nj]),bins,ptbins);
      hrawptC[nj][icen]  = new TH1F(Form("hrawptC%d_%d",nj,icen),Form("raw p_{T} distribution jet centb %d %s",icen,cjets[nj]),bins,ptbins);

      //! Ratios
      hrecogen[nj][icen] = new TProfile(Form("hrecogen%d_%d",nj,icen),Form("reco/gen p_{T} distribution jet centb %d %s",icen,cjets[nj]),500,0,1000);
      hrecoraw[nj][icen] = new TProfile(Form("hrecoraw%d_%d",nj,icen),Form("reco/raw p_{T} distribution jet centb %d %s",icen,cjets[nj]),500,0,1000);
      hrecoraw_ref[nj][icen]  = new TProfile(Form("hrecoraw_ref%d_%d",nj,icen),Form("reco/raw : ref p_{T} distribution jet centb %d %s",icen,cjets[nj]),500,0,1000);
      hrawgen[nj][icen]  = new TProfile(Form("hrawgen%d_%d",nj,icen),Form("raw/gen p_{T} distribution jet centb %d %s",icen,cjets[nj]),500,0,1000);


      hcorrptrefpt[nj][icen]= new TH2F(Form("hcorrptrefpt%d_%d",nj,icen),Form("Gen jet:Reco jet p_{T} distribution jet centb %d %s",icen,cjets[nj]),500,0,1000,500,0,1000);
      hrawptrefpt[nj][icen]= new TH2F(Form("hrawptrefpt%d_%d",nj,icen),Form("Gen jet:Raw jet p_{T}  distribution jet centb %d %s",icen,cjets[nj]),500,0,1000,500,0,1000);
      hcorrptrawpt[nj][icen]= new TH2F(Form("hcorrptrawpt%d_%d",nj,icen),Form("Reco jet Corr:Raw jet p_{T}  distribution jet centb %d %s",icen,cjets[nj]),500,0,1000,500,0,1000);

      hrescrpt[nj][icen]= new TH2F(Form("hrescrpt%d_%d",nj,icen),Form("Gen jet:(Reco/Gen) jet p_{T} distribution jet centb %d %s",icen,cjets[nj]),500,0,1000,150,rbinl,rbinh);
      hresrrpt[nj][icen]= new TH2F(Form("hresrrpt%d_%d",nj,icen),Form("Gen jet:(Raw/Gen) jet p_{T}  distribution jet centb %d %s",icen,cjets[nj]),500,0,1000,150,rbinl,rbinh);
      hresrcrpt[nj][icen]= new TH2F(Form("hresrcrpt%d_%d",nj,icen),Form("Reco jet:(Reco/Raw) jet p_{T} distribution jet centb %d %s",icen,cjets[nj]),500,0,1000,150,rbinl,rbinh);

      hratiorawrefpt[nj][icen]= new TH2F(Form("hratiorawrefpt%d_%d",nj,icen),Form("Raw jet / Gen jet p_{T} (raw) distribution jet centb %d %s",icen,cjets[nj]),
					 bins,ptbins,rbins,rbinl,rbinh);
      hratiocorrrefpt[nj][icen]= new TH2F(Form("hratiocorrrefpt%d_%d",nj,icen),Form("Reco jet / Gen jet p_{T} (corr.) distribution jet centb %d %s",icen,cjets[nj]),
					  bins,ptbins,rbins,rbinl,rbinh);
      hratiocorrrawpt[nj][icen]= new TH2F(Form("hratiocorrrawpt%d_%d",nj,icen),Form("Correc. jet / Raw jet jet p_{T} distribution jet centb %d %s",icen,cjets[nj]),
                                          bins,ptbins,rbins,rbinl,rbinh);

      hratiocorrrefpt_lead[nj][icen]= new TH2F(Form("hratiocorrrefpt_lead%d_%d",nj,icen),Form("Leading jet Reco jet / Gen jet p_{T} (corr.) distribution jet centb %d %s",icen,cjets[nj]),
                                               bins,ptbins,rbins,rbinl,rbinh);
      hratiocorrrefpt_slead[nj][icen]= new TH2F(Form("hratiocorrrefpt_slead%d_%d",nj,icen),Form("sub-Leading jet Reco jet / Gen jet p_{T} (corr.) distribution jet centb %d %s",icen,cjets[nj]),
                                                bins,ptbins,rbins,rbinl,rbinh);
      hratiocorrrefpt_remain[nj][icen]= new TH2F(Form("hratiocorrrefpt_remain%d_%d",nj,icen),Form("Remaing jet Reco jet / Gen jet p_{T} (corr.) distribution jet centb %d %s",icen,cjets[nj]),
                                                 bins,ptbins,rbins,rbinl,rbinh);
      hratiocorrrefpt_pthat[nj][icen]= new TH2F(Form("hratiocorrrefpt_pthat%d_%d",nj,icen),Form("pT hat jet Reco jet / Gen jet p_{T} (corr.) distribution jet centb %d %s",icen,cjets[nj]),
                                                bins,ptbins,rbins,rbinl,rbinh);
      hratiocorrrefpt_genm[nj][icen]= new TH2F(Form("hratiocorrrefpt_genm%d_%d",nj,icen),Form("Gen matched jet Reco jet / Gen jet p_{T} (corr.) distribution jet centb %d %s",icen,cjets[nj]),
                                               bins,ptbins,rbins,rbinl,rbinh);



      for(int ie=0;ie<2;ie++){
        hratiorawrefpt_eta[nj][icen][ie]= new TH2F(Form("hratiorawrefpt_eta%d_%d_%d",nj,icen,ie),
						   Form("Raw jet / Gen jet p_{T} (raw) distribution jet centb %d %s etabin%d",icen,cjets[nj],ie),
						   bins,ptbins,rbins,rbinl,rbinh);
        hratiocorrrefpt_eta[nj][icen][ie]= new TH2F(Form("hratiocorrrefpt_eta%d_%d_%d",nj,icen,ie),
						    Form("Reco jet / Gen jet p_{T} (raw) distribution jet centb %d %s etabin%d",icen,cjets[nj],ie),
						    bins,ptbins,rbins,rbinl,rbinh);
      }

      hjetptpu[nj][icen] = new TH2F(Form("hjetptpu%d_%d",nj,icen),Form("jet(pt:pu) distribution jet centb %d %s",icen,cjets[nj]),dbins,ptbins_data,100,0,300);
      for(int ie=0;ie<ketar;ie++){
        hjetptpu_etab[nj][icen][ie] = new TH2F(Form("hjetptpu_etab%d_%d_%d",nj,icen,ie),Form("jet(pt:pu) distribution jet %s etabin %d cen %d",cjets[nj],icen,ie),
					       dbins,ptbins_data,100,0,300);
      }
      
      for(int m=0;m<maxe;m++){
        hpteta[nj][icen][m] = new TH2F(Form("hpteta%d_%d_%d",nj,icen,m),Form("resolution  pt(eta) distribution cent %d jet %s etabin%d",icen,cjets[nj],m),
				       bins,ptbins,rbins,rbinl,rbinh);
      }
      
      for(int m=0;m<maxph;m++){
	hptphi[nj][icen][m] = new TH2F(Form("hptphi%d_%d_%d",nj,icen,m),Form("resolution pt(phi) distribution cent %d jet %s phibin%d",icen,cjets[nj],m),
				       bins,ptbins,rbins,rbinl,rbinh);
      }

      hgenjrecoj[nj][icen] =new TH2F(Form("hgenjrecoj%d_%d",nj,icen),Form("gen jet2 : reco jet2 %s cent %d",cjets[nj],icen),500,0.,1000.,500,0.,1000.);
      hgenjrecoj_pflavor[nj][icen] =new TH2F(Form("hgenjrecoj_pflavor%d_%d",nj,icen),Form("gen jet : reco jet with parton flavor %s cent %d",cjets[nj],icen),500,0.,1000.,500,0.,1000.);

      //! efficency histograms
      hPtAll [nj][icen] = new TH1F(Form("hPtAll%d_%d",nj,icen),Form("Denominator pT for algorithm %s cent %d",cjets[nj],icen),40,30,430);
      hEtaAll[nj][icen] = new TH1F(Form("hEtaAll%d_%d",nj,icen),Form("Denominator eta  for algorithm %s cent %d",cjets[nj],icen),20,-2.0,2.0);
      hPhiAll[nj][icen] = new TH1F(Form("hPhiAll%d_%d",nj,icen),Form("Denominator  phi  for algorithm %s cent %d",cjets[nj],icen),20,-pi,pi);
      
      hPtSel [nj][icen] = new TH1F(Form("hPtSel%d_%d",nj,icen),Form("Numerator pT for algorithm %s cent %d",cjets[nj],icen),40,30,430);
      hEtaSel[nj][icen] = new TH1F(Form("hEtaSel%d_%d",nj,icen),Form("Numerator eta  for algorithm %s cent %d",cjets[nj],icen),20,-2.0,2.0);
      hPhiSel[nj][icen] = new TH1F(Form("hPhiSel%d_%d",nj,icen),Form("Numerator  phi  for algorithm %s cent %d",cjets[nj],icen),20,-pi,pi);

      hDeltaR[nj][icen]    = new TH1F(Form("hDeltaR%d_%d",nj,icen),Form("#DeltaR for algorithm %s cent %d",cjets[nj],icen),100,0,1);
      hDeltaRAll[nj][icen] = new TH1F(Form("hDeltaRAll%d_%d",nj,icen),Form("#DeltaR (all) for algorithm %s cent %d",cjets[nj],icen),100,0,1);
      hDeltaRSel[nj][icen] = new TH1F(Form("hDeltaRSel%d_%d",nj,icen),Form("#DeltaR (sel) for algorithm %s cent %d",cjets[nj],icen),100,0,1);

      for(int ir=0;ir<25;ir++){
	//! Response vs DeltaR
        hRspVsDeltaR[nj][icen][ir] = new TH1F(Form("hRspVsDeltaR%d_%d_%d",nj,icen,ir),Form(" <recopt/refpt> vs. #DeltaR (%d) algorithm %s cent %d",ir,cjets[nj],icen),rbins,rbinl,rbinh);
      }
    }//! icen
  }//! nj
  std::cout<<"Initialized the histograms " <<std::endl;
  ///////////////////////////////////////////////////////////////////////////////////////// 


  //! Centrality reweighting function
  //TF1* fcen = new TF1("fcen","exp(-1.0*pow(x+1.11957e+01,2)/pow(1.34120e+01,2)/2)",0,40);
  TF1 *fcen = new TF1("fcen","[0]*exp([1]+[2]*x+[3]*x*x+[4]*x*x*x)",0,40);
  fcen->SetParameters(2.10653e-02,5.61607,-1.41493e-01,1.00586e-03,-1.32625e-04);

  //! vertex z reweighting
  TF1 *fVz = new TF1("fVz","[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x");
  if(strcmp(ksp,"pp")==0) fVz->SetParameters(8.41684e-01,-2.58609e-02,4.86550e-03,-3.10581e-04,2.07918e-05);
  else  fVz->SetParameters(7.62788e-01,-1.13228e-02,5.85199e-03,-3.04550e-04,4.43440e-05);


  Long64_t nb = 0;
  Long64_t nentries = c->GetEntries();
  std::cout<<Form("# of entries in TTree for %s : ",ksp)<<nentries<<std::endl;
  std::cout<<std::endl;
  hEvt->Fill(2,nentries);

  //! weight  for the merging of the samples for different pT hat bins
  Float_t wxs = xsection/(nentries/100000.);
  
  Int_t iEvent=0; 
  for (Long64_t ievt=0; ievt<nentries;ievt++) {//! event loop
  //for (Long64_t ievt=0; ievt<1;ievt++) {//! event loop
    //! load the hiForest event
    nb += c->GetEntry(ievt);

    int hiBin       = c->evt.hiBin;
    float vz        = c->evt.vz;
    float hiHF      = c->evt.hiHF;

    //! testing
    //if(hiBin>4 && strcmp(ksp,"pbpb")==0)continue;

    //! apply vertex cut
    if(fabs(vz)>kVzcut)continue;


    //! Centrality bin
    if(hiBin<0 || hiBin>39)continue;
    int centb=-1;
    double wcen=1;
    double wvz=fVz->Eval(vz);
    if(strcmp(ksp,"pbpb")==0){
      centb=GetCentBin(hiBin);
      wcen = fcen->Eval(hiBin);
    }else{
      centb=ncen-1; //! pp
      wcen=1;
    }

    if(ievt%10000==0)std::cout<<" ********** Event # " <<ievt<<std::endl;
    //std::cout<<" ********** Event # " <<ievt<<"\t vz : "<<vz<<"\t hiBin : "<<hiBin<<"\t wxs : "<<wxs<<std::endl;


    //! Centrality from 0-90% 
    if(centb==-1 || centb==ncen)continue;


    int istat=0;
    for(int nj=0;nj<knj;nj++){ //! loop over different jet algorithms
      
      //! Get the jet object
      //iJet = c->GetJet(nj);
      iJet = c->GetJetByAlgo(cjets[nj]);
      
      //! xsec-weight
      double pthat = iJet->pthat;
      if(pthat > maxpthat)continue;
      istat=1;
      
      //std::cout<<"\t Jet Algorithm : "<<c->GetCjets[Nj](nj)<<"\t # of Jets  : "<<iJet->nref<<"\t pthat : "<<pthat<<std::endl;
      if(nj==0)hTotEve->Fill(1); //! akPu3PF      

      float njets=0.;
      float meanpt=0.;

      int *ljet = new int[2];
      FindLeadSubLeadJets(iJet,ljet);
      if(ljet[0]>=0){
	hratiocorrrefpt_lead[nj][centb]->Fill(iJet->refpt[ljet[0]],iJet->jtpt[ljet[0]]/iJet->refpt[ljet[0]],wxs*wcen*wvz);
      }
      if(ljet[1]>=0){
	hratiocorrrefpt_slead[nj][centb]->Fill(iJet->refpt[ljet[1]],iJet->jtpt[ljet[1]]/iJet->refpt[ljet[1]],wxs*wcen*wvz);
      }

      if(nj>3){
	//! Gen matched jets
	for(int igen=0; igen<iJet->ngen; igen++){
	  if( iJet->gensubid[igen] != 0) continue;
	  int gj = iJet->genmatchindex[igen];
	  
	  float refpt   = iJet->refpt[gj];
	  float recopt  = iJet->jtpt[gj];
	  float recoeta = iJet->jteta[gj];
	  float delr    = iJet->refdrjt[gj];
	  
	  if(recopt<kptrecocut || refpt<kptgencut || refpt==0 || fabs(recoeta)>ketacut || fabs(delr)>kdRcut)continue;
	  hratiocorrrefpt_genm[nj][centb]->Fill(refpt,recopt/refpt,wxs*wcen*wvz);
	}
      }


      for(int ij=0; ij<iJet->nref; ij++){
	//if(!selecJet(iJet,ij))continue;

	float refpt   = iJet->refpt[ij];
        float recopt  = iJet->jtpt[ij];
        float rawpt   = iJet->rawpt[ij];
	float refeta  = iJet->refeta[ij];
        float recoeta = iJet->jteta[ij];
        float refphi  = iJet->refphi[ij];
        float recophi = iJet->jtphi[ij];
	int refparton_flavor = iJet->refparton_flavor[ij];


	//! Matching criteria 
        float delr = iJet->refdrjt[ij];


	if(recopt<kptrecocut || refpt<kptgencut || refpt==0)continue;
	//std::cout<<"\t \t "<<ij<<"\t refpt : "<<refpt<<"\t recopt : "<<recopt<<"\t raw pT : "<<rawpt<<std::endl;

	if(fabs(refeta)<ketacut && refpt>80){
          //! Denominator for matching efficiency
	  hPtAll [nj][centb]->Fill(refpt,wxs*wcen*wvz);
          hEtaAll[nj][centb]->Fill(refeta,wxs*wcen*wvz);
          hPhiAll[nj][centb]->Fill(refphi,wxs*wcen*wvz);
	  
	  
	  //! Response
	  for (int idr=0;idr<25;idr++) {
	    double drcut = 0.0+idr*(0.25-0.00)/(25-1);
	    if (delr>drcut) continue;
	    hRspVsDeltaR[nj][centb][idr]->Fill(recopt/refpt,wxs*wcen*wvz);
	  }
	  
	  //! DeltaR efficiency
	  hDeltaR[nj][centb]->Fill(delr,wxs*wcen*wvz);
	  for (int idrmax=0;idrmax<100;idrmax++) {
	    float drmax = idrmax*0.01+0.005;
	    hDeltaRAll[nj][centb]->Fill(drmax,wxs*wcen*wvz);
	    if (delr<drmax) hDeltaRSel[nj][centb]->Fill(drmax,wxs*wcen*wvz);
	  }
        }

        //! Matching cut for gen-jet and reco-jet
	if(delr > kdRcut)continue;


        if(fabs(refeta)<ketacut && refpt>80){
          //! Numerator for matching efficiency
          hPtSel [nj][centb]->Fill(refpt,wxs*wcen*wvz);
          hEtaSel[nj][centb]->Fill(refeta,wxs*wcen*wvz);
          hPhiSel[nj][centb]->Fill(refphi,wxs*wcen*wvz);
        }

        //! pile up eta dependence
        //int ebin = GetDetEtaBin(fabs(recoeta));

	//! jet selction cut
        if(fabs(recoeta)>ketacut)continue;
	
	//istat=1;
	//! 1D distributions
	njets++;
	meanpt += refpt;
        hNjets [nj][centb]->Fill(1.);
        hgenpt [nj][centb]->Fill(refpt,wxs*wcen*wvz);
        hgeneta[nj][centb]->Fill(refeta,wxs*wcen*wvz);
	hgenphi[nj][centb]->Fill(refphi,wxs*wcen*wvz);


	hrecopt [nj][centb]->Fill(recopt,wxs*wcen*wvz);
        hrecoeta[nj][centb]->Fill(recoeta,wxs*wcen*wvz);
        hrecophi[nj][centb]->Fill(recophi,wxs*wcen*wvz);
        hrawpt [nj][centb]->Fill(rawpt,wxs*wcen*wvz);


        hgenptC [nj][centb]->Fill(refpt,wxs*wcen*wvz);
	hrecoptC [nj][centb]->Fill(recopt,wxs*wcen*wvz);
        hrawptC [nj][centb]->Fill(rawpt,wxs*wcen*wvz);

	hrecogen[nj][centb]->Fill(refpt,recopt/refpt,wxs*wcen*wvz);
        hrawgen [nj][centb]->Fill(refpt,rawpt/refpt,wxs*wcen*wvz);
        hrecoraw[nj][centb]->Fill(rawpt,recopt/rawpt,wxs*wcen*wvz);
        hrecoraw_ref [nj][centb]->Fill(refpt,recopt/rawpt,wxs*wcen*wvz);

	hFracjets[nj][centb]->Fill(pthat,refpt,wxs*wcen*wvz);


	//! Response  (ratio of recopt/refpt)
        hratiocorrrefpt[nj][centb]->Fill(refpt,recopt/refpt,wxs*wcen*wvz);
	hratiorawrefpt [nj][centb]->Fill(refpt,rawpt/refpt,wxs*wcen*wvz);
	hratiocorrrawpt [nj][centb]->Fill(recopt,recopt/rawpt,wxs*wcen*wvz);

	//! remaing jets
        bool iRemain = ij!=ljet[0] || ij!=ljet[1];
	if(iRemain)hratiocorrrefpt_remain[nj][centb]->Fill(refpt,recopt/refpt,wxs*wcen*wvz);
	
        //! pT hat
	hratiocorrrefpt_pthat[nj][centb]->Fill(pthat,recopt/refpt,wxs*wcen*wvz);



	//! 2D correlation between refpt and recopt
        hcorrptrefpt[nj][centb]->Fill(refpt,recopt,wxs*wcen*wvz);
        hrawptrefpt [nj][centb]->Fill(refpt,rawpt,wxs*wcen*wvz);
	hcorrptrawpt[nj][centb]->Fill(rawpt,recopt,wxs*wcen*wvz);

        //! Very fine bin in ref pt
	hrescrpt[nj][centb]->Fill(refpt,recopt/refpt,wxs*wcen*wvz);
	hresrrpt[nj][centb]->Fill(refpt,rawpt/refpt,wxs*wcen*wvz);
	hresrcrpt[nj][centb]->Fill(recopt,recopt/rawpt,wxs*wcen*wvz);

	int ieta=-1;
	if(fabs(recoeta)<1.3)ieta=0; //! barrel region
        else ieta=1; //! HCAL region
        if(ieta>=0){
          hratiocorrrefpt_eta[nj][centb][ieta]->Fill(refpt,recopt/refpt,wxs*wcen*wvz);
          hratiorawrefpt_eta [nj][centb][ieta]->Fill(refpt,rawpt/refpt,wxs*wcen*wvz);
	}

	//! pileup study
        hjetptpu[nj][centb]->Fill(recopt,iJet->jtpu[ij],wxs*wcen*wvz);

        //! Response in different eta and phi bins
        int etabin = GetEtaBin(fabs(refeta));
	int phibin = GetPhiBin(refphi);

	if(etabin < 0 || etabin>=maxe || phibin < 0 || phibin>=maxph)continue;

        //! Response in eta and phi bins
        hpteta[nj][centb][etabin]->Fill(refpt,recopt/refpt,wxs*wcen*wvz);
        hptphi[nj][centb][phibin]->Fill(refpt,recopt/refpt,wxs*wcen*wvz);


        //! Gen:Reco correlation plots
	hgenjrecoj [nj][centb]->Fill(refpt,recopt,wxs*wcen*wvz);
	if(fabs(refparton_flavor)<=21)hgenjrecoj_pflavor [nj][centb]->Fill(refpt,recopt,wxs*wcen*wvz);

      }//! ij loop

      hNevt[nj][centb]->Fill(vz);
      if(njets>0){
	hAvjets[nj][centb]->Fill(pthat,njets,wxs*wcen*wvz);
	hMeanPtjets[nj][centb]->Fill(pthat,meanpt/njets,wxs*wcen*wvz);
      }
      delete [] ljet;
    }//! nj jet loop

    if(istat){
      hBin->Fill(hiBin,wxs*wcen*wvz);
      hVz->Fill(vz,wxs*wcen*wvz);
      hHF->Fill(hiHF,wxs*wcen*wvz);
      iEvent++;
    }
    //std::cout<<"Completed event #  "<<ievt<<std::endl; 
  }//! event loop ends
  
  std::cout<<std::endl;
  std::cout<<std::endl;
  std::cout<<std::endl;

  std::cout<<"Events which passed the pT hat cut : "<<hTotEve->Integral()<<" out of  : "<<hEvt->Integral()
	   <<" efficiency of all the cuts : " <<hTotEve->Integral()/hEvt->Integral()<<std::endl;
  std::cout<<std::endl;


  if(strcmp(ksp,"pp")==0){
    for(int nj=0;nj<knj;nj++){
      //std::cout<<"# of Events for : "<<c->GetCjets[Nj](nj)<<"\t"<<hNevt[nj][0]->Integral()<<"\t # of Jets : "<<hNjets[nj][0]->Integral()<<std::endl;
      std::cout<<"# of Events for : "<<cjets[nj]<<"\t"<<hNevt[nj][0]->Integral()<<"\t # of Jets : "<<hNjets[nj][0]->Integral()<<std::endl;
    }
  }else{
    for(int nj=0;nj<knj;nj++){
      for(int icen=0;icen<ncen;icen++){
	std::cout<<"# of Events for : "<<cjets[nj]<<"\t icen : "<<icen<<"\t"<<hNevt[nj][icen]->Integral()<<"\t # of Jets : "<<hNjets[nj][icen]->Integral()<<std::endl;
      }
      std::cout<<std::endl;
    }
  }

  //! Write to output file
  fout->cd();
  fout->Write();
  fout->Close();


  //! Check
  timer.Stop();
  float  mbytes = 0.000001*nb;
  double rtime  = timer.RealTime();
  double ctime  = timer.CpuTime();

  std::cout<<std::endl;
  std::cout<<Form("RealTime=%f seconds, CpuTime=%f seconds",rtime,ctime)<<std::endl;
  std::cout<<Form("You read %f Mbytes/RealTime seconds",mbytes/rtime)<<std::endl;
  std::cout<<Form("You read %f Mbytes/CpuTime  seconds",mbytes/ctime)<<std::endl;
  std::cout<<std::endl;
  std::cout<<"Good bye : " <<"\t"<<std::endl;
  return 1;
}
Пример #13
0
void photon_JEC()
{
    TH1::SetDefaultSumw2();

    Double_t alphabins[] = {0.075, 0.125, 0.175, .25, .35};

    TH1D *RdRmcalpha[nptbins];
    TProfile *Ratio[2][nptbins];

    for(int i = 0; i < nptbins; i++)
    {
        TString name;
        name = "RdRmcalpha_";
        name += ptbins[i];
        RdRmcalpha[i] = new TH1D(name,name+";#alpha;R_{data}/R_{MC}",4,alphabins);
        name = "Rd_";
        name += ptbins[i];
        Ratio[0][i] = new TProfile(name,"",4,alphabins);
        name = "Rmc_";
        name += ptbins[i];
        Ratio[1][i] = new TProfile(name,"",4,alphabins);
    }

    TH1D *alphas = new TH1D("alphas",";#alpha = p_{T}^{Jet3}/p_{T}^{#gamma}",100,0,0.8);

    TH1D *hPhotonPt[2];
    hPhotonPt[0] = new TH1D("hPhotonPt_data",";photon p_{T}",200,0,400);
    hPhotonPt[1] = (TH1D*)hPhotonPt[0]->Clone("hPhotonPt_mc");
    TH1D *hPhotonEta[2];
    hPhotonEta[0] = new TH1D("hPhotonEta_data",";photon #eta",26,-3,3);
    hPhotonEta[1] = (TH1D*)hPhotonEta[0]->Clone("hPhotonEta_mc");

    TH1D *hJet2Pt[2];
    hJet2Pt[0] = new TH1D("hJet2Pt_data",";jet 2 p_{T}",200,0,400);
    hJet2Pt[1] = (TH1D*)hJet2Pt[0]->Clone("hJet2Pt_mc");
    TH1D *hJet2Eta[2];
    hJet2Eta[0] = new TH1D("hJet2Eta_data",";jet 2 #eta",26,-3,3);
    hJet2Eta[1] = (TH1D*)hJet2Eta[0]->Clone("hJet2Eta_mc");

    TH1D *hJet3Pt[2];
    hJet3Pt[0] = new TH1D("hJet3Pt_data",";jet 3 p_{T}",200,0,400);
    hJet3Pt[1] = (TH1D*)hJet3Pt[0]->Clone("hJet3Pt_mc");
    TH1D *hJet3Eta[2];
    hJet3Eta[0] = new TH1D("hJet3Eta_data",";jet 3 #eta",26,-3,3);
    hJet3Eta[1] = (TH1D*)hJet3Eta[0]->Clone("hJet3Eta_mc");


    TString files[2];

    files[0] = "/mnt/hadoop/cms/store/user/luck/pA2013_forests/PA2013_HiForest_PromptReco_HLT_Photon40.root";
    files[1] = "/mnt/hadoop/cms/store/user/luck/pA2013_MC/HiForest2_QCDPhoton30_5020GeV_100k.root";

    bool montecarlo[2] = {false, true};

    //loop over files
    //do the smaller MC file first, for some reason I have segfaults when I process the MC second.
    for(int ii = 1; ii > -1; ii--)
    {
        HiForest *c = new HiForest(files[ii], "Forest", cPPb, montecarlo[ii]);
        c->InitTree();

        //loop over events in each file
        int nentries = c->GetEntries();
        for(int jentry = 0; jentry<nentries; jentry++)
        {
            if (jentry% 1000 == 0)  {
                printf("%d / %d\n",jentry,nentries);
            }

            c->GetEntry(jentry);

            //collision selection
            if( !((montecarlo[ii] || c->skim.pHBHENoiseFilter) && c->skim.phfPosFilter1 && c->skim.phfNegFilter1 && c->skim.phltPixelClusterShapeFilter && c->skim.pprimaryvertexFilter) )
                continue;

            if(c->photon.nPhotons == 0)
                continue;

            //loop over photons in the event
            Float_t leadingPt = 40; //minPt is 40GeV
            Int_t leadingIndex = -1;
            for(int i = 0; i<c->photon.nPhotons; i++)
            {
                if(c->photon.pt[i] > leadingPt)
                {
                    leadingPt = c->photon.pt[i];
                    leadingIndex = i;
                }
            }

            if(leadingIndex == -1) // no photons above minPt
                continue;
            if ( TMath::Abs(c->photon.eta[leadingIndex]) > 1.3 ) // barrel photons only
                continue;
            if(c->photon.ecalRecHitSumEtConeDR04[leadingIndex] > TMath::Min(3., 0.05*c->photon.energy[leadingIndex]) )
                continue;
            if(c->photon.hcalTowerSumEtConeDR04[leadingIndex] > TMath::Min(2.4, 0.05*c->photon.energy[leadingIndex]) )
                continue;
            //if(c->photon.trkSumPtHollowConeDR04[leadingIndex] > 0.10*leadingPt )
            //continue;
            //if ( (c->photon.sigmaIetaIeta[leadingIndex] < 0.15) || (c->photon.sigmaIetaIeta[leadingIndex] > 0.35) )
            //continue;
            //if ( (c->photon.sigmaIphiIphi[leadingIndex] < 0.15) || (c->photon.sigmaIphiIphi[leadingIndex] > 0.30) )
            //continue;
            if ( c->photon.sigmaIetaIeta[leadingIndex] > 0.01 )
                continue;

            //loop over 'away' jets
            int jet2index = -1;
            double jet2pt = 0;
            int jet3index = -1;
            double jet3pt = 0;
            for(int i = 0; i<c->akPu3PF.nref; i++)
            {
                if( TMath::Abs(c->akPu3PF.jteta[i]) > 3.0)
                    continue;
                Double_t dphi = TMath::ACos(TMath::Cos(c->photon.phi[leadingIndex] - c->akPu3PF.jtphi[i]));
                if(dphi < TMath::Pi()/2)
                    continue;
                if(c->akPu3PF.jtpt[i] > jet2pt)
                {
                    jet3pt = jet2pt;
                    jet3index = jet2index;
                    jet2pt = c->akPu3PF.jtpt[i];
                    jet2index = i;
                }
                else if(c->akPu3PF.jtpt[i] > jet3pt)
                {
                    jet3pt = c->akPu3PF.jtpt[i];
                    jet3index = i;
                }
            }

            if(jet3index == -1) //no 3rd jet means alpha = 0, we don't care
                continue;
            if( TMath::Abs(c->akPu3PF.jteta[jet2index]) > 1.3 )
                continue;
            Double_t dphi = TMath::ACos(TMath::Cos(c->photon.phi[leadingIndex] - c->akPu3PF.jtphi[jet2index]));
            if( dphi < 2.7 )
                continue;

            Double_t alpha = jet3pt/leadingPt;
            Double_t ratio = jet2pt/leadingPt;

            int ptbin = returnPtBin(leadingPt);
            if(ptbin != -1)
                Ratio[ii][ptbin]->Fill(alpha,ratio);

            alphas->Fill(alpha);
            hPhotonPt[ii]->Fill(leadingPt);
            hPhotonEta[ii]->Fill( c->photon.eta[leadingIndex] );
            hJet2Pt[ii]->Fill(jet2pt);
            hJet2Eta[ii]->Fill( c->akPu3PF.jteta[jet2index] );
            hJet3Pt[ii]->Fill(jet3pt);
            hJet3Eta[ii]->Fill( c->akPu3PF.jteta[jet3index] );
        }
    }

    TCanvas *canvas[nptbins];
    for(int i = 0; i < nptbins; i++)
    {
        TH1D *hRatiod = Ratio[0][i]->ProjectionX();
        TH1D *hRatiomc = Ratio[1][i]->ProjectionX();
        RdRmcalpha[i]->Divide(hRatiod,hRatiomc,1,1);

        canvas[i] = new TCanvas();
        RdRmcalpha[i]->Draw();
    }

    TCanvas *danvas = new TCanvas();
    alphas->Draw();
    danvas->SaveAs("alpha_counts.gif");


    hPhotonPt[0]->Scale( 1./hPhotonPt[0]->GetEntries() );
    hPhotonPt[1]->Scale( 1./hPhotonPt[1]->GetEntries() );
    TCanvas *d1 = new TCanvas();
    hPhotonPt[0]->Draw();
    hPhotonPt[1]->SetMarkerColor(kRed);
    hPhotonPt[1]->Draw("same");
    d1->SetLogy();
    TLegend *leg = new TLegend(0.75,0.75,0.9,0.9);
    leg->SetFillColor(0);
    leg->AddEntry(hPhotonPt[0], "Data","P");
    leg->AddEntry(hPhotonPt[1], "MC", "P");
    leg->DrawClone();
    d1->SaveAs("photon_pt.gif");

    hPhotonEta[0]->Scale( 1./hPhotonEta[0]->GetEntries() );
    hPhotonEta[1]->Scale( 1./hPhotonEta[1]->GetEntries() );
    TCanvas *d2 = new TCanvas();
    hPhotonEta[0]->Draw();
    hPhotonEta[1]->SetMarkerColor(kRed);
    hPhotonEta[1]->Draw("same");
    leg->DrawClone();
    d2->SaveAs("photon_eta.gif");

    hJet2Pt[0]->Scale( 1./hJet2Pt[0]->GetEntries() );
    hJet2Pt[1]->Scale( 1./hJet2Pt[1]->GetEntries() );
    TCanvas *d3 = new TCanvas();
    hJet2Pt[0]->Draw();
    hJet2Pt[1]->SetMarkerColor(kRed);
    hJet2Pt[1]->Draw("same");
    d3->SetLogy();
    leg->DrawClone();
    d3->SaveAs("jet2_pt.gif");

    hJet2Eta[0]->Scale( 1./hJet2Eta[0]->GetEntries() );
    hJet2Eta[1]->Scale( 1./hJet2Eta[1]->GetEntries() );
    TCanvas *d4 = new TCanvas();
    hJet2Eta[0]->Draw();
    hJet2Eta[1]->SetMarkerColor(kRed);
    hJet2Eta[1]->Draw("same");
    leg->DrawClone();
    d4->SaveAs("jet2_eta.gif");

    hJet3Pt[0]->Scale( 1./hJet3Pt[0]->GetEntries() );
    hJet3Pt[1]->Scale( 1./hJet3Pt[1]->GetEntries() );
    TCanvas *d5 = new TCanvas();
    hJet3Pt[0]->Draw();
    hJet3Pt[1]->SetMarkerColor(kRed);
    hJet3Pt[1]->Draw("same");
    d5->SetLogy();
    leg->DrawClone();
    d5->SaveAs("jet3_pt.gif");

    hJet3Eta[0]->Scale( 1./hJet3Eta[0]->GetEntries() );
    hJet3Eta[1]->Scale( 1./hJet3Eta[1]->GetEntries() );
    TCanvas *d6 = new TCanvas();
    hJet3Eta[0]->Draw();
    hJet3Eta[1]->SetMarkerColor(kRed);
    hJet3Eta[1]->Draw("same");
    leg->DrawClone();
    d6->SaveAs("jet3_eta.gif");
}
Пример #14
0
void ffStudy(double tag=0, char *infName = "/d102/yjlee/hiForest2MC/Pythia80_HydjetDrum_mix01_HiForest2_v22_simTrack05.root")
{
   // Define the input file and HiForest
   HiForest *c = new HiForest(infName);
   c->hasPFTree=0;
   c->hasPhotonTree=0;
   c->hasTowerTree=0;
   c->hasHbheTree=0;
   c->hasEbTree=0;
   c->hasGenpTree=0;
   c->hasGenParticleTree=0;   
   c->hasAkPu2CaloJetTree=0;
   c->hasAkPu3CaloJetTree=0;
   c->hasAkPu4CaloJetTree=0;
   c->doTrackCorrections=1;
   c->InitTree();
   
   // Output file
   TFile *output = new TFile(Form("output-%.0f.root",tag),"recreate");
   
   // Output
   TTree * t = new TTree("t","gammajet");
   
   JetData data(t,1);

   HistoData histos_MergedGeneralCalo("MergedGeneral");
   HistoData histos2_MergedGeneral("MergedGeneral2");   // phi dependent corr
   
   TH1D *hWeight = new TH1D("hWeight","",1000,0,100);
   TH1D *hWeight2 = new TH1D("hWeight2","",1000,0,100);
   TH1D *hPt = new TH1D("hPt","",100,0,100);
   TH1D *hNoWPt = new TH1D("hNoWPt","",100,0,100);
   
   // Main loop
   for (int i=0;i<c->GetEntries();i++) {
      c->GetEntry(i);
      data.hiBin = c->evt.hiBin;
      if (i % 1000 == 0) cout <<i<<" / "<<c->GetEntries()<<endl;
      data.leadingJetPt = -1;
      data.subleadingJetPt = -1;
      data.leadingJetIt = -1;
      data.subleadingJetIt = -1;
      data.genleadingJetPt = -1;
      data.gensubleadingJetPt = -1;
      
      // Event selection
      
      
      // Select leading and subleading jet
      for (int j=0;j<c->icPu5.nref;j++) {
         if (fabs(c->icPu5.jteta[j])>2) continue;
         if (c->icPu5.jtpt[j]>data.leadingJetPt) {
	    data.leadingJetPt = c->icPu5.jtpt[j];
	    data.leadingJetEta = c->icPu5.jteta[j];
	    data.leadingJetPhi = c->icPu5.jtphi[j];
	    data.leadingJetIt = j;
	 }   
	 if (c->icPu5.jtpt[j]>data.subleadingJetPt && c->icPu5.jtpt[j] < data.leadingJetPt) {
	    data.subleadingJetPt = c->icPu5.jtpt[j];
	    data.subleadingJetEta = c->icPu5.jteta[j];
	    data.subleadingJetPhi = c->icPu5.jtphi[j];
	    data.subleadingJetIt = j;
         }
	 if (c->icPu5.jtpt[j]<data.subleadingJetPt) break;	 
      } 

      // Select generator level leading and subleading jet
      for (int j=0;j<c->icPu5.ngen;j++) {
         if (fabs(c->icPu5.geneta[j])>2) continue;
         if (c->icPu5.genpt[j]>data.genleadingJetPt) {
	    data.genleadingJetPt = c->icPu5.genpt[j];
	    data.genleadingJetEta = c->icPu5.geneta[j];
	    data.genleadingJetPhi = c->icPu5.genphi[j];
	 }   
	 if (c->icPu5.genpt[j]>data.gensubleadingJetPt && c->icPu5.genpt[j] < data.genleadingJetPt) {
	    data.gensubleadingJetPt = c->icPu5.genpt[j];
	    data.gensubleadingJetEta = c->icPu5.geneta[j];
	    data.gensubleadingJetPhi = c->icPu5.genphi[j];
         }
	 if (c->icPu5.genpt[j]<data.gensubleadingJetPt) break;	 
      } 
      
      //if (data.subleadingJetPt<50||data.subleadingJetPt>80) continue;
      
      // MPT calculation
      data.mpt = 0;
      data.cormpt = 0;
      data.cormpt2 = 0;
      data.genMpt = 0;
      data.genPMpt = 0;
      
      for (int j=0;j<c->track.nTrk;j++) {
         if (fabs(c->track.trkEta[j])>2.4) continue;
	 if (fabs(c->track.trkPt[j])<0.5) continue;
	 double mptTrk = -c->track.trkPt[j]*cos(c->track.trkPhi[j]-data.leadingJetPhi);
	 data.mpt+=mptTrk;
      }

      for (int j=0;j<c->track.nTrk;j++) {
         if (fabs(c->track.trkEta[j])>2.4) continue;
	 if ((c->track.trkPt[j])<0.5) continue;
	 if (c->track.trkAlgo[j]>=4&&!(c->track.highPurity[j])) continue;
         
	 double dphi1 = acos(cos(c->track.trkPhi[j]-data.leadingJetPhi));
         double deta1 = fabs(c->track.trkEta[j]-data.leadingJetEta);
         double dphi2 = acos(cos(c->track.trkPhi[j]-data.subleadingJetPhi));
         double deta2 = fabs(c->track.trkEta[j]-data.subleadingJetEta);
	 
	 double dr1 = sqrt(dphi1*dphi1+deta1*deta1);
	 double dr2 = sqrt(dphi2*dphi2+deta2*deta2);
	 
	 double trkWt=1;
         double trkWt2=0;         

	 //cout <<trkWt<<endl;
	 double mptTrk = -c->track.trkPt[j]*cos(c->track.trkPhi[j]-data.leadingJetPhi)*trkWt;
	 data.cormpt+=mptTrk;
	 if (data.leadingJetPt>100&&dr1<0.5) trkWt = 0.5; 
	 if (data.subleadingJetPt>100&&dr2<0.5) trkWt = 0.5; 
	 
	 double ptWeight = 1;//c->track.trkPt[j];
	 histos_MergedGeneralCalo.hRecoPt->Fill(c->track.trkPt[j],ptWeight);
	 histos_MergedGeneralCalo.hCorrectedPt->Fill(c->track.trkPt[j],ptWeight*trkWt);
	 histos_MergedGeneralCalo.hRecoEta->Fill(c->track.trkEta[j],ptWeight);
	 histos_MergedGeneralCalo.hCorrectedEta->Fill(c->track.trkEta[j],ptWeight*trkWt);
	 histos_MergedGeneralCalo.hRecoPhi->Fill(c->track.trkPhi[j],ptWeight);
	 histos_MergedGeneralCalo.hCorrectedPhi->Fill(c->track.trkPhi[j],ptWeight*trkWt);
	 histos_MergedGeneralCalo.hRecoDR->Fill(dr1,ptWeight);
	 histos_MergedGeneralCalo.hCorrectedDR->Fill(dr1,ptWeight*trkWt);


	 if (data.leadingJetPt>=50&&dr1<0.5) {
            if (data.leadingJetPt>200) trkWt2 = c->trackCorrections[1]->GetCorr(c->track.trkPt[j],c->track.trkEta[j],c->track.trkPhi[j],c->evt.hiBin);
            else trkWt2 = c->trackCorrections[2]->GetCorr(c->track.trkPt[j],c->track.trkEta[j],c->track.trkPhi[j],c->evt.hiBin);
         } else if (data.subleadingJetPt>=50&&dr2<0.5) {
            if (data.subleadingJetPt>120) trkWt2 = c->trackCorrections[1]->GetCorr(c->track.trkPt[j],c->track.trkEta[j],c->track.trkPhi[j],c->evt.hiBin);
            else trkWt2 = c->trackCorrections[2]->GetCorr(c->track.trkPt[j],c->track.trkEta[j],c->track.trkPhi[j],c->evt.hiBin);        
         } else {
            trkWt2 = c->trackCorrections[0]->GetCorr(c->track.trkPt[j],c->track.trkEta[j],c->track.trkPhi[j],c->evt.hiBin);
         }

         trkWt2 = c->getTrackCorrectionPara(j);

	 histos2_MergedGeneral.hRecoPt->Fill(c->track.trkPt[j],ptWeight);
	 histos2_MergedGeneral.hCorrectedPt->Fill(c->track.trkPt[j],ptWeight*trkWt2);
	 histos2_MergedGeneral.hRecoEta->Fill(c->track.trkEta[j],ptWeight);
	 histos2_MergedGeneral.hCorrectedEta->Fill(c->track.trkEta[j],ptWeight*trkWt2);
	 histos2_MergedGeneral.hRecoPhi->Fill(c->track.trkPhi[j],ptWeight);
	 histos2_MergedGeneral.hCorrectedPhi->Fill(c->track.trkPhi[j],ptWeight*trkWt2);
	 histos2_MergedGeneral.hRecoDR->Fill(dr1,ptWeight);
	 histos2_MergedGeneral.hCorrectedDR->Fill(dr1,ptWeight*trkWt2);

	 double mptTrk2 = -c->track.trkPt[j]*cos(c->track.trkPhi[j]-data.leadingJetPhi)*trkWt2;
	 data.cormpt2+=mptTrk2;
	 
	 hWeight->Fill(trkWt);
	 hWeight2->Fill(trkWt2);
	 if (trkWt2>0.001) {
	    hPt->Fill(c->track.trkPt[j]);
         } else {
	    hPt->Fill(c->track.trkPt[j]);
	    hNoWPt->Fill(c->track.trkPt[j]);
         
         }
	 

      }

      for (int j=0;j<c->track.nParticle;j++) {
         if (fabs(c->track.pEta[j])>2.4) continue;
	 if (fabs(c->track.pPt[j])<0.5) continue;
	 double mptPTrk = -c->track.pPt[j]*cos(c->track.pPhi[j]-data.leadingJetPhi);
	 data.genPMpt+=mptPTrk;

	 double dphi1 = acos(cos(c->track.pPhi[j]-data.leadingJetPhi));
         double deta1 = fabs(c->track.pEta[j]-data.leadingJetEta);
	 
	 double dr1 = sqrt(dphi1*dphi1+deta1*deta1);
	 double ptWeight = 1;//c->track.pPt[j];
	 
	 histos_MergedGeneralCalo.hGenPt->Fill(c->track.pPt[j],ptWeight);
	 histos_MergedGeneralCalo.hGenEta->Fill(c->track.pEta[j],ptWeight);
	 histos_MergedGeneralCalo.hGenPhi->Fill(c->track.pPhi[j],ptWeight);
	 histos_MergedGeneralCalo.hGenDR->Fill(dr1,ptWeight);
	 histos2_MergedGeneral.hGenPt->Fill(c->track.pPt[j],ptWeight);
	 histos2_MergedGeneral.hGenEta->Fill(c->track.pEta[j],ptWeight);
	 histos2_MergedGeneral.hGenPhi->Fill(c->track.pPhi[j],ptWeight);
	 histos2_MergedGeneral.hGenDR->Fill(dr1,ptWeight);
	 double mptTrk = -c->track.pPt[j]*cos(c->track.pPhi[j]-data.genleadingJetPhi);
	 data.genMpt+=mptTrk;

      }

      //cout <<data.mpt<<endl;
      t->Fill();
   }
  // t->Write();
   histos_MergedGeneralCalo.calcEff();
   histos2_MergedGeneral.calcEff();
   output->Write();
   output->Close();
}
Пример #15
0
void analyzeDiJetMPT(
   TString jetAlgo = "akPu3PF",
   TString trkCol = "anaTrack",
   TString inname="/mnt/hadoop/cms/store/user/yenjie/HiForest_v27/Dijet${pthat}_HydjetDrum_v27_mergedV1.root",
   TString outname="output.root",
   bool isPP=false,
   int dataSrcType = 1, // 0 mc, 1 hi, 2 pp 2.76 TeV, 3 pp 7TeV
   double samplePtHat=0,
   double ptHatMax=9999,
   double sampleWeight = 1, // data: 1, mc: s = 0.62, b = 0.38
   double vzMax = 15,
   int maxEntries = -1,
   double leadingJetPtMin=-1,
   double subleadingJetPtMin=-1,
   double sigDPhi=-1,
   bool genJetMode=false,
   int smearCentBin = 0,
   bool doCentReWeight=false,
   TString mcfname="",
   TString datafname="output-data-Photon-v7_v30.root"
                      )
{
   ///////////////////////////////////////////////////
   // Setup Analysis
   ///////////////////////////////////////////////////
   int saveTracks = 1; // 0=none, 1=all, 10=cone
   double cutjetPt = 10;
   double cutjetEta = 2;
   double cutPtTrk=1.;
   double cutEtaTrk = 2.4;
   double trkJetAssoR=0.3;

   TString tag=Form("%s_%.0f_%.0f_%.0f_saveTrk%d_jmin%.0f_tmin%.0f_genj%d_sm%d",jetAlgo.Data(),leadingJetPtMin,subleadingJetPtMin,sigDPhi*1000,saveTracks,cutjetPt,cutPtTrk,genJetMode,smearCentBin);
   outname.ReplaceAll(".root",Form("_%s.root",tag.Data()));
   cout << "Input: " << inname << " isPP: " << isPP << endl;
   cout << "Sample pthat = " << samplePtHat << " ptHatMax = " << ptHatMax << endl;
   cout << "Track pt min = " << cutPtTrk << endl;
   cout << "skim: leading Jet > " << leadingJetPtMin << " subleading > " << subleadingJetPtMin << " dphi > " << sigDPhi  << endl;
   cout << "Genjet mode: " << genJetMode << endl;
   cout << "SmearCentBin  = " << smearCentBin << endl;
   cout << "Output: " << outname << endl;

   // Centrality reweiting
   CentralityReWeight cw(datafname,mcfname,"offlSel&&pt1>100&&pt2>0&&acos(cos(phi2-phi1))>2./3*3.14159");

   // Define the input file and HiForest
   HiForest * c = new HiForest(inname,jetAlgo.Data(),isPP);
   c->doTrackCorrections = true;
   c->doTrackingSeparateLeadingSubleading = false;
   c->InitTree();

   // intialize jet variables
   Jets* anajet = &(c->akPu3PF) ;
   
   // Output file
   cout << "Output: " << outname << endl;
   TFile *output = new TFile(outname,"recreate");
   if (doCentReWeight&&mcfname!="") {
      cw.Init(); //cw.hCentData->Draw(); cw.hCentMc->Draw("same");
   }

   // basics
   output->cd();
   TH1D * hCent = new TH1D("hCent","",40,0,40);
   TH1D * hVz = new TH1D("hVz","",60,-30,30);
   TH1D * hPtHatBeforeSel = new TH1D("hPtHatBeforeSel","",200,0,1000);
   TH1D * hPtHat = new TH1D("hPtHat","",200,0,1000);
   TH2D * hJetPt2D = new TH2D("hJetPt2D","",100,0,500,100,0,500);
   TH1D * hJDPhi = new TH1D("hJDPhi","",40,0,Pi());
   TH1D * hAj = new TH1D("hAj","",32,0,0.8);   
   TH1D * hTrkPt = new TH1D("hTrkPt",";p_{T} (GeV/c)",200,0,200);
   TH1D * hTrkCorrPt = new TH1D("hTrkCorrPt",";p_{T} (GeV/c)",200,0,200);
   TH1D * hGenpPt = new TH1D("hGenpPt",";p_{T} (GeV/c)",200,0,200);
   TH1D* smearingHist=0;
   if ( smearCentBin > 0 ) {
      smearingHist = new TH1D("smearingH","",100,-2,2);
   }
   EvtSel evt;
   DiJet gj;
   TTree * tgj = new TTree("tgj","dijet jet tree");
   BookGJBranches(tgj,evt,gj);

   // pp triggers
   int HLT_Jet40_v1=0;
   if (dataSrcType==2) {
      c->hltTree->SetBranchAddress("HLT_Jet40_v1",&HLT_Jet40_v1);
   } else if (dataSrcType==3) {
      c->hltTree->SetBranchAddress("HLT_Jet40_v1",&HLT_Jet40_v1);
   }

   ////////////////////////
   // Smearing Setup
   ////////////////////////
   if (smearCentBin>0) {
     LoadParameters();
   }

   ///////////////////////////////////////////////////
   // Main loop
   ///////////////////////////////////////////////////
   if (maxEntries<0||maxEntries > c->GetEntries()) maxEntries = c->GetEntries();
   for (int i=0;i<maxEntries;i++) {
      c->GetEntry(i);
      // Event Info
      evt.run = c->hlt.Run;
      evt.evt = c->hlt.Event;
      evt.cBin = c->evt.hiBin;
      if (isPP) evt.cBin = 39;
      evt.evtPlane = c->evt.hiEvtPlanes[21];
      evt.nJ = anajet->nref;
      evt.nT = c->track.nTrk;
      evt.trig = (c->hlt.HLT_HIJet80_v1 > 0);
      evt.offlSel = (c->skim.pcollisionEventSelection > 0);
      if (!c->hasSkimTree) evt.offlSel = (c->evt.hiNtracks>0 && c->evt.hiHFplus>=4 && c->evt.hiHFminus>=4);
      evt.noiseFilt = (c->skim.pHBHENoiseFilter > 0);
      if (dataSrcType>1) {
         if (dataSrcType==2) {
            evt.trig = (HLT_Jet40_v1>0);
         } else if (dataSrcType==3) {
            evt.trig = (HLT_Jet40_v1>0);
         }
//          evt.offlSel = (c->skim.phfCoincFilter && c->skim.ppurityFractionFilter);
      }
      if (!c->hasHltTree) evt.trig = true;
      evt.anaEvtSel = evt.offlSel;
      if (dataSrcType>0) evt.anaEvtSel = evt.anaEvtSel && evt.trig && evt.noiseFilt;
      evt.vz = c->track.vz[1];
      // Get Centrality Weight
      if (doCentReWeight) evt.weight = cw.GetWeight(evt.cBin);
      else evt.weight = 1;
      evt.npart = getNpart(evt.cBin);
      evt.ncoll = getNcoll(evt.cBin);
      evt.sampleWeight = sampleWeight/maxEntries; // for different mc sample, 1 for data
      evt.pthat = anajet->pthat;
      evt.samplePtHat = samplePtHat;

      if (i%1000==0) cout <<i<<" / "<<maxEntries << " run: " << evt.run << " evt: " << evt.evt << " bin: " << evt.cBin << " nT: " << evt.nT << " trig: " <<  evt.trig << " anaEvtSel: " << evt.anaEvtSel <<endl;

      // initialize
      int leadingIndex=-1,genLeadingIndex=-1;
      int awayIndex=-1,genAwayIndex=-1;
      gj.clear();
      
      // smearing for pp
      gj.nUnSmJet=0;
      if (smearCentBin>0) {	
        for (int j=0;j<anajet->nref;j++) {
         if (anajet->jtpt[j]<cutjetPt) continue;
         if (fabs(anajet->jteta[j])>cutjetEta) continue;
         if ((anajet->trackMax[j]/anajet->jtpt[j])<0.01) continue;
          //if (anajet->jtpt[j]>200) cout << "Before smearing: " << anajet->jtpt[j] << endl;
          int smCentBin = GetCBin( centBin[smearCentBin] );
          //cout << "smCentBin: " << smCentBin << endl;
          gj.inclJetUnSmPt[gj.nUnSmJet] = anajet->jtpt[j];
          anajet->jtpt[j]  = GetSmearedPtData(2,smCentBin,anajet->jtpt[j],0,"");
          gj.inclJetSm[gj.nUnSmJet] = anajet->jtpt[j]/gj.inclJetUnSmPt[gj.nUnSmJet];
          //if (anajet->jtpt[j]>200) cout << "After smearing: " << anajet->jtpt[j] << endl;
          if ( (gj.inclJetUnSmPt[gj.nUnSmJet] > 100) && (fabs(anajet->jteta[j])<2.0))
            smearingHist->Fill( (anajet->jtpt[j] - gj.inclJetUnSmPt[gj.nUnSmJet] )/gj.inclJetUnSmPt[gj.nUnSmJet] );
          ++gj.nUnSmJet;
        }
      }

      ///////////////////////////////////////////////////////
      // Find Leading jets
      ///////////////////////////////////////////////////////
      for (int j=0;j<anajet->nref;j++) {
         if (anajet->jtpt[j]<cutjetPt) continue;
         if (fabs(anajet->jteta[j])>cutjetEta) continue;
         if ((anajet->trackMax[j]/anajet->jtpt[j])<0.01) continue;
         if (anajet->jtpt[j] > gj.pt1) {
            gj.pt1 = anajet->jtpt[j];
            leadingIndex = j;
         }
      }

      // Found a leading jet which passed basic quality cut!
      if (leadingIndex!=-1) {
         // set leading jet
         gj.pt1raw=anajet->rawpt[leadingIndex];
         gj.eta1=anajet->jteta[leadingIndex];
         gj.phi1=anajet->jtphi[leadingIndex];
         gj.ref1pt = anajet->refpt[leadingIndex];
         gj.ref1eta = anajet->refeta[leadingIndex];
         gj.ref1phi = anajet->refphi[leadingIndex];
         gj.ref1partonpt = anajet->refparton_pt[leadingIndex];
         gj.ref1partonflavor = anajet->refparton_flavor[leadingIndex];
         
         // Loop over jet tree to find a away side leading jet
         gj.nJet=0;
         for (int j=0;j<anajet->nref;j++) {
            if (anajet->jtpt[j]<cutjetPt) continue;
            if (fabs(anajet->jteta[j])>cutjetEta) continue;
            if ((anajet->trackMax[j]/anajet->jtpt[j])<0.01) continue;
            gj.inclJetPt[gj.nJet] = anajet->jtpt[j];
            gj.inclJetEta[gj.nJet] = anajet->jteta[j];
            gj.inclJetPhi[gj.nJet] = anajet->jtphi[j];
            gj.inclJetRefPt[gj.nJet] = anajet->refpt[j];
            gj.inclJetRefPartonPt[gj.nJet] = anajet->refparton_pt[j];
            if (j!=leadingIndex&&anajet->jtpt[j] > gj.pt2) {
               gj.pt2 = anajet->jtpt[j];
               awayIndex = j;
            }
            ++gj.nJet;
         }

         if (awayIndex !=-1) { // Found an away jet!
            gj.pt2raw = anajet->rawpt[awayIndex];
            gj.eta2   = anajet->jteta[awayIndex];
            gj.phi2   = anajet->jtphi[awayIndex];
            gj.deta   = gj.eta2 - gj.eta1;
            gj.dphi   = deltaPhi(gj.phi2,gj.phi1);
            gj.Aj     = (gj.pt1-gj.pt2)/(gj.pt1+gj.pt2);
            gj.ref2pt = anajet->refpt[awayIndex];
            gj.ref2eta = anajet->refeta[awayIndex];
            gj.ref2phi = anajet->refphi[awayIndex];
            gj.ref2partonpt = anajet->refparton_pt[awayIndex];
            gj.ref2partonflavor = anajet->refparton_flavor[awayIndex];
         }         
      } // end of if leadingIndex
      
      ////////////////////////////////////////
      // Find Leading Genjets
      ////////////////////////////////////////
      // Loop over genjets to look for leading genjet candidate in the event
      for (int j=0;j<anajet->ngen;j++) {
         if (anajet->genpt[j]<cutjetPt) continue;
         if (fabs(anajet->geneta[j])>cutjetEta) continue;
         if (anajet->genpt[j] > gj.genjetpt1) {
            gj.genjetpt1=anajet->genpt[j];
            genLeadingIndex=j;
         }
      }

      if (genLeadingIndex!=-1) {
         gj.genjeteta1=anajet->geneta[genLeadingIndex];
         gj.genjetphi1=anajet->genphi[genLeadingIndex];
      }
      // subleading
      gj.nGenJet=0;
      for (int j=0;j<anajet->ngen;j++) {
         if (anajet->genpt[j]<cutjetPt) continue;
         if (fabs(anajet->geneta[j])>cutjetEta) continue;
         gj.inclGenJetPt[gj.nGenJet] = anajet->genpt[j];
         gj.inclGenJetEta[gj.nGenJet] = anajet->geneta[j];
         gj.inclGenJetPhi[gj.nGenJet] = anajet->genphi[j];
         if (j!=genLeadingIndex && anajet->genpt[j]>gj.genjetpt2) {
            gj.genjetpt2=anajet->genpt[j];
            gj.genjeteta2=anajet->geneta[j];
            gj.genjetphi2=anajet->genphi[j];
         }
         ++gj.nGenJet;
      }
      if (genJetMode) {
         gj.pt1 = gj.genjetpt1;
         gj.eta1 = gj.genjeteta1;
         gj.phi1 = gj.genjetphi1;
         gj.pt2 = gj.genjetpt2;
         gj.eta2 = gj.genjeteta2;
         gj.phi2 = gj.genjetphi2;
         gj.dphi   = deltaPhi(gj.phi2,gj.phi1);
      }

      ///////////////////////////////////////////////////////
      // Skim
      ///////////////////////////////////////////////////////
      if (!evt.anaEvtSel) continue;
      if (samplePtHat>0 && evt.pthat>=ptHatMax) continue;
      if (vzMax>0 && fabs(evt.vz)>vzMax) continue;
      hPtHatBeforeSel->Fill(evt.pthat);
      // ensure jet distribution unbiased by pthat turn on
      if (leadingJetPtMin>0&&gj.pt1<leadingJetPtMin) continue;
      if (subleadingJetPtMin>0&&gj.pt2<subleadingJetPtMin) continue;
      if (sigDPhi>0&&fabs(gj.dphi)<sigDPhi) continue;
      
      // Fill Baisc Event info
      hCent->Fill(evt.cBin);
      hVz->Fill(evt.vz);
      hPtHat->Fill(evt.pthat);
      hJetPt2D->Fill(gj.pt1,gj.pt2);
      hJDPhi->Fill(fabs(gj.dphi));
      hAj->Fill(gj.Aj);

      ///////////////////////////////////////////////////////
      // Tracks
      ///////////////////////////////////////////////////////
      bool doTracks = false;
      if (doTracks) {
      double trkcorr[4];
      gj.nTrk=0;
      const int nTrkSet=1;
      Tracks * anaTrks[nTrkSet] = {&(c->track)};
      // Full Tracks, Pixel Tracks
      for (int iset=0; iset<nTrkSet; ++iset) {
         for (int it=0; it<anaTrks[iset]->nTrk; ++it) {
            // Kinematic Selection
            if (anaTrks[iset]->trkPt[it] < cutPtTrk) continue;
            if (fabs(anaTrks[iset]->trkEta[it]) > cutEtaTrk) continue;
            if (!anaTrks[iset]->highPurity[it]) continue;
            
            float trkPt = anaTrks[iset]->trkPt[it];
            float trkEta = anaTrks[iset]->trkEta[it];
            float trkPhi = anaTrks[iset]->trkPhi[it];
            float trkPtErrorNorm = anaTrks[iset]->trkPtError[it]/anaTrks[iset]->trkPt[it];
            float trkNHit = anaTrks[iset]->trkNHit[it];
            float trkChi2Norm = anaTrks[iset]->trkChi2[it]/anaTrks[iset]->trkNlayer[it]/anaTrks[iset]->trkNdof[it];
            float trkDzNorm = anaTrks[iset]->trkDz1[it]/anaTrks[iset]->trkDzError1[it];
            float trkDxyNorm = anaTrks[iset]->trkDxy1[it]/anaTrks[iset]->trkDxyError1[it];
            int trkAlgo = anaTrks[iset]->trkAlgo[it];
            bool trkHP  = (trkPtErrorNorm<0.06&&trkNHit>=13&&trkChi2Norm<0.15&&trkDzNorm<3&&trkDxyNorm<3);
            gj.trkPt[gj.nTrk] = trkPt;
            gj.trkEta[gj.nTrk] = trkEta;
            gj.trkPhi[gj.nTrk] = trkPhi;
            gj.trkWt[gj.nTrk] = c->getTrackCorrection(it);
            float dr1 = deltaR(trkEta,trkPhi,gj.eta1,gj.phi1);
            float dr2 = deltaR(trkEta,trkPhi,gj.eta2,gj.phi2);
            float dr1bkg = deltaR(trkEta,trkPhi,-gj.eta1,gj.phi1);
            float dr2bkg = deltaR(trkEta,trkPhi,-gj.eta2,gj.phi2);
            gj.trkAsso[gj.nTrk] = 0;
            if (dr1<trkJetAssoR) gj.trkAsso[gj.nTrk] = 1;
            else if (dr1bkg<trkJetAssoR) gj.trkAsso[gj.nTrk] = 11;
            else if (dr2<trkJetAssoR) gj.trkAsso[gj.nTrk] = 2;
            else if (dr2bkg<trkJetAssoR) gj.trkAsso[gj.nTrk] = 12;
            // Histogram
            hTrkPt->Fill(trkPt);
            hTrkCorrPt->Fill(trkPt,gj.trkWt[gj.nTrk]);
            // Select what to save
            if (saveTracks==0) continue;
            if (saveTracks==10&&gj.trkAsso[gj.nTrk]==0) continue;

            // Fill
            gj.trkNHit[gj.nTrk] = trkNHit;
            gj.trkChi2Norm[gj.nTrk] = trkChi2Norm;
            gj.trkAlgo[gj.nTrk] = trkAlgo;
            gj.trkHP[gj.nTrk] = trkHP;
            gj.trkIsFake[gj.nTrk] = anaTrks[iset]->trkFake[it];
            ++gj.nTrk;
         }
      }

      gj.nSim=0;
      for (int ip=0; ip<anaTrks[0]->nParticle; ++ip) {
         if (anaTrks[0]->pPt[ip] < cutPtTrk) continue;
         if (fabs(anaTrks[0]->pEta[ip]) > cutEtaTrk) continue;
         float simPt = anaTrks[0]->pPt[ip];
         float simEta = anaTrks[0]->pEta[ip];
         float simPhi = anaTrks[0]->pPhi[ip];
         float dr1 = deltaR(simEta,simPhi,gj.eta1,gj.phi1);
         float dr2 = deltaR(simEta,simPhi,gj.eta2,gj.phi2);
         float dr1bkg = deltaR(simEta,simPhi,-gj.eta1,gj.phi1);
         float dr2bkg = deltaR(simEta,simPhi,-gj.eta2,gj.phi2);
         gj.simAsso[gj.nSim] = 0;
         if (dr1<trkJetAssoR) gj.simAsso[gj.nSim] = 1;
         else if (dr1bkg<trkJetAssoR) gj.simAsso[gj.nSim] = 11;
         else if (dr2<trkJetAssoR) gj.simAsso[gj.nSim] = 2;
         else if (dr2bkg<trkJetAssoR) gj.simAsso[gj.nSim] = 12;
         // Select what to save
         if (saveTracks==0) continue;
         if (saveTracks==10&&gj.simAsso[gj.nSim]==0) continue;

         // Fill
         gj.simPt[gj.nSim] = simPt;
         gj.simEta[gj.nSim] = simEta;
         gj.simPhi[gj.nSim] = simPhi;
         gj.simHasRec[gj.nSim] = (anaTrks[0]->pNRec[ip]==1&&(anaTrks[0]->mtrkAlgo[ip]<4||anaTrks[0]->mtrkQual[ip]>0));
         ++gj.nSim;
      }
      }
      
      // All done
      tgj->Fill();
   }

   output->Write();
   output->Close();
   delete c;
}
Пример #16
0
int writetree_pp(char *ksp = "ppJet40"){

  timer.Start();
  LoadLib();

 
  TString inname="";
  if(strcmp(ksp,"ppJet40")==0)inname = "/hadoop/store/user/belt/hiForest2/PP2013_HiForest_PromptReco_JSon_Jet40Jet60_ppTrack_forestv84.root";
  else if(strcmp(ksp,"ppJet80")==0)inname = "/hadoop/store/user/belt/hiForest2/PP2013_HiForest_PromptReco_JsonPP_Jet80_PPReco_forestv82.root";
    
  //! Load Lib
  //gSystem->Load("/afs/cern.ch/user/p/pawan/scratch0/CMSSW_6_2_0/src/work/pPb/HiForest/V3/hiForest_h.so");
    
  //! Define the input file and HiForest
  //! CMSSW_5_3_3
  HiForest *c = new HiForest(inname,Form("Forest%s",ksp),cPP);
  cout<<"Loaded the hiforest tree : "<<c->GetName()<<endl;
  ShutoffBranches(c);
    

  TFile *fout = new TFile(Form("ntuple_2013_%s_v2.root",ksp),"RECREATE");
    
  std::cout<<"\t"<<std::endl;
  std::cout<<"\t"<<std::endl;
  std::cout<<"**************************************************** "<<std::endl;
  std::cout<<Form("Running for %s ",ksp)<<std::endl;
  std::cout<<Form("pT  cut for %0.3f ",kptrecocut)<<std::endl;
  std::cout<<Form("eta cut for %0.3f ",ketacut)<<std::endl;
  std::cout<<"My hiForest Tree : " <<c->GetName()<<"\t Entries "<<c->GetEntries()<<std::endl;
  std::cout<<"Output file  "<<fout->GetName()<<std::endl;
  std::cout<<"**************************************************** "<<std::endl;
  std::cout<<"\t"<<std::endl;
  std::cout<<"\t"<<std::endl;
    
  //! shut off jet trees
  //c->hasAk2CaloJetTree=0;
  //c->hasAk4CaloJetTree=0;
  //c->hasAk3CaloJetTree=0;
  //c->hasAk5CaloJetTree=0;
    
  c->hasAkPu2CaloJetTree=0;
  c->hasAkPu4CaloJetTree=0;
  c->hasAkPu3CaloJetTree=0;
  //c->hasAkPu5CaloJetTree=0;
    
  //c->hasAk2PFJetTree=0;
  //c->hasAk4PFJetTree=0;
  //c->hasAk5PFJetTree=0;
    
  //c->hasAkPu2PFJetTree=0;
  //c->hasAkPu4PFJetTree=0;
  //c->hasAkPu5PFJetTree=0;
    
  c->hasTrackTree=0;
    
  //! For jets
  //Jets *mJets2 = 0;
  Jets *mJets3 = 0;
  Jets *mJets4 = 0;
  Long64_t nentries = c->GetEntries();
  std::cout<<Form("# of entries in TTree for %s : ",ksp)<<nentries<<std::endl;

  //TTree *jetR2Tree = new TTree("jetR2","ak2PF");
  TTree *jetR3Tree = new TTree("jetR3","ak3PF");
  TTree *jetR4Tree = new TTree("jetR4","ak4PF");
  TTree *evtTree = new TTree("evt","evt");

  // declare the event variables.
  int evt;
  int run;
  float vx;
  float vy;
  float vz;
  int jet40;
  int jet60;
  int jet80;
  int jet100;
  int ntrk;

  // declare the jet variables
  /*
  int nrefe2;
  float pt2[1000];
  float raw2[1000];
  float eta2[1000];
  float phi2[1000];
  float chMax2[1000];
  float trkMax2[1000];
  float chSum2[1000];
  float phSum2[1000];
  float neSum2[1000];
  float trkSum2[1000];
  float phMax2[1000];
  float neMax2[1000];
  */

  int nrefe3;
  float pt3[1000];
  float raw3[1000];
  float eta3[1000];
  float phi3[1000];
  float chMax3[1000];
  float trkMax3[1000];
  float chSum3[1000];
  float phSum3[1000];
  float neSum3[1000];
  float trkSum3[1000];
  float phMax3[1000];
  float neMax3[1000];

  int nrefe4;
  float pt4[1000];
  float raw4[1000];
  float eta4[1000];
  float phi4[1000];
  float chMax4[1000];
  float trkMax4[1000];
  float chSum4[1000];
  float phSum4[1000];
  float neSum4[1000];
  float trkSum4[1000];
  float phMax4[1000];
  float neMax4[1000];
    
  //set the branches in the trees. 
  evtTree->Branch("evt",&evt,"evt/I");
  evtTree->Branch("run",&run,"run/I");
  evtTree->Branch("vx",&vx,"vx/F");
  evtTree->Branch("vy",&vy,"vy/F");
  evtTree->Branch("vz",&vz,"vz/F");
  evtTree->Branch("jet40",&jet40,"jet40/I");
  evtTree->Branch("jet60",&jet60,"jet60/I");
  evtTree->Branch("jet80",&jet80,"jet80/I");
  evtTree->Branch("jet100",&jet100,"jet100/I");
  evtTree->Branch("ntrk",&ntrk,"ntrk/I");
  /*
  jetR2Tree->Branch("nrefe",&nrefe2,"nrefe/I");
  jetR2Tree->Branch("pt",&pt2,"pt[nrefe]/F");
  jetR2Tree->Branch("raw",&raw2,"raw[nrefe]/F");
  jetR2Tree->Branch("eta",&eta2,"eta[nrefe]/F");
  jetR2Tree->Branch("phi",&phi2,"phi[nrefe]/F");
  jetR2Tree->Branch("chMax",&chMax2,"chMax[nrefe]/F");
  jetR2Tree->Branch("trkMax",&trkMax2,"trkMax[nrefe]/F");
  jetR2Tree->Branch("phMax",&phMax2,"phMax[nrefe]/F");
  jetR2Tree->Branch("neMax",&neMax2,"neMax[nrefe]/F");
  jetR2Tree->Branch("chSum",&chSum2,"chSum[nrefe]/F");
  jetR2Tree->Branch("phSum",&phSum2,"phSum[nrefe]/F");
  jetR2Tree->Branch("neSum",&neSum2,"neSum[nrefe]/F");
  jetR2Tree->Branch("trkSum",&trkSum2,"trkSum[nrefe]/F");
  */
  jetR3Tree->Branch("nrefe",&nrefe3,"nrefe/I");
  jetR3Tree->Branch("pt",&pt3,"pt[nrefe]/F");
  jetR3Tree->Branch("raw",&raw3,"raw[nrefe]/F");
  jetR3Tree->Branch("eta",&eta3,"eta[nrefe]/F");
  jetR3Tree->Branch("phi",&phi3,"phi[nrefe]/F");
  jetR3Tree->Branch("chMax",&chMax3,"chMax[nrefe]/F");
  jetR3Tree->Branch("trkMax",&trkMax3,"trkMax[nrefe]/F");
  jetR3Tree->Branch("phMax",&phMax3,"phMax[nrefe]/F");
  jetR3Tree->Branch("neMax",&neMax3,"neMax[nrefe]/F");
  jetR3Tree->Branch("chSum",&chSum3,"chSum[nrefe]/F");
  jetR3Tree->Branch("phSum",&phSum3,"phSum[nrefe]/F");
  jetR3Tree->Branch("neSum",&neSum3,"neSum[nrefe]/F");
  jetR3Tree->Branch("trkSum",&trkSum3,"trkSum[nrefe]/F");

  jetR4Tree->Branch("nrefe",&nrefe4,"nrefe/I");
  jetR4Tree->Branch("pt",&pt4,"pt[nrefe]/F");
  jetR4Tree->Branch("raw",&raw4,"raw[nrefe]/F");
  jetR4Tree->Branch("eta",&eta4,"eta[nrefe]/F");
  jetR4Tree->Branch("phi",&phi4,"phi[nrefe]/F");
  jetR4Tree->Branch("chMax",&chMax4,"chMax[nrefe]/F");
  jetR4Tree->Branch("trkMax",&trkMax4,"trkMax[nrefe]/F");
  jetR4Tree->Branch("phMax",&phMax4,"phMax[nrefe]/F");
  jetR4Tree->Branch("neMax",&neMax4,"neMax[nrefe]/F");
  jetR4Tree->Branch("chSum",&chSum4,"chSum[nrefe]/F");
  jetR4Tree->Branch("phSum",&phSum4,"phSum[nrefe]/F");
  jetR4Tree->Branch("neSum",&neSum4,"neSum[nrefe]/F");
  jetR4Tree->Branch("trkSum",&trkSum4,"trkSum[nrefe]/F");

     
  for (Long64_t ievt=0; ievt<nentries;ievt++) {//! event loop
  //for (Long64_t ievt=0; ievt<100;ievt++) {//! event loop
    //! load the hiForest event
    c->GetEntry(ievt);

    bool evSel = false;
    evSel = fabs(c->evt.vz)<15. && c->skim.pHBHENoiseFilter  && c->skim.pPAcollisionEventSelectionPA && (c->hlt.HLT_PAJet40_NoJetID_v1 || c->hlt.HLT_PAJet60_NoJetID_v1 || c->hlt.HLT_PAJet80_NoJetID_v1 || c->hlt.HLT_PAJet100_NoJetID_v1);
	
    if(!evSel)continue;
        
   
    run = c->evt.run;
    evt = c->evt.evt;
    vx = c->evt.vx;
    vy = c->evt.vy;
    vz = c->evt.vz;
    jet40  = c->hlt.HLT_PAJet40_NoJetID_v1;
    jet60  = c->hlt.HLT_PAJet60_NoJetID_v1;
    jet80  = c->hlt.HLT_PAJet80_NoJetID_v1;
    jet100 = c->hlt.HLT_PAJet100_NoJetID_v1;
    ntrk = c->evt.hiNtracks;

    if(ievt%10000 == 0) cout<<" ******** Event # "<< ievt <<"\t Run " <<run<<endl;
    /*
    mJets2 = &(c->ak2PF);
    nrefe2 = mJets2->nref;

    for (int i = 0; i<nrefe2; i++) {
      pt2[i]     = mJets2->jtpt[i];
      eta2[i]    = mJets2->jteta[i];
      phi2[i]    = mJets2->jtphi[i];
      raw2[i]    = mJets2->rawpt[i];
      chMax2[i]  = mJets2->chargedMax[i];
      trkMax2[i]  = mJets2->trackMax[i];
      chSum2[i]  = mJets2->chargedSum[i];
      phSum2[i]  = mJets2->photonSum[i];
      neSum2[i]  = mJets2->neutralSum[i];
      trkSum2[i] = mJets2->trackSum[i];
      phSum2[i]  = mJets2->photonMax[i];
      neMax2[i]  = mJets2->neutralMax[i];
    }
    */

    mJets3 = &(c->ak3PF);
    nrefe3 = mJets3->nref;

    for (int i = 0; i<nrefe3; i++) {
      pt3[i]     = mJets3->jtpt[i];
      eta3[i]    = mJets3->jteta[i];
      phi3[i]    = mJets3->jtphi[i];
      raw3[i]    = mJets3->rawpt[i];
      chMax3[i]  = mJets3->chargedMax[i];
      trkMax3[i]  = mJets3->trackMax[i];
      chSum3[i]  = mJets3->chargedSum[i];
      phSum3[i]  = mJets3->photonSum[i];
      neSum3[i]  = mJets3->neutralSum[i];
      trkSum3[i] = mJets3->trackSum[i];
      phSum3[i]  = mJets3->photonMax[i];
      neMax3[i]  = mJets3->neutralMax[i];
    }

    mJets4 = &(c->ak4PF);
    nrefe4 = mJets4->nref;

    for (int i = 0; i<nrefe4; i++) {
      pt4[i]     = mJets4->jtpt[i];
      eta4[i]    = mJets4->jteta[i];
      phi4[i]    = mJets4->jtphi[i];
      raw4[i]    = mJets4->rawpt[i];
      chMax4[i]  = mJets4->chargedMax[i];
      trkMax4[i]  = mJets4->trackMax[i];
      chSum4[i]  = mJets4->chargedSum[i];
      phSum4[i]  = mJets4->photonSum[i];
      neSum4[i]  = mJets4->neutralSum[i];
      trkSum4[i] = mJets4->trackSum[i];
      phSum4[i]  = mJets4->photonMax[i];
      neMax4[i]  = mJets4->neutralMax[i];
    }

    evtTree->Fill();
    //jetR2Tree->Fill();
    jetR3Tree->Fill();
    jetR4Tree->Fill();

  }  

  fout->cd();
  fout->Write();
  fout->Close();
    
  // time out:
  timer.Stop();
  float rtime  = timer.RealTime();
  float ctime  = timer.CpuTime();
    
  cout<<"\t"<<endl;
  cout<<Form("RealTime=%f seconds, CpuTime=%f seconds",rtime,ctime)<<endl;
  cout<<"\t"<<endl;
  cout<<"Good bye : " <<"\t"<<endl;
    
  return 0;

  
  




}
void forest2yskim_jetSkim_forestV3_noEleRejection(TString inputFile_="forestFiles/pA/pA_photonSkimForest_v85_skimPhotonPt50_eta1.5.root",
		std::string MinbiasFname = "skim_trackJet_minbiasTrackJet_mc.root",
		float cutphotonPt  = 35,  // default value dropped to 35GeV  for later photon energy smearing/scaling
		std::string outname = "testPhotonSkim.root",
		sampleType colli=kPADATA,
		bool doMix = false,
		bool doJetResCorrection = 1,  // = L2L3 * MC nonclosure correction  jet energy correction is done by default from Oct 19th (YS)
		int smearingCentBin = -1, //0=0-10%, 1=10-30%, 2=30-50%, 3=50-100%, 4=0-30%, 5=30-100%  : Jet pT and phi smearing!
		float jetEnergyScale = 1.0, 
		float addFlatJetEnergyRes = 0.0, 
		bool useGenJetColl = 0
		)
{
	bool isMC=true;
	if ((colli==kPPDATA)||(colli==kPADATA)||(colli==kHIDATA))
		isMC=false;

	int seconds = time(NULL);         cout << " time = " <<seconds%10000<< endl;
	TRandom3 rand(seconds%10000);
	TString datafname  = "";
	float cutphotonEta = 1.44;
	float preCutPhotonEt = 30;

	const int nMaxPho = 100;


	HiForest *c;
	if((colli==kPADATA)||(colli==kPAMC)) {
		c = new HiForest(inputFile_.Data(), "forest", cPPb, isMC );
	}
	else if  ((colli==kPPDATA)||(colli==kPPMC)) {
		c = new HiForest(inputFile_.Data(), "forest", cPP, isMC );
	}
	else if  ((colli==kHIDATA)||(colli==kHIMC)) {
		c = new HiForest(inputFile_.Data(), "forest", cPbPb, isMC );
		c->GetEnergyScaleTable("../photonEnergyScaleTable_lowPt_v6.root");
	}
	else {
		cout << " Error!  No such collision type" << endl;
		return;
	}

	c->InitTree();


	// vertex and centrality vtxCentWeighting
	TFile* fWeight = new TFile("../vertexReweightingHistogram_pthatweighted.root");

	TH1D* hWeight_vtx_data_pp = (TH1D*)fWeight->Get("vertexHistoData_pp");
	TH1D* hWeight_vtx_mc_pp = (TH1D*)fWeight->Get("vertexHistoMC_pp");

	TH1D* hWeight_vtx_data_ppb = (TH1D*)fWeight->Get("vertexHistoData_ppb");
	TH1D* hWeight_vtx_mc_ppb = (TH1D*)fWeight->Get("vertexHistoMC_ppb");

	TH1D* hWeight_vtx_data_pbpb = (TH1D*)fWeight->Get("vertexHistoData_pbpb");
	TH1D* hWeight_vtx_mc_pbpb = (TH1D*)fWeight->Get("vertexHistoMC_pbpb");
	TH1D* hWeight_cent_data_pbpb = (TH1D*)fWeight->Get("centBinHistoData_pbpb");
	TH1D* hWeight_cent_mc_pbpb = (TH1D*)fWeight->Get("centBinHistoMC_pbpb");




	// L2L3 correction
	TFile* fL2L3pp = new TFile("../corrL2L3/Casym_pp_double_hcalbins_algo_ak3PF_pt100_140_jet80_alphahigh_20_phicut250.root");
	TH1D * c_etapp=(TH1D*)fL2L3pp->Get("C_asym");
	TF1* fptpp = new TF1("fptpp","1-[0]/pow(x,[1])",20,300);
	fptpp->SetParameters(0.06971,0.8167);

	TFile* fL2L3pA = new TFile("../corrL2L3/Casym_pPb_double_hcalbins_algo_akPu3PF_pt100_140_jet80_alphahigh_20_phicut250.root");
	TH1D * c_etapA=(TH1D*)fL2L3pA->Get("C_asym");
	TF1* fptpA = new TF1("fptpA","1-[0]/pow(x,[1])",20,300);
	fptpA->SetParameters(0.3015, 0.8913);

	TFile* fL2L3Ap = new TFile("../corrL2L3/Casym_Pbp_double_hcalbins_algo_akPu3PF_pt100_140_jet80_alphahigh_20_phicut250.root");
	TH1D * c_etaAp=(TH1D*)fL2L3Ap->Get("C_asym");
	TF1* fptAp = new TF1("fptAp","1-[0]/pow(x,[1])",20,300);
	fptAp->SetParameters(0.3015, 0.8913);

	// pA MC
	TF1 * fgaus=new TF1("fgaus_pA","gaus(0)",-20,20);
	fgaus->SetParameters(1,0,1);
	TF1 * fsmear_pA = new TF1("fsmear_pA","[0]/pow(x,[1])",50,300);
	fsmear_pA->SetParameters(1.052,0.5261);


	/*
	   TCanvas* c11 = new TCanvas("c11","",1200,400);   // valiation of smearing factors
	   c11->Divide(3,1);
	   c11->cd(1);
	   c_etapp->Draw();
	   c11->cd(2);
	   c_etaAp->Draw();
	   c11->cd(3);
	   c_etapA->Draw();
	   c11->SaveAs("f1.gif");
	   */


	// Create a new root file
	TFile* newfile_data = new TFile(outname.data(),"recreate");

	TTree* newtreePhoton;
	float newPt[nMaxPho];  // <<= temporary space
	int order[nMaxPho];
	float corrPt[nMaxPho];
	newtreePhoton = c->photonTree->CloneTree(0);
	newtreePhoton->SetName("yPhotonTree");
	newtreePhoton->SetMaxTreeSize(MAXTREESIZE);
	newtreePhoton->Branch("order",  order, "order[nPhotons]/I");
	newtreePhoton->Branch("corrPt", corrPt,"corrPt[nPhotons]/F");

	TTree* treeFullJet;
	if (   (colli==kPPDATA) || (colli==kPPMC) ) {
		//treeFullJet = c->ak3jetTree->CloneTree(0);
		treeFullJet = c->ak3PFJetTree->CloneTree(0);
		cout << "pp collision.  Using ak3PF Jet Algo" << endl<<endl;
	}
	else {
		//treeFullJet = c->akPu3jetTree->CloneTree(0);
		treeFullJet = c->akPu3PFJetTree->CloneTree(0);
		cout << "PbPb or pPb collision. Using akPu3PF Jet Algo" << endl<<endl;
	}
	treeFullJet->SetName("fullJet");
	treeFullJet->SetMaxTreeSize(MAXTREESIZE);
#if 1
	TTree* treeGenp;
	if (   (colli==kHIMC ) || (colli==kPPMC) || (colli==kPAMC) ) {
		treeGenp =  c->genParticleTree->CloneTree(0);
		treeGenp->SetName("genparTree");
		//treeGenp =  c->genpTree->CloneTree(0);
		//treeGenp->SetName("genparTree");
		treeGenp->SetMaxTreeSize(MAXTREESIZE);
	}
#endif


	// jet tree!
	int nJet;
	const int MAXJET = 50000; // to accomodate 100 smeared jets, need to be careful with ram
	float jetPt[MAXJET];
	float jetEta[MAXJET];
	float jetPhi[MAXJET];
	float jetDphi[MAXJET];
	int jetSubid[MAXJET];
	float jetRefPt[MAXJET];
	float jetRefEta[MAXJET];
	float jetRefPhi[MAXJET];
	float jetRefDphi[MAXJET];
	float jetRefPartonPt[MAXJET];
	int  jetRefPartonFlv[MAXJET];

	TTree *newtreeJet = new TTree("yJet","jets");
	newtreeJet->SetMaxTreeSize(MAXTREESIZE);
	newtreeJet->Branch("nJet",&nJet,"nJet/I");
	newtreeJet->Branch("pt",jetPt,"pt[nJet]/F");
	newtreeJet->Branch("eta",jetEta,"eta[nJet]/F");
	newtreeJet->Branch("phi",jetPhi,"phi[nJet]/F");
	newtreeJet->Branch("dphi",jetDphi,"dphi[nJet]/F");
	if ( isMC )  {
		newtreeJet->Branch("subid",jetSubid,"subid[nJet]/I");
		newtreeJet->Branch("refPt",jetRefPt,"refPt[nJet]/F");
		newtreeJet->Branch("refEta",jetRefEta,"refEta[nJet]/F");
		newtreeJet->Branch("refPhi",jetRefPhi,"refPhi[nJet]/F");
		newtreeJet->Branch("refDphi",jetRefDphi,"refDphi[nJet]/F");
		newtreeJet->Branch("refPartonPt",jetRefPartonPt,"refPartonPt[nJet]/F");
		newtreeJet->Branch("refPartonFlv",jetRefPartonFlv,"refPartonFlv[nJet]/I");
	}



	int nMjet;
	float mJetPt[MAXMJET];
	float mJetEta[MAXMJET];
	float mJetPhi[MAXMJET];
	float mJetDphi[MAXMJET];

	TTree * tmixJet = new TTree("mJet","Jet from minbias events");
	tmixJet->SetMaxTreeSize(MAXTREESIZE);
	tmixJet->Branch("nJet",&nMjet,"nJet/I");
	tmixJet->Branch("pt",mJetPt,"pt[nJet]/F");
	tmixJet->Branch("eta",mJetEta,"eta[nJet]/F");
	tmixJet->Branch("phi",mJetPhi,"phi[nJet]/F");
	tmixJet->Branch("dphi", mJetDphi, "dphi[nJet]/F");



	// Imb = Input MinBias events
	EvtSel          evtImb;
	Int_t           nJetImb;
	Float_t         jetPtImb[100];
	Float_t         jetEtaImb[100];
	Float_t         jetPhiImb[100];
	TBranch        *b_evt;
	TBranch        *b_nJetImb;
	TBranch        *b_jetPtImb;
	TBranch        *b_jetEtaImb;
	TBranch        *b_jetPhiImb;


	int nCentBins =  nCentBinSkim;
	if ((colli==kPADATA)||(colli==kPAMC)) {
		nCentBins = nCentBinSkimPA;
	}

	TChain   *tjmb[100][nVtxBin+1];
	int nMB[100][nVtxBin+1] ; //= 199109;
	int mbItr[100][nVtxBin+1];
	if ( doMix ) {
		cout <<"  Tree initialization for MinBias mixing" << endl;
		for( int icent = 0 ; icent< nCentBins ; icent++) {
			for( int ivz = 1 ; ivz<=nVtxBin ; ivz++) {

				tjmb[icent][ivz] = new TChain(Form("trkAndJets_first_cBin2icent%d_ivz%d",icent,ivz));
				tjmb[icent][ivz]->Add(MinbiasFname.data());
				tjmb[icent][ivz]->SetBranchAddress("evt", &evtImb,&b_evt);
				tjmb[icent][ivz]->SetBranchAddress("nJet",   &nJetImb,   &b_nJetImb);
				tjmb[icent][ivz]->SetBranchAddress("jetPt",  &jetPtImb,  &b_jetPtImb);
				tjmb[icent][ivz]->SetBranchAddress("jetEta", &jetEtaImb, &b_jetEtaImb);
				tjmb[icent][ivz]->SetBranchAddress("jetPhi", &jetPhiImb, &b_jetPhiImb);


				nMB[icent][ivz] = tjmb[icent][ivz]->GetEntries();
				cout << "number of evetns in (icent = " << icent << ", ivtxZ = "<< ivz << ")  = " << nMB[icent][ivz] << endl;
				int primeSeed = rand.Integer(37324);
				mbItr[icent][ivz] = primeSeed%(nMB[icent][ivz]);
				cout <<" initial itr = " << mbItr[icent][ivz] << endl;
			}
		}
	}
	else
		cout << endl << endl << "  Mixing process is skipped" << endl << endl << endl ;


	// reweighting factor should go here
	int eTot(0), eSel(0);
	EvtSel evt;
	GammaJet gj;
	Isolation isol;
	TTree *tgj;
	tgj = new TTree("tgj","gamma jet tree");
	tgj->SetMaxTreeSize(MAXTREESIZE);
	tgj->Branch("evt",&evt.run,"run/I:evt:cBin:pBin:trig/O:offlSel:noiseFilt:anaEvtSel:vz/F:vtxCentWeight/F:hf4Pos:hf4Neg:hf4Sum:ptHat:ptHatWeight");
	tgj->Branch("lpho",&gj.photonEt,"photonEt/F:photonRawEt:photonEta:photonPhi:hovere:r9:sigmaIetaIeta:sumIso:genIso:genPhotonEt:genMomId/I:lJetPt/F:lJetEta:lJetPhi:lJetDphi:lJetSubid/I");
	tgj->Branch("isolation",&isol.cc1,"cc1:cc2:cc3:cc4:cc5:cr1:cr2:cr3:cr4:cr5:ct1PtCut20:ct2PtCut20:ct3PtCut20:ct4PtCut20:ct5PtCut20:ecalIso:hcalIso:trackIso");  // ecalIso,hcalIso,trackIso are the pp style isolation


	float vzCut = vtxCutPhotonAna;
	TH1F* hvz = new TH1F("hvz","",nVtxBin,-vzCut,vzCut);
	// event plane hitogram
	TH1F* hEvtPlnBin = new TH1F("hEvtPlnBin", "", nPlnBin, -PI/2., PI/2.);
	// jet algos
	Jets* theJet;
	Jets* genJetTree;
	if (   (colli==kPPDATA) || (colli==kPPMC) ) {
		theJet = &(c->ak3PF) ;
		cout << "pp collision.  Using ak3PF Jet Algo" << endl<<endl;
	}
	else {
		theJet = &(c->akPu3PF) ;
		cout << "PbPb or pPb collision. Using akPu3PF Jet Algo" << endl<<endl;
	}
	genJetTree = &(c->akPu3PF);

	//////// Kaya's modificiation ////////
	EventMatchingCMS* eventMatcher=new EventMatchingCMS();
	bool eventAdded;
	Long64_t duplicateEvents = 0;
	//////// Kaya's modificiation - END ////////

	// Loop starts.
	int nentries = c->GetEntries();
	cout << "number of entries = " << nentries << endl;
	for (Long64_t jentry = 0 ; jentry < nentries; jentry++) {
		eTot++;
		if (jentry% 2000 == 0)  {
			cout <<jentry<<" / "<<nentries<<" "<<setprecision(2)<<(double)jentry/nentries*100<<endl;
		}

		c->GetEntry(jentry);

		//////// Kaya's modificiation ////////
		eventAdded = eventMatcher->addEvent(c->evt.evt, c->evt.lumi, c->evt.run, jentry);
		if(!eventAdded) // this event is duplicate, skip this one.
		{
			duplicateEvents++;
			continue;
		}
		//////// Kaya's modificiation - END ////////

		// Select events with a generated photon in mid-rapidity
		bool genPhotonFlag=false;
		if ( !isMC )   // fixed the most stupid error
			genPhotonFlag = true;
		else {
#if 0 // there is no genp tree, but is higentree
			for ( int g=0 ; g< c->genp.nPar ; g++)
				if ( c->genp.id[g] != 22 )
					continue;
			if ( fabs( c->genp.momId[g] ) > 22 )
				continue;
			if ( fabs( c->genp.status[g] ) != 1 )
				continue;
			if ( fabs( c->genp.eta[g] ) > cutphotonEta )
				continue;
			if ( c->genp.et[g] < 35 )
				continue;
#endif
			for ( int g=0 ; g< c->genparticle.mult ; g++) {
				if ( c->genparticle.pdg[g] != 22 )
					continue;
				//	if ( fabs( c->genparticle.momId[g] ) > 22 )
				//	  continue;
				//	if ( fabs( c->genparticle.status[g] ) != 1 )
				//	  continue;
				if ( fabs( c->genparticle.eta[g] ) > cutphotonEta )
					continue;
				if ( c->genparticle.pt[g] < cutphotonPt )
					continue;
				genPhotonFlag = true;
			}
		}
		if ( !genPhotonFlag)
			continue;

		evt.clear();
		evt.run   = c->evt.run;
		evt.evt = c->evt.evt;
		evt.hf4Pos = c->evt.hiHFplusEta4;
		evt.hf4Neg = c->evt.hiHFminusEta4;
		evt.hf4Sum = evt.hf4Pos + evt.hf4Neg;
		evt.cBin = -99;
		evt.pBin   = -99 ;
		if ((colli==kHIDATA)||(colli==kHIMC))   {
			evt.cBin = c->evt.hiBin;
			evt.pBin   = hEvtPlnBin->FindBin( c->evt.hiEvtPlanes[theEvtPlNumber] ) ;
		}
		else if ((colli==kPADATA)||(colli==kPAMC))   {
			evt.cBin =  getHfBin(evt.hf4Sum);
			// if (  ((evt.cBin) < 0) || (evt.cBin) > 18 )
			//   cout << " Check the pA centrality..  cbin = " << evt.cBin << endl;
		}

		evt.trig = 0;
		evt.offlSel = (c->skim.pcollisionEventSelection > 0);
		evt.noiseFilt = (c->skim.pHBHENoiseFilter > 0);
		evt.anaEvtSel = c->selectEvent() && evt.trig;
		evt.vz = c->evt.vz;

		int cBin = evt.cBin;
		int vzBin = hvz->FindBin(evt.vz)  ;
		hvz->Fill(evt.vz) ;

		// this was the problem!!! all c->selectEvent() are 0
		//if ( ( (colli==kHIDATA)||(colli==kHIMC)||(colli==kPADATA)||(colli==kPAMC) || (colli==kPPMC) ) && ( c->selectEvent() == 0 ))
		if ( ( (colli==kHIDATA)||(colli==kHIMC) ) && ( c->skim.pcollisionEventSelection == 0 ))
			continue;
		if ( ( (colli==kPADATA)||(colli==kPAMC)||(colli==kPPDATA)||(colli==kPPMC)) && ( c->skim.pPAcollisionEventSelectionPA == 0 )) // yeonju included pp data and pp mc
			continue;
	//	if ( ( (colli==kPPMC) ) && ( c->skim.pcollisionEventSelection == 0 ))
	//		continue;
	//	if ( ( (colli==kPADATA)||(colli==kPPDATA) ) && ( c->skim.pVertexFilterCutGplus ==0 ) ) // No Pile up events
	//		continue;
		if ( (vzBin<1) || ( vzBin > nVtxBin) )
			continue;

		eSel++;      // OK.  This event is a collisional and no-noise event.


		// Reweight for vertex and centrality of MC
		evt.vtxCentWeight = 1;
		double wVtx=1;
		double wCent=1;
		if (colli ==kHIMC) {
			int vBin =  hWeight_vtx_data_pbpb->FindBin(evt.vz);
			wVtx =   hWeight_vtx_data_pbpb->GetBinContent(vBin) / hWeight_vtx_mc_pbpb->GetBinContent(vBin) ;
			wCent =  hWeight_cent_data_pbpb->GetBinContent(evt.cBin+1) / hWeight_cent_mc_pbpb->GetBinContent(evt.cBin+1) ;
		}
		else if ( colli ==kPPMC) {
			int vBin =  hWeight_vtx_data_pp->FindBin(evt.vz);
			wVtx =   hWeight_vtx_data_pp->GetBinContent(vBin) / hWeight_vtx_mc_pp->GetBinContent(vBin) ;
		}
		else if ( colli ==kPAMC) {
			int vBin =  hWeight_vtx_data_ppb->FindBin(evt.vz);
			wVtx =   hWeight_vtx_data_ppb->GetBinContent(vBin) / hWeight_vtx_mc_ppb->GetBinContent(vBin) ;
		}
		evt.vtxCentWeight = wVtx * wCent;

		evt.ptHat = -1;
		evt.ptHatWeight = 1;
		evt.ptHat = c->photon.ptHat;

		// if( colli == kPAMC && evt.ptHat > maxpthat ) // pA samples don't use ptHatCutter.C.
		//	continue;
		if (colli ==kHIMC) {
			if ( evt.ptHat < 50  )       evt.ptHatWeight = 9008/16237. ;
			else if ( evt.ptHat < 80  )       evt.ptHatWeight = 3750/85438. ;
			else   evt.ptHatWeight =  1191/140432. ;
		}
        else if ( colli == kPPMC) { // pp has only 4 pthat samples
            if ( evt.ptHat > 30 && evt.ptHat < 50  )       evt.ptHatWeight = 156861/156861. ;
            else if ( evt.ptHat > 50 && evt.ptHat < 80  )       evt.ptHatWeight = 33610/193462. ;
            else if ( evt.ptHat > 80 && evt.ptHat < 120  )       evt.ptHatWeight = 5757/195174. ;
            else   evt.ptHatWeight = 1272/236703. ;
            //  if ( evt.ptHat < 50  )       evt.ptHatWeight = 9008/9008. ;
            //  else if ( evt.ptHat < 80  )       evt.ptHatWeight = 3750/40109. ;
            //  else   evt.ptHatWeight = 1191/66934. ;
    	}
		else if ( colli == kPAMC) { 
			if ( evt.ptHat > 30 && evt.ptHat < 50  )       evt.ptHatWeight = 62744/62744. ;
			else if ( evt.ptHat > 50 && evt.ptHat < 80  )       evt.ptHatWeight = 29499/107309. ;
			else if ( evt.ptHat > 80 && evt.ptHat < 120  )       evt.ptHatWeight = 7640/106817. ;
			else if ( evt.ptHat > 120 && evt.ptHat < 170  )       evt.ptHatWeight = 1868/104443. ;
			else   evt.ptHatWeight = 649/139647. ;
		}



		for (int j=0;j< c->photon.nPhotons;j++) {

			if (  ( c->photon.pt[j] > preCutPhotonEt ) && ( fabs( c->photon.eta[j] ) < cutphotonEta ) ) {
				newPt[j] = c->getCorrEt(j);
			}
			else
				newPt[j] = c->photon.pt[j] - 10000;

		//	if ( (c->isSpike(j)) || (c->photon.hadronicOverEm[j]>0.2) || (c->photon.isEle[j]))  // Electron Rejection should be default.
			if ( (c->isSpike(j)) || (c->photon.hadronicOverEm[j]>0.2) ) //||  (c->photon.isEle[j])  // This is for no Electron Rejection case.
				newPt[j] = newPt[j] - 20000;
			if (c->photon.seedTime[j] ==0 )   // clustering bug
				newPt[j] = newPt[j] - 30000;

			corrPt[j] = newPt[j];
		}

		TMath::Sort(c->photon.nPhotons, newPt, order);


		// Select the leading photon
		gj.clear();
		int leadingIndex=-1;
		for (int j=0;j<c->photon.nPhotons;j++) {
			if ( c->photon.pt[j]  < preCutPhotonEt ) continue;
			if ( fabs(c->photon.eta[j]) > cutphotonEta ) continue;
			if (c->isSpike(j)) continue;
			//   if (!(c->isLoosePhoton(j))) continue;
			if (c->photon.hadronicOverEm[j]>0.1) continue;
			if ((c->photon.rawEnergy[j]/c->photon.energy[j])<0.5) continue;



			// sort using corrected photon pt
			float theCorrPt= corrPt[j];
			if ( theCorrPt > gj.photonEt) {
				gj.photonEt = theCorrPt;
				leadingIndex = j;
			}
		}
		//    if ( (gj.photonEt < cutphotonPt) )    <== This cut ruins the ptHat weighting factor
		//  continue;


		/// Save leading photons
		if (leadingIndex!=-1) {
			gj.photonRawEt=c->photon.pt[leadingIndex];
			gj.photonEta=c->photon.eta[leadingIndex];
			gj.photonPhi=c->photon.phi[leadingIndex];
			gj.hovere=c->photon.hadronicOverEm[leadingIndex];
			gj.r9=c->photon.r9[leadingIndex];
			gj.sigmaIetaIeta=c->photon.sigmaIetaIeta[leadingIndex];
			gj.sumIsol = (c->photon.cr4[leadingIndex]+c->photon.cc4[leadingIndex]+c->photon.ct4PtCut20[leadingIndex]) / 0.9;
			gj.genIso   = c->photon.genCalIsoDR04[leadingIndex];
			gj.genPhotonEt = c->photon.genMatchedPt[leadingIndex];
			gj.genMomId = c->photon.genMomId[leadingIndex];
			isol.Set(c,leadingIndex);
		}
		else {
			gj.clear();
		}
		if ( (colli==kPADATA) && ( evt.run > 211256 ) )  {
			gj.photonEta = - gj.photonEta;
		}



		///////////////////// Skimmed Jet tree ///////////////////////////////////
		nJet = 0 ;

		int jetEntries = 0;
		if (useGenJetColl )    jetEntries = theJet->ngen;
		else                   jetEntries = theJet->nref;

		int nSmear = 1;
		if(smearingCentBin != -1)
			nSmear = 100;

		for(int iSmear =0; iSmear < nSmear; iSmear++){ // iSmear loop have to be here, before Jet loop. mis-ordered for loops ruins jetrefpt values.
			for (int ij=0; ij< jetEntries ; ij++) {
				if ( gj.photonEt < 0 )    continue ;    // If there is no photon in this event
				if (  useGenJetColl )   {
					jetPt[nJet] = theJet->genpt[ij];
					jetEta[nJet] = theJet->geneta[ij];
					jetPhi[nJet] = theJet->genphi[ij];
				}
				else  {
					jetPt[nJet] = theJet->jtpt[ij];
					jetEta[nJet] = theJet->jteta[ij];
					jetPhi[nJet] = theJet->jtphi[ij];
				}

				// Smear phi
				Double_t newPhi = jetPhi[nJet] ;
				if( smearingCentBin != -1 )
				{
					Double_t phiSmear  = TMath::Sqrt((cphi_pbpb[smearingCentBin]*cphi_pbpb[smearingCentBin] - cphi_pp*cphi_pp)
							+ (sphi_pbpb[smearingCentBin]*sphi_pbpb[smearingCentBin] - sphi_pp*sphi_pp)/jetPt[nJet]
							+ (nphi_pbpb[smearingCentBin]*nphi_pbpb[smearingCentBin] - nphi_pp*nphi_pp)/(jetPt[nJet]*jetPt[nJet]));
					newPhi  =  jetPhi[nJet] +   rand.Gaus(0, phiSmear);
					while ( fabs(newPhi) > PI )  {
						if ( newPhi > PI )  newPhi = newPhi - 2*PI;
						if ( newPhi < -PI )  newPhi = newPhi + 2*PI;
					}
				}
				jetPhi[nJet] = newPhi;


				// smear the jet pT
				//float smeared = jetPt[nJet] * rand.Gaus(1,addJetEnergyRes/jetPt[nJet])   *  rand.Gaus(1, addFlatJetEnergyRes) ;
				Double_t smeared = jetPt[nJet] * rand.Gaus(1, addFlatJetEnergyRes);
				if( smearingCentBin != -1 )
				{
					Double_t smearSigma = TMath::Sqrt((c_pbpb[smearingCentBin]*c_pbpb[smearingCentBin] - c_pp*c_pp)
							+ (s_pbpb[smearingCentBin]*s_pbpb[smearingCentBin] - s_pp*s_pp)/jetPt[nJet]
							+ (n_pbpb[smearingCentBin]*n_pbpb[smearingCentBin] - n_pp*n_pp)/(jetPt[nJet]*jetPt[nJet]));
					smeared = jetPt[nJet] * rand.Gaus(1, smearSigma);
				}
				// then multiply jet energy sclae

				// resCorrection
				float resCorrection =1. ;
				float l2l3Corr =1 ;

				if  (doJetResCorrection)   {
					// L2L3 correction!
					if ( colli == kPPDATA)   {
						l2l3Corr = c_etapp->GetBinContent(c_etapp->FindBin(jetEta[nJet])) * fptpp->Eval( jetPt[nJet]);
					}
					else if ( colli == kPADATA)   {
						if ( evt.run > 211256 )
							l2l3Corr = c_etapA->GetBinContent(c_etapA->FindBin(jetEta[nJet]))  * fptpA->Eval( jetPt[nJet]);
						else
							l2l3Corr = c_etaAp->GetBinContent(c_etaAp->FindBin(jetEta[nJet]))  * fptAp->Eval( jetPt[nJet]);
					}
					else if ( colli == kPAMC)
						l2l3Corr = 1 + (fsmear_pA->Eval( jetPt[nJet] )) * fgaus->GetRandom()  ;

					// do the residual correction
					if ((colli==kHIDATA)||(colli==kHIMC))  { 
						if ( evt.cBin  < 12 )   // central
							resCorrection  =  1.04503 -1.6122  /(sqrt(jetPt[nJet])) + 9.27212 / (jetPt[nJet]);  //1.04503    -1.6122    9.27212
						else                  // peripheral
							resCorrection  =  1.00596 -0.653191/(sqrt(jetPt[nJet])) + 4.35373 / (jetPt[nJet]);  //1.00596     -0.653191  4.35373
					}
					else if ((colli==kPPDATA)||(colli==kPPMC)){  // do the residual correction
						resCorrection  = 0.993609  +0.158418/(sqrt(jetPt[nJet])) + 0.335479 / (jetPt[nJet]);//	  0.993609   0.158418   0.335479
					}
					else if ((colli==kPADATA)||(colli==kPAMC)){
						resCorrection = 0.997738 + 0.0221806/(sqrt(jetPt[nJet])) - 0.877999/ (jetPt[nJet]); //C : 0.997738, S : 0.0221806, N : -0.877999 //function derived as a function of gen pt 
						//resCorrection = 0.981365 + 0.342746/(sqrt(jetPt[nJet])) - 2.63018 / (jetPt[nJet]); //C : 0.981365, S : 0.342746, N : -2.63018 //function derived as a function of gen pt //derived from l2l3 corrected sample. 
						//resCorrection = 0.745753 + 6.91646/(sqrt(jetPt[nJet])) - 33.0167 / (jetPt[nJet]); //C : 0.745753, S : 6.91646, N : -33.0167 //function derived as a function of reco pt 
					}

				} // doJetResCorrection

				// reflect eta!
				if ( (colli==kPADATA) && ( evt.run > 211256 ) )  {
					jetEta[nJet] = -jetEta[nJet];
				}

				jetPt[nJet] = smeared * l2l3Corr /resCorrection *jetEnergyScale;



				if ( jetPt[nJet] < cutjetPtSkim)  // double cutjetPtSkim = 15; Oct 19th
					continue;
				if ( fabs( jetEta[nJet] ) > cutjetEtaSkim )     // double cutjetEtaSkim = 3.0; Oct 19th
					continue;
				if ( getDR( jetEta[nJet], jetPhi[nJet], gj.photonEta, gj.photonPhi) < 0.5 )
					continue;


				if (jetPt[nJet] >0)
					jetDphi[nJet] = getAbsDphi( jetPhi[nJet], gj.photonPhi) ;
				else
					jetDphi[nJet] = -1;


				if (  useGenJetColl )   {
					jetSubid[nJet] = -9999;
					jetRefPt[nJet] = -9999;
					jetRefEta[nJet] = -9999;
					jetRefPhi[nJet] = -9999;
					jetRefPt[nJet] =  -9999;
					jetRefPartonPt[nJet] = -9999;
					jetRefPartonFlv[nJet] = -9999;
				}
				else {
					jetRefPt[nJet] = theJet->refpt[ij];
					jetRefEta[nJet] = theJet->refeta[ij];
					jetRefPhi[nJet] = theJet->refphi[ij];
					if (jetRefPt[nJet] >0)
						jetRefDphi[nJet] = getAbsDphi( jetRefPhi[nJet] , gj.photonPhi) ;
					else
						jetRefDphi[nJet] = -1;
					jetRefPartonPt[nJet] = theJet->refparton_pt[ij];
					jetRefPartonFlv[nJet] = theJet->refparton_flavor[ij];

					jetSubid[nJet] = -9999;
					if (jetRefPt[nJet] >0)  {   // Find the collisional subid of this gen jet!!
						for ( int igen=0; igen < genJetTree->ngen ; igen++) {
							if ( jetRefPt[nJet] == genJetTree->genpt[igen] )
								jetSubid[nJet] = genJetTree->gensubid[igen] ;
						}

						if ( jetSubid[nJet] == -9999 ) // No genJet matched!
							cout << " WARNING!  This reco jet was not matched to anyone in the gen jet collection!!! " << endl;

					}
				}

				nJet++ ;
			}// ij for loop
		}// iSmear for loop


		//////// Leading jet kinematics in dphi>7pi/8
		float maxJpt = 0;
		int jetLeadingIndex = -1;

		for (int ij=0; ij< nJet ; ij++) {
			if ( jetDphi[ij] < awayRange )  // const float awayRange= PI * 7./8.;
			continue;
			if ( fabs( jetEta[ij] ) > cutjetEta )  // double cutjetEta = 1.6;
			continue;
			if ( jetPt[ij] > maxJpt) {
				maxJpt = jetPt[ij] ;
				jetLeadingIndex = ij;
			}
		}
		if ( jetLeadingIndex > -1 ) {
			gj.lJetPt = jetPt[jetLeadingIndex];
			gj.lJetEta = jetEta[jetLeadingIndex];
			gj.lJetPhi = jetPhi[jetLeadingIndex];
			gj.lJetDphi =  jetDphi[jetLeadingIndex];
			gj.lJetSubid=  jetSubid[jetLeadingIndex];
		}
		else {
			gj.lJetPt = -1;
			gj.lJetEta = 999;
			gj.lJetPhi = 999;
			gj.lJetDphi = 0;
			gj.lJetSubid=  -99;
		}


		int nMixing = nMixing1;
		nMjet = 0;
		bool noSuchEvent = false;
		int iMix=0;
		int loopCounter=0;

		if ( !doMix )
			iMix = nMixing+1;   // Mixing step will be skipped

		while (iMix<nMixing)  {
			loopCounter++;
			if ( loopCounter > nMB[cBin][vzBin]+1) {
				iMix = 999999 ;
				noSuchEvent = true;
				cout << " no such event!! :  icent = " << cBin << ",  vzBin = " << vzBin << ",  pBin = " << evt.pBin << endl;
				continue;
			}

			mbItr[cBin][vzBin] = mbItr[cBin][vzBin] + 1;
			if ( mbItr[cBin][vzBin] == nMB[cBin][vzBin] )
				mbItr[cBin][vzBin] =  mbItr[cBin][vzBin] - nMB[cBin][vzBin];

			/// Load the minbias tracks!!
			tjmb[cBin][vzBin]->GetEntry(mbItr[cBin][vzBin]);



			// ok found the event!! ///////////
			loopCounter =0;  // Re-initiate loopCounter
			// Jet mixing
			for (int it = 0 ; it < nJetImb ; it++) {
				if ( gj.photonEt < 0 )  continue;
				// Smear phi
				Double_t newPhi = jetPhiImb[it];
				if( smearingCentBin != -1 )
				{
					Double_t phiSmear  = TMath::Sqrt((cphi_pbpb[smearingCentBin]*cphi_pbpb[smearingCentBin] - cphi_pp*cphi_pp)
							+ (sphi_pbpb[smearingCentBin]*sphi_pbpb[smearingCentBin] - sphi_pp*sphi_pp)/jetPtImb[it]
							+ (nphi_pbpb[smearingCentBin]*nphi_pbpb[smearingCentBin] - nphi_pp*nphi_pp)/(jetPtImb[it]*jetPtImb[it]));
					newPhi  =  jetPhiImb[it] +   rand.Gaus(0, phiSmear);
					while ( fabs(newPhi) > PI )  {
						if ( newPhi > PI )  newPhi = newPhi - 2*PI;
						if ( newPhi < -PI )  newPhi = newPhi + 2*PI;
					}
				}
				jetPhiImb[it] = newPhi;


				// smear the jet pT
				//float smeared = jetPtImb[it] * rand.Gaus(1,addJetEnergyRes/jetPtImb[it]) *  rand.Gaus(1, addFlatJetEnergyRes) ;
				Double_t smeared = jetPtImb[it] *  rand.Gaus(1, addFlatJetEnergyRes);
				if( smearingCentBin != -1 )
				{
					Double_t smearSigma = TMath::Sqrt((c_pbpb[smearingCentBin]*c_pbpb[smearingCentBin] - c_pp*c_pp)
							+ (s_pbpb[smearingCentBin]*s_pbpb[smearingCentBin] - s_pp*s_pp)/jetPtImb[it]
							+ (n_pbpb[smearingCentBin]*n_pbpb[smearingCentBin] - n_pp*n_pp)/(jetPtImb[it]*jetPtImb[it]));
					smeared = jetPtImb[it] * rand.Gaus(1, smearSigma);
				}
				float resCorrection =1. ;
				float l2l3Corr =1 ;

				if  (doJetResCorrection)   {
					// L2L3
					if ( colli == kPPDATA)   {
						l2l3Corr = c_etapp->GetBinContent(c_etapp->FindBin(jetEtaImb[it])) * fptpp->Eval( jetPtImb[it]);
					}
					else if ( colli == kPADATA)   {
						if ( evt.run > 211256 )
							l2l3Corr = c_etapA->GetBinContent(c_etapA->FindBin(jetEtaImb[it]))  * fptpA->Eval( jetPtImb[it]);
						else
							l2l3Corr = c_etaAp->GetBinContent(c_etaAp->FindBin(jetEtaImb[it]))  * fptAp->Eval( jetPtImb[it]);
					}
					else if ( colli == kPAMC)
						l2l3Corr = 1 + (fsmear_pA->Eval( jetPtImb[it] )) * fgaus->GetRandom()  ;

					// Correction from MC closure
					if ((colli==kHIDATA)||(colli==kHIMC))  { // do the residual correction
						if ( evt.cBin  < 12 )   // central
							resCorrection  =  1.04503 -1.6122  /(sqrt(jetPtImb[it])) + 9.27212 / (jetPtImb[it]);  //1.04503    -1.6122    9.27212
						else                  // peripheral
							resCorrection  =  1.00596 -0.653191/(sqrt(jetPtImb[it])) + 4.35373 / (jetPtImb[it]);  //1.00596     -0.653191  4.35373
					}
					else if ((colli==kPPDATA)||(colli==kPPMC)){  // do the residual correction
						resCorrection  = 0.993609  +0.158418/(sqrt(jetPtImb[it])) + 0.335479 / (jetPtImb[it]);//          0.993609   0.158418   0.335479
					}
					else if ((colli==kPADATA)||(colli==kPAMC)){
						resCorrection = 0.997738 + 0.0221806/(sqrt(jetPtImb[it])) - 0.877999 / (jetPtImb[it]); //C : 0.997738, S : 0.0221806, N : -0.877999 //function derived as a function of gen pt
						//resCorrection = 0.981365 + 0.342746/(sqrt(jetPtImb[it])) - 2.63018 / (jetPtImb[it]); //C : 0.981365, S : 0.342746, N : -2.63018 //function derived as a function of gen pt//derived from l2l3 corrected sample.
						//resCorrection = 0.745753 + 6.91646/(sqrt(jetPtImb[it])) - 33.0167 / (jetPtImb[it]); //C : 0.745753, S : 6.91646, N : -33.0167//function derived as a function of reco pt
					}

				}


				float smearedCorrected  = smeared *l2l3Corr / resCorrection *jetEnergyScale; // residual correction

				if ( smearedCorrected < cutjetPtSkim )  // double cutjetPtSkim = 15; Oct 19th
					continue;
				if ( fabs( jetEtaImb[it] ) > cutjetEtaSkim )   // double cutjetEtaSkim = 3.0; Oct 19th
					continue;
				if ( getDR( jetEtaImb[it], jetPhiImb[it], gj.photonEta, gj.photonPhi) < 0.5 )  // This cut added for consistency ; Oct 19th
					continue;

				mJetPt[nMjet]    = smearedCorrected;
				mJetEta[nMjet]   = jetEtaImb[it];
				mJetPhi[nMjet]   = jetPhiImb[it];
				if  ( mJetPt[nMjet]>0 )
					mJetDphi[nMjet]  =   getAbsDphi(mJetPhi[nMjet], gj.photonPhi) ;
				else
					mJetDphi[nMjet]=-1;

				nMjet++; // < == Important!
			}

			iMix++;
		}
		if ( noSuchEvent )
			continue;

		tgj->Fill();
		newtreeJet->Fill();
		tmixJet->Fill();
		newtreePhoton->Fill();
		treeFullJet->Fill();
		if (   (colli==kHIMC ) || (colli==kPPMC) || (colli==kPAMC) )
			treeGenp->Fill();
	}

	newfile_data->Write();
	//   newfile_data->Close();   // <<=== If there is close() function. writing stucks in the middle of looping.. I don't know why!!
	cout << " Done! "<< endl;
	cout << "    " << eSel<<" out of total "<<eTot<<" events were analyzed."<<endl;
	cout << "Duplicate events  = " << duplicateEvents << endl;
}
void analyzeTrackingCorrection(
   TString jetAlgo = "ak3PF",
   TString trkCol = "ppTrack",
//   TString trkCol = "anaTrack",
 //  TString inname="/mnt/hadoop/cms/store/user/yenjie/HiForest_v27/Dijet${pthat}_HydjetDrum_v27_mergedV1.root",
 //  TString inname="/mnt/hadoop/cms/store/user/yenjie/HiForest_v27/Dijet80_HydjetDrum_v27_mergedV1.root",
 //  TString outname="trkcorr/test/TrkCorrtest_hy18dj100.root",
   TString coll = "PbP",
 //  double samplePtHat=0,
//   double ptHatMax=9999,
//   double sampleWeight = 1,
   double cutPtTrk=0.5,
   double vzMax = 15,
   int maxEntries = -1,
   double leadingJetPtMin=100,
   double subleadingJetPtMin=-1,
   double sigDPhi=-1,
   bool genJetMode=false
) {
    samplePtHat = atoi(getenv("PTHAT")) ;
    cout <<"PTHAT =" <<samplePtHat<<endl ;
//  samplePtHat = pthat ;
  double xsection=0;
  double xup=0;
  double xsub=0;
  TString COM = "5TeV" ;
 if(coll=="PP" || coll=="PbPb"){
  if(samplePtHat==15){
    ptHatMax=30;
    xup =2.034E-01;
    xsub=1.075E-02;
  }
  else if(samplePtHat==30){
     ptHatMax=50;
    xup =1.075E-02;
    xsub=1.025E-03;
  }
  else if(samplePtHat==50){
     ptHatMax=80;
    xup =1.025E-03;
    xsub=9.865E-05;
  }
  else if(samplePtHat==80){
     ptHatMax=120;
    xup =9.865E-05;
    xsub=1.129E-05;
  }
  else if(samplePtHat==120){
     ptHatMax=170;
    xup=1.129E-05;
    xsub=1.465E-06;
  }else if(samplePtHat==170){
     ptHatMax=200;
    xup=1.465E-06;
    xsub=5.310E-07;
  }else if(samplePtHat==200){
     ptHatMax=250;
    xup =5.310E-07;
    xsub=1.192E-07;
  }else if(samplePtHat==250){
     ptHatMax=300;
    xup =1.192E-07;
    xsub=3.176E-08;
  }else if(samplePtHat==300){
     ptHatMax=9999;
    xup =3.176E-08;
    xsub=0;
  }
   }
 else { //for pPb at 5 TeV cross section
  if(samplePtHat==15){
    ptHatMax=30;
    xup =5.335E-01;
    xsub=3.378E-02;
  }
  else if(samplePtHat==30){
     ptHatMax=50;
    xup =3.378E-02;
    xsub=3.778E-03;
  }
  else if(samplePtHat==50){
     ptHatMax=80;
    xup =3.778E-03;
    xsub=4.412E-04;
  }
  else if(samplePtHat==80){
     ptHatMax=120;
    xup =4.412E-04;
    xsub=6.147E-05;
  }
  else if(samplePtHat==120){
     ptHatMax=170;
    xup=6.147E-05;
    xsub=1.018E-05;
  }else if(samplePtHat==170){
     ptHatMax=220;
    xup=1.018E-05;
    xsub=2.477E-06;
  }else if(samplePtHat==220){
     ptHatMax=280;
    xup =2.477E-06;
    xsub=6.160E-07;
  }else if(samplePtHat==280){
   //  ptHatMax=9999;
     ptHatMax=370;
    xup =6.160E-07;
    xsub=1.088E-07;
  //  xsub=0;
  }else if(samplePtHat==370){
    ptHatMax=9999;
    xup=1.088E-07;
    xsub=0;
}
}
  xsection = xup-xsub;

  std::cout<<std::endl;
  std::cout<<std::endl;

    if(coll=="PP"){
      //    dataPath= Form("/net/hisrv0001/home/zhukova/scratch/HIHighPt/forest/pthat%d", samplePtHat); //2012 pp MC with HI tracking
       //   dataPath= Form("/mnt/hadoop/cms/store/user/dgulhan/ppHiIterativeTrack/P01/prod24/Signal_Pythia_pt%d/HiForest_v84_merged01", samplePtHat); //MIT path for 2013 pp 2.76 TeV with HI tracking
          dataPath= Form("/mnt/hadoop/cms/store/user/dgulhan/pPb/HP04/prod16/Signal_Pythia_pt%d/HiForest_v77_v2_merged01", samplePtHat); //MIT path for 2013 pp 5 TeV with pp tracking
  //        dataPath= Form("/mnt/hadoop/cms/store/user/dgulhan/pp2013/P01/prod22/Signal_Pythia_pt%d/HiForest_v81_merged01", samplePtHat); //lxplus path for 2013 pp with pp tracking
       //   intputFile=Form("mergedFile.root");  //! 2012 pp MC with HI tracking
        //  intputFile=Form("pt%d_JEC_ppHiIterativeTrack_P01_prod24_v84_merged_forest_0.root", samplePtHat);  //! 2013 pp 2.76 TeV with HI tracking
          intputFile=Form("pt%d_HP04_hiforest77_hiSignal.root", samplePtHat);  //! 2013 pp 5 TeV with pp tracking
        //  intputFile=Form("pt%d_pp2013_P01_prod22_v81_merged_forest_0.root", samplePtHat); //pp tracking 
          }
    else if(coll=="PbPb"){
           if(samplePtHat==50||samplePtHat==80||samplePtHat==100||samplePtHat==170){
             dataPath= Form("/mnt/hadoop/cms/store/user/yenjie/HiForest_v27/"); //MIT MC normial
              intputFile=Form("Dijet%d_HydjetDrum_v27_mergedV1.root", samplePtHat);
            }
           else {
                dataPath= Form("/mnt/hadoop/cms/store/user/yenjie/HiForest_v28/"); //MIT MC normial
                intputFile=Form("Dijet%d_HydjetDrum_v28_mergedV1.root", samplePtHat);
               }
        }
   else {    
    //   dataPath= Form("/mnt/hadoop/cms/store/user/dgulhan/pPb/HP04/prod16/Hijing_Pythia_pt%d/HiForest_v77_merged01", samplePtHat); //MC pPb sample
    //   intputFile=Form("pt%d_HP04_prod16_v77_merged_forest_0.root",samplePtHat);
    //for Pbp MC input   
       dataPath=Form("/mnt/hadoop/cms/store/user/dgulhan/Pbp/HP05/prod24/Hijing_Pythia_pt%d/HiForest_v84_merged02", samplePtHat);  //! MC Pbp sample
       intputFile=Form("pt%d_HP05_prod24_v84_merged_forest_0.root",samplePtHat);
      
  }
    
   TString inname=Form("%s/%s", dataPath.Data(),intputFile.Data());

 //  TString outname=Form("TrkCorrtest_pp2013HITracking_Sigdj%d.root",samplePtHat);
 //  TString outname=Form("TrkCorr_pythia5TeV_Sigdj%d.root",samplePtHat);
   TString outname=Form("TrkCorr_%s%s%sEff_dj%d.root",COM.Data(), coll.Data(),trkCol.Data(),samplePtHat);

   TH1::SetDefaultSumw2();
   TString tag=Form("%s_%.0f_%.0f_%.0f_genJetMode%d",jetAlgo.Data(),leadingJetPtMin,subleadingJetPtMin,sigDPhi*1000,genJetMode);
   outname.ReplaceAll(".root",Form("_%s.root",tag.Data()));
   cout << "Input: " << inname << endl;
   cout << "Sample pthat = " << samplePtHat << " ptHatMax = " << ptHatMax << endl;
   cout << "Track pt min = " << cutPtTrk << endl;
   cout << "skim: leading Jet > " << leadingJetPtMin << " subleading > " << subleadingJetPtMin << " dphi > " << sigDPhi  << endl;
   cout << "Genjet mode: " << genJetMode << endl;
   cout << "Output: " << outname << endl;

   ///////////////////////////////////////////////////
   // Setup Analysis
   ///////////////////////////////////////////////////
   double cutjetPt = 40;
   double cutjetEta = 2;
   double cutEtaTrk = 2.4;
   

   // Define the input file and HiForest
//    HiForest * c = new HiForest(inname,"mergedTrack");
 //  HiForest * c = new HiForest(inname,trkCol.Data());
   HiForest * c ;
   if(COM=="5TeV") 
       c = new HiForest(inname.Data(),trkCol.Data(),cPPb);
  else if(coll=="PP")
       c = new HiForest(inname.Data(),trkCol.Data(),cPP);
  else 
       c = new HiForest(inname.Data(),trkCol.Data(),cPbPb);
    c->doTrackCorrections = false;
   c->InitTree();

   // intialize jet variables
   Jets * anajet = 0;
   if (jetAlgo=="akPu3PF") anajet = &(c->akPu3PF);
   else if (jetAlgo=="ak3PF") anajet = &(c->ak3PF);
   else {
      cout << "Fatal Error: jetalgo " << jetAlgo << " not defined" << endl;
      exit(1);
   }
   
   // Output file
   cout << "Output: " << outname << endl;
   TFile *output = new TFile(outname,"recreate");

   EvtSel evt;
   DiJet gj;
//    TrkReso trkRes1(1.6);

   ///////////////////////////////////////////////////
   // Book Histograms
   ///////////////////////////////////////////////////
   // Tracking Corrections
   TrkCorrHisAna effMergedGeneral("Forest2_MergedGeneral",output,40,coll.Data());
   effMergedGeneral.DeclareHistograms();

   TrkCorrHisAna effMergedGeneral_j1("Forest2_MergedGeneral_j1",output,40,coll.Data());
   effMergedGeneral_j1.DeclareHistograms();

   TrkCorrHisAna effMergedGeneral_j2("Forest2_MergedGeneral_j2",output,40,coll.Data());
   effMergedGeneral_j2.DeclareHistograms();

   TrkCorrHisAna effMergedGeneral_jetfine("Forest2_MergedGeneral_jetfine",output,40,coll.Data());
   effMergedGeneral_jetfine.jetBins.clear();
 //  float fineJetBins[10] = {0,40,80,100,120,160,200,250,500,1000};
   float fineJetBins[] = {0,40, 60, 80,100, 120, 160, 200, 300, 500, 1000};
   effMergedGeneral_jetfine.jetBins.insert(effMergedGeneral_jetfine.jetBins.begin(),fineJetBins,fineJetBins+9);
   effMergedGeneral_jetfine.DeclareHistograms();

   // basics
   output->cd();
   TH1D * hCent = new TH1D("hCent","",100,0,100);
   TH1D * hVz = new TH1D("hVz","",60,-30,30);
   TH1D * hPtHatBeforeSel = new TH1D("hPtHatBeforeSel","",200,0,1000);
   TH1D * hPtHat = new TH1D("hPtHat","",200,0,1000);
   TH2D * hJetPt2D = new TH2D("hJetPt2D","",100,0,500,100,0,500);
   TH1D * hJDPhi = new TH1D("hJDPhi","",40,0,Pi());
   TH1D * hAj = new TH1D("hAj","",32,0,0.8);

   // In separate centrality bins
   vector<TH1D*> vhCent;
   vector<TH1D*> vhPtHat;
   vector<TH1D*> vhPtHatBeforeSel;
   vector<TH2D*> vhJetPt2D;
   for (int ib=0; ib<(Int_t)effMergedGeneral.centBins.size()-1; ++ib) {
      vhCent.push_back(new TH1D(Form("hCent_c%d",ib),
    //  Form("cbin%dto%d;Centrality Bin;",effMergedGeneral.centBins[ib],effMergedGeneral.centBins[ib+1]),40,0,40));
      Form("cbin%dto%d;Centrality Bin;",effMergedGeneral.centBins[ib],effMergedGeneral.centBins[ib+1]),100,0,100));
      vhPtHat.push_back(new TH1D(Form("hPtHat_c%d",ib),"",200,0,1000));
      vhPtHatBeforeSel.push_back(new TH1D(Form("hPtHatBeforeSel_c%d",ib),"",200,0,1000));
      vhJetPt2D.push_back(new TH2D(Form("hJetPt2D_c%d",ib),"",100,0,500,100,0,500));
   }

   ///////////////////////////////////////////////////
   // Main loop
   ///////////////////////////////////////////////////
   if (maxEntries<0) maxEntries = c->GetEntries();
   for (int i=0;i<maxEntries;i++) {
      c->GetEntry(i);
      evt.cBin = c->evt.hiBin;
      evt.evtPlane = c->evt.hiEvtPlanes[21];
      evt.nJ = anajet->nref;
      evt.nT = c->track.nTrk;
      evt.offlSel = (c->skim.pcollisionEventSelection > 0);
      if (!c->hasSkimTree) evt.offlSel = (c->evt.hiNtracks>0 && c->evt.hiHFplus>=4 && c->evt.hiHFminus>=4);
      evt.vz = c->track.vz[1];
    //  evt.sampleWeight = sampleWeight/maxEntries; // for different mc sample, 1 for data
      sampleWeight =  xsection/(maxEntries/100000.);
      evt.sampleWeight = sampleWeight; // for different mc sample, 1 for data
      evt.pthat = anajet->pthat;
      evt.samplePtHat = samplePtHat;

      if (i%1000==0) cout <<i<<" / "<< maxEntries << " pthat: " << evt.pthat << " cBin: " << evt.cBin << " nT: " << evt.nT <<endl;

      // initialize
      int leadingIndex=-1,genLeadingIndex=-1;
      int awayIndex=-1,genAwayIndex=-1;
      gj.clear();
      
      ///////////////////////////////////////////////////////
      // Find Leading jets
      ///////////////////////////////////////////////////////
      for (int j=0;j<anajet->nref;j++) {
         if (anajet->jtpt[j]<cutjetPt) continue;
         if (fabs(anajet->jteta[j])>cutjetEta) continue;
          if(anajet->trackMax[j]/anajet->jtpt[j] <=0.01) continue ;
         if (anajet->jtpt[j] > gj.pt1) {
            gj.pt1 = anajet->jtpt[j];
            leadingIndex = j;
         }
      }

      // Found a leading jet which passed basic quality cut!
      if (leadingIndex!=-1) {
         // set leading jet
         gj.pt1raw=anajet->rawpt[leadingIndex];
         gj.eta1=anajet->jteta[leadingIndex];
         gj.phi1=anajet->jtphi[leadingIndex];
         gj.ref1pt = anajet->refpt[leadingIndex];
         gj.ref1eta = anajet->refeta[leadingIndex];
         gj.ref1phi = anajet->refphi[leadingIndex];
         gj.ref1partonpt = anajet->refparton_pt[leadingIndex];
         gj.ref1partonflavor = anajet->refparton_flavor[leadingIndex];
         
         // Loop over jet tree to find a away side leading jet
         gj.nJet=0;
         for (int j=0;j<anajet->nref;j++) {
            if (anajet->jtpt[j]<cutjetPt) continue;
            if (fabs(anajet->jteta[j])>cutjetEta) continue;
            if(anajet->trackMax[j]/anajet->jtpt[j] <=0.01) continue ;
            gj.inclJetPt[gj.nJet] = anajet->jtpt[j];
            gj.inclJetEta[gj.nJet] = anajet->jteta[j];
            gj.inclJetPhi[gj.nJet] = anajet->jtphi[j];
            gj.inclJetRefPt[gj.nJet] = anajet->refpt[j];
            gj.inclJetRefPartonPt[gj.nJet] = anajet->refparton_pt[j];
            if (j!=leadingIndex&&anajet->jtpt[j] > gj.pt2) {
               gj.pt2 = anajet->jtpt[j];
               awayIndex = j;
            }
            ++gj.nJet;
         }

         if (awayIndex !=-1) { // Found an away jet!
            gj.pt2raw = anajet->rawpt[awayIndex];
            gj.eta2   = anajet->jteta[awayIndex];
            gj.phi2   = anajet->jtphi[awayIndex];
            gj.deta   = gj.eta2 - gj.eta1;
            gj.dphi   = deltaPhi(gj.phi2,gj.phi1);
            gj.Aj     = (gj.pt1-gj.pt2)/(gj.pt1+gj.pt2);
            gj.ref2pt = anajet->refpt[awayIndex];
            gj.ref2eta = anajet->refeta[awayIndex];
            gj.ref2phi = anajet->refphi[awayIndex];
            gj.ref2partonpt = anajet->refparton_pt[awayIndex];
            gj.ref2partonflavor = anajet->refparton_flavor[awayIndex];
         }         
      } // end of if leadingIndex
      
      ////////////////////////////////////////
      // Find Leading Genjets
      ////////////////////////////////////////
      // Loop over genjets to look for leading genjet candidate in the event
      for (int j=0;j<anajet->ngen;j++) {
         if (anajet->genpt[j]<cutjetPt) continue;
         if (fabs(anajet->geneta[j])>cutjetEta) continue;
         if (anajet->genpt[j] > gj.genjetpt1) {
            gj.genjetpt1=anajet->genpt[j];
            genLeadingIndex=j;
         }
      }

      if (genLeadingIndex!=-1) {
         gj.genjeteta1=anajet->geneta[genLeadingIndex];
         gj.genjetphi1=anajet->genphi[genLeadingIndex];
      }
      // subleading
      gj.nGenJet=0;
      for (int j=0;j<anajet->ngen;j++) {
         if (anajet->genpt[j]<cutjetPt) continue;
         if (fabs(anajet->geneta[j])>cutjetEta) continue;
         gj.inclGenJetPt[gj.nGenJet] = anajet->genpt[j];
         gj.inclGenJetEta[gj.nGenJet] = anajet->geneta[j];
         gj.inclGenJetPhi[gj.nGenJet] = anajet->genphi[j];
         if (j!=genLeadingIndex && anajet->genpt[j]>gj.genjetpt2) {
            gj.genjetpt2=anajet->genpt[j];
            gj.genjeteta2=anajet->geneta[j];
            gj.genjetphi2=anajet->genphi[j];
         }
         ++gj.nGenJet;
      }
      if (genJetMode) {
         gj.pt1 = gj.genjetpt1;
         gj.eta1 = gj.genjeteta1;
         gj.phi1 = gj.genjetphi1;
         gj.pt2 = gj.genjetpt2;
         gj.eta2 = gj.genjeteta2;
         gj.phi2 = gj.genjetphi2;
         gj.dphi   = deltaPhi(gj.phi2,gj.phi1);
      }

      ///////////////////////////////////////////////////////
      // Skim
      ///////////////////////////////////////////////////////
      if (!evt.offlSel) continue;
    //  if (samplePtHat>0 && evt.pthat>=ptHatMax) continue;
      if (evt.pthat>=ptHatMax) continue;
      if (vzMax>0 && fabs(evt.vz)>vzMax) continue;
      // protection against high pt jet from background event
      if (leadingIndex>=0&&anajet->subid[leadingIndex]>0) continue;
      hPtHatBeforeSel->Fill(evt.pthat);
      for (int ib=0; ib<(Int_t)effMergedGeneral.centBins.size(); ++ib) {
         if(evt.cBin>=effMergedGeneral.centBins[ib] && evt.cBin<effMergedGeneral.centBins[ib+1]){
            vhPtHatBeforeSel[ib]->Fill(evt.pthat);
         }
      }
      // ensure jet distribution unbiased by pthat turn on
      if (leadingJetPtMin>0&&gj.pt1<leadingJetPtMin) continue;
      if (subleadingJetPtMin>0&&gj.pt2<subleadingJetPtMin) continue;
      if (sigDPhi>0&&fabs(gj.dphi)<sigDPhi) continue;
      
      // Fill Baisc Event info
      hCent->Fill(evt.cBin);
      hVz->Fill(evt.vz);
      hPtHat->Fill(evt.pthat);
      hJetPt2D->Fill(gj.pt1,gj.pt2);
      hJDPhi->Fill(fabs(gj.dphi));
      hAj->Fill(gj.Aj);
      for (int ib=0; ib<(Int_t)effMergedGeneral.centBins.size(); ++ib) {
         if(evt.cBin>=effMergedGeneral.centBins[ib] && evt.cBin<effMergedGeneral.centBins[ib+1]){
            vhCent[ib]->Fill(evt.cBin);
            vhPtHat[ib]->Fill(evt.pthat);
            vhJetPt2D[ib]->Fill(gj.pt1,gj.pt2);
         }
      }

      ///////////////////////////////////////////////////////
      // Tracks
      ///////////////////////////////////////////////////////
      // Full Tracks, Pixel Tracks
      Tracks * anaTrks[1] = {&(c->track)};
      for (int it=0; it<anaTrks[0]->nTrk; ++it) {
         // Kinematic Selection
         if (anaTrks[0]->trkPt[it] < cutPtTrk) continue;
         if (fabs(anaTrks[0]->trkEta[it]) > cutEtaTrk) continue;
        // if (anaTrks[0]->trkAlgo[it]>=4&&!anaTrks[0]->highPurity[it]) continue; // quality selection
         if (!anaTrks[0]->highPurity[it]) continue; // quality selection
         if(anaTrks[0]->trkPtError[it]/anaTrks[0]->trkPt[it]>=0.1 || TMath::Abs(anaTrks[0]->trkDz1[it]/anaTrks[0]->trkDzError1[it])>=3.0 || TMath::Abs(anaTrks[0]->trkDxy1[it]/anaTrks[0]->trkDxyError1[it])>=3.0) continue ; //ridge cut for tracks
         RecTrack_t r;
         r.ptr = anaTrks[0]->trkPt[it];
         r.etar = anaTrks[0]->trkEta[it];
         r.phir = anaTrks[0]->trkPhi[it];
         r.algo = anaTrks[0]->trkAlgo[it];
         r.nsim = !anaTrks[0]->trkFake[it];
         r.status = 1; // for now correct all tracks
         float dr1 = deltaR(r.etar,r.phir,gj.eta1,gj.phi1);
         float dr2 = deltaR(r.etar,r.phir,gj.eta2,gj.phi2);
         r.jet  = 0;
         r.jeta = -99;
         r.jdr  = -99;
         if (samplePtHat>0) {
           if (dr1<0.5&&gj.pt1>=40) {
              r.jet = gj.pt1;
              r.jeta = gj.eta1;
              r.jdr = dr1;
              effMergedGeneral_j1.FillRecHistograms(evt,gj,r);
           } else if (dr2<0.5&&gj.pt2>=40) {
              r.jet = gj.pt2;
              r.jeta = gj.eta2;
              r.jdr = dr2;
              effMergedGeneral_j2.FillRecHistograms(evt,gj,r);
           }
         }

         // Fill
         effMergedGeneral.FillRecHistograms(evt,gj,r);
         effMergedGeneral_jetfine.FillRecHistograms(evt,gj,r);
//          effMergedGeneral_trkPhi.FillRecHistograms(evt,gj,r);
//          if (r.jet>=120) effMergedGeneral_trkPhi_jet_120to999.FillRecHistograms(evt,gj,r);
//          else if (r.jet>=cutjetPt) effMergedGeneral_trkPhi_jet_50to120.FillRecHistograms(evt,gj,r);
//          else effMergedGeneral_trkPhi_noJet.FillRecHistograms(evt,gj,r);
//          effMergedGeneral_SimSmear.FillRecHistograms(evt,gj,r);
      }

      ///////////////////////////////////////////////////////
      // SimTracks
      ///////////////////////////////////////////////////////
      for (int ip=0; ip<anaTrks[0]->nParticle; ++ip) {
         if (anaTrks[0]->pPt[ip] < cutPtTrk) continue;
         if (fabs(anaTrks[0]->pEta[ip]) > cutEtaTrk) continue;

         SimTrack_t s;
         s.pts = anaTrks[0]->pPt[ip];
         s.etas = anaTrks[0]->pEta[ip];
         s.phis = anaTrks[0]->pPhi[ip];
         s.status = 1; // for now assume all simtracks as signal tracks

       //  s.nrec = (anaTrks[0]->pNRec[ip])*(int)(anaTrks[0]->mtrkAlgo[ip]<4||anaTrks[0]->mtrkQual[ip]>0);
      //   s.nrec = (anaTrks[0]->pNRec[ip])*(int)(anaTrks[0]->mtrkAlgo[ip]<4||anaTrks[0]->mtrkQual[ip]>0)*(anaTrks[0]->mtrkPtError[ip]/anaTrks[0]->mtrkPt[ip]<0.1 && anaTrks[0]->mtrkDz1[ip]/anaTrks[0]->mtrkDzError1[ip]<3.0 && anaTrks[0]->mtrkDxy1[ip]/anaTrks[0]->mtrkDxyError1[ip]<3.0);
         s.nrec = (anaTrks[0]->pNRec[ip])*(int)(anaTrks[0]->mtrkQual[ip]>0)*(anaTrks[0]->mtrkPtError[ip]/anaTrks[0]->mtrkPt[ip]<0.1 && TMath::Abs(anaTrks[0]->mtrkDz1[ip]/anaTrks[0]->mtrkDzError1[ip])<3.0 && TMath::Abs(anaTrks[0]->mtrkDxy1[ip]/anaTrks[0]->mtrkDxyError1[ip])<3.0);
      //   s.nrec = (int)(anaTrks[0]->mtrkAlgo[ip]<4||anaTrks[0]->mtrkQual[ip]>0)*(anaTrks[0]->mtrkPtError[ip]/anaTrks[0]->mtrkPt[ip]<0.1 && TMath::Abs(anaTrks[0]->mtrkDz1[ip]/anaTrks[0]->mtrkDzError1[ip])<3.0 && TMath::Abs(anaTrks[0]->mtrkDxy1[ip]/anaTrks[0]->mtrkDxyError1[ip])<3.0);

//          if (s.pts<1.5) s.nrec = anaTrks[0]->pNRec[ip];
//          else s.nrec = (anaTrks[0]->pNRec[ip])*(anaTrks[0]->mtrkQual[ip]);
         s.acc = anaTrks[0]->pAcc[ip];
         s.jet = gj.pt1;
         s.jeta = gj.eta1;
         float dr1 = deltaR(s.etas,s.phis,gj.eta1,gj.phi1);
         float dr2 = deltaR(s.etas,s.phis,gj.eta2,gj.phi2);
         s.jet = 0;
         s.jeta = -99;
         s.jdr = -99;
         if (samplePtHat>0) {
           if (dr1<0.5&&gj.pt1>=40) {
              s.jet = gj.pt1;
              s.jeta = gj.eta1;
              s.jdr = dr1;
              effMergedGeneral_j1.FillSimHistograms(evt,gj,s);
           } else if (dr2<0.5&&gj.pt2>=40) {
              s.jet = gj.pt2;
              s.jeta = gj.eta2;
              s.jdr = dr2;
              effMergedGeneral_j2.FillSimHistograms(evt,gj,s);
           }
         }
         // Fill
         effMergedGeneral.FillSimHistograms(evt,gj,s);
         effMergedGeneral_jetfine.FillSimHistograms(evt,gj,s);
//          effMergedGeneral_trkPhi.FillSimHistograms(evt,gj,s);
//          if (s.jet>=120) effMergedGeneral_trkPhi_jet_120to999.FillSimHistograms(evt,gj,s);
//          else if (s.jet>=cutjetPt) effMergedGeneral_trkPhi_jet_50to120.FillSimHistograms(evt,gj,s);
//          else effMergedGeneral_trkPhi_noJet.FillSimHistograms(evt,gj,s);
         // Sim Smearing
//          if (s.pts>=1&&s.pts<2) {
//             float trksm = trkRes1.GetSmear(s.pts);
//             s.pts*=trksm;
//          }
//          effMergedGeneral_SimSmear.FillSimHistograms(evt,gj,s);
      }
      // All done
   }

//    effMergedGeneral.WriteHistograms();
   output->Write();
   output->Close();
   delete c;
}
Пример #19
0
void dijetTrack(double tag=0, char *infName = "/d102/yjlee/hiForest2MC/Pythia80_HydjetDrum_mix01_HiForest2_v22_simTrack05.root")
{
   // Define the input file and HiForest
   HiForest *c = new HiForest(infName);

   // Turn off the non-necessary trees
   c->hasPFTree=0;
   c->hasPhotonTree=0;
   c->hasTowerTree=0;
   c->hasHbheTree=0;
   c->hasEbTree=0;
   c->hasGenpTree=0;
   c->hasGenParticleTree=0;   
   c->hasAkPu2CaloJetTree=0;
   c->hasAkPu3CaloJetTree=0;
   c->hasAkPu4CaloJetTree=0;
   c->doTrackCorrections=1;
   c->InitTree();
   
   // Output file
   TFile *output = new TFile(Form("output-%.0f.root",tag),"recreate");
   
   // Book a output tree
   TTree * t = new TTree("t","gammajet");

   // My tree data format   
   JetData data(t,1);

   // Book histograms
   TH1F *hJetTrackDphi    = new TH1F("hJetTrackDphi"   , ";#Delta #phi;Weighted Entries", 100,  0, TMath::Pi());
   TH1F *hJetTrackDeta    = new TH1F("hJetTrackDeta"   , ";#Delta #eta;Weighted Entries", 100, -2, 2);
   TH2F *hJetTrack2D      = new TH2F("hJetTrack2D"     , ";#Delta #eta; #Delta #phi"    , 100, -2, 2,100,0, TMath::Pi());
   TH1F *hGenJetTrackDphi = new TH1F("hGenJetTrackDphi", ";#Delta #phi;Weighted Entries", 100,  0, TMath::Pi());
   TH1F *hGenJetTrackDeta = new TH1F("hGenJetTrackDeta", ";#Delta #eta;Weighted Entries", 100, -2, 2);
   TH2F *hGenJetTrack2D   = new TH2F("hGenJetTrack2D"  , ";#Delta #eta; #Delta #phi"    , 100, -2, 2,100,0, TMath::Pi());
   
   // Main loop
   for (int i=0;i<c->GetEntries();i++) {
      c->GetEntry(i);
      data.hiBin = c->evt.hiBin;
      if (i % 1000 == 0) cout <<i<<" / "<<c->GetEntries()<<endl;
      data.leadingJetPt = -1;
      data.subleadingJetPt = -1;
      data.leadingJetIt = -1;
      data.subleadingJetIt = -1;
      data.genleadingJetPt = -1;
      data.gensubleadingJetPt = -1;
      
      // =================================
      // Select leading and subleading jet
      // =================================
      for (int j=0;j<c->icPu5.nref;j++) {
         if (fabs(c->icPu5.jteta[j])>2) continue;
         if (c->icPu5.jtpt[j]>data.leadingJetPt) {
	    data.leadingJetPt = c->icPu5.jtpt[j];
	    data.leadingJetEta = c->icPu5.jteta[j];
	    data.leadingJetPhi = c->icPu5.jtphi[j];
	    data.leadingJetIt = j;
	 }   
	 if (c->icPu5.jtpt[j]>data.subleadingJetPt && c->icPu5.jtpt[j] < data.leadingJetPt) {
	    data.subleadingJetPt = c->icPu5.jtpt[j];
	    data.subleadingJetEta = c->icPu5.jteta[j];
	    data.subleadingJetPhi = c->icPu5.jtphi[j];
	    data.subleadingJetIt = j;
         }
	 if (c->icPu5.jtpt[j]<data.subleadingJetPt) break;	 
      } 

      // =================================================
      // Select generator level leading and subleading jet
      // =================================================
      for (int j=0;j<c->icPu5.ngen;j++) {
         if (fabs(c->icPu5.geneta[j])>2) continue;
         if (c->icPu5.genpt[j]>data.genleadingJetPt) {
	    data.genleadingJetPt = c->icPu5.genpt[j];
	    data.genleadingJetEta = c->icPu5.geneta[j];
	    data.genleadingJetPhi = c->icPu5.genphi[j];
	 }   
	 if (c->icPu5.genpt[j]>data.gensubleadingJetPt && c->icPu5.genpt[j] < data.genleadingJetPt) {
	    data.gensubleadingJetPt  = c->icPu5.genpt[j];
	    data.gensubleadingJetEta = c->icPu5.geneta[j];
	    data.gensubleadingJetPhi = c->icPu5.genphi[j];
         }
	 if (c->icPu5.genpt[j]<data.gensubleadingJetPt) break;	 
      } 
      
      // ====================================================================
      // Now we have leading and subleading jet from generator and reco level
      // Loop over tracks in reco level
      // ====================================================================
      for (int j=0;j<c->track.nTrk;j++) {
         if (fabs(c->track.trkEta[j])>2.4) continue;
	 if (fabs(c->track.trkPt[j]) <0.5) continue;
	 double dphi1 = acos(cos(c->track.trkPhi[j]-data.leadingJetPhi));
         double deta1 = (c->track.trkEta[j]-data.leadingJetEta);

         // Fill the histogram, with track pT as the weight of the entry.
	 hJetTrackDphi->Fill(dphi1       , c->track.trkPt[j]);
	 hJetTrackDeta->Fill(deta1       , c->track.trkPt[j]);
	 hJetTrack2D  ->Fill(deta1, dphi1, c->track.trkPt[j]);
      }

      // =============================
      // Loop over tracks in gen level
      // =============================
      for (int j=0;j<c->track.nParticle;j++) {
         if (fabs(c->track.pEta[j])>2.4) continue;
	 if (fabs(c->track.pPt[j]) <0.5) continue;
	 double dphi1 = acos(cos(c->track.pPhi[j]-data.genleadingJetPhi));
         double deta1 = (c->track.pEta[j]-data.genleadingJetEta);
	 
	 double dr1 = sqrt(dphi1*dphi1+deta1*deta1);

         // Fill the histogram, with simtrack pT as the weight of the entry.
	 hGenJetTrackDphi->Fill(dphi1       , c->track.pPt[j]);
	 hGenJetTrackDeta->Fill(deta1       , c->track.pPt[j]);
	 hGenJetTrack2D  ->Fill(deta1, dphi1, c->track.pPt[j]);
      }

      t->Fill();
   }

   output->Write();
   output->Close();
}
int IndResponse5TeVOnFlyForest(double kPt=30,const char *ksp="ppb",int ifile=0)
{

  timer.Start();

  //! Load Lib
  gSystem->Load("../HiForest_V3/hiForest_h.so");
  
  //! Load the hiforest input root file
  HiForest *c = 0;
  //! Latest
//  if(strcmp(ksp,"ppb")==0)c = new HiForest(Form("/mnt/hadoop/cms/store/user/dgulhan/pPb/HP04/prod13/Hijing_Pythia_pt%.f/HiForest_v72_v01_merged01/pt%.f_prod13_v72_merged_forest_%d.root",kPt,kPt,ifile),"PythiaHijing",cPPb); 
//  if(strcmp(ksp,"ppb")==0)c = new HiForest(Form("/mnt/hadoop/cms/store/user/dgulhan/pPb/HP04/prod16/Hijing_Pythia_pt%.f/HiForest_v77_merged01/pt%.f_HP04_prod16_v77_merged_forest_%d.root",kPt,kPt,ifile),"PythiaHijing",cPPb); 
  if(strcmp(ksp,"ppb")==0)c = new HiForest(Form("/mnt/hadoop/cms/store/user/kjung/pPb_Full_BTagForestMerged/pPb_Full_BTagForest%.f_Fix3output.root", kPt),"PythiaHijing",cPPb);
 // if(strcmp(ksp,"ppb")==0)c = new HiForest(Form("/mnt/hadoop/cms/store/user/dgulhan/pPb/HP04/prod25/HiForest_v85_merged01/pt%.f_HP04_prod25_v85_merged_forest_%d.root", kPt,ifile),"PythiaHijing",cPPb);
// else if(strcmp(ksp,"pbp")==0)c = new HiForest(Form("/mnt/hadoop/cms/store/user/dgulhan/Pbp/HP05/prod24/Hijing_Pythia_pt%.f/HiForest_v84_merged02/pt%.f_HP05_prod24_v84_merged_forest_%d.root",kPt,kPt,ifile),"HijingPythia",cPPb); 
// else if(strcmp(ksp,"pbp")==0)   c = new HiForest(Form("/mnt/hadoop/cms/store/user/kjung/PbpMC/HP06/mergedPthat%.f/PbpJEC_pthat%.f_outputMerged.root",kPt,kPt),"HijingPythia",cPPb);
// else if(strcmp(ksp,"pbp")==0)    c = new HiForest(Form("/mnt/hadoop/cms/store/user/kjung/PbpMC/HP08/MergedFiles/pthat%.foutputMerged.root",kPt),"HijingPythia",cPPb);
 else if(strcmp(ksp,"pbp")==0)    c = new HiForest(Form("/net/hidsk0001/d00/scratch/maoyx/pPb/CMSSW_5_3_8_HI_patch2/src/MNguyen/combinePtHatBins/CorrPbpJet%.f.root",kPt),"HijingPythia",cPPb);
  else {
    c = new HiForest(Form("/mnt/hadoop/cms/store/user/kjung/pPbForest/Signal_Pythia_pt%.f/merged/pt%.f_HP04_prod16_v77_merged_forest_Sum.root",kPt,kPt),"Pythia",cPPb);
//    if(kPt==280)c = new HiForest(Form("/mnt/hadoop/cms/store/user/dgulhan/pPb/HP03/prod10/Signal_Pythia_pt%0.0f/HiForest_v63_v02_merged03/pt%0.0f_HP03_prod09_merged_forest_%d.root",kPt,kPt,ifile),"Pythia",cPPb);
//    else c = new HiForest(Form("/mnt/hadoop/cms/store/user/dgulhan/pPb/HP03/prod10/Signal_Pythia_pt%0.0f/HiForest_v63_merged03/pt%0.0f_HP03_prod09_merged_forest_%d.root",kPt,kPt,ifile),"Pythia",cPPb);
  }
  double xsection=0;
  double xup=0;
  double xsub=0;
  double maxpthat=9999;

  if(kPt==15){
    maxpthat=30;
    xup =5.335e-01;
    xsub=3.378e-02;
  }
  else if(kPt==30){
    maxpthat=50;
    xup =3.378e-02;
    xsub=3.778e-03;
  }
  else if(kPt==50){
    maxpthat=80;
  //  maxpthat=9999;
    xup =3.778e-03;
  //  xsub=0;
    xsub=4.412e-04;
  }
  else if(kPt==80){
    maxpthat=120;
    xup =4.412e-04;
    xsub=6.147e-05;
  }
  else if(kPt==120){
    maxpthat=170;
    xup=6.147e-05;
    xsub=1.018e-05;
  }else if(kPt==170){
    maxpthat=220;
    xup=1.018e-05;
    xsub=2.477e-06;
  }else if(kPt==220){
    maxpthat=280;
    xup =2.477e-06;
    xsub=6.160e-07;
  }else if(kPt==280){
    maxpthat=9999;
    xup =6.160e-07;
    xsub=0;
  }
/*    maxpthat=370;
    xup =6.160e-07;
    xsub=1.088e-07;
    }else if(kPt==370){
    maxpthat=9999;
    xup=1.088e-07; 
    xsub=0;
    }
*/
  xsection = xup-xsub;

  std::cout<<std::endl;
  std::cout<<std::endl;

  
  /*
  const int knj = 25;
  const char *cjets[knj] = {"icPu5",
			    "ak1PF","ak2PF","ak3PF","ak4PF","ak5PF","ak6PF",
			    "akPu1PF","akPu2PF","akPu3PF","akPu4PF","akPu5PF","akPu6PF",			    
			    "ak1Calo","ak2Calo","ak3Calo","ak4Calo","ak5Calo","ak6Calo",
			    "akPu1Calo","akPu2Calo","akPu3Calo","akPu4Calo","akPu5Calo","akPu6Calo"};

  const char *calgo[knj] = {"icPu5",
			    "ak1PF","ak2PF","ak3PF","ak4PF","ak5PF","ak6PF",
			    "akPu1PF","akPu2PF","akPu3PF","akPu4PF","akPu5PF","akPu6PF",			    
			    "ak1Calo","ak2Calo","ak3Calo","ak4Calo","ak5Calo","ak6Calo",
			    "akPu1Calo","akPu2Calo","akPu3Calo","akPu4Calo","akPu5Calo","akPu6Calo"};
  */
  const int knj = 12;
  const char *cjets[knj] = {"ak3PF","ak4PF","ak5PF",
			    "akPu3PF","akPu4PF","akPu5PF",
			    "ak3Calo","ak4Calo","ak5Calo",
			    "akPu3Calo","akPu4Calo","akPu5Calo"};
  const char *calgo[knj] = {"ak3PF","ak4PF","ak5PF",
			    "akPu3PF","akPu4PF","akPu5PF",
			    "ak3Calo","ak4Calo","ak5Calo",
			    "akPu3Calo","akPu4Calo","akPu5Calo"};

  c->hasIcPu5JetTree=0;
  c->hasAk1PFJetTree=0;
  c->hasAk6PFJetTree=0;
  c->hasAkPu1PFJetTree=0;
  c->hasAkPu6PFJetTree=0;
  c->hasAk1CaloJetTree=0;
  c->hasAk6CaloJetTree=0;
  c->hasAkPu1CaloJetTree=0;
  c->hasAkPu6CaloJetTree=0;


  /*
  c->hasMetTree=0;
  c->hasPFTree=0;
  c->hasIcPu5JetTree=0;
  c->hasAkPu2JetTree=0;
  c->hasAkPu3JetTree=0;
  c->hasAkPu4JetTree=0;
  c->hasAkPu2CaloJetTree=0;
  c->hasAkPu3CaloJetTree=0;
  c->hasAkPu4CaloJetTree=0;
  c->hasHltTree=0;
  c->hasTrackTree=0;
  c->hasPixTrackTree=0;
  c->hasSkimTree=0;
  c->hasTowerTree=0;
  c->hasHbheTree=0;
  c->hasEbTree=0;
  c->hasGenpTree=0;
  c->hasGenParticleTree=0;
  c->hasPhotonTree=0;
  */


  //! To get the jet object from hiforest
  Jets *iJet=0;

  std::cout<<"Loaded all tree variables and # of jet algorithms : "<<knj<<std::endl;
  std::cout<<"\t"<<std::endl;


  //! Open a output file for histos
//  TFile *fout = new TFile(Form("Output/Response_%s_HP04_prod25_v85_pT%0.0fGeV_%d.root",ksp,kPt,ifile),"RECREATE");
  TFile *fout = new TFile(Form("Output/Response_%s_HP08_OnFlyForest_JECv17_pT%0.0fGeV.root",ksp,kPt),"RECREATE");


  std::cout<<"\t"<<std::endl;
  std::cout<<"\t"<<std::endl;
  std::cout<<"**************************************************** "<<std::endl;
  std::cout<<Form("Running for %s ",ksp)<<std::endl;
  std::cout<<Form("pT  cut for %0.3f ",kptrecocut)<<std::endl;
  std::cout<<Form("eta cut for %0.3f ",ketacut)<<std::endl;
  std::cout<<"My hiForest TTree : " <<c->GetName()<<std::endl;
  std::cout<<"Output file  "<<fout->GetName()<<std::endl;
  std::cout<<"**************************************************** "<<std::endl;
  std::cout<<"\t"<<std::endl;
  std::cout<<"\t"<<std::endl;


  //! 
  //! Define histograms here
  TH1::SetDefaultSumw2();
  TH2::SetDefaultSumw2();
  TProfile::SetDefaultSumw2();

  ////////////////////////////////////////////////////////////////////////////////////////////////////////
  TH1F *hEvt    = new TH1F("hEvt","# of events ",4,0,4);
  TH1F *hVz     = new TH1F("hVz","# of events ",80,-20,20);
  TH1F *hBin    = new TH1F("hBin","Centrality bin",100,-0.5,100-0.5);
  TH1F *hTotEve = new TH1F("hTotEve","# of events in the skimmed files",4,0,4);

  
  TH1F *hHF       = new TH1F("hHF","HF distribution",500,0,500);
  TH1F *hNTracks  = new TH1F("hNTracks","hiNTracks",500,0,500);
  TH2F *hNTracksHF = new TH2F("hNTracksHF","Ntrack vs HF ",500,0,500,500,0,500);
  TH2F *hBinHF      = new TH2F("hBinHF","HF vs hiBin",100,-0.5,100-0.5,500,0,500);
  TH2F *hBinNTracks = new TH2F("hBinNTracks","HF vs NTracks",100,-0.5,100-0.5,500,0,500);
    TH2F *hNTracksHFplusEta4 = new TH2F("hNTracksHFplusEta4","NTracks vs HFplusEta4",500,0,500, 500, 0., 500);
  
  TH1F *hgenpt_genm [knj][nmult], *hrecopt_genm[knj][nmult], *hrawpt_genm[knj][nmult];
  TH1F *hjeteta  [knj][nmult], *hjetphi[knj][nmult];
  TH2F *hjetpteta[knj][nmult], *hjetptphi[knj][nmult], *hjetetaphi[knj][nmult];

  //! Ratios of the pt distributions
  TProfile *hrecogen[knj][nmult], *hrecoraw[knj][nmult], *hrawgen[knj][nmult];

  //! Resposnse
  TH2F *hrescrpt_genm[knj][nmult], *hresrrpt_genm[knj][nmult], *hresrcrpt_genm[knj][nmult];
  TH2F *hrescreta_genm[knj][nmult], *hresrreta_genm[knj][nmult], *hresrcreta_genm[knj][nmult];

  TH2F *hratiorawrefpt_eta[knj][nmult][2], *hratiocorrrefpt_eta[knj][nmult][2];

  TH2F *hratiocorrrefpt_genm[knj][nmult];
  TH2F *hratiocorrrefpt_lead[knj][nmult], *hratiocorrrefpt_slead[knj][nmult];

    TH2F *hratiocorrrefpt_genhfb[knj][nhfbin];
    TH2F *hratiocorrrefpt_etaptbin[knj][bins];
    TH2F *hratiorawrefpt_etaptbin[knj][bins];

  //! For comparison with data
  TH2F *hJetEnergyScale[knj][nmult];

  TH2F *hpteta[knj][nmult][maxe] ;
  TH2F *hptphi[knj][nmult][maxph] ;

  TH2F *hgenjrecoj[knj][nmult];
  TH1F *hNjets_genm[knj][nmult];
  TH1F *hNevt [knj][nmult];

  //! Background for jets 
  //! (photonSum+neutralSum+chargedSum-rawpt)
  TH2F *hjetptpu_genm[knj][nmult];             //! centrality                                                                       
  TH2F *hjetptpu_etab_genm[knj][nmult][ketar]; //! eta dependence             
  TH1F *hjetbkgd_genm[knj][nmult];
  TH2F *hjetptbkgd_genm[knj][nmult];
  TH2F *hjetptbkgd_etab_genm[knj][nmult][ketar];
  TH2F *hPFFraction_genm[knj][nmult][3];

  //! Efficency histos
  TH1F *hPtAll [knj][nmult], *hPtSel[knj][nmult];
  TH1F *hEtaAll[knj][nmult], *hEtaSel[knj][nmult];
  TH1F *hPhiAll[knj][nmult], *hPhiSel[knj][nmult];

  //! Response vs deltar
  TH1F *hRspVsDeltaR[knj][nmult][25];

  //! DeltaR efficiency                                                                                                                                                              
  TH1F *hDeltaR[knj][nmult];
  TH1F *hDeltaRAll[knj][nmult];
  TH1F *hDeltaRSel[knj][nmult];

    for(int nj=0;nj<knj;nj++){
        
        for(int icen=0;icen<nmult;icen++){
            hNevt [nj][icen] = new TH1F(Form("hNevt%d_%d",nj,icen),Form("# of events cent %d %s",icen,cjets[nj]),40,-40,40);
            
            hNjets_genm [nj][icen] = new TH1F(Form("hNjets_genm%d_%d",nj,icen),Form("# of jets cent %d jets %s",icen,cjets[nj]),200,30,630);
            hgenpt_genm [nj][icen] = new TH1F(Form("hgenpt_genm%d_%d",nj,icen),Form("Gen matched gen p_{T} distribution jet centb %d %s",icen,cjets[nj]),500,0,1000);
            hrecopt_genm[nj][icen] = new TH1F(Form("hrecopt_genm%d_%d",nj,icen),Form("Gen matched reco p_{T} distribution jet centb %d %s",icen,cjets[nj]),500,0,1000);
            hrawpt_genm [nj][icen] = new TH1F(Form("hrawpt_genm%d_%d",nj,icen),Form("Gen matched raw p_{T} distribution jet centb %d %s",icen,cjets[nj]),500,0,1000);
            
            //! Ratios
            hrecogen[nj][icen] = new TProfile(Form("hrecogen%d_%d",nj,icen),Form("reco/gen p_{T} distribution jet centb %d %s",icen,cjets[nj]),500,0,1000);
            hrecoraw[nj][icen] = new TProfile(Form("hrecoraw%d_%d",nj,icen),Form("reco/raw p_{T} distribution jet centb %d %s",icen,cjets[nj]),500,0,1000);
            hrawgen[nj][icen]  = new TProfile(Form("hrawgen%d_%d",nj,icen),Form("raw/gen p_{T} distribution jet centb %d %s",icen,cjets[nj]),500,0,1000);
            
            //! Gen matched
            hrescrpt_genm[nj][icen]= new TH2F(Form("hrescrpt_genm%d_%d",nj,icen),Form("Gen jet:(Reco/Gen) jet p_{T} distribution jet centb %d %s",icen,cjets[nj]),500,0,1000,150,rbinl,rbinh);
            hresrrpt_genm[nj][icen]= new TH2F(Form("hresrrpt_genm%d_%d",nj,icen),Form("Gen jet:(Raw/Gen) jet p_{T}  distribution jet centb %d %s",icen,cjets[nj]),500,0,1000,150,rbinl,rbinh);
            hresrcrpt_genm[nj][icen]= new TH2F(Form("hresrcrpt_genm%d_%d",nj,icen),Form("Reco jet:(Reco/Raw) jet p_{T} distribution jet centb %d %s",icen,cjets[nj]),500,0,1000,150,rbinl,rbinh);
            
            hrescreta_genm[nj][icen]= new TH2F(Form("hrescreta_genm%d_%d",nj,icen),Form("Gen jet:(Reco/Gen) jet p_{T} distribution jet centb %d %s",icen,cjets[nj]),100,-5.0,5.0,150,rbinl,rbinh);
            hresrreta_genm[nj][icen]= new TH2F(Form("hresrreta_genm%d_%d",nj,icen),Form("Gen jet:(Raw/Gen) jet p_{T}  distribution jet centb %d %s",icen,cjets[nj]),100,-5.0,5.0,150,rbinl,rbinh);
            hresrcreta_genm[nj][icen]= new TH2F(Form("hresrcreta_genm%d_%d",nj,icen),Form("Reco jet:(Reco/Raw) jet p_{T} distribution jet centb %d %s",icen,cjets[nj]),100,-5.0,5.0,150,rbinl,rbinh);
            
            hjeteta[nj][icen] = new TH1F(Form("hjeteta%d_%d",nj,icen),Form("jet eta distribution jet centb %d %s",icen,calgo[nj]),100,-5.0,5.0);
            hjetphi[nj][icen] = new TH1F(Form("hjetphi%d_%d",nj,icen),Form("jet phi distribution jet centb %d %s",icen,calgo[nj]),72,-pi,pi);
            
            hjetetaphi[nj][icen] = new TH2F(Form("hjetetaphi%d_%d",nj,icen),Form("jet eta-phi distribution jet centb %d %s",icen,calgo[nj]),100,-5.0,5.0,72,-pi,pi);
            hjetpteta[nj][icen] = new TH2F(Form("hjetpteta%d_%d",nj,icen),Form("jet pt-eta distribution jet centb %d %s",icen,calgo[nj]),500,0,1000,100,-5.0,5.0);
            hjetptphi[nj][icen] = new TH2F(Form("hjetptphi%d_%d",nj,icen),Form("jet pt-phi distribution jet centb %d %s",icen,calgo[nj]),500,0,1000,72,-pi,pi);
            
            
            hratiocorrrefpt_lead[nj][icen]= new TH2F(Form("hratiocorrrefpt_lead%d_%d",nj,icen),Form("Leading jet Reco jet / Gen jet p_{T} (corr.) distribution jet centb %d %s",icen,cjets[nj]),
                                                     500,0,1000,rbins,rbinl,rbinh);
            hratiocorrrefpt_slead[nj][icen]= new TH2F(Form("hratiocorrrefpt_slead%d_%d",nj,icen),Form("sub-Leading jet Reco jet / Gen jet p_{T} (corr.) distribution jet centb %d %s",icen,cjets[nj]),
                                                      500,0,1000,rbins,rbinl,rbinh);
            hratiocorrrefpt_genm[nj][icen]= new TH2F(Form("hratiocorrrefpt_genm%d_%d",nj,icen),Form("Gen matched jet Reco jet / Gen jet p_{T} (corr.) distribution jet centb %d %s",icen,cjets[nj]),
                                                     500,0,1000,rbins,rbinl,rbinh);
            hJetEnergyScale[nj][icen] = new TH2F(Form("hJetEnergyScale%d_%d",nj,icen),Form("hJetEnergyScale%d_%d",nj,icen),500,0,1000,50,-1.00,1.00);
            
            for(int ie=0;ie<2;ie++){
                hratiorawrefpt_eta[nj][icen][ie]= new TH2F(Form("hratiorawrefpt_eta%d_%d_%d",nj,icen,ie),
                                                           Form("Raw jet / Gen jet p_{T} (raw) distribution jet centb %d %s etabin%d",icen,cjets[nj],ie),
                                                           500,0,1000,rbins,rbinl,rbinh);
                hratiocorrrefpt_eta[nj][icen][ie]= new TH2F(Form("hratiocorrrefpt_eta%d_%d_%d",nj,icen,ie),
                                                            Form("Reco jet / Gen jet p_{T} (raw) distribution jet centb %d %s etabin%d",icen,cjets[nj],ie),
                                                            500,0,1000,rbins,rbinl,rbinh);
            }
            
            //hjetptpu_genm[nj][icen] = new TH2F(Form("hjetptpu_genm%d_%d",nj,icen),Form("jet(pt:pu) distribution jet centb %d %s",icen,cjets[nj]),dbins,ptbins_data,100,0,300);
            //for(int ie=0;ie<ketar;ie++){
            // hjetptpu_etab_genm[nj][icen][ie] = new TH2F(Form("hjetptpu_etab_genm%d_%d_%d",nj,icen,ie),Form("jet(pt:pu) distribution jet %s etabin %d cen %d",cjets[nj],icen,ie),
            ///					    dbins,ptbins_data,100,0,300);
            //}
            
            hjetptpu_genm[nj][icen] = new TH2F(Form("hjetptpu_genm%d_%d",nj,icen),Form("jet(pt:pu) distribution jet centb %d %s",icen,cjets[nj]),500,0,1000,100,0,300);
            for(int ie=0;ie<ketar;ie++){
                hjetptpu_etab_genm[nj][icen][ie] = new TH2F(Form("hjetptpu_etab_genm%d_%d_%d",nj,icen,ie),Form("jet(pt:pu) distribution jet %s etabin %d cen %d",cjets[nj],icen,ie),
                                                            500,0,1000,100,0,300);
                hjetptbkgd_etab_genm[nj][icen][ie] = new TH2F(Form("hjetptbkgd_etab_genm%d_%d_%d",nj,icen,ie),Form("jet(pt:bkgd) distribution jet etabin %d centb %d %s",ie,icen,calgo[nj]),500,0,1000,100,0,300);
            }
            hjetbkgd_genm  [nj][icen] = new TH1F(Form("hjetbkgd_genm%d_%d",nj,icen),Form("jet(pu) p_{T} distribution jet centb %d %s",icen,calgo[nj]),100,0,300);
            //hjetptbkgd_genm[nj][icen] = new TH2F(Form("hjetptbkgd_genm%d_%d",nj,icen),Form("jet(pt:bkgd) distribution jet centb %d %s",icen,calgo[nj]),dbins,ptbins_data,100,0,300);
            hjetptbkgd_genm[nj][icen] = new TH2F(Form("hjetptbkgd_genm%d_%d",nj,icen),Form("jet(pt:bkgd) distribution jet centb %d %s",icen,calgo[nj]),500,0,1000,100,0,300);
            //! PF fractions
            for(int ipf=0;ipf<3;ipf++){
                hPFFraction_genm[nj][icen][ipf] = new TH2F(Form("hPFFraction_genm%d_%d_%d",nj,icen,ipf),Form("PF fraction distribution jet centb %d %s %d",icen,calgo[nj],ipf),500,0,1000,15,0,1.5);
            }
            
            
            for(int m=0;m<maxe;m++){
                hpteta[nj][icen][m] = new TH2F(Form("hpteta%d_%d_%d",nj,icen,m),Form("resolution  pt(eta) distribution cent %d jet %s etabin%d",icen,cjets[nj],m),
                                               500,0,1000,rbins,rbinl,rbinh);
            }
            
            for(int m=0;m<maxph;m++){
                hptphi[nj][icen][m] = new TH2F(Form("hptphi%d_%d_%d",nj,icen,m),Form("resolution pt(phi) distribution cent %d jet %s phibin%d",icen,cjets[nj],m),
                                               500,0,1000,rbins,rbinl,rbinh);
            }
            
            hgenjrecoj[nj][icen] =new TH2F(Form("hgenjrecoj%d_%d",nj,icen),Form("gen jet2 : reco jet2 %s cent %d",cjets[nj],icen),500,0.,1000.,500,0.,1000.);
            
            //! efficency histograms
            hPtAll [nj][icen] = new TH1F(Form("hPtAll%d_%d",nj,icen),Form("Denominator pT for algorithm %s cent %d",cjets[nj],icen),40,10,110);
            hEtaAll[nj][icen] = new TH1F(Form("hEtaAll%d_%d",nj,icen),Form("Denominator eta  for algorithm %s cent %d",cjets[nj],icen),100,-5.0,5.0);
            hPhiAll[nj][icen] = new TH1F(Form("hPhiAll%d_%d",nj,icen),Form("Denominator  phi  for algorithm %s cent %d",cjets[nj],icen),20,-pi,pi);
            
            hPtSel [nj][icen] = new TH1F(Form("hPtSel%d_%d",nj,icen),Form("Numerator pT for algorithm %s cent %d",cjets[nj],icen),40,10,110);
            hEtaSel[nj][icen] = new TH1F(Form("hEtaSel%d_%d",nj,icen),Form("Numerator eta  for algorithm %s cent %d",cjets[nj],icen),100,-5.0,5.0);
            hPhiSel[nj][icen] = new TH1F(Form("hPhiSel%d_%d",nj,icen),Form("Numerator  phi  for algorithm %s cent %d",cjets[nj],icen),20,-pi,pi);
            
            hDeltaR[nj][icen]    = new TH1F(Form("hDeltaR%d_%d",nj,icen),Form("#DeltaR for algorithm %s cent %d",cjets[nj],icen),100,0,1);
            hDeltaRAll[nj][icen] = new TH1F(Form("hDeltaRAll%d_%d",nj,icen),Form("#DeltaR (all) for algorithm %s cent %d",cjets[nj],icen),100,0,1);
            hDeltaRSel[nj][icen] = new TH1F(Form("hDeltaRSel%d_%d",nj,icen),Form("#DeltaR (sel) for algorithm %s cent %d",cjets[nj],icen),100,0,1);
            
            for(int ir=0;ir<25;ir++){
                //! Response vs DeltaR
                hRspVsDeltaR[nj][icen][ir] = new TH1F(Form("hRspVsDeltaR%d_%d_%d",nj,icen,ir),Form(" <recopt/refpt> vs. #DeltaR (%d) algorithm %s cent %d",ir,cjets[nj],icen),rbins,rbinl,rbinh);
            }
        }//! icen
        //for eta clsoure in different jet pt bins
        for(int ipt=0;ipt<bins;ipt++){
            hratiocorrrefpt_etaptbin[nj][ipt]= new TH2F(Form("hratiocorrrefpt_etaptbin%d_%d",nj,ipt),Form("Gen matched jet Reco jet / Gen jet p_{T} (corr.) distribution jet vs eta in pt bin %d %s",ipt,cjets[nj]),
                                                  100,-5.0,5.0,rbins,rbinl,rbinh);
            hratiorawrefpt_etaptbin[nj][ipt]= new TH2F(Form("hratiorawrefpt_etaptbin%d_%d",nj,ipt),Form("Gen matched jet Reco jet RawPt/ Gen jet p_{T} (corr.) distribution jet vs eta in pt bin %d %s",ipt,cjets[nj]),
                                                  100,-5.0,5.0,rbins,rbinl,rbinh); 
        }
        //for different HFplusEta4 bins
        for(int ihf=0;ihf<nhfbin;ihf++){
            hratiocorrrefpt_genhfb[nj][ihf]= new TH2F(Form("hratiocorrrefpt_genhfbin%d_%d",nj,ihf),Form("Gen matched jet Reco jet / Gen jet p_{T} (corr.) distribution jet hiHF bin %d %s",ihf,cjets[nj]),
                                                      500,0,1000,rbins,rbinl,rbinh);
        }
        
    }//! nj
  std::cout<<"Initialized the histograms " <<std::endl;
  ///////////////////////////////////////////////////////////////////////////////////////// 


  //! Centrality reweighting function

  //! vertex z reweighting




  Long64_t nentries = c->GetEntries();
  std::cout<<Form("# of entries in TTree for %s : ",ksp)<<nentries<<std::endl;
  std::cout<<std::endl;
  hEvt->Fill(2,nentries);

  //! weight  for the merging of the samples for different pT hat bins
  Float_t wxs = xsection/(nentries/100000.);
  
  Int_t iEvent=0; 
  for (Long64_t ievt=0; ievt<nentries;ievt++) {//! event loop
    //for (Long64_t ievt=0; ievt<5000;ievt++) {//! event loop
    //! load the hiForest event
    c->GetEntry(ievt);
/*
    int hiBin       = c->evt.hiBin;
    float vz        = c->evt.vz;
    float hiHF      = c->evt.hiHF;
    int ntracks     = c->evt.hiNtracks;
    float HFplusEta = c->evt.hiHFplusEta4;
    float HFminusEta = c->evt.hiHFminusEta4 ; 
    float HFplusEta4 = HFplusEta+HFminusEta;
    //! testing
    //if(hiBin>4 && strcmp(ksp,"pbpb")==0)continue;

    //! apply vertex cut
    if(fabs(vz)>kVzcut)continue;


    //! Centrality bin
    if(hiBin<0 || hiBin>100)continue;
    int multb=GetMultBin(ntracks);
    int hiHFb=GetHFplusEta4Bin(HFplusEta4);  
*/      
    double wcen=1;
    double wvz=1;
    int multb=0;
    int hiHFb=0;
    //wxs=1;
    if(strcmp(ksp,"pbp")==0)multb=0;
  
    if(ievt%10000==0)std::cout<<" ********** Event # " <<ievt<<std::endl;
    //std::cout<<" ********** Event # " <<ievt<<"\t vz : "<<vz<<"\t hiBin : "<<hiBin<<"\t wxs : "<<wxs<<std::endl;


/*    //! Centrality from 0-100% 
    if(multb==-1 || multb==nmult)continue;
    if(hiHFb==-1 || hiHFb==nhfbin)continue;
*/
    int istat=0;
    for(int nj=0;nj<knj;nj++){ //! loop over different jet algorithms
      

      if(nj==0)iJet = &(c->ak3PF);
      else if(nj==1)iJet = &(c->ak4PF);
      else if(nj==2)iJet = &(c->ak5PF);

      else if(nj==3)iJet = &(c->akPu3PF);
      else if(nj==4)iJet = &(c->akPu4PF);
      else if(nj==5)iJet = &(c->akPu5PF);

      else if(nj==6)iJet = &(c->ak3Calo);
      else if(nj==7)iJet = &(c->ak4Calo);
      else if(nj==8)iJet = &(c->ak5Calo);

      else if(nj==9)iJet = &(c->akPu3Calo);
      else if(nj==10)iJet = &(c->akPu4Calo);
      else if(nj==11)iJet = &(c->akPu5Calo);


      //! xsec-weight
      double pthat = iJet->pthat;
      if(pthat > maxpthat)continue;
      istat=1;
      
      //std::cout<<"\t Jet Algorithm : "<<cjets[nj]<<"\t # of Jets  : "<<iJet->nref<<"\t pthat : "<<pthat<<std::endl;
      if(nj==0)hTotEve->Fill(1); //! akPu3PF      


/*      int *ljet = new int[3];
      FindLeadSubLeadJets(iJet,ljet);
      if(ljet[0]>=0){
	hratiocorrrefpt_lead[nj][multb]->Fill(iJet->refpt[ljet[0]],iJet->jtpt[ljet[0]]/iJet->refpt[ljet[0]],wxs*wcen*wvz);
	hratiocorrrefpt_lead[nj][nmult-1]->Fill(iJet->refpt[ljet[0]],iJet->jtpt[ljet[0]]/iJet->refpt[ljet[0]],wxs*wcen*wvz);
      }
      if(ljet[1]>=0){
	hratiocorrrefpt_slead[nj][multb]->Fill(iJet->refpt[ljet[1]],iJet->jtpt[ljet[1]]/iJet->refpt[ljet[1]],wxs*wcen*wvz);
	hratiocorrrefpt_slead[nj][nmult-1]->Fill(iJet->refpt[ljet[1]],iJet->jtpt[ljet[1]]/iJet->refpt[ljet[1]],wxs*wcen*wvz);
      }

      //! Jet energy scale comparison with data
      if(ljet[0]>=0 && ljet[1]>=0 && iJet->jtpt[ljet[0]]>50. && iJet->jtpt[ljet[1]]>50.){//! atleas a dijet
        int mstat=1;
        double ptdij = (iJet->jtpt[ljet[0]] + iJet->jtpt[ljet[1]])/2.;
        if(ljet[2]>=0){
          //if(iJet->jtpt[ljet[2]]/ptdij > 0.2)mstat=0;
	  mstat=0;
        }
        if(mstat){
          double B=-9999;
          double rn1 = gRandom->Rndm();
          double rn2 = gRandom->Rndm();
          if(rn1 > rn2){
            B = (iJet->jtpt[ljet[0]] - iJet->jtpt[ljet[1]])/(iJet->jtpt[ljet[0]] + iJet->jtpt[ljet[1]]);
          }else{
            B = (iJet->jtpt[ljet[1]] - iJet->jtpt[ljet[0]])/(iJet->jtpt[ljet[1]] + iJet->jtpt[ljet[0]]);
          }
          hJetEnergyScale[nj][multb]->Fill(ptdij,B);
          hJetEnergyScale[nj][nmult-1]->Fill(ptdij,B);
	}
      }
*/
      //! Gen matched jets
      for(int igen=0; igen<iJet->nref; igen++){
	if( iJet->subid[igen] != 0) continue;
	int gj = igen;
	
	float rawpt   = iJet->rawpt[gj];
	float refpt   = iJet->refpt[gj];
	float refeta  = iJet->refeta[gj];
	float refphi  = iJet->refphi[gj];
//	float recopt  = iJet->jtpt[gj];
	float recopt  = iJet->corrpt[gj];
	float recoeta = iJet->jteta[gj];
	float delr    = iJet->refdrjt[gj];
          
       if(rawpt <15.) continue ;
     //  if(recopt<30.) continue ;
	if(fabs(refeta)<ketacut && refpt>10){
          //! Denominator for matching efficiency
	  hPtAll [nj][multb]->Fill(refpt,wxs*wcen*wvz);
          hEtaAll[nj][multb]->Fill(refeta,wxs*wcen*wvz);
          hPhiAll[nj][multb]->Fill(refphi,wxs*wcen*wvz);
	  
	  hPtAll [nj][nmult-1]->Fill(refpt,wxs*wcen*wvz);
          hEtaAll[nj][nmult-1]->Fill(refeta,wxs*wcen*wvz);
          hPhiAll[nj][nmult-1]->Fill(refphi,wxs*wcen*wvz);
	  
	  //! DeltaR efficiency
	  hDeltaR[nj][multb]->Fill(delr,wxs*wcen*wvz);
	  hDeltaR[nj][nmult-1]->Fill(delr,wxs*wcen*wvz);
	  for (int idrmax=0;idrmax<100;idrmax++) {
	    float drmax = idrmax*0.01+0.005;
	    hDeltaRAll[nj][multb]->Fill(drmax,wxs*wcen*wvz);
	    hDeltaRAll[nj][nmult-1]->Fill(drmax,wxs*wcen*wvz);
	    if (delr<drmax){
	      hDeltaRSel[nj][multb]->Fill(drmax,wxs*wcen*wvz);
	      hDeltaRSel[nj][nmult-1]->Fill(drmax,wxs*wcen*wvz);
	    }
	  }
        }

	
	if(recopt<kptrecocut || refpt<kptgencut || refpt==0 || fabs(recoeta)>ketacut || fabs(delr)>kdRcut)continue;

        if(fabs(refeta)<ketacut && refpt>10){
          //! Numerator for matching efficiency
          hPtSel [nj][multb]->Fill(refpt,wxs*wcen*wvz);
          hEtaSel[nj][multb]->Fill(refeta,wxs*wcen*wvz);
          hPhiSel[nj][multb]->Fill(refphi,wxs*wcen*wvz);

          hPtSel [nj][nmult-1]->Fill(refpt,wxs*wcen*wvz);
          hEtaSel[nj][nmult-1]->Fill(refeta,wxs*wcen*wvz);
          hPhiSel[nj][nmult-1]->Fill(refphi,wxs*wcen*wvz);
        }
	

	//! Response
	for (int idr=0;idr<25;idr++) {
	  double drcut = 0.0+idr*(0.25-0.00)/(25-1);
	  if (delr>drcut) continue;
	  hRspVsDeltaR[nj][multb][idr]->Fill(recopt/refpt,wxs*wcen*wvz);
	  hRspVsDeltaR[nj][nmult-1][idr]->Fill(recopt/refpt,wxs*wcen*wvz);
	}
	

    hratiocorrrefpt_genm[nj][multb]->Fill(refpt,recopt/refpt,wxs*wcen*wvz);
	hratiocorrrefpt_genhfb[nj][hiHFb]->Fill(refpt,recopt/refpt,wxs*wcen*wvz);
	hrecogen[nj][multb]->Fill(refpt,recopt/refpt,wxs*wcen*wvz);
	hrecoraw[nj][multb]->Fill(recopt,recopt/rawpt,wxs*wcen*wvz);
        hrawgen [nj][multb]->Fill(refpt,rawpt/refpt,wxs*wcen*wvz);
	hgenjrecoj [nj][multb]->Fill(refpt,recopt,wxs*wcen*wvz);


	hratiocorrrefpt_genm[nj][nmult-1]->Fill(refpt,recopt/refpt,wxs*wcen*wvz);
        hratiocorrrefpt_genhfb[nj][nhfbin-1]->Fill(refpt,recopt/refpt,wxs*wcen*wvz);
        hratiocorrrefpt_genhfb[nj][nhfbin-2]->Fill(refpt,recopt/refpt,wxs*wcen*wvz);
	hrecogen[nj][nmult-1]->Fill(refpt,recopt/refpt,wxs*wcen*wvz);
	hrecoraw[nj][nmult-1]->Fill(recopt,recopt/rawpt,wxs*wcen*wvz);
        hrawgen [nj][nmult-1]->Fill(refpt,rawpt/refpt,wxs*wcen*wvz);
	hgenjrecoj [nj][nmult-1]->Fill(refpt,recopt,wxs*wcen*wvz);

	int ieta=-1;
	if(fabs(recoeta)<1.3)ieta=0; //! barrel region
	else ieta=1; //! HCAL region

   int ptb=GetPtBin(refpt);
   hratiocorrrefpt_etaptbin[nj][ptb]->Fill(refeta,recopt/refpt,wxs*wcen*wvz);
    hratiorawrefpt_etaptbin[nj][ptb]->Fill(refeta,rawpt/refpt,wxs*wcen*wvz);       
          
	//! Response in eta
	hratiocorrrefpt_eta[nj][multb][ieta]->Fill(refpt,recopt/refpt,wxs*wcen*wvz);
	hratiorawrefpt_eta [nj][multb][ieta]->Fill(refpt,rawpt/refpt,wxs*wcen*wvz);
	hratiocorrrefpt_eta[nj][nmult-1][ieta]->Fill(refpt,recopt/refpt,wxs*wcen*wvz);
	hratiorawrefpt_eta [nj][nmult-1][ieta]->Fill(refpt,rawpt/refpt,wxs*wcen*wvz);

	hjeteta   [nj][multb]->Fill(iJet->jteta[gj]);
	hjetphi   [nj][multb]->Fill(iJet->jtphi[gj]);
	hjetpteta [nj][multb]->Fill(iJet->jtpt[gj],iJet->jteta[gj]);
	hjetptphi [nj][multb]->Fill(iJet->jtpt[gj],iJet->jtphi[gj]);
	hjetetaphi[nj][multb]->Fill(iJet->jteta[gj],iJet->jtphi[gj]);

	hjeteta   [nj][nmult-1]->Fill(iJet->jteta[gj]);
	hjetphi   [nj][nmult-1]->Fill(iJet->jtphi[gj]);
	hjetpteta [nj][nmult-1]->Fill(iJet->jtpt[gj],iJet->jteta[gj]);
	hjetptphi [nj][nmult-1]->Fill(iJet->jtpt[gj],iJet->jtphi[gj]);
	hjetetaphi[nj][nmult-1]->Fill(iJet->jteta[gj],iJet->jtphi[gj]);



	//! Fill the background pT info for the signal matched jets only
	//! pileup study
	hjetptpu_genm[nj][multb]->Fill(recopt,iJet->jtpu[gj],wxs*wcen*wvz);
	hjetptpu_etab_genm[nj][multb][ieta]->Fill(recopt,iJet->jtpu[gj],wxs*wcen*wvz);

	hjetptpu_genm[nj][nmult-1]->Fill(recopt,iJet->jtpu[gj],wxs*wcen*wvz);
	hjetptpu_etab_genm[nj][nmult-1][ieta]->Fill(recopt,iJet->jtpu[gj],wxs*wcen*wvz);
	
	//! Jet bkgd estimation
	//! (photonSum+neutralSum+chargedSum-rawpt)
	double jbkgd  = (iJet->photonSum[gj]+iJet->neutralSum[gj]+iJet->chargedSum[gj]) - rawpt;
	hjetbkgd_genm  [nj][multb]->Fill(jbkgd,wxs*wcen*wvz);
	hjetptbkgd_genm[nj][multb]->Fill(recopt,jbkgd,wxs*wcen*wvz);
	hjetptbkgd_etab_genm[nj][multb][ieta]->Fill(recopt,jbkgd,wxs*wcen*wvz);

	hjetbkgd_genm  [nj][nmult-1]->Fill(jbkgd,wxs*wcen*wvz);
	hjetptbkgd_genm[nj][nmult-1]->Fill(recopt,jbkgd,wxs*wcen*wvz);
	hjetptbkgd_etab_genm[nj][nmult-1][ieta]->Fill(recopt,jbkgd,wxs*wcen*wvz);

	hPFFraction_genm[nj][multb][0]->Fill(recopt,iJet->photonSum[gj]/rawpt);
	hPFFraction_genm[nj][multb][1]->Fill(recopt,iJet->neutralSum[gj]/rawpt);
	hPFFraction_genm[nj][multb][2]->Fill(recopt,iJet->chargedSum[gj]/rawpt);

	hPFFraction_genm[nj][nmult-1][0]->Fill(recopt,iJet->photonSum[gj]/rawpt);
	hPFFraction_genm[nj][nmult-1][1]->Fill(recopt,iJet->neutralSum[gj]/rawpt);
	hPFFraction_genm[nj][nmult-1][2]->Fill(recopt,iJet->chargedSum[gj]/rawpt);
	
	hNjets_genm [nj][multb]->Fill(refpt);
	hgenpt_genm [nj][multb]->Fill(refpt,wxs*wcen*wvz);
	hrecopt_genm[nj][multb]->Fill(recopt,wxs*wcen*wvz);	  
	hrawpt_genm [nj][multb]->Fill(rawpt,wxs*wcen*wvz);

	hNjets_genm [nj][nmult-1]->Fill(refpt);
	hgenpt_genm [nj][nmult-1]->Fill(refpt,wxs*wcen*wvz);
	hrecopt_genm[nj][nmult-1]->Fill(recopt,wxs*wcen*wvz);	  
	hrawpt_genm [nj][nmult-1]->Fill(rawpt,wxs*wcen*wvz);
	
	//! Very fine bin in ref pt
	hrescrpt_genm[nj][multb]->Fill(refpt,recopt/refpt,wxs*wcen*wvz);
	hresrrpt_genm[nj][multb]->Fill(refpt,rawpt/refpt,wxs*wcen*wvz);
	hresrcrpt_genm[nj][multb]->Fill(recopt,recopt/rawpt,wxs*wcen*wvz);

	hrescrpt_genm [nj][nmult-1]->Fill(refpt,recopt/refpt,wxs*wcen*wvz);
	hresrrpt_genm [nj][nmult-1]->Fill(refpt,rawpt/refpt,wxs*wcen*wvz);
	hresrcrpt_genm[nj][nmult-1]->Fill(recopt,recopt/rawpt,wxs*wcen*wvz);

	//! Very fine bin in ref eta
	hrescreta_genm[nj][multb]->Fill(refeta,recopt/refpt,wxs*wcen*wvz);
	hresrreta_genm[nj][multb]->Fill(refeta,rawpt/refpt,wxs*wcen*wvz);
	hresrcreta_genm[nj][multb]->Fill(recoeta,recopt/rawpt,wxs*wcen*wvz);

	hrescreta_genm[nj][nmult-1]->Fill(refeta,recopt/refpt,wxs*wcen*wvz);
	hresrreta_genm[nj][nmult-1]->Fill(refeta,rawpt/refpt,wxs*wcen*wvz);
	hresrcreta_genm[nj][nmult-1]->Fill(recoeta,recopt/rawpt,wxs*wcen*wvz);


        //! Response in different eta and phi bins
        int etabin = GetEtaBin(fabs(refeta));
	int phibin = GetPhiBin(refphi);

        //! Response in eta and phi bins
        if(etabin >= 0 && etabin<maxe){
	  hpteta[nj][multb][etabin]->Fill(refpt,recopt/refpt,wxs*wcen*wvz);
	  hpteta[nj][nmult-1][etabin]->Fill(refpt,recopt/refpt,wxs*wcen*wvz);
	}
        if(phibin >= 0 && phibin<maxph){
	  hptphi[nj][multb][phibin]->Fill(refpt,recopt/refpt,wxs*wcen*wvz);
	  hptphi[nj][nmult-1][phibin]->Fill(refpt,recopt/refpt,wxs*wcen*wvz);
	}
      }//! igen loop
/*      hNevt[nj][multb]->Fill(vz,wxs*wcen*wvz);
      hNevt[nj][nmult-1]->Fill(vz,wxs*wcen*wvz);
*/
   //   delete [] ljet;
    }//! nj jet loop

/*    if(istat){
      hBin->Fill(hiBin,wxs*wcen*wvz);
      hVz->Fill(vz,wxs*wcen*wvz);
      hHF->Fill(hiHF,wxs*wcen*wvz);

      hNTracks->Fill(ntracks,wxs*wcen*wvz);
      hNTracksHF->Fill(ntracks,hiHF,wxs*wcen*wvz);
      hBinHF->Fill(hiBin,hiHF,wxs*wcen*wvz);
      hBinNTracks->Fill(hiBin,ntracks,wxs*wcen*wvz);
      hNTracksHFplusEta4->Fill(ntracks,HFplusEta4,wxs*wcen*wvz);
      iEvent++;
    }
*/ //   std::cout<<"Completed event #  "<<ievt<<std::endl; 
  }//! event loop ends
  
  std::cout<<std::endl;
  std::cout<<std::endl;
  std::cout<<std::endl;

//  std::cout<<"Events which passed the pT hat cut : "<<hTotEve->Integral()<<" out of  : "<<hEvt->Integral()
//	   <<" efficiency of all the cuts : " <<hTotEve->Integral()/hEvt->Integral()<<std::endl;
  std::cout<<std::endl;


  for(int nj=0;nj<knj;nj++){
    std::cout<<"# of Events for : "<<cjets[nj]<<"\t"<<hNevt[nj][nmult-1]->Integral()<<"\t # of Jets : "<<hNjets_genm[nj][nmult-1]->Integral()<<std::endl;
  }

  //! Write to output file
  fout->cd();
  fout->Write();
  fout->Close();


  //! Check
  timer.Stop();
  double rtime  = timer.RealTime();
  double ctime  = timer.CpuTime();

  std::cout<<std::endl;
  std::cout<<Form("RealTime=%f seconds, CpuTime=%f seconds",rtime,ctime)<<std::endl;
  std::cout<<std::endl;
  std::cout<<"Good bye : " <<"\t"<<std::endl;
  return 1;
}
Пример #21
0
void analyzeForest(
		   //		   const char* infname = "root://eoscms//eos/cms/store/group/phys_heavyions/velicanu/forest/PA2013_HiForest_PromptRecofirstPR_forestv51.root",
		   //		   const char* infname = "/d102/yetkin/prod/clean/noDuplicate.root",
		   const char* infname = "/d102/yjlee/hiForest2/promptskim-hihighpt-hltjet80-pt90-v20.root",
		   const char* outname = "ntuple_data_PbPb_akPu3PF_04.root",
		   bool MC = 0,
		   bool PbPb2011 = 1,
		   int centIndex = 0, int etaBin = 0, int leadJetPtBin = 0, int trackPtBin = 0
		   ){

   cout<<"Begin"<<endl;

   bool mini = 1;


   int Nevents = 50000;
   Nevents = -1;

  bool usePF = 1;
  int R = 3;

  double etaCOM = -0.465;



  bool doFlow = 0;
  bool doInclusiveJets = 1;
  bool doTracks = 1;
  bool fillTracks = !PbPb2011;

  if(mini){
    doTracks = 0;
  }


  double trkMin = 4;

  double leadPtMin = 100;
  double jetTrackMin = 4;


  int frame = 1; // Dijet frame for z

  int analysisId = 0;

  double ptSubLeadMin = 30;
  double ptLeadMin = 120;

  double etLeadMin[10] = {100, 100,120,150,180,200  };
  double etLeadMax[10] = {1000,120,150,180,200,1000 };

  double tkMin[10] = {4.,  4.,5.,7.,10., 20.};
  double tkMax[10] = {100.,5.,7.,10.,20.,1000.};

  TF1* gaus = new TF1("gaus","gaus",-5,5);
  gaus->SetParameter(0,1);
  gaus->SetParameter(1,0);
  gaus->SetParameter(2,1);

  TRandom* engin = new TRandom();

  //  double fitMin[10] = {100,80,60,50,100};
  //  double fitMax[10] = {250,200,150,100,250};

  double fitMin[10] = {100,90,80,70,100};
  double fitMax[10] = {300,300,300,300,300};

  TH1::SetDefaultSumw2();
  TH2::SetDefaultSumw2();
  cout<<"x"<<endl;

  string name[10] = {"c0to10","c10to20","c20to30","c30to50","c50to100","c0to30","c30to100","c0to100"};
  cout<<"x"<<endl;

  TFile* outf = new TFile(outname,"recreate");
  
  double pi = TMath::Pi();
  cout<<"x"<<endl;

  FlowReconstructor* flow;

  if(doFlow) flow = new FlowReconstructor();
  cout<<"x"<<endl;

  string trackVars = "";
  string evtVars = "";
  string dijetVars = "";
  string dijetExtraVars = "";

  string matchedVars = "";
  string jetVars = "";
  string flowVars = "";
  string flowVarsA = "";
  string flowVarsB = "";
  string flowVarsC = "";

  evtVars += "evt:run:bin:hf:ntrk:npix:psi:noise:pthat:nside:nps:npb:npscom:npbcom:hfs:hfb:nls:nlb:nlscom:nlbcom";
  dijetVars += "jtpt1:jteta1:jtphi1:jtpt2:jteta2:jtphi2:jtpt3:jteta3:jtphi3:dphi"
     ":trkMax1:trkMax2:trkMax3";

  dijetExtraVars += "njet10:njet20:njet30:njet40:njet50:njet100"
     ":ngen10:ngen20:ngen30:ngen50"
     ":trkSum1:trkSum2:trkSum3"
     ":pu1:pu2:pu3"
     ":puc1:puc2:puc3"
     ":raw1:raw2:raw3"
     ":had1:had2:had3"
     ":matchPt1:matchPt2:matchPt3";
  
  matchedVars += "refpt1:refpt2:refpt3:pt1:pt2:pt3:type";

  flowVars += "v2:v2s:psi:psis:v2p:v2ps:psip:psips:v2m:v2ms:psim:psims:v2pm:v2mp:v2pp:v2mm";

  jetVars += evtVars;
  jetVars += ":";
  jetVars += dijetVars;
  jetVars += ":";
  jetVars += "pt:eta:phi";

  if(MC){
     jetVars += ":";
     jetVars += "genpt:geneta:genphi:dijetType";
  }

  trackVars += evtVars;
  trackVars += ":";
  trackVars += dijetVars;
  trackVars += ":";

  trackVars += "pt:eta:phi:dr1:dr2:bkg1a:bkg1b:bkg1c:bkg2a:bkg2b:bkg2c";
  trackVars += ":";
  trackVars += "z1:z2:z1a:z2a:z1b:z2b:z1c:z2c";

  dijetVars += ":";
  dijetVars += dijetExtraVars;


  cout<<"Filling event variables : "<<evtVars.data()<<endl;
  cout<<"Filling dijet variables : "<<dijetVars.data()<<endl;
  cout<<"Filling mc variables    : "<<matchedVars.data()<<endl;
  cout<<"Filling jet variables   : "<<jetVars.data()<<endl;
  cout<<"Filling track variables : "<<trackVars.data()<<endl;


  TNtuple *ntjet,*ntdijet,*ntmatch,*ntevt,*ntFlowA,*ntFlowB,*ntFlowC,*nttrk;

  ntdijet = new TNtuple("ntdijet","",dijetVars.data());
  if(MC) ntmatch = new TNtuple("ntmatch","",matchedVars.data());
  ntevt = new TNtuple("ntevt","",evtVars.data());

  if(doFlow){
     ntFlowA = new TNtuple("ntFlowA","",flowVars.data());
  }

  if(doInclusiveJets){
     ntjet = new TNtuple("ntjet","",jetVars.data());
  }
  if(doTracks){
     nttrk = new TNtuple("nttrk","",trackVars.data());
  }

  bool pp = 0;

  double ajMin[10] = {0,    0.11, 0.22, 0.33, 0. , 0, 0};
  double ajMax[10] = {0.11, 0.22, 0.33, 1.,   1. , 0 ,0};

  int nEta = 4;
  double etaMin[10] = {0,  0,    0.5,  1.};
  double etaMax[10] = {5., 0.5,  1.,   2.};

   outf->cd();

   int NxsiBin = 20;
   int NptBin = 100;
   double zBins[21];
   double ptBins[101];

   cout<<"BINS : "<<endl;
   for(int i = 0; i < NxsiBin+1; ++i){
     double xsi = -1+(10./NxsiBin)*(NxsiBin-i-1);
     cout<<"xsi : "<<xsi<<endl;
     zBins[i] = exp(-xsi);
   }

   for(int i = 0; i < NptBin+1; ++i){
     ptBins[i] = i*1000./NptBin;
   }

   HiForest * t;
   if(PbPb2011){
      if(!MC) doTracks = 0;
     t = new HiForest(infname,"",cPbPb,MC);
   }else{
     t = new HiForest(infname,"",cPPb,MC);
   }

   t->hasPhotonTree *= 0;
   t->hasMetTree *= 0;
   t->hasPFTree *= 0;
   t->hasPFTree *= 0;


   t->hasAk2JetTree *= 0;
   t->hasAk3JetTree *= !PbPb2011 || MC;
   t->hasAk4JetTree *= 0;
   t->hasAk5JetTree *= !PbPb2011 || MC;

   t->hasAkPu2JetTree *= 0;
   t->hasAkPu3JetTree *= 1;
   t->hasAkPu4JetTree *= 0;
   t->hasAkPu5JetTree *= !PbPb2011 || MC;

   t->hasAk2CaloJetTree *= 0;
   t->hasAk3CaloJetTree *= !PbPb2011 || MC;
   t->hasAk4CaloJetTree *= 0;
   t->hasAk5CaloJetTree *= !PbPb2011 || MC;

   t->hasAkPu2CaloJetTree *= 0;
   t->hasAkPu3CaloJetTree *= !PbPb2011 || MC;
   t->hasAkPu4CaloJetTree *= 0;
   t->hasAkPu5CaloJetTree *= !PbPb2011 || MC;


   if(!doTracks) t->hasTrackTree *= 0;
   t->hasPixTrackTree *= 0;
   t->hasTowerTree *= 0;
   t->hasHbheTree *= 0;
   t->hasEbTree *= 0;
   t->hasGenpTree *= 0;
   t->hasGenParticleTree *= MC;

   t->InitTree();

   cout<<"a"<<endl;


   if(Nevents > 0){
      t->nEntries = Nevents;
   }else{
      Nevents = t->nEntries;
   }

   outf->cd();

   vector<JetIndex> vecs;
   vecs.reserve(maxEntry);

   float z1[4], z2[4],
     z1a[4], z2a[4],
     z1b[4], z2b[4],
     z1c[4], z2c[4];

   float tdt1[4], tdt2[4], tdt1a[4], tdt2a[4], tdt1b[4], tdt2b[4], tdt1c[4], tdt2c[4];

   Jets *jets0 = 0, * jets1 = 0, *jets2 = 0;
   TTree  *jetTree0 = 0, * jetTree1 = 0, *jetTree2 = 0;

   if(usePF){

     if(R == 3){
       jets1 = &(t->akPu3PF);
       jetTree1 = t->akPu3jetTree;
       jets2 = &(t->akPu3Calo);
       jets0 = &(t->ak3PF);


     }
     if(R == 5){
       jets1 = &(t->akPu5PF);
       jetTree1 = t->akPu5jetTree;
       jets2 = &(t->akPu5Calo);
       jets0 = &(t->ak5PF);

     }


   }else{

     if(R == 3){
       jets1 = &(t->akPu3PF);
       jetTree1 = t->akPu3jetTree;
       jets2 = &(t->ak3PF);
     }
     if(R == 5){
       jets1 = &(t->akPu5PF);
       jetTree1 = t->akPu5jetTree;
       jets2 = &(t->ak5PF);
     }
   }

   cout<<"a"<<endl;

   //   t->sortJets(jetTree1, *jets1, 2., 0, 1); // add smearing in here. save input as ref 

   for(int iev = 0; iev < Nevents; ++iev){
     if(iev%1000==0){ 
       cout<<"Processing entry : "<<iev<<endl;
       if(doFlow) flow->realloc();
     }
     t->GetEntry(iev);

     if(!MC && !PbPb2011 && !(t->skim.pPAcollisionEventSelectionPA && t->skim.pHBHENoiseFilter &&t->hlt.HLT_PAJet80_NoJetID_v1)) continue;
     if(!MC && PbPb2011 && !(t->skim.pcollisionEventSelection && t->skim.pHBHENoiseFilter)) continue;

     // add other selection

     int noise = -1;
     if(PbPb2011){

	 if(!(t->skim.pHBHENoiseFilter)) noise = 0;
	 
	 if(t->hcalNoise.maxhpdhits >= 17) noise = 1;
	 if(t->hcalNoise.maxrbxhits >= 56) noise = 2;
	 
	 if(t->hcalNoise.nspikenoise >= 1) noise = 4;
	 if(t->hcalNoise.hasbadts4ts5 >= 1) noise = 5;
    
       //       if(t->hcalNoise.maxzeros >= 17) noise = 2;
       //       if(t->hcalNoise.emenergy/t->hcalNoise.hadenergy <= 0.45) noise = 3;

     }else{
       if(0){
         if(t->hcalNoise.MaxHPDHits >= 17) noise = 1;
         if(t->hcalNoise.MaxRBXHits >= 56) noise = 2;

         if(t->hcalNoise.SpikeNoiseCount >= 1) noise = 4;
         if(t->hcalNoise.HasBadTS4TS5 >= 1) noise = 5;
       }

     }

     if(!MC && noise >= 0) continue;

     float pthat = jets1->pthat;

     double pt1 = -9, pt2 = -9, pt3 = -9, aj = -9,
       eta1 = -9,eta2 = -9,phi1 = -9,phi2 = -9,
       dphi  = -9, adphi  = -9,
       eta3 = -9, phi3 = -9, dr = -9,
       ch1 = 0,ch2 = 0, ch1alt = 0, ch2alt = 0,

	refpt1 = 0, refpt2 = 0, refpt3 = 0,
        genpt1 = 0, genpt2 = 0, genpt3 = 0,

       pu1=-9,pu2=-9, pu3 = -9, 
       puc1=-9,puc2=-9, puc3 = -9,

       raw1=-9,raw2=-9, raw3 = -9,

       drm1=-9,drm2=-9, drm3=-9,
       psi1=-9, psi2=-9, psi=-9, psiP=-9, psiM=-9, psiPS=-9, psiMS=-9, psiS=-9,
       psiTri = -9, psiTriP = -9, psiTriM = -9, psiTriS = -9, psiTriPS = -9, psiTriMS = -9;

     float etsum=0,etx=0,ety=0,v2=0,
       etp=0,etxp=0,etyp=0,v2p=0,
       etm=0,etxm=0,etym=0,v2m=0,
       v2pm=0,v2mp=0,v2pp=0,v2mm=0,etx1=0,ety1=0,
       v2s,v2ps,v2ms;

     int dijetType = -9,njt10=0,njt20=0,njt30=0,njt40=0,njt50=0,njt100=0;
     int ngen10 = 0, ngen20=0, ngen30 = 0, ngen50 = 0;


     float trkMax1 = -9,trkMax2=-9,trkMax3=-9,
       trkSum1=-9,trkSum2=-9,trkSum3=-9,
       had1=-9,had2=-9,had3=-9,
       matchPt1=-9,matchPt2=-9,matchPt3=-9;

     int nSide = -9;

     int iPlane = 21; //21 HF, 0 tracks

     double flowEtaMin = 3;

     double hf = t->evt.hiHFplusEta4;
     double ntrk = t->evt.hiNtracks;
     double npix = t->evt.hiNpix;

     int nside = 0;
     int nps = 0;
     int npb = 0;
     int npscom = 0;
     int npbcom = 0;
     double hfs = 0, hfb = 0;
     int nls = 0, nlb = 0, nlscom = 0, nlbcom = 0;

     psi = t->evt.hiEvtPlanes[iPlane];
     psiM = t->evt.hiEvtPlanes[iPlane+2];
     psiP = t->evt.hiEvtPlanes[iPlane+1];

     if(doFlow){
       flow->reset();

       flow->fillTowers(t->tower,psi,psiM,psiP);
       flow->fit(psi);

       v2 = flow->v2;
       v2p = flow->v2p;
       v2m = flow->v2m;
       v2pp = flow->v2pp;
       v2pm = flow->v2pm;
       v2mp = flow->v2mp;
       v2mm = flow->v2mm;
       psiS = flow->psiS;
       psiPS = flow->psiPS;
       psiMS = flow->psiMS;
       v2s = flow->v2s;
       v2ps = flow->v2ps;
       v2ms = flow->v2ms;
       
     }

     vecs.clear();

     for(int j = 0; j < jets1->nref; ++j){

       if( fabs(jets1->jteta[j]) > 2 ) continue;

       JetIndex entry;
       entry.pt = jets1->jtpt[j];
       entry.index = j;
       vecs.push_back(entry);
       if(jets1->trackMax[j]<jetTrackMin) continue;

       if(jets1->jtpt[j]>10) njt10++;
       if(jets1->jtpt[j]>20) njt20++;
       if(jets1->jtpt[j]>30) njt30++;
       if(jets1->jtpt[j]>40) njt40++;
       if(jets1->jtpt[j]>50) njt50++;
       if(jets1->jtpt[j]>100) njt100++;
     }

     sort(vecs.begin(),vecs.end(),comparePt);

     int jtLead = -1, jtSubLead = -1, jtThird = -1;

     if(vecs.size() > 0) jtLead = vecs[0].index;
     if(vecs.size() > 1) jtSubLead = vecs[1].index;
     if(vecs.size() > 2) jtThird = vecs[2].index;

     if(!MC && (vecs.size() < 1 || jets1->jtpt[jtLead] < leadPtMin)) continue;
          
     int evt = t->hlt.Event;
     int run = t->hlt.Run;

     if(jtLead > -1){
       pt1 = jets1->jtpt[jtLead];
       eta1 = jets1->jteta[jtLead];
       phi1 = jets1->jtphi[jtLead];
       raw1 = jets1->rawpt[jtLead];
       trkMax1 = jets1->trackMax[jtLead];
       trkSum1 = jets1->trackSum[jtLead];
       matchPt1 = jets1->matchedPt[jtLead];

       if(MC) refpt1 = jets1->refpt[jtLead];
     }

     if(jtSubLead > -1){
       pt2 = jets1->jtpt[jtSubLead];
       eta2 = jets1->jteta[jtSubLead];
       phi2 = jets1->jtphi[jtSubLead];
       raw2 = jets1->rawpt[jtSubLead];
       trkMax2 = jets1->trackMax[jtSubLead];
       trkSum2 = jets1->trackSum[jtSubLead];
       matchPt2 = jets1->matchedPt[jtSubLead];

       if(MC) refpt2 = jets1->refpt[jtSubLead];

       aj = (pt1-pt2)/(pt1+pt2);
       dphi = deltaPhi(phi1,phi2);
       adphi = fabs(dphi);

       dr= deltaR(eta2,phi2,eta1,phi1);
       //       correlateTracks(t->track,eta2,phi2,trkMin,ch2,trk2,ntrk2);
     }

     if(jtThird > -1){
	pt3 = jets1->jtpt[jtThird];
	eta3 = jets1->jteta[jtThird];
	phi3 = jets1->jtphi[jtThird];
	raw3 = jets1->rawpt[jtThird];
	trkMax3 = jets1->trackMax[jtThird];
        trkSum3 = jets1->trackSum[jtThird];
	matchPt3 = jets1->matchedPt[jtThird];

	if(MC) refpt3 = jets1->refpt[jtThird];

     }

     double dphijet=-10;
     dphijet=acos(cos(phi1-phi2));

     int im1 = findMatch(drm1,*jets0,eta1,phi1);
     int im2 = findMatch(drm2,*jets0,eta2,phi2);
     int im3 = findMatch(drm3,*jets0,eta3,phi3);

     if(im1 >= 0 ){
       pu1 = jets0->rawpt[im1]-raw1;
       puc1 = jets0->jtpt[im1]-pt1;
     }

     if(im2 >= 0 ){
       pu2 = jets0->rawpt[im2]-raw2;
       puc2 = jets0->jtpt[im2]-pt2;
     }

     if(im3 >= 0 ){
       pu3 = jets0->rawpt[im3]-raw3;
       puc3 = jets0->jtpt[im3]-pt3;
     }


     
     if(MC){
	vecs.clear();
	for(int j = 0; j < jets1->ngen; ++j){	   
	   JetIndex entry;
	   if(fabs(jets1->geneta[j]) > 2) continue;
	   entry.pt = jets1->genpt[j];
	   entry.index = j;
	   vecs.push_back(entry);

	   if(jets1->genpt[j] > 10)ngen10++;
           if(jets1->genpt[j] > 20)ngen20++;
           if(jets1->genpt[j] > 30)ngen30++;
           if(jets1->genpt[j] > 50)ngen50++;

	}

	sort(vecs.begin(),vecs.end(),comparePt);

	int ig1 = -1, ig2 = -1, ig3 = -1;     
	if(vecs.size() > 0){
	   ig1 = jets1->genmatchindex[vecs[0].index];
	   genpt1 = jets1->genpt[vecs[0].index];
	}
	if(vecs.size() > 1){
	   ig2 = jets1->genmatchindex[vecs[1].index];
	   genpt2 = jets1->genpt[vecs[1].index];
	}
	if(vecs.size() > 2){
	   ig3 = jets1->genmatchindex[vecs[2].index];
	   genpt3 = jets1->genpt[vecs[2].index];
	}

	if(jtLead == ig1 && jtSubLead == ig2) dijetType = 0;
        else if(jtLead == ig1 && jtSubLead == ig3) dijetType = 1;
        else if(jtLead == ig2 && jtSubLead == ig1) dijetType = 2;
        else if(jtLead == ig2 && jtSubLead == ig3) dijetType = 3;
        else if(jtLead == ig3 && jtSubLead == ig1) dijetType = 4;
        else if(jtLead == ig3 && jtSubLead == ig2) dijetType = 5;

     }

     double dijetEta = (eta1+eta2)/2;

     if(doTracks){
       
       for(int i = 0; i < t->genparticle.mult; ++i){
	 double peta = t->genparticle.eta[i];
         double petaCOM = peta - etaCOM;

         if(4. < peta && peta < 5.2){
	   if(t->genparticle.sube[i] == 0) hfs += t->genparticle.pt[i];
	   else hfb += t->genparticle.pt[i];
	 }


         if(fabs(peta) < 2.4){
	   if(t->genparticle.chg[i] == 0) continue;
	   if(t->genparticle.pt[i] > 0.4){
	     if(t->genparticle.sube[i] == 0) nps++;
	     else npb++;
	   }
	   if(t->genparticle.pt[i] > 0.1 && t->genparticle.pt[i] < 1){
             if(t->genparticle.sube[i] == 0) nls++;
             else nlb++;
           }


	 }
	 if(fabs(petaCOM) < 2.4){
	   if(t->genparticle.chg[i] == 0) continue;
	   if(t->genparticle.pt[i] > 0.4){
             if(t->genparticle.sube[i] == 0) npscom++;
             else npbcom++;
           }
	   if(t->genparticle.pt[i] > 0.1 && t->genparticle.pt[i] < 1){
             if(t->genparticle.sube[i] == 0) nlscom++;
             else nlbcom++;
           }
         }
       }
       

     for(int i = 0; i < t->track.nTrk; ++i){

       if(!t->selectTrack(i)) continue;

       double dphitrk = acos(cos(t->track.trkPhi[i]-phi1));
       if(dphitrk < 2.*pi/3. && dphitrk > pi/3.) nside++;

       double tdr1 = deltaR(t->track.trkEta[i],t->track.trkPhi[i],eta1,phi1);
       double tdr2 = deltaR(t->track.trkEta[i],t->track.trkPhi[i],eta2,phi2);

       double bkg1a = deltaR(t->track.trkEta[i],t->track.trkPhi[i],-eta1,phi1);
       double bkg1b = deltaR(t->track.trkEta[i],t->track.trkPhi[i],eta1,phi1+pi);
       double bkg1c = deltaR(t->track.trkEta[i],t->track.trkPhi[i],-eta1,phi1+pi);

       double bkg2a = deltaR(t->track.trkEta[i],t->track.trkPhi[i],-eta2,phi2);
       double bkg2b = deltaR(t->track.trkEta[i],t->track.trkPhi[i],eta2,phi2+pi);
       double bkg2c = deltaR(t->track.trkEta[i],t->track.trkPhi[i],-eta2,phi2+pi);

       double drMax = 10000.;

       if(tdr1 > drMax && 
	  tdr2 > drMax &&
	  bkg1a > drMax &&
	  bkg1b > drMax &&
	  bkg1c > drMax &&
	  bkg2a > drMax &&
	  bkg2b > drMax &&
	  bkg2c > drMax) continue;

       if(jtLead > -1){
	 getProjectedZ(z1,tdt1,pt1,eta1,phi1,t->track.trkPt[i],t->track.trkEta[i],t->track.trkPhi[i],dijetEta);
	 getProjectedZ(z1a,tdt1a,pt1,-eta1,phi1,t->track.trkPt[i],t->track.trkEta[i],t->track.trkPhi[i],dijetEta);
         getProjectedZ(z1b,tdt1b,pt1,eta1,phi1+pi,t->track.trkPt[i],t->track.trkEta[i],t->track.trkPhi[i],dijetEta);
         getProjectedZ(z1c,tdt1c,pt1,-eta1,phi1+pi,t->track.trkPt[i],t->track.trkEta[i],t->track.trkPhi[i],dijetEta);
       }

       if(jtSubLead > -1){
	 getProjectedZ(z2,tdt2,pt2,eta2,phi2,t->track.trkPt[i],t->track.trkEta[i],t->track.trkPhi[i],dijetEta);
	 getProjectedZ(z2a,tdt2a,pt2,-eta2,phi2,t->track.trkPt[i],t->track.trkEta[i],t->track.trkPhi[i],dijetEta);
         getProjectedZ(z2b,tdt2b,pt2,eta2,phi2+pi,t->track.trkPt[i],t->track.trkEta[i],t->track.trkPhi[i],dijetEta);
         getProjectedZ(z2c,tdt2c,pt2,-eta2,phi2+pi,t->track.trkPt[i],t->track.trkEta[i],t->track.trkPhi[i],dijetEta);
       }


       float trkentry[] = {
	 evt,run,t->evt.hiBin,hf,ntrk,npix,psi,noise,pthat,
	 nside,nps,npb,npscom,npbcom,hfs,hfb,nls,nlb,nlscom,nlbcom,
	  pt1,eta1,phi1,pt2,eta2,phi2,pt3,eta3,phi3,dphijet,
	 trkMax1,trkMax2,trkMax3,
	  t->track.trkPt[i],t->track.trkEta[i],t->track.trkPhi[i],
	  tdr1,tdr2,
	  bkg1a,bkg1b,bkg1c,bkg2a,bkg2b,bkg2c,
	  
	  z1[frame],z2[frame],
	  z1a[frame],z2a[frame],
	  z1b[frame],z2b[frame],
	  z1c[frame],z2c[frame],	  
       };
       
       if(fillTracks) nttrk->Fill(trkentry);

     }
     }
     
     float evtentry[] = {evt,run,t->evt.hiBin,hf,ntrk,npix,psi,noise,pthat,nside,nps,npb,npscom,npbcom,hfs,hfb,nls,nlb,nlscom,nlbcom};     
     float dijetentry[] = {pt1,eta1,phi1,pt2,eta2,phi2,pt3,eta3,phi3,dphijet,
                           trkMax1,trkMax2,trkMax3,
			   njt10,njt20,njt30,njt40,njt50,njt100,
			   ngen10,ngen20,ngen30,ngen50,
			   trkSum1,trkSum2,trkSum3,
			   pu1,pu2,pu3,
			   puc1,puc2,puc3,
			   raw1,raw2,raw3,
			   had1,had2,had3,
			   matchPt1,matchPt2,matchPt3
     };

     float matchedentry[] = {refpt1,refpt2,refpt3,genpt1,genpt2,genpt3,dijetType};
     float flowentryA[] = {v2,v2s,psi,psiS,v2p,v2ps,psiP,psiPS,v2m,v2ms,psiM,psiMS,v2pm,v2mp,v2pp,v2mm};

     ntevt->Fill(evtentry);
     ntdijet->Fill(dijetentry);
     if(MC) ntmatch->Fill(matchedentry);
     if(doFlow) ntFlowA->Fill(flowentryA);

     if(doInclusiveJets){
	vecs.clear();
	for(int j = 0; j < jets1->nref; ++j){
	   //       if(j == jtLead) continue;
	   if( fabs(jets1->jteta[j]) > 2 ) continue;
	   if( jets1->jtpt[j] < ptSubLeadMin) continue;
	   
	   JetIndex entry;
	   entry.pt = jets1->jtpt[j];
	   entry.index = j;
	   vecs.push_back(entry);
	}
	
	sort(vecs.begin(),vecs.end(),comparePt);

     for(int j = 0; j < vecs.size(); ++j){

       int jj = vecs[j].index;

       double pt=-9, eta=-9, phi=-9, had=-9, ch=-9, trk=-9, ntrk=-9, ptm=-9, drm=-9, pu=-9;
       double genpt=-9, geneta=-9, genphi=-9;

       pt = jets1->jtpt[jj];
       eta = jets1->jteta[jj];
       phi = jets1->jtphi[jj];

       genpt = jets1->refpt[jj];
       geneta = jets1->refeta[jj];
       genphi = jets1->refphi[jj];

       float jentry[] = {evt,run,t->evt.hiBin,hf,ntrk,npix,psi,noise,pthat,
			 nside,nps,npb,npscom,npbcom,hfs,hfb,nls,nlb,nlscom,nlbcom,
			 pt1,eta1,phi1,pt2,eta2,phi2,pt3,eta3,phi3,dphijet,
			 trkMax1,trkMax2,trkMax3,
			 pt,eta,phi,
			 genpt,geneta,genphi,dijetType 
       };

       ntjet->Fill(jentry);

     }
     } 

   }
   
   outf->Write();


   cout<<"Congrats!!!"<<endl;


}
void gammaJetRapidity_energyClosure()
{
  TH1::SetDefaultSumw2();
  
  TString file;

  file = "/mnt/hadoop/cms/store/user/luck/pA2013_MC/HiForest2_QCDPhoton30_5020GeV_100k.root";

  HiForest *c = new HiForest(file, "Forest", cPPb, true);
  c->InitTree();

  TProfile *mcClosure = new TProfile("mcClosure",";p_{T}^{gen};<p_{T}^{reco}/p_{T}^{gen}>",40,0,300);

  Int_t notMatched = 0;

  //loop over events in each file
  int nentries = c->GetEntries();
  for(int jentry = 0; jentry<nentries; jentry++)
  {
    if (jentry% 1000 == 0)  {
      printf("%d / %d\n",jentry,nentries);
    }
    
    c->GetEntry(jentry);
    
    //event selection (mc only)
    if( !( c->skim.phfPosFilter1 && c->skim.phfNegFilter1 && c->skim.phltPixelClusterShapeFilter && c->skim.pprimaryvertexFilter) )
      continue;

    if(c->photon.nPhotons == 0)
      continue;

    //loop over photons in the event
    Float_t leadingPt = 0;
    Int_t leadingIndex = -1;
    for(int i = 0; i<c->photon.nPhotons; i++)
    {
      if(c->photon.pt[i] > leadingPt)
      {
	leadingPt = c->photon.pt[i];
	leadingIndex = i;
      }
    }
    
    if(leadingIndex == -1) 
      continue;

    if(c->photon.isGenMatched[leadingIndex])
    {
      Double_t genPt = c->photon.genMatchedPt[leadingIndex];
      Double_t ratio = leadingPt/genPt;

      mcClosure->Fill(genPt,ratio);

    }
    else
    {
      notMatched++;
    }
  }

  mcClosure->Draw();
  mcClosure->GetYaxis()->SetRangeUser(0.,2.);
  TLine *line = new TLine(0, 1, 300, 1);
  line->Draw();
  drawText("Leading Photons",0.75,0.75);

  printf("Number of not matched leading photons: %d\n",notMatched);
}