#define  TP_cxx    
#include "TP.h"  
#include <TH2.h>   
#include <TStyle.h> 
#include <TCanvas.h> 
#include <string>
#include <math.h>
#include <iostream>
#include <fstream>
#include <string>

void TP::Loop() 

{

  if (fChain == 0) return;

  TH1F * TagInvMass = new TH1F("TagInvMass","TagInvMass",100,80000.,100000.);
  TH1F * ProbeInvMass = new TH1F("ProbeInvMass","ProbeInvMass",100,80000.,100000.);

  TH2F * hex = new TH2F("hex","hex",50,-3.,3.,50,-3.2,3.2);
  TH2F * hall = new TH2F("hall","hall",50,-3.,3.,50,-3.2,3.2);
  TH1F * hptallbb = new TH1F("hptallbb","hptallbb",21,0.,20);
  TH1F * hptallbe = new TH1F("hptallbe","hptallbe",21,0.,20);
   TH1F * hdr  = new TH1F("hdr","dr",100,0.,10.); 
    TH1F * hdr2  = new TH1F("hdr2","dr2",100,0.,10.); 
  TH1F * hptdr   = new TH1F("hptdr","hptdr",21,0.,20);
  TH1F * hdrcut  = new TH1F("hpdrcut","All dr cuts",100,0.,1.); 
  TH1F * hptalle = new TH1F("hptalle","hptalle",21,0.,20);
  // 
  TH1F * stacoCombComb_jpsiInvmass_os_am_aa_cut3 =new TH1F("stacoCombComb_jpsiInvmass_os_am_aa_cut3","stacoCombComb_jpsiInvmass_os_am_aa_cut3", 20, 2.86 , 3.34);
  // 

 int nptbins2  = 11; 
  float ptbin2[12];
   ptbin2[0]=1.000;
 ptbin2[0]=1.000;  
 ptbin2[1]=5.000;  
 ptbin2[2]=7.000;  
 ptbin2[3]=10.000; 
 ptbin2[4]=14.000; 
 ptbin2[5]=18.000; 
 ptbin2[6]=25.000; 
 ptbin2[7]=30.000; 
 ptbin2[8]=35.000; 
 ptbin2[9]=40.000; 
 ptbin2[10]=45.000;
	ptbin2[11]=50.000;
 
  TH1F * hptall = new TH1F("hptall","hptall",nptbins2,ptbin2); 
  TH1F * hptselall = new TH1F("hptselall","hptselall",nptbins2,ptbin2); 
  TH1F * hptb   = new TH1F("hptb","hptb",nptbins2,ptbin2); 
  TH1F * hpte   = new TH1F("hpte","hpte",nptbins2,ptbin2); 
  TH1F * hptmsallqp = new TH1F("hptmsallqp","hptmsallqp",nptbins2,ptbin2); 
  TH1F * hptmsallqn = new TH1F("hptmsallqn","hptmsallqn",nptbins2,ptbin2); 
  TH1F * hptmsselbqp = new TH1F("hptmsselbqp","hptmsselbqp",nptbins2,ptbin2); 
  TH1F * hptmsselbqn = new TH1F("hptmsselbqn","hptmsselbqn",nptbins2,ptbin2); 
  TH1F * hptmsbqp = new TH1F("hptmsbqp","hptmsbqp",nptbins2,ptbin2); 
  TH1F * hptmsbqn = new TH1F("hptmsbqn","hptmsbqn",nptbins2,ptbin2); 
  TH1F * hptmsall     = new TH1F("hptmsall","hptmsall",nptbins2,ptbin2); 
  TH1F * hptmsallqnp = new TH1F("hptmsallqnp","hptmsallqnp",nptbins2,ptbin2); 
  TH1F * hptmsallqnn = new TH1F("hptmsallqnn","hptmsallqnn",nptbins2,ptbin2); 
  TH1F * hptmsallqpnp = new TH1F("hptmsallqpnp","hptmsallqpnp",nptbins2,ptbin2); 
  TH1F * hptmsallqpnn = new TH1F("hptmsallqpnn","hptmsallqpnn",nptbins2,ptbin2); 
  TH1F * hptmsallqnnp = new TH1F("hptmsallqnnp","hptmsallqnnp",nptbins2,ptbin2); 
  TH1F * hptmsallqnnn = new TH1F("hptmsallqnnn","hptmsallqnnn",nptbins2,ptbin2); 
  TH1F * hptmsb      = new TH1F("hptmsb","hptmsb",nptbins2,ptbin2); 
  TH1F * hptmsbqnp = new TH1F("hptmsbqnp","hptmsbqnp",nptbins2,ptbin2); 
  TH1F * hptmsbqnn = new TH1F("hptmsbqnn","hptmsbqnn",nptbins2,ptbin2); 
  TH1F * hptmsbqpnp      = new TH1F("hptmsbqpnp","hptmsbqpnp",nptbins2,ptbin2); 
  TH1F * hptmsbqpnn      = new TH1F("hptmsbqpnn","hptmsbqpnn",nptbins2,ptbin2); 
  TH1F * hptmsbqnnp      = new TH1F("hptmsbqnnp","hptmsbqnnp",nptbins2,ptbin2); 
  TH1F * hptmsbqnnn      = new TH1F("hptmsbqnnn","hptmsbqnnn",nptbins2,ptbin2); 
  TH1F * hptmse          = new TH1F("hptmse","hptmse",nptbins2,ptbin2); 
  TH1F * hptmseqnp = new TH1F("hptmseqnp","hptmseqnp",nptbins2,ptbin2); 
  TH1F * hptmseqnn = new TH1F("hptmseqnn","hptmseqnn",nptbins2,ptbin2); 
  TH1F * hptmseqpnp      = new TH1F("hptmseqpnp","hptmseqpnp",nptbins2,ptbin2); 
  TH1F * hptmseqpnn      = new TH1F("hptmseqpnn","hptmseqpnn",nptbins2,ptbin2); 
  TH1F * hptmseqnnp      = new TH1F("hptmseqnnp","hptmseqnnp",nptbins2,ptbin2); 
  TH1F * hptmseqnnn      = new TH1F("hptmseqnnn","hptmseqnnn",nptbins2,ptbin2); 
  TH1F * hptmsselall = new TH1F("hptmsselall","hptmsselall",nptbins2,ptbin2);
  TH1F * hptmsselallqnp = new TH1F("hptmselallqnp","hptmselallqnp",nptbins2,ptbin2); 
  TH1F * hptmsselallqnn = new TH1F("hptmselallqnn","hptmselallqnn",nptbins2,ptbin2); 
  TH1F * hptmsselallqpnp = new TH1F("hptmsselallqpnp","hptmsselallqpnp",nptbins2,ptbin2); 
  TH1F * hptmsselallqpnn = new TH1F("hptmsselallqpnn","hptmsselallqpnn",nptbins2,ptbin2); 
  TH1F * hptmsselallqnnp = new TH1F("hptmsselallqnnp","hptmsselallqnnp",nptbins2,ptbin2); 
  TH1F * hptmsselallqnnn = new TH1F("hptmsselallqnnn","hptmsselallqnnn",nptbins2,ptbin2); 
  TH1F * hptmsselb   = new TH1F("hptmsselb","hptmsselb",nptbins2,ptbin2);
  TH1F * hptmsselbqnp = new TH1F("hptmsselbqnp","hptmsselbqnp",nptbins2,ptbin2); 
  TH1F * hptmsselbqnn = new TH1F("hptmsselbqnn","hptmsselbqnn",nptbins2,ptbin2); 
  TH1F * hptmsselbqpnp = new TH1F("hptmsselbqpnp","hptmsselbqpnp",nptbins2,ptbin2); 
  TH1F * hptmsselbqpnn = new TH1F("hptmsselbqpnn","hptmsselbqpnn",nptbins2,ptbin2); 
  TH1F * hptmsselbqnnp = new TH1F("hptmsselbqnnp","hptmsselbqnnp",nptbins2,ptbin2); 
  TH1F * hptmsselbqnnn = new TH1F("hptmsselbqnnn","hptmsselbqnnn",nptbins2,ptbin2); 
  TH1F * hptmssele   = new TH1F("hptmssele","hptmssele",nptbins2,ptbin2);
  TH1F * hptmsseleqnp = new TH1F("hptmsseleqnp","hptmsseleqnp",nptbins2,ptbin2); 
  TH1F * hptmsseleqnn = new TH1F("hptmsseleqnn","hptmsseleqnn",nptbins2,ptbin2); 
  TH1F * hptmsseleqpnp = new TH1F("hptmsseleqpnp","hptmsseleqpnp",nptbins2,ptbin2); 
  TH1F * hptmsseleqpnn = new TH1F("hptmsseleqpnn","hptmsseleqpnn",nptbins2,ptbin2); 
  TH1F * hptmsseleqnnp = new TH1F("hptmsseleqnnp","hptmsseleqnnp",nptbins2,ptbin2); 
  TH1F * hptmsseleqnnn = new TH1F("hptmsseleqnnn","hptmsseleqnnn",nptbins2,ptbin2); 
  TH1F * hptselb   = new TH1F("hptselb","hptselb",nptbins2,ptbin2); 
  TH1F * hptsele   = new TH1F("hptsele","hptsele",nptbins2,ptbin2); 
  TH1F * hptselalldr = new TH1F("hptselalldr","hptselalldr",nptbins2,ptbin2); 
  TH1F * hptselbdr   = new TH1F("hptselbdr","hptselbdr",nptbins2,ptbin2); 
  TH1F * hptseledr   = new TH1F("hptseledr","hptseledr",nptbins2,ptbin2); 
  TH1F * hptmsselbdr   = new TH1F("hptmsselbdr","hptmsselbdr",nptbins2,ptbin2); 
  TH1F * hptmsseledr   = new TH1F("hptmsseledr","hptmsseledr",nptbins2,ptbin2); 
    

  int netabin = 60;

  TH1F * hetaall   = new TH1F("hetaall","hetaall",netabin,-3.05,3.05);
  TH1F * hetaallqnp   = new TH1F("hetaallqnp","hetaallqnp",netabin,-3.05,3.05);
  TH1F * hetaallqnn   = new TH1F("hetaallqnn","hetaallqnn",netabin,-3.05,3.05);
  TH1F * hetaallqpnp   = new TH1F("hetaallqpnp","hetaallqpnp",netabin,-3.05,3.05);
  TH1F * hetaallqpnn   = new TH1F("hetaallqpnn","hetaallqpnn",netabin,-3.05,3.05);
  TH1F * hetaallqnnp   = new TH1F("hetaallqnnp","hetaallqnnp",netabin,-3.05,3.05);
  TH1F * hetaallqnnn   = new TH1F("hetaallqnnn","hetaallqnnn",netabin,-3.05,3.05);
  TH1F * hetab     = new TH1F("hetab","hetab",netabin,-3.05,3.05);
  TH1F * hetabqp     = new TH1F("hetabqp","hetabqp",netabin,-3.05,3.05);
  TH1F * hetabqn     = new TH1F("hetabqn","hetabqn",netabin,-3.05,3.05);
  TH1F * hetaselbqp     = new TH1F("hetaselbqp","hetaselbqp",netabin,-3.05,3.05);
  TH1F * hetaselbqn     = new TH1F("hetaselbqn","hetaselbqn",netabin,-3.05,3.05);
  TH1F * hetabqnp   = new TH1F("hetabqnp","hetabqnp",netabin,-3.05,3.05);
  TH1F * hetabqnn   = new TH1F("hetabqnn","hetabqnn",netabin,-3.05,3.05);
  TH1F * hetabqpnp   = new TH1F("hetabqpnp","hetabqpnp",netabin,-3.05,3.05);
  TH1F * hetabqpnn   = new TH1F("hetabqpnn","hetabqpnn",netabin,-3.05,3.05);
  TH1F * hetabqnnp   = new TH1F("hetabqnnp","hetabqnnp",netabin,-3.05,3.05);
  TH1F * hetabqnnn   = new TH1F("hetabqnnn","hetabqnnn",netabin,-3.05,3.05);
  TH1F * hetae     = new TH1F("hetae","hetae",netabin,-3.05,3.05);
  TH1F * hetaeqnp   = new TH1F("hetaeqnp","hetaeqnp",netabin,-3.05,3.05);
  TH1F * hetaeqnn   = new TH1F("hetaeqnn","hetaeqnn",netabin,-3.05,3.05);
  TH1F * hetaeqpnp   = new TH1F("hetaeqpnp","hetaeqpnp",netabin,-3.05,3.05);
  TH1F * hetaeqpnn   = new TH1F("hetaeqpnn","hetaeqpnn",netabin,-3.05,3.05);
  TH1F * hetaeqnnp   = new TH1F("hetaeqnnp","hetaeqnnp",netabin,-3.05,3.05);
  TH1F * hetaeqnnn   = new TH1F("hetaeqnnn","hetaeqnnn",netabin,-3.05,3.05);
  TH1F * hetaselall= new TH1F("hetaselall","hetaselall",netabin,-3.05,3.05);
  TH1F * hetaselallqnp   = new TH1F("hetaselallqnp","hetaselallqnp",netabin,-3.05,3.05);
  TH1F * hetaselallqnn   = new TH1F("hetaselallqnn","hetaselallqnn",netabin,-3.05,3.05);
  TH1F * hetaselallqpnp   = new TH1F("hetaselallqpnp","hetaselallqpnp",netabin,-3.05,3.05);
  TH1F * hetaselallqpnn   = new TH1F("hetaselallqpnn","hetaselallqpnn",netabin,-3.05,3.05);
  TH1F * hetaselallqnnp   = new TH1F("hetaselallqnnp","hetaselallqnnp",netabin,-3.05,3.05);
  TH1F * hetaselallqnnn   = new TH1F("hetaselallqnnn","hetaselallqnnn",netabin,-3.05,3.05);
  TH1F * hetaselb  = new TH1F("hetaselb","hetaselb",netabin,-3.05,3.05);
  TH1F * hetaselbqnp   = new TH1F("hetaselbqnp","hetaselbqnp",netabin,-3.05,3.05);
  TH1F * hetaselbqnn   = new TH1F("hetaselbqnn","hetaselbqnn",netabin,-3.05,3.05);
  TH1F * hetaselbqpnp   = new TH1F("hetaselbqpnp","hetaselbqpnp",netabin,-3.05,3.05);
  TH1F * hetaselbqpnn   = new TH1F("hetaselbqpnn","hetaselbqpnn",netabin,-3.05,3.05);
  TH1F * hetaselbqnnp   = new TH1F("hetaselbqnnp","hetaselbqnnp",netabin,-3.05,3.05);
  TH1F * hetaselbqnnn   = new TH1F("hetaselbqnnn","hetaselbqnnn",netabin,-3.05,3.05);
  TH1F * hetasele  = new TH1F("hetasele","hetasele",netabin,-3.05,3.05);
  TH1F * hetaseleqnp   = new TH1F("hetaseleqnp","hetaseleqnp",netabin,-3.05,3.05);
  TH1F * hetaseleqnn   = new TH1F("hetaseleqnn","hetaseleqnn",netabin,-3.05,3.05);
  TH1F * hetaseleqpnp   = new TH1F("hetaseleqpnp","hetaseleqpnp",netabin,-3.05,3.05);
  TH1F * hetaseleqpnn   = new TH1F("hetaseleqpnn","hetaseleqpnn",netabin,-3.05,3.05);
  TH1F * hetaseleqnnp   = new TH1F("hetaseleqnnp","hetaseleqnnp",netabin,-3.05,3.05);
  TH1F * hetaseleqnnn   = new TH1F("hetaseleqnnn","hetaseleqnnn",netabin,-3.05,3.05);
  TH1F * hetaselalldr = new TH1F("hetaselalldr","hetaselalldr",netabin,-3.05,3.05);
  TH1F * hetaselbdr = new TH1F("hetaselbdr","hetaselbdr",netabin,-3.05,3.05);
  TH1F * hetaseledr = new TH1F("hetaseledr","hassled",netabin,-3.05,3.05);


  int nphibin = 20;

  TH1F * hphiall   = new TH1F("hphiall","hphiall",nphibin,-3.14,3.14);
  TH1F * hphiallqnp   = new TH1F("hphiallqnp","hphiallqnp",nphibin,-3.14,3.14);
  TH1F * hphiallqnn   = new TH1F("hphiallqnn","hphiallqnn",nphibin,-3.14,3.14);
  TH1F * hphiallqpnp   = new TH1F("hphiallqpnp","hphiallqpnp",nphibin,-3.14,3.14);
  TH1F * hphiallqpnn   = new TH1F("hphiallqpnn","hphiallqpnn",nphibin,-3.14,3.14);
  TH1F * hphiallqnnp   = new TH1F("hphiallqnnp","hphiallqnnp",nphibin,-3.14,3.14);
  TH1F * hphiallqnnn   = new TH1F("hphiallqnnn","hphiallqnnn",nphibin,-3.14,3.14);
  TH1F * hphie     = new TH1F("hphie","hphie",nphibin,-3.14,3.14);
  TH1F * hphieqnp   = new TH1F("hphieqnp","hphieqnp",nphibin,-3.14,3.14);
  TH1F * hphieqnn   = new TH1F("hphieqnn","hphieqnn",nphibin,-3.14,3.14);
  TH1F * hphieqpnp   = new TH1F("hphieqpnp","hphieqpnp",nphibin,-3.14,3.14);
  TH1F * hphieqpnn   = new TH1F("hphieqpnn","hphieqpnn",nphibin,-3.14,3.14);
  TH1F * hphieqnnp   = new TH1F("hphieqnnp","hphieqnnp",nphibin,-3.14,3.14);
  TH1F * hphieqnnn   = new TH1F("hphieqnnn","hphieqnnn",nphibin,-3.14,3.14);
  TH1F * hphib     = new TH1F("hphib","hphib",nphibin,-3.14,3.14);
  TH1F * hphibqp   = new TH1F("hphibqp","hphibqp",nphibin,-3.14,3.14);
  TH1F * hphibqn   = new TH1F("hphibqn","hphibqn",nphibin,-3.14,3.14);
  TH1F * hphiselbqp   = new TH1F("hphiselbqp","hphiselbqp",nphibin,-3.14,3.14);
  TH1F * hphiselbqn   = new TH1F("hphiselbqn","hphiselbqn",nphibin,-3.14,3.14);
  TH1F * hphibqnp   = new TH1F("hphibqnp","hphibqnp",nphibin,-3.14,3.14);
  TH1F * hphibqnn   = new TH1F("hphibqnn","hphibqnn",nphibin,-3.14,3.14);
  TH1F * hphibqpnp   = new TH1F("hphibqpnp","hphibqpnp",nphibin,-3.14,3.14);
  TH1F * hphibqpnn   = new TH1F("hphibqpnn","hphibqpnn",nphibin,-3.14,3.14);
  TH1F * hphibqnnp   = new TH1F("hphibqnnp","hphibqnnp",nphibin,-3.14,3.14);
  TH1F * hphibqnnn   = new TH1F("hphibqnnn","hphibqnnn",nphibin,-3.14,3.14);
  TH1F * hphiselall = new TH1F("hphiselall","hphiselall",nphibin,-3.14,3.14);
  TH1F * hphiselallqnp   = new TH1F("hphiselallqnp","hphiselallqnp",nphibin,-3.14,3.14);
  TH1F * hphiselallqnn   = new TH1F("hphiselallqnn","hphiselallqnn",nphibin,-3.14,3.14);
  TH1F * hphiselallqpnp   = new TH1F("hphiselallqpnp","hphiselallqpnp",nphibin,-3.14,3.14);
  TH1F * hphiselallqpnn   = new TH1F("hphiselallqpnn","hphiselallqpnn",nphibin,-3.14,3.14);
  TH1F * hphiselallqnnp   = new TH1F("hphiselallqnnp","hphiselallqnnp",nphibin,-3.14,3.14);
  TH1F * hphiselallqnnn   = new TH1F("hphiselallqnnn","hphiselallqnnn",nphibin,-3.14,3.14);
  TH1F * hphiselb  = new TH1F("hphiselb","hphiselb",nphibin,-3.14,3.14);
  TH1F * hphiselbqnp   = new TH1F("hphiselbqnp","hphiselbqnp",nphibin,-3.14,3.14);
  TH1F * hphiselbqnn   = new TH1F("hphiselbqnn","hphiselbqnn",nphibin,-3.14,3.14);
  TH1F * hphiselbqpnp   = new TH1F("hphiselbqpnp","hphiselbqpnp",nphibin,-3.14,3.14);
  TH1F * hphiselbqpnn   = new TH1F("hphiselbqpnn","hphiselbqpnn",nphibin,-3.14,3.14);
  TH1F * hphiselbqnnp   = new TH1F("hphiselbqnnp","hphiselbqnnp",nphibin,-3.14,3.14);
  TH1F * hphiselbqnnn   = new TH1F("hphiselbqnnn","hphiselbqnnn",nphibin,-3.14,3.14);
  TH1F * hphisele  = new TH1F("hphisele","hphisele",nphibin,-3.14,3.14);
  TH1F * hphiseleqnp   = new TH1F("hphiseleqnp","hphiseleqnp",nphibin,-3.14,3.14);
  TH1F * hphiseleqnn   = new TH1F("hphiseleqnn","hphiseleqnn",nphibin,-3.14,3.14);
  TH1F * hphiseleqpnp   = new TH1F("hphiseleqpnp","hphiseleqpnp",nphibin,-3.14,3.14);
  TH1F * hphiseleqpnn   = new TH1F("hphiseleqpnn","hphiseleqpnn",nphibin,-3.14,3.14);
  TH1F * hphiseleqnnp   = new TH1F("hphiseleqnnp","hphiseleqnnp",nphibin,-3.14,3.14);
  TH1F * hphiseleqnnn   = new TH1F("hphiseleqnnn","hphiseleqnnn",nphibin,-3.14,3.14);
  TH1F * hphiselalldr = new TH1F("hphiselalldr","hphiselalldr",nphibin,-3.14,3.14);
  TH1F * hphiselbdr  = new TH1F("hphiselbdr","hphiselbdr",nphibin,-3.14,3.14);
  TH1F * hphiseledr  = new TH1F("hphiseledr","hphiseledr",nphibin,-3.14,3.14);
  
  my_h1= new TFile ("TPout_test_CombComb_staco.root", "RECREATE");
  
  int nphibins = 5;
 
  ///////////////////////////
  ///////////////////////////
  //MU0
  int nptbins  = 11; 
  float ptbin[12]={1,5,7,10,14,18,25,30,35,40,45,50};
  int netabins = 18; 
  float etabin[19]={-2.4,-2.0,-1.7,-1.5,-1.3,-1.05,-0.8,-0.5,-0.1,0,0.1,0.5,0.8,1.05,1.3,1.5,1.7,2.0,2.4}; 
  
  
  TH2F * hmapall    = new TH2F("hmapall","hmapall",netabins,etabin,nptbins,ptbin);                       
  TH2F * hmapselall = new TH2F("hmapselall","hmapselall",netabins,etabin,nptbins,ptbin);                 
  TH2F * hmapselalleff = new TH2F("hmapselalleff","hmapselalleff",netabins,etabin,nptbins,ptbin);        
  TH2F * hmapb      = new TH2F("hmapb","hmapb",netabins,-1.05,1.05,nphibins,-3.14,3.14);                 
  TH2F * hmape      = new TH2F("hmape","hmape",netabins,-1.05,1.05,nphibins,-3.14,3.14);                 
  TH2F * hmapselb   = new TH2F("hmapselb","hmapselb",netabins,-1.05,1.05,nphibins,-3.14,3.14);     	    
  TH2F * hmapsele   = new TH2F("hmapsele","hmapsele",10,-2.4165,2.4165,16,-3.14,3.14);		    
  TH2F * hmapselalldr = new TH2F("hmapselalldr","hmapselalldr",netabins,-1.05,1.05,nphibins,-3.14,3.14); 
  TH2F * hmapselbdr   = new TH2F("hmapselbdr","hmapselbdr",netabins,-1.05,1.05,nphibins,-3.14,3.14);     
  TH2F * hmapdr     = new TH2F("hmapdr","hmapdr",netabins,-1.05,1.05,nphibins,-3.14,3.14);       	    
  TH2F * hmapalle   = new TH2F("hmapalle","hmapalle",10,-2.4165,2.4165,16,-3.14,3.14);		    
  TH2F * hmapseledr = new TH2F("hmapseledr","hmapseledr",10,-2.4165,2.4165,16,-3.14,3.14);		    
  
  ofstream log;                                
  log.open("logTP.txt");		      
  bool DEBUG = false;    		      
						      
   Long64_t nentries = fChain->GetEntries();   
   Long64_t nbytes = 0, nb = 0;                 
   					       
   int ntotal = 0;			       
   int ntag   = 0;			       
   int nprobe = 0;                              
   int nprobetrigger = 0;		       
   int npass =  0;			       
   int nbarrel = 0;			       
   int n_1 = 0;         
   int n_2 = 0;	       
   int n_3 = 0;	       
   int n_barrel=0;      
   int n_endcap = 0;     
   int n_trig_barrel=0;  
   int n_trig_endcap=0;  
   int n_dr_barrel=0;    
   int n_dr_endcap=0;    
   int n_same = 0;       
			        
   int n_syst[20];       
   
   bool doPIcuts   = kFALSE;    
   bool IsMC = kTRUE; 
 
   bool DoCombComb = kTRUE ;
   bool DoCombAny  = kFALSE;
   bool doProbeSegmentTagged = kFALSE; 
   bool doProbeComb = kFALSE; 
   
   // Select kind of T&P (only one type a time!!) 
   bool DoL1 = kTRUE;  
   bool DoEF = kFALSE; 
   bool DoMix = kFALSE; 
   bool DoRev = kFALSE; 


   if ( (DoL1 + DoEF + DoMix + DoRev) > 1) 
     { 
       if (DEBUG) log << "More than 1 kind of TP: Exit !!"<<endl;
       return;
     }

   if (DEBUG) log << "number of entries = "<<nentries<<endl;

   for (int h=0; h<20; h++) n_syst[h]=0;

   for (Long64_t jentry=0; jentry<nentries;jentry++) 
     {
       Long64_t ientry = LoadTree(jentry);
       if (ientry < 0) break;
       nb = fChain->GetEntry(jentry);   nbytes += nb;
     
       if(runNumber==153565 || runNumber==153599) continue;

       bool IsCombComb = 0;
       if (mu1author ==6 && mu2author == 6) IsCombComb=1;
       bool IsCombAny = 0;
       if ( (mu1author ==6 && mu2author == 7) || (mu1author ==7  && mu2author == 6) || IsCombComb )  IsCombAny = 1; 
       if (DoCombComb && !IsCombComb) continue; // staco CombComb
       if (DoCombAny  && !IsCombAny)  continue; // staco CombAny
       
       
       // Jpsi event selection cuts
       bool IsJpsi  = 1;
       float deltaR = sqrt(deltaEta*deltaEta+deltaPhi*deltaPhi);
       bool EtaCut  = 0;
       hdr->Fill(deltaR);
       float deltaR2=0.,dPhi,dEta;
      dPhi=fabs(mu1phi-mu2phi);
      dEta=fabs(mu1eta-mu2eta);
       if(dPhi>3.14159264) dPhi=2*3.14159264-dPhi;
       deltaR2=  sqrt(dPhi*dPhi+dEta*dEta);
       hdr2->Fill(deltaR2);

       if (fabs(mu1eta)<2.4 && fabs(mu2eta)<2.4) EtaCut = 1;
       
       if (! IsMC)
	  {
	    IsJpsi = 0;
	  if (invmass >75000 && invmass < 105000 && q == 0 && EtaCut) // Z Selection 
	      {   
		IsJpsi = 1;
	      }
	  }

       // Here start Tag and Probe
       if (IsJpsi)
	 {
	   if (DEBUG) log << " ** Dimuon event found on event ** "<<jentry<<endl;
	   ntotal++; // new dimuon events

	   for (int muonindex= 1; muonindex <3; muonindex++)
	     {
	       if (DEBUG) log << " ** Muon Index = "<< muonindex<<endl;
	       
	       float tageta;
	       float tagphi;
	       float tagpt;   
	       float tagz0;   
	       float tagdr; 
	       float tagdrL1;
	       float tagdrEF;
	       float tagiso;
	       bool  isBadTagMuon= 0;
	     
	       if (DoL1 || DoRev)
		 {
		   if (muonindex == 1)
		     {
		       tagpt    = mu1pt;
		       tagz0    = mu1z0;
		       tagdr    = mu1L1MUCOMMdr;
		       tagdrL1  = mu1L1MUCOMMdr;
		       tagdrEF  = mu1EFMU20dr;
		       tagiso  = mu1_ptIsol40;
		       		       
		       if (fabs(mu1etas) < 100)
			 {
			   tageta   = mu1etas;
			   tagphi   = mu1phis; 
			 }
		       
		       if (fabs(mu1etas) >= 100 && fabs(mu1etae) < 100)
			 {
			   tageta   = mu1etae;
			   tagphi   = mu1phie; 
			 }
		       
		       if (fabs(mu1etas) >= 100 && fabs(mu1etae) >= 100)
			 {
			   isBadTagMuon == 1;
			   tageta   = mu1eta;
			   tagphi   = mu1phi; 
			 }
		     }
		   
		   if (muonindex == 2)
		     {
		       tagpt    = mu2pt;
		       tagz0    = mu2z0;
		       tagdr    = mu2L1MUCOMMdr;
		       tagdrL1  = mu2L1MUCOMMdr;
		       tagdrEF  = mu2EFMU20dr;
		       tagiso   = mu2_ptIsol40;

		       if (fabs(mu1etas) < 100)
			 {
			tageta   = mu2etas;
			tagphi   = mu2phis; 
			 }
		       
		       if (fabs(mu2etas) >= 100 && fabs(mu2etae) < 100)
			 {
			   tageta   = mu2etae;
			   tagphi   = mu2phie; 
			 }
		       
		       if (fabs(mu1etas) >= 100 && fabs(mu1etae) >= 100)
			 {
			   isBadTagMuon == 1;
			   tageta   = mu2eta;
			   tagphi   = mu2phi; 
			 }
		     }
	       	 } // end of (if ! DoEF)

	       if (DoEF || DoMix)
		 {
		   if (muonindex == 1)
		     {
		       tagpt    = mu1pt;
		       tagz0    = mu1z0;
		       tagdr    = mu1L1MUCOMMdr;
		       tagdrL1  = mu1L1MUCOMMdr;
		       tagdrEF  = mu1L1MUCOMMdr;
		       tageta   = mu1eta;
		       tagphi   = mu1phi; 
		       tagiso   = mu1_ptIsol40;
		       //cout<<"mu1EFMU6dr "<<mu1EFMU6dr<<endl;
		     }
		   if (muonindex == 2)
		     {
		       tagpt    = mu2pt;
		       tagz0    = mu2z0;
		       tagdr    = mu2L1MUCOMMdr;
		       tagdrL1  = mu2L1MUCOMMdr;
		       tagdrEF  = mu2L1MUCOMMdr;
		       tageta   = mu2eta;
		       tagphi   = mu2phi; 
		       tagiso   = mu2_ptIsol40;
		     }
		 } // end of (if ! DoEF)


	       bool IsTag = 0;
	       bool HasTagQuality = MuonQuality(muonindex);
	       float tagdrcut;
	      
	       ///deltaR cut 
	       if (  DoEF || DoMix) tagdrcut = 0.05; // EF DR cut
	       if (  DoL1 || DoRev) tagdrcut = 0.4;  // L1 DR cut
 
		 //tagdrcut = SearchDrCut(tagpt, tageta, tagphi, drmap);
	      
	       bool SameTriggerIndexL1 = false;
	       bool SameTriggerIndexEF = false;
	       bool CannotBeTagL1 = false;
	       bool CannotBeTagEF = false;

	       if (DEBUG) log<< " mu1 eta=" << mu1eta << " extr=" << mu1etae << " sp=" << mu1etas << endl;
	       if (DEBUG) log<< " mu2 eta=" << mu2eta << " extr=" << mu2etae << " sp=" << mu2etas << endl;
	       if (DEBUG) log << " mu1 EF trigger index = " << mu1EFMU6index <<" and DR is "<<mu1EFMU6index<<endl;
	       if (DEBUG) log << " mu2 EF trigger index = " << mu2EFMU6index <<" and DR is "<<mu2EFMU6index<<endl;
	       if (DEBUG) log << " mu1 L1 trigger index = " << mu1L1MUCOMMindex <<" and DR is "<<mu1L1MUCOMMdr<<endl;
	       if (DEBUG) log << " mu2 L1 trigger index = " << mu2L1MUCOMMindex <<" and DR is "<<mu2L1MUCOMMdr<<endl;
	       
	       if ( mu1L1MUCOMMindex == mu2L1MUCOMMindex ) SameTriggerIndexL1 = true;
	       if ( mu1EFMU6index == mu2EFMU6index ) SameTriggerIndexEF = true;
	   
	       if (SameTriggerIndexL1 == true) 
		 {
		   // If both muons inside the Dimuon could be matched with 
		   // the same Trigger Index Object then the muon (mu1 or mu2) 
		   // with the 
		   // higher DR is discarded as a TAG and is acceptes as a
		   // Probe but IS NOT MATCHED!! 

		   if (DEBUG) log << " This Event has same L1 trigger object index"<<endl;
		   float OtherDr ;

		   if (muonindex == 1 ) OtherDr = mu2L1MUCOMMdr ;
		   if (muonindex == 2 ) OtherDr = mu1L1MUCOMMdr ;

		   if (DEBUG) log << " tagdrL1 = "   << tagdrL1 <<endl;
		   if (DEBUG) log << " OtherDrL1 = " << OtherDr <<endl;

		   if (tagdrL1 > OtherDr ) CannotBeTagL1 = true;
		 }

	       if (CannotBeTagL1) if (DEBUG) log << " This tag for L1 has been rejected "<<endl;

	       if (SameTriggerIndexEF == true) 
	 {	 
		   if (DEBUG) log << " This Event has same EF trigger object index"<<endl;
		   float OtherDr ;

		   if (muonindex == 1 ) OtherDr = mu2EFMU6dr ;
		   if (muonindex == 2 ) OtherDr = mu1EFMU6dr ;

		   if (DEBUG) log << " tagdrEF = "   << tagdrEF<<endl;
		   if (DEBUG) log << " OtherDrEF = " << OtherDr<<endl;

		   if (tagdrEF > OtherDr ) CannotBeTagEF = true;
		 }

	       if (CannotBeTagEF) if (DEBUG) log << " This tag for EF has been rejected "<<endl;
	       
	       bool HasTriggerInEventL1 = false;
	       bool HasTriggerInEventEF = false;

	       if (   muEFMU6pass >0 ) HasTriggerInEventEF = true;
	       if (   muL1MUCOMMpass >0 ) HasTriggerInEventL1 = true;

	       if (DEBUG) log << " L1 decision = "<< HasTriggerInEventL1<<endl;
	       if (DEBUG) log << " EF decision = "<< HasTriggerInEventEF<<endl;

	       if ( DoL1 || DoRev)
		 {
		   if ( HasTagQuality && HasTriggerInEventL1 
			&& fabs(tagdr) < tagdrcut && isBadTagMuon == 0 
                 && tagpt > 1000 && tagiso/tagpt < 0.2  // added
			&& !CannotBeTagL1 ) IsTag = 1;
		 }

	       if ( DoEF || DoMix) 
		 {
		   if ( HasTagQuality && HasTriggerInEventEF 
			&& fabs(tagdr) < tagdrcut && isBadTagMuon == 0 
                 && tagpt > 1000 && tagiso/tagpt < 0.2  // added
			&& !CannotBeTagEF && !CannotBeTagL1 ) IsTag = 1; 
		 } 

	       if (IsTag) 
		 {

		   if (DEBUG) log << " TAG is ok "<<endl; 
		   TagInvMass->Fill(invmass); 
		   ntag++;
		   float probeetaID; 
		   float probephiID; 
		   if (muonindex == 1) probeetaID = mu2eta; 
		   if (muonindex == 2) probeetaID = mu1eta; 
		   if (muonindex == 1) probephiID = mu2phi;
		   if (muonindex == 2) probephiID = mu1phi;
		   float probeeta ;
		   float probephi ;

		   float probept;   
		   float probez0;   
		   float probedr;
		   float probedrL1;
		   int   ProbeIndex;
		   bool isBadProbeMuon= 0;
		   int probeAuthor = -100;
		   int probeNtrt;
		   int probeq;
		   if ( DoL1 || DoMix )
		     {
		       if (muonindex == 2)
			 {
			   probept    = mu1pt;
			   probez0    = mu1z0;
			   probedr    = mu1L1MUCOMMdr ;
			   probedrL1  = mu1L1MUCOMMdr ;
			   ProbeIndex = 1;
			   probeAuthor= mu1author; 
			   probeNtrt  = mu1_nTRT;
			   probeq  = mu1q;
			   //probeNtrt  = mu1Ntrt;

			   if (fabs(mu1etas) < 100)
			     {
			       probeeta   = mu1etas;
			       probephi   = mu1phis; 
			     }
			   
			   if (fabs(mu1etas) >= 100 && fabs(mu1etae) < 100)
			     {
			       probeeta   = mu1etae;
			       probephi   = mu1phie; 
			     }
			   
			   if (fabs(mu1etas) >= 100 && fabs(mu1etae) >= 100)
			     {
			       // isBadProbeMuon= 1;
			       probeeta   = mu1eta;
			       probephi   = mu1phi; 
			     }
			 }
		       
		       if (muonindex == 1)
			 {
			   probept    = mu2pt;
			   probez0    = mu2z0; 
			   probedr    = mu2L1MUCOMMdr; 
			   probedrL1  = mu2L1MUCOMMdr; 
			   ProbeIndex = 2;
			   probeAuthor= mu2author;
			   probeNtrt  = mu2_nTRT;
			   probeq     = mu2q;
			   //probeNtrt  = mu2Ntrt;
			   
			   if (fabs(mu2etas) < 100)
			     {
			       probeeta   = mu2etas;
			       probephi   = mu2phis; 
			     }
			   
			   if (fabs(mu2etas) >= 100 && fabs(mu2etae) < 100)
			     {
			       probeeta   = mu2etae;
			       probephi   = mu2phie; 
			     }
			   
			   if (fabs(mu2etas) >= 100 && fabs(mu2etae) >= 100) 
			     {
			       //			       isBadProbeMuon= 1;
			       probeeta   = mu2eta;
			       probephi   = mu2phi; 
			     }  
			 }
		     } // end if !DoEF
		   
		   if (DoEF || DoRev) 
		    { 
		       if (muonindex == 1) 
			 {
		       probept    = mu2pt;       
		       probez0    = mu2z0;
		       probedr    = mu2EFMU6dr ; 
		       probedrL1  = mu2L1MUCOMMdr ;
		       probeeta   = mu2eta;
		       probephi   = mu2phi;
		       probeAuthor= mu2author;
		       probeNtrt  = mu2_nTRT; 
		       probeq     = mu2q;
		       //probeNtrt=mu2Ntrt; 
		     }
		   if (muonindex == 2) 
		     {
		       probept    = mu1pt; 
		       probez0    = mu1z0; 
		       probedr    = mu1EFMU6dr ; 
		       probedrL1  = mu1L1MUCOMMdr ; 
		       probeeta   = mu1eta;
		       probephi   = mu1phi;
		       probeAuthor= mu1author; 
		       probeNtrt  = mu1_nTRT;
		       probeq     = mu1q;
		       //probeNtrt=mu1Ntrt;
		     }

		 } // end of (if ! DoEF)

		
		   bool IsProbe = 0;   
		   bool HasProbeQuality = MuonQuality(ProbeIndex);
		   float probedrcut;
		   ///probe DeltaR cut	
		   float probedrcutL1=0.4;
		   float probedrcutEF=0.05;
		   // [-1.3 to -1.1], [-0.1 to 0.1] and [1.1 to 1.3] 

		   ///p cuts                      
		   float probetheta=0.;
		   float probep=0.;
		   probetheta=2*atan(exp(-1*probeetaID));
		   probep=probept/sin(probetheta);
		   bool pcut=false;
		   if(fabs(probeetaID)<=2.5 && probep>3000.) pcut = true;

		   ///trt cut 
		   bool trtCut=false;
		   if(   (fabs(probeetaID)<=2. && probeNtrt>10) ||
			 fabs(probeetaID)>2
			 ) trtCut=true;
		   
		   if (DEBUG) log<<"probetheta="<<probetheta<<" probeeta="<<probeetaID<<" probep="<<probep<<" probept="<<probept
		      << " probeAuthor=" << probeAuthor<<endl;
		  
		   ///runNmber cut
		   bool runNumberCut=true;
		   
		   ///Exclusion regions
		   bool excludeEtaRegion = false; 
		   if((probeetaID>-1.3 && probeetaID<-1.1)  
		      || (probeetaID>-0.1 && probeetaID<0.1) 
		      || (probeetaID>1.1 && probeetaID<1.3) ) excludeEtaRegion = true;
		   //if((probeetaID>-1.5 && probeetaID<-0.5) 
		   //   || (probeetaID>-0.1 && probeetaID<0.1) 
		   //   || (probeetaID>1.1 && probeetaID<1.3) ) excludeEtaRegion = true;
		   
		   if (DEBUG) log <<  " before  isBadProbeMuon=" << isBadProbeMuon << endl;
		   if(doProbeSegmentTagged && probeAuthor!=13) isBadProbeMuon = 1;
		   
		   if (DEBUG) log <<  " HasProbeQuality=" <<  HasProbeQuality << " isBadProbeMuon=" << isBadProbeMuon << " pcut="<< pcut << endl;

		   if ( HasProbeQuality && isBadProbeMuon == 0 && pcut && runNumberCut && trtCut) // && !excludeEtaRegion && probept> 8000) 
		     {
		       //cout<<"dentro if HasProbeQuality && isBadProbeMuon == 0 && pcut && runNumberCut"<<endl;
		       if (DEBUG) log << "good probe to be Tested " << endl;
		       ProbeInvMass->Fill(invmass);
		       stacoCombComb_jpsiInvmass_os_am_aa_cut3->Fill(invmass/1000.);

		         if (  DoEF || DoRev) probedrcut = 0.05; // EF DR cut
			 if (  DoL1 || DoMix) probedrcut = 0.4;  // L1 DR cut
		       
			 //			 if (probept > 10000)
			 if (true)
			   {
			     if (DEBUG) log << "Probe pt  = "<<probept<<endl;
			     if (DEBUG) log << "Probe eta = "<<probeetaID<<endl;
			     if (DEBUG) log << "Probe phi = "<<probephiID<<endl;
			   }

		       hptmsall->Fill(probept/1000.); // fill histo for barrel	 
		       hetaall->Fill(probeetaID);
		       hphiall->Fill(probephiID);
		       if (probeq>0 && probeetaID >0 || probeq<0 && probeetaID <0)  { 
                hptmsallqnp->Fill(probept/1000.); 
                hetaallqnp->Fill(probeetaID); 
                hphiallqnp->Fill(probephiID); } 
		       if (probeq>0 && probeetaID <0 || probeq<0 && probeetaID >0) { 
                hptmsallqnn->Fill(probept/1000.); 
                hetaallqnn->Fill(probeetaID); 
                hphiallqnn->Fill(probephiID); } 
		       if (probeq>0 && probeetaID >0) { 
                hptmsallqpnp->Fill(probept/1000.); 
                hetaallqpnp->Fill(probeetaID); 
                hphiallqpnp->Fill(probephiID); } 
		       if (probeq>0 && probeetaID <0) { 
                hptmsallqpnn->Fill(probept/1000.); 
                hetaallqpnn->Fill(probeetaID); 
                hphiallqpnn->Fill(probephiID); } 
		       if (probeq<0 && probeetaID >0) { 
                hptmsallqnnp->Fill(probept/1000.); 
                hetaallqnnp->Fill(probeetaID); 
                hphiallqnnp->Fill(probephiID); } 
		       if (probeq<0 && probeetaID <0) { 
                hptmsallqnnn->Fill(probept/1000.); 
                hetaallqnnn->Fill(probeetaID); 
                hphiallqnnn->Fill(probephiID); } 
		       
		        hmapall->Fill(fabs(probeetaID),probept);
			hptall->Fill(probep/1000.);
		       if (fabs(probeetaID) < 1.05) 
			 { 
			   nprobe++;
			   hptmsb ->Fill(probept/1000.); // fill histo for barrel
			   hetab->Fill(probeetaID);
			   hphib->Fill(probephiID);
		       if (probeq>0)  {hptmsbqp->Fill(probept/1000.); 
		       hetabqp->Fill(probeetaID); 
                hphibqp->Fill(probephiID); } 
		       if (probeq<0)  {hptmsbqn->Fill(probept/1000.); 
		       hetabqn->Fill(probeetaID); 
                hphibqn->Fill(probephiID); } 
		       if (probeq>0 && probeetaID >0 || probeq<0 && probeetaID <0)  { 
                hptmsbqnp->Fill(probept/1000.); 
                hetabqnp->Fill(probeetaID); 
                hphibqnp->Fill(probephiID); } 
		       if (probeq>0 && probeetaID <0 || probeq<0 && probeetaID >0) { 
                hptmsbqnn->Fill(probept/1000.); 
                hetabqnn->Fill(probeetaID); 
                hphibqnn->Fill(probephiID); } 
		       if (probeq>0 && probeetaID >0) { 
                hptmsbqpnp->Fill(probept/1000.); 
                hetabqpnp->Fill(probeetaID); 
                hphibqpnp->Fill(probephiID); } 
		       if (probeq>0 && probeetaID <0) { 
                hptmsbqpnn->Fill(probept/1000.); 
                hetabqpnn->Fill(probeetaID); 
                hphibqpnn->Fill(probephiID); } 
		       if (probeq<0 && probeetaID >0) { 
                hptmsbqnnp->Fill(probept/1000.); 
                hetabqnnp->Fill(probeetaID); 
                hphibqnnp->Fill(probephiID); } 
		       if (probeq<0 && probeetaID <0) { 
                hptmsbqnnn->Fill(probept/1000.); 
                hetabqnnn->Fill(probeetaID); 
                hphibqnnn->Fill(probephiID); } 
		       hmapb->Fill(probeetaID,probephiID);
			 }
		       else
			 {	
			   nprobe++;
			   hptmse ->Fill(probept/1000.); // fill histo for Endcap
			   hetae->Fill(probeetaID);
			   hphie->Fill(probephiID);
		       if (probeq>0 && probeetaID >0 || probeq<0 && probeetaID <0)  { 
                hptmseqnp->Fill(probept/1000.); 
                hetaeqnp->Fill(probeetaID); 
                hphieqnp->Fill(probephiID); } 
		       if (probeq>0 && probeetaID <0 || probeq<0 && probeetaID >0) { 
                hptmseqnn->Fill(probept/1000.); 
                hetaeqnn->Fill(probeetaID); 
                hphieqnn->Fill(probephiID); } 
		       if (probeq>0 && probeetaID >0) { 
                hptmseqpnp->Fill(probept/1000.); 
                hetaeqpnp->Fill(probeetaID); 
                hphieqpnp->Fill(probephiID); } 
		       if (probeq>0 && probeetaID <0) { 
                hptmseqpnn->Fill(probept/1000.); 
                hetaeqpnn->Fill(probeetaID); 
                hphieqpnn->Fill(probephiID); } 
		       if (probeq<0 && probeetaID >0) { 
                hptmseqnnp->Fill(probept/1000.); 
                hetaeqnnp->Fill(probeetaID); 
                hphieqnnp->Fill(probephiID); } 
		       if (probeq<0 && probeetaID <0) { 
                hptmseqnnn->Fill(probept/1000.); 
                hetaeqnnn->Fill(probeetaID); 
                hphieqnnn->Fill(probephiID); } 
			   hmape->Fill(probeetaID,probephiID);
			 }
		       
		       bool HasRequiredTriggerInEvent;
		       bool HasProbeTriggerL1 = false;
		       bool HasProbeTriggerEF = false;
		       bool HasProbeTrigger = false;

		       if (DoEF || DoRev)          HasRequiredTriggerInEvent = HasTriggerInEventEF;
		       if (DoL1 || DoMix) HasRequiredTriggerInEvent = HasTriggerInEventL1;
		       
		       
		       if (DEBUG) log << " probe dr l1 = "<<probedrL1<<endl; 
		       if (DoL1 || DoMix) if (DEBUG) log << " probe dr L1 = "<<probedr<<endl; 
		       if (DoEF || DoRev) if (DEBUG) log << " probe dr EF = "<<probedr<<endl; 

		       if (DEBUG) log << " CannotBeTagL1 = "<<CannotBeTagL1<<endl; 
		       if (DEBUG) log << " CannotBeTagEF = "<<CannotBeTagEF<<endl;
		       
		       if ( (DoL1 || DoMix) && SameTriggerIndexL1 == true) if (DEBUG) log << "This event must be rejected and non efficient as probe"<<endl;
		       
		       if ( fabs(probedrL1) < probedrcutL1 && SameTriggerIndexL1 != true) HasProbeTriggerL1 = true;

		       if (DEBUG) log << " HasProbeTriggerL1 = "<<HasProbeTriggerL1<<endl;

		       if ( DoEF  && SameTriggerIndexEF == true) if (DEBUG) log << "This event must be rejected in EF and non efficient as probe"<<endl;
		       if ( DoEF && fabs(probedr) <  probedrcut && HasProbeTriggerL1 && SameTriggerIndexEF != true)  HasProbeTriggerEF = true;
		       if ( DoRev && fabs(probedr) <  probedrcut && HasProbeTriggerL1 )  HasProbeTriggerEF = true;
		       if ( DoEF || DoRev ) if (DEBUG) log << " HasProbeTriggerEF = "<<HasProbeTriggerEF<<endl;

		       if ( (DoL1 || DoMix) && HasProbeTriggerL1) HasProbeTrigger = true;
		       if ( (DoEF || DoRev) && HasProbeTriggerEF) HasProbeTrigger = true;
		       
		       if (DEBUG) log << " Probe trigger matching decision is "<< HasProbeTrigger <<endl;
		       if ( HasProbeQuality && HasProbeTrigger)
			 {
			   
			   bool HasPassedL1 = false;

			   hptmsselall ->Fill(probept/1000.); 
			   hetaselall->Fill(probeetaID);
			   hphiselall->Fill(probephiID);
		       if (probeq>0 && probeetaID >0 || probeq<0 && probeetaID <0)  { 
                hptmsselallqnp->Fill(probept/1000.); 
                hetaselallqnp->Fill(probeetaID); 
                hphiselallqnp->Fill(probephiID); } 
		       if (probeq>0 && probeetaID <0 || probeq<0 && probeetaID >0) { 
                hptmsselallqnn->Fill(probept/1000.); 
                hetaselallqnn->Fill(probeetaID); 
                hphiselallqnn->Fill(probephiID); } 
		       if (probeq>0 && probeetaID >0) { 
                hptmsselallqpnp->Fill(probept/1000.); 
                hetaselallqpnp->Fill(probeetaID); 
                hphiselallqpnp->Fill(probephiID); } 
		       if (probeq>0 && probeetaID <0) { 
                hptmsselallqpnn->Fill(probept/1000.); 
                hetaselallqpnn->Fill(probeetaID); 
                hphiselallqpnn->Fill(probephiID); } 
		       if (probeq<0 && probeetaID >0) { 
                hptmsselallqnnp->Fill(probept/1000.); 
                hetaselallqnnp->Fill(probeetaID); 
                hphiselallqnnp->Fill(probephiID); } 
		       if (probeq<0 && probeetaID <0) { 
                hptmsselallqnnn->Fill(probept/1000.); 
                hetaselallqnnn->Fill(probeetaID); 
                hphiselallqnnn->Fill(probephiID); } 
			   hmapselall->Fill(fabs(probeetaID),probept); 
			   //hmapselall->Fill(probeetaID,probept);
			   hptselall->Fill(probep/1000.);

			   if (fabs(probeetaID) < 1.05)
			     {   
			       nprobetrigger++; 
			       hptmsselb ->Fill(probept/1000.); // fill histo for barrel
			       hetaselb->Fill(probeetaID);
			       hphiselb->Fill(probephiID);
		       if (probeq>0)  {hptmsselbqp->Fill(probept/1000.); 
		       hetaselbqp->Fill(probeetaID); 
                hphiselbqp->Fill(probephiID); } 
		       if (probeq<0)  {hptmsselbqn->Fill(probept/1000.); 
		       hetaselbqn->Fill(probeetaID); 
                hphiselbqn->Fill(probephiID); } 
		       if (probeq>0 && probeetaID >0 || probeq<0 && probeetaID <0)  { 
                hptmsselbqnp->Fill(probept/1000.); 
                hetaselbqnp->Fill(probeetaID); 
                hphiselbqnp->Fill(probephiID); } 
		       if (probeq>0 && probeetaID <0 || probeq<0 && probeetaID >0) { 
                hptmsselbqnn->Fill(probept/1000.); 
                hetaselbqnn->Fill(probeetaID); 
                hphiselbqnn->Fill(probephiID); } 
		       if (probeq>0 && probeetaID >0) { 
                hptmsselbqpnp->Fill(probept/1000.); 
                hetaselbqpnp->Fill(probeetaID); 
                hphiselbqpnp->Fill(probephiID); } 
		       if (probeq>0 && probeetaID <0) { 
                hptmsselbqpnn->Fill(probept/1000.); 
                hetaselbqpnn->Fill(probeetaID); 
                hphiselbqpnn->Fill(probephiID); } 
		       if (probeq<0 && probeetaID >0) { 
                hptmsselbqnnp->Fill(probept/1000.); 
                hetaselbqnnp->Fill(probeetaID); 
                hphiselbqnnp->Fill(probephiID); } 
		       if (probeq<0 && probeetaID <0) { 
                hptmsselbqnnn->Fill(probept/1000.); 
                hetaselbqnnn->Fill(probeetaID); 
                hphiselbqnnn->Fill(probephiID); } 
			       hmapselb->Fill(probeetaID,probephiID);
			     }
			   if (fabs(probeetaID) >= 1.05)
			     {   
			       nprobetrigger++;
			       hptmssele ->Fill(probept/1000.); // fill histo for endcap
			       hetasele->Fill(probeetaID);
			       hphisele->Fill(probephiID);
		       if (probeq>0 && probeetaID >0 || probeq<0 && probeetaID <0)  { 
                hptmsseleqnp->Fill(probept/1000.); 
                hetaseleqnp->Fill(probeetaID); 
                hphiseleqnp->Fill(probephiID); } 
		       if (probeq>0 && probeetaID <0 || probeq<0 && probeetaID >0) { 
                hptmsseleqnn->Fill(probept/1000.); 
                hetaseleqnn->Fill(probeetaID); 
                hphiseleqnn->Fill(probephiID); } 
		       if (probeq>0 && probeetaID >0) { 
                hptmsseleqpnp->Fill(probept/1000.); 
                hetaseleqpnp->Fill(probeetaID); 
                hphiseleqpnp->Fill(probephiID); } 
		       if (probeq>0 && probeetaID <0) { 
                hptmsseleqpnn->Fill(probept/1000.); 
                hetaseleqpnn->Fill(probeetaID); 
                hphiseleqpnn->Fill(probephiID); } 
		       if (probeq<0 && probeetaID >0) { 
                hptmsseleqnnp->Fill(probept/1000.); 
                hetaseleqnnp->Fill(probeetaID); 
                hphiseleqnnp->Fill(probephiID); } 
		       if (probeq<0 && probeetaID <0) { 
                hptmsseleqnnn->Fill(probept/1000.); 
                hetaseleqnnn->Fill(probeetaID); 
                hphiseleqnnn->Fill(probephiID); } 
			       hmapsele->Fill(probeetaID,probephiID);
			     }
			 }
		     }// end HasProbequality
		 } // end IFisTag
	     } // if is Jpsi
	 } // iend of loop on jentry
     } // iend of loop on jentry

   hmapselall->Sumw2();
   hmapall->Sumw2();
   hmapselalleff->Divide(hmapselall,hmapall,1.,1.,"b") ;
   
   if (DEBUG) log << " ntotal Jpsi = " << ntotal<< endl;
   if (DEBUG) log << " ntag = " << ntag<< endl;
   if (DEBUG) log << " nprobe = " << nprobe<< endl;
   if (DEBUG) log << " nprobetrigger = " << nprobetrigger<< endl;
   
   stacoCombComb_jpsiInvmass_os_am_aa_cut3->Write();   
   hdr->Write();
   hdr2->Write(); 
   hptmsall->Write();
   hptmsallqnp->Write();
   hptmsallqnn->Write();
   hptmsallqpnp->Write();
   hptmsallqpnn->Write();
   hptmsallqnnp->Write();
   hptmsallqnnn->Write();
   hptmsselall->Write();
   hptmsselallqnp->Write();
   hptmsselallqnn->Write();
   hptmsselallqpnp->Write();
   hptmsselallqpnn->Write();
   hptmsselallqnnp->Write();
   hptmsselallqnnn->Write();
   hmapselalleff->Write();
   hetaall->Write();
   hetaallqnp->Write();
   hetaallqnn->Write();
   hetaallqpnp->Write();
   hetaallqpnn->Write();
   hetaallqnnp->Write();
   hetaallqnnn->Write();
   hetaselall->Write();
   hetaselallqnp->Write();
   hetaselallqnn->Write();
   hetaselallqpnp->Write();
   hetaselallqpnn->Write();
   hetaselallqnnp->Write();
   hetaselallqnnn->Write();
   hphiall->Write();
   hphiallqnp->Write();
   hphiallqnn->Write();
   hphiallqpnp->Write();
   hphiallqpnn->Write();
   hphiallqnnp->Write();
   hphiallqnnn->Write();
   hphiselall->Write();
   hphiselallqnp->Write();
   hphiselallqnn->Write();
   hphiselallqpnp->Write();
   hphiselallqpnn->Write();
   hphiselallqnnp->Write();
   hphiselallqnnn->Write();
   hmapall->Write();
   hmapselall->Write();
   hptall->Write();
   hptselall->Write();
   
   hptmsb->Write();
   hptmsbqp->Write();
   hptmsbqn->Write();
   hptmsselbqp->Write();
   hptmsselbqn->Write();
   hptmsbqnp->Write();
   hptmsbqnn->Write();
   hptmsbqpnp->Write();
   hptmsbqpnn->Write();
   hptmsbqnnp->Write();
   hptmsbqnnn->Write();
   hptmsselb->Write();
   hptmsselbqnp->Write();
   hptmsselbqnn->Write();
   hptmsselbqpnp->Write();
   hptmsselbqpnn->Write();
   hptmsselbqnnp->Write();
   hptmsselbqnnn->Write();
   hetab->Write();
   hetabqp->Write();
   hetabqn->Write();
   hetaselbqp->Write();
   hetaselbqn->Write();
   hetabqnp->Write();
   hetabqnn->Write();
   hetabqpnp->Write();
   hetabqpnn->Write();
   hetabqnnp->Write();
   hetabqnnn->Write();
   hetaselb->Write();
   hetaselbqnp->Write();
   hetaselbqnn->Write();
   hetaselbqpnp->Write();
   hetaselbqpnn->Write();
   hetaselbqnnp->Write();
   hetaselbqnnn->Write();
   hphib->Write();
   hphibqp->Write();
   hphibqn->Write();
   hphiselbqp->Write();
   hphiselbqn->Write();
   hphibqnp->Write();
   hphibqnn->Write();
   hphibqpnp->Write();
   hphibqpnn->Write();
   hphibqnnp->Write();
   hphibqnnn->Write();
   hphiselb->Write();
   hphiselbqnp->Write();
   hphiselbqnn->Write();
   hphiselbqpnp->Write();
   hphiselbqpnn->Write();
   hphiselbqnnp->Write();
   hphiselbqnnn->Write();
   hmapb->Write();
   hmapselb->Write();
   
   hptmse->Write();
   hptmseqnp->Write();
   hptmseqnn->Write();
   hptmseqpnp->Write();
   hptmseqpnn->Write();
   hptmseqnnp->Write();
   hptmseqnnn->Write();
   hptmssele->Write();
   hptmsseleqnp->Write();
   hptmsseleqnn->Write();
   hptmsseleqpnp->Write();
   hptmsseleqpnn->Write();
   hptmsseleqnnp->Write();
   hptmsseleqnnn->Write();
   hetae->Write();
   hetaeqnp->Write();
   hetaeqnn->Write();
   hetaeqpnp->Write();
   hetaeqpnn->Write();
   hetaeqnnp->Write();
   hetaeqnnn->Write();
   hetasele->Write();
   hetaseleqnp->Write();
   hetaseleqnn->Write();
   hetaseleqpnp->Write();
   hetaseleqpnn->Write();
   hetaseleqnnp->Write();
   hetaseleqnnn->Write();
   hphie->Write();
   hphieqnp->Write();
   hphieqnn->Write();
   hphieqpnp->Write();
   hphieqpnn->Write();
   hphieqnnp->Write();
   hphieqnnn->Write();
   hphisele->Write();
   hphiseleqnp->Write();
   hphiseleqnn->Write();
   hphiseleqpnp->Write();
   hphiseleqpnn->Write();
   hphiseleqnnp->Write();
   hphiseleqnnn->Write();
   hmape->Write();
   hmapsele->Write();
       
   TagInvMass->Write();
   ProbeInvMass->Write();
   my_h1->Write();
}

bool TP::MuonQuality(int index)
{
  bool mupass= 0;
  float mueta  ;
  float muphi  ; 
  float mupt   ;
  float muz0  ;
  if (index == 1)
    {
       mueta  = mu1eta;
       muphi  = mu1phi; 
       mupt   = mu1pt;
       muz0   = mu1z0;
    }
  else
    {
      mueta  = mu2eta;
      muphi  = mu2phi; 
      mupt   = mu2pt;
      muz0   = mu2z0;
    }

  float theta=2*atan(exp(-mueta));
  float mup=mupt/(sin(theta));
  
  /*
  if ( fabs(pvz) < 150 && fabs(mueta)<2.4 
       && mupt >1500 && mup>1500 
       && fabs(muz0-pvz) < 3 && msinfo == 1)
  */

  mupass=1;
  
  return mupass;
}

float TP::SearchDrCut(float pt, float muetas, float muphis, float t[7][32][42])
{

  //if (DEBUG) log << "test"<<endl;
  float dr_cut;
  int ptzone[100];
  //if (DEBUG) log << "Assign ptzone n2 "<<endl;
   
   for (int p=0; p<100; p++)
     {
	 if ( p< 4) ptzone[p]=0;
	 if ( p==4) ptzone[p]=1;
	 if ( p==5) ptzone[p]=2;
	 if ( p == 6 || p == 7) ptzone[p]=3;
	 if ( p == 8 || p == 9) ptzone[p]=3;
	 if ( p == 10 || p == 11) ptzone[p]=3;
	 if ( p == 12 || p == 13 || p== 14) ptzone[p]=3;
	 if ( p >= 15 ) ptzone[p]=3;
       }     
  
  float rpt = pt/1000.;
  int  i=(int)rpt;
  if (i >= 100) i = 99;
  int zone = ptzone[i]-1;  
  

  float infeta = -3.;
  float passoeta = 0.142; 
  float getetabin=fabs(muetas-infeta)/passoeta;
  Int_t ebin=((int)getetabin);
  
  float infphi = -3.14;
  float passophi = 0.196; 
  float getphibin=fabs(muphis-infphi)/passophi;
  Int_t pbin=((int)getphibin);
  

  if (zone < 0) dr_cut = 0.5; // flat 
  if (ebin > 41) ebin = 41;
  if (pbin > 31) pbin = 31;
  
  // if (DEBUG) log << " pt = "<<i<<" and zone = "<<zone<<endl;
  //if (DEBUG) log << " pbin ="<<pbin<<" and etabin= "<<ebin<<endl;
  
      
  if (zone >= 0) dr_cut = t[zone][pbin][ebin];
  if (dr_cut == 999) dr_cut = 0.5; // put flat dr cut when no entries in map
  
  
   
  
  return dr_cut;
}