Exemplo n.º 1
0
void JESUnc(){
  gSystem->Load("libFWCoreFWLite.so");
  AutoLibraryLoader::enable();
  JetCorrectionUncertainty *jecUnc = new JetCorrectionUncertainty("Jec10V3_Uncertainty_AK5PF.txt");

  ofstream myfile;
  myfile.open ("JESUnc.cxx");
  
  myfile << "double JESUnc(double eta, double pT){ " << std::endl;
  myfile << " double feta = abs(eta);" << std::endl;
  AutoLibraryLoader::enable();
  JetCorrectionUncertainty *jecUnc = new JetCorrectionUncertainty("Jec10V3_Uncertainty_AK5PF.txt");

  for (int iPt = 20; iPt < 100; iPt+=10){
   for (int iEta = 0; iEta < 50; iEta++){
    jecUnc->setJetEta(iEta / 10.);
    jecUnc->setJetPt(iPt);
    double unc = jecUnc->getUncertainty(true);
    myfile << " if (feta > " << iEta/10. << " && feta < " << (iEta+1)/10. << " && pT > " << iPt << " && pT < " << (iPt+10) << ") return  " << unc << " ; " << std::endl;
   }
  }

  myfile << "return 0;" << std::endl;
  myfile << "}" << std::endl;

  myfile.close(); 

}
void JESUncertainty(double pt, double eta){
  gSystem->Load("libFWCoreFWLite.so"); 
  AutoLibraryLoader::enable();
  
  //----------- Correction Object ------------------------------
//  vector<JetCorrectorParameters> JetCorPar;
//  JetCorrectorParameters *par1 = new JetCorrectorParameters("Fall10_AK5PF_L2Relative.txt");
//  JetCorrectorParameters *par2 = new JetCorrectorParameters("Fall10_AK5PF_L3Absolute.txt");
//  JetCorrectorParameters *par3 = new JetCorrectorParameters("Fall10_AK5PF_L2L3Residual.txt");   
//  JetCorPar.push_back(*par1);
//  JetCorPar.push_back(*par2);
//  JetCorPar.push_back(*par3);     
//  FactorizedJetCorrector *JetCor = new FactorizedJetCorrector(JetCorPar);
  //----------- Uncertainty Object -----------------------------
  JetCorrectionUncertainty *jecUnc = new JetCorrectionUncertainty("Fall10_AK5PF_Uncertainty.txt");

  jecUnc->setJetEta(eta);  
  jecUnc->setJetPt(pt);
  return jecUnc->getUncertainty(true);
}
Exemplo n.º 3
0
void drawSourceCorrelations() {

  setTDRStyle();

  // Autogenerate list of sources from UncertaintySources.txt with this macro:
  // grep '\[' CondFormats/JetMETObjects/data/Winter14_V5_DATA_UncertaintySources_AK5PFchs.txt | sed 's/\]/"\);/' | sed 's/\[/s.push_back\("/'
  // The ones that are included in Total (kData) are listed in JetDefs.hpp,
  // with bit-name mapping found in drawJetCorrectionUncertainty.cpp

  // 8 TeV Winter14_V5 sources
  vector<string> s;
  s.push_back("AbsoluteStat");
  s.push_back("AbsoluteScale");
  s.push_back("AbsoluteFlavMap");
  s.push_back("AbsoluteMPFBias");
  //s.push_back("HighPtExtra"); // 8 TeV GR
  s.push_back("Fragmentation"); // new patched 8 TeV
  s.push_back("SinglePionECAL");
  s.push_back("SinglePionHCAL");
  s.push_back("FlavorQCD");
  //s.push_back("TimeEta");
  //s.push_back("TimePt");
  s.push_back("RelativeJEREC1");
  s.push_back("RelativeJEREC2");
  s.push_back("RelativeJERHF");
  s.push_back("RelativePtBB");
  s.push_back("RelativePtEC1");
  s.push_back("RelativePtEC2");
  s.push_back("RelativePtHF");
  s.push_back("RelativeFSR");
  s.push_back("RelativeStatEC2");
  s.push_back("RelativeStatHF");
  s.push_back("PileUpDataMC");
  s.push_back("PileUpPtRef");
  s.push_back("PileUpPtBB");
  s.push_back("PileUpPtEC1");
  s.push_back("PileUpPtEC2");
  s.push_back("PileUpPtHF");
  //s.push_back("PileUpMuZero");
  //s.push_back("PileUpEnvelope");
  //s.push_back("SubTotalPileUp");
  //s.push_back("SubTotalRelative");
  //s.push_back("SubTotalPt");
  //s.push_back("SubTotalScale");
  //s.push_back("SubTotalMC");
  //s.push_back("Total");
  //s.push_back("TotalNoFlavor");
  //s.push_back("TotalNoTime");
  //s.push_back("TotalNoFlavorNoTime");
  //s.push_back("FlavorZJet");
  //s.push_back("FlavorPhotonJet");
  //s.push_back("FlavorPureGluon");
  //s.push_back("FlavorPureQuark");
  //s.push_back("FlavorPureCharm");
  //s.push_back("FlavorPureBottom");
  //s.push_back("TimeRunA");
  //s.push_back("TimeRunB");
  //s.push_back("TimeRunC");
  //s.push_back("TimeRunD");
  //s.push_back("CorrelationGroupMPFInSitu");
  //s.push_back("CorrelationGroupIntercalibration");
  //s.push_back("CorrelationGroupbJES");
  //s.push_back("CorrelationGroupFlavor");
  //s.push_back("CorrelationGroupUncorrelated");

  // 7 TeV JEC11_V12 sources
  /*
  vector<string> s;
  s.push_back("Absolute");
  s.push_back("HighPtExtra");
  s.push_back("SinglePion");
  s.push_back("Flavor");
  //s.push_back("Time");
  s.push_back("RelativeJEREC1");
  s.push_back("RelativeJEREC2");
  s.push_back("RelativeJERHF");
  s.push_back("RelativeFSR");
  s.push_back("RelativeStatEC2");
  s.push_back("RelativeStatHF");
  s.push_back("PileUpDataMC");
  s.push_back("PileUpOOT");
  s.push_back("PileUpPt");
  s.push_back("PileUpBias");
  s.push_back("PileUpJetRate");
  //s.push_back("SubTotalPileUp");
  //s.push_back("SubTotalRelative");
  //s.push_back("SubTotalPt");
  //s.push_back("SubTotalDataMC");
  //s.push_back("Total");
  */

  // define this bit to test that quadratic sum equals total
  string sref = "Total";

  double etabins[] = {0,1.3,2.5,3.0,4.7};
  const int neta = sizeof(etabins)/sizeof(etabins[0])-1;
  double ptbins[] =
    {10, 12, 15, 18, 21, 24, 28, 32, 37, 43, 49, 56, 64, 74, 84,
     97, 114, 133, 153, 174, 196, 220, 245, 272, 300, 362, 430,
     507, 592, 686, 790, 905, 1032, 1172, 1327, 1497, 1684, 1890, //1999};
     2000, 2238, 2500}; // pT=2504 observed limit with 20/fb at 8 TeV
  //, 2787, 3103, 3450};
  const int npt = sizeof(ptbins)/sizeof(ptbins[0])-1;

  const int netapt = neta*npt;
  double etaptbins[netapt+1];
  for (int ieta = 0; ieta != neta; ++ieta) {
    for (int ipt = 0; ipt != npt; ++ipt) {
      double x = pow(2500/10,ieta)*(ptbins[ipt]);
      etaptbins[ieta*npt+ipt] = x;
    } // for npt
  } // for ieta
  etaptbins[netapt] = pow(2500/10,neta)*10;

  TH2D *h2 = new TH2D("h2",";p_{T} (GeV);p_{T} (GeV)",
		      npt, ptbins, npt, ptbins);
  TH2D *h2x = new TH2D("h2x",";250^{i_{#eta}}p_{T} (GeV)"
		       ";250^{i_{#eta}}p_{T} (GeV)",
		       netapt, etaptbins, netapt, etaptbins);

  const double zmin = -0.4;//-0.25;
  // Set empty cells to white (below lower limit of zmin+eps)
  for (int i = 1; i != h2x->GetNbinsX()+1; ++i) {
    for (int j = 1; j != h2x->GetNbinsY()+1; ++j) {
      h2x->SetBinContent(i, j, zmin);
    }
  }

  // Create uncertainty sources
  vector<JetCorrectionUncertainty*> uncs(s.size());
  for (unsigned int k = 0; k != s.size(); ++k) {

    // GT 8 TeV
    //const char *sf = "CondFormats/JetMETObjects/data/"
    ////"Winter14_V5_DATA_UncertaintySources_AK7PF.txt"; // 8 TeV
    //"Winter14_V5_DATA_UncertaintySources_AK5PFchs.txt"; // 8 TeV
    // New patched 8 TeV (fixed fragmentation source sign)
    const char *sf = "../txt/"
    "Winter14_V8M_DATA_UncertaintySources_AK5PFchs.txt"; // 8 TeV
    // Older 7 TeV
    //const char *sf = "../../CondFormats/JetMETObjects/data/"
    //"JEC11_V12_AK7PF_UncertaintySources.txt"; // 7 TeV
    const char *src = s[k].c_str();
    JetCorrectorParameters *p = new JetCorrectorParameters(sf, src);
    JetCorrectionUncertainty *unc = new JetCorrectionUncertainty(*p);
    uncs[k] = unc;
  }

  // Correlation plot between (eta,pT) pairs
  for (int ii = 0; ii != neta; ++ii) {
  for (int jj = 0; jj != neta; ++jj) {

    double eta1 = etabins[ii];
    double eta2 = etabins[jj];

  for (int i = 1; i != h2->GetNbinsX()+1; ++i) {
    for (int j = 1; j != h2->GetNbinsY()+1; ++j) {
      
      double pt1 = h2->GetXaxis()->GetBinCenter(i);
      double pt2 = h2->GetYaxis()->GetBinCenter(j);

      // Calculate correlation according to Sec. 8 Eq.(46) in JEC paper v3
      double sumski2(0), sumskj2(0), sumskiskj(0);
      for (unsigned int k = 0; k != s.size(); ++k) {
	
	JetCorrectionUncertainty *unc = uncs[k]; assert(unc);

	unc->setJetPt(pt1);
	unc->setJetEta(eta1);
	double ski = unc->getUncertainty(true);

	unc->setJetPt(pt2);
	unc->setJetEta(eta2);
	double skj = unc->getUncertainty(true);

	sumski2 += ski*ski;
	sumskj2 += skj*skj;
	sumskiskj += ski*skj;
      }
      double si = sqrt(sumski2);
      double sj = sqrt(sumskj2);
      double rhoij = sumskiskj / (si*sj);
      
      if (pt1*cosh(eta1)<4000 && pt2*cosh(eta2)<4000) {
	
	// |eta|<1.3
	if (ii==0 && jj==0) {
	  if (!(pt1<400 && pt2>900)) // white background for legend
	    h2->SetBinContent(i, j, rhoij);
	  else
	    h2->SetBinContent(i, j, zmin);
	}
	// all etas
	if (!(ii==jj && pt1<150 && pt2>600)) // white background for labels
	  h2x->SetBinContent(ii*npt+i, jj*npt+j, rhoij);
	else
	  h2x->SetBinContent(i, j, zmin);
      }
    } // for j
  } // for i

  } // for jj
  } // for ii

  // Sigle eta bin
  {
    TH1D *h1 = new TH1D("h1",";p_{T} (GeV);p_{T} (GeV)",npt,ptbins);
    h1->SetMinimum(ptbins[0]);
    h1->SetMaximum(ptbins[npt]);
    //h1->GetXaxis()->SetMoreLogLabels();
    h1->GetXaxis()->SetNoExponent();
    //h1->GetYaxis()->SetMoreLogLabels();
    h1->GetYaxis()->SetNoExponent();
    

    TCanvas *c1 = tdrCanvas("c1",h1,2,0,kSquare); // 8 TeV
    //TCanvas *c1 = tdrCanvas("c1",h1,1,0,kSquare); // 7 TeV
    gPad->SetLogx();
    gPad->SetLogy();
    
    gStyle->SetPalette(1);
    gStyle->SetOptStat(0);
    
    h2->Draw("COLZ SAME");
    //h2->GetZaxis()->SetRangeUser(0,1-1e-4);
    h2->GetZaxis()->SetRangeUser(zmin+1e-4,1-1e-4);

    gPad->SetRightMargin(0.12);
    gPad->SetLeftMargin(0.17);
    gPad->RedrawAxis();
    gPad->Update();

    TLine *l = new TLine();
    l->DrawLine(10,10,2500,2500);
    l->SetLineStyle(kDashed);
    l->DrawLine(1000,10,1000,1000);
    l->DrawLine(1000,1000,2500,1000);
    l->DrawLine(200,10,200,200);
    l->DrawLine(200,200,2500,200);
    l->DrawLine(40,10,40,40);
    l->DrawLine(40,40,2500,40);

    TLatex *tex = new TLatex();
    tex->SetNDC(); tex->SetTextSize(0.045);
    tex->DrawLatex(0.20,0.87,"Anti-k_{T} R=0.5, PF+CHS");
    //tex->DrawLatex(0.20,0.80,"TotalNoTime");
    tex->DrawLatex(0.20,0.80,"Total excl. time");

    tex->SetTextFont(42);
    tex->SetTextSize(0.05);
    tex->DrawLatex(0.10,0.09,"10");

    c1->SaveAs("pdf/drawSourceCorrelations_8TeV_Eta13.pdf");
    //c1->SaveAs("pdf/drawSourceCorrelations_7TeV.pdf");
  }

  // Multiple eta bins
  {
    TH1D *h1x = new TH1D("h1x",";250^{i#eta} #times p_{T} (GeV)"
			 ";250^{i#eta} #times p_{T} (GeV)",
			 netapt,etaptbins);
    h1x->SetMinimum(etaptbins[0]);
    h1x->SetMaximum(etaptbins[netapt]);
    //h1x->GetXaxis()->SetMoreLogLabels();
    //h1x->GetXaxis()->SetNoExponent();
    //h1x->GetYaxis()->SetMoreLogLabels();
    //h1x->GetYaxis()->SetNoExponent();

    TCanvas *c1x = tdrCanvas("c1x",h1x,2,0,kSquare); // 8 TeV cross-eta
    gPad->SetLogx();
    gPad->SetLogy();
    
    gStyle->SetPalette(1);
    gStyle->SetOptStat(0);
    
    h2x->Draw("COLZ SAME");
    //h2x->GetZaxis()->SetRangeUser(0,1-1e-4);
    h2x->GetZaxis()->SetRangeUser(zmin+1e-4,1-1e-4);

    gPad->SetBottomMargin(0.15);
    h1x->GetXaxis()->SetTitleOffset(1.2);
    
    gPad->SetRightMargin(0.12);
    gPad->SetLeftMargin(0.17);
    gPad->RedrawAxis();
    gPad->Update();
    
    TLine *l = new TLine();
    l->DrawLine(10,10,2500*pow(250,3),2500*pow(250,3));
    l->SetLineStyle(kDashed);
    l->DrawLine(1000,10,1000,1000);
    l->DrawLine(1000,1000,2500*pow(250,3),1000);
    l->DrawLine(200,10,200,200);
    l->DrawLine(200,200,2500*pow(250,3),200);
    l->DrawLine(40,10,40,40);
    l->DrawLine(40,40,2500*pow(250,3),40);
    
    TLatex *tex = new TLatex();
    tex->SetNDC(); tex->SetTextSize(0.045);
    tex->DrawLatex(0.20,0.88,"Anti-k_{T} R=0.5, PF+CHS");//, TotalNoTime");
    //tex->DrawLatex(0.20,0.80,"TotalNoTime");
    tex->DrawLatex(0.71,0.88,"HF");
    tex->DrawLatex(0.530,0.69,"EC2");
    tex->DrawLatex(0.355,0.50,"EC1");
    tex->DrawLatex(0.190,0.30,"BB");

    tex->SetTextFont(42);
    tex->SetTextSize(0.05);
    tex->DrawLatex(0.10,0.09,"10");
    
    c1x->SaveAs("pdf/drawSourceCorrelations_8TeV.pdf");
  }
}
Exemplo n.º 4
0
vector<Jet> selectJetsCMG(const Event & ev, const vector<Lepton> & leptons, JetCorrectionUncertainty  & jecUnc, TLorentzVector * diff, unsigned mode, double ptMin, double etaMax) {
#else
vector<Jet> selectJetsCMG(const Event & ev, const vector<Lepton> & leptons, TLorentzVector * diff, unsigned mode, double ptMin, double etaMax) {
#endif

	const SingleVariableContainer<int> * jn = dynamic_cast<const SingleVariableContainer<int> *>(ev.findVariable("jn"));
	const ArrayVariableContainer<float> * jn_px = dynamic_cast<const ArrayVariableContainer<float> *>(ev.findVariable("jn_px"));
	const ArrayVariableContainer<float> * jn_py = dynamic_cast<const ArrayVariableContainer<float> *>(ev.findVariable("jn_py"));
	const ArrayVariableContainer<float> * jn_pz = dynamic_cast<const ArrayVariableContainer<float> *>(ev.findVariable("jn_pz"));
	const ArrayVariableContainer<float> * jn_en = dynamic_cast<const ArrayVariableContainer<float> *>(ev.findVariable("jn_en"));
	const ArrayVariableContainer<float> * jn_jp = dynamic_cast<const ArrayVariableContainer<float> *>(ev.findVariable("jn_jp"));
	const ArrayVariableContainer<float> * jn_genpx = dynamic_cast<const ArrayVariableContainer<float> *>(ev.findVariable("jn_genjpx"));
	const ArrayVariableContainer<float> * jn_genpy = dynamic_cast<const ArrayVariableContainer<float> *>(ev.findVariable("jn_genjpy"));
	const ArrayVariableContainer<float> * jn_genpz = dynamic_cast<const ArrayVariableContainer<float> *>(ev.findVariable("jn_genjpz"));
	const ArrayVariableContainer<float> * jn_genen = dynamic_cast<const ArrayVariableContainer<float> *>(ev.findVariable("jn_genjen"));
	const ArrayVariableContainer<int> * jn_idbits = dynamic_cast<const ArrayVariableContainer<int> *>(ev.findVariable("jn_idbits"));

	if (mode == 1 || mode == 2) {
		if (diff == 0)
			throw string("ERROR - selectJetsCMG(): NULL pointer!");
		diff->SetPxPyPzE(0, 0, 0, 0);
	}

	vector<Jet> jets;
	for ( int i = 0; i < jn->getVal(); ++i ) {
		TLorentzVector jet(jn_px->getVal(i), jn_py->getVal(i), jn_pz->getVal(i), jn_en->getVal(i));
		bool matchesLepton = false;
		for (unsigned k = 0; k < leptons.size(); ++k) {
			TLorentzVector lepton = leptons[k].lorentzVector();
			double delR = deltaR(lepton.Eta(), lepton.Phi(), jet.Eta(), jet.Phi());
			if (delR < 0.15) {
				matchesLepton = true;
				break;
			}
		}
		if (matchesLepton)
			continue;
		if (mode == 1 || mode == 2) {
#ifdef CMSSWENV
			jecUnc.setJetEta(jet.Eta());
			jecUnc.setJetPt(jet.Pt());
			double sF = fabs(jecUnc.getUncertainty(true));
			if ( sF > 0.3 ) {
				cout << setw(10) << jet.Pt() << setw(10) << jet.Eta() << setw(10) << sF << endl;	
				throw string("ERROR!");	
			}
			if (mode == 1)
				sF = 1 + sF;
			else
				sF = 1 - sF;
			TLorentzVector newJet = sF * jet;
			(*diff) += (newJet - jet);
			jet = newJet;
#else
			throw string("ERROR: Jet Uncertainty Systematic variation not supported!");
#endif
		}
		Jet tmp;
		tmp.addFloatVar( jn_px->getName(), jet.Px() );
		tmp.addFloatVar( jn_py->getName(), jet.Py() );
		tmp.addFloatVar( jn_pz->getName(), jet.Pz() );
		tmp.addFloatVar( jn_en->getName(), jet.E() );
		tmp.addIntVar( jn_idbits->getName(), jn_idbits->getVal(i) );
		tmp.addFloatVar( jn_jp->getName(), jn_jp->getVal(i) );
		TLorentzVector genJet( jn_genpx->getVal(i), jn_genpy->getVal(i), jn_genpz->getVal(i), jn_genen->getVal(i) );
		tmp.addFloatVar( "jn_genpt", genJet.Pt() );

		jets.push_back(tmp);
	}
	return jets;
}

TLorentzVector smearJets(vector<Jet> & jets, unsigned mode) {
	TLorentzVector jetDiff;
	for ( unsigned j = 0; j < jets.size(); ++j ) {
		Jet smJet = smearedJet( jets[j], mode );
		jetDiff += (smJet.lorentzVector() - jets[j].lorentzVector());
		jets[j] = smJet;
	}
	return jetDiff;
}
Exemplo n.º 5
0
bool testSources(string file1, string file2,
			 double jetpt=50., double jeteta=2.4, std::string src_selection="Summer13_V2") {
  if(debug){
    std::cout<< "WARNING: debug/verbose mode activated" << std::endl;
    verbose = true;
  }
  
  const char** srcnames;
  int nsrc;

  // Instantiate uncertainty sources
  if(src_selection == "Summer13_V2"){
    srcnames = srcnames_Summer13_V2;
    nsrc=nsrc_Summer13_V2;
  }
  else if(src_selection == "Summer13_V5"){
    srcnames = srcnames_Summer13_V5;
    nsrc=nsrc_Summer13_V5;
  }
  else if(src_selection == "Summer13_V5_SubTotalPt"){
    srcnames = srcnames_Summer13_V5_SubTotalPt;
    nsrc=nsrc_Summer13_V5_SubTotalPt;
  }
  else if(src_selection == "Summer13_V5_SubTotalRelative"){
    srcnames = srcnames_Summer13_V5_SubTotalRelative;
    nsrc=nsrc_Summer13_V5_SubTotalRelative;
  }
  else if(src_selection == "Summer13_V5_SubTotalPileUp"){
    srcnames = srcnames_Summer13_V5_SubTotalPileUp;
    nsrc=nsrc_Summer13_V5_SubTotalPileUp;
  }
  else if(src_selection == "Summer13_V5_CorrGroups"){
    srcnames = srcnames_Summer13_V5_CorrGroups;
    nsrc=nsrc_Summer13_V5_CorrGroups;
  }

  std::vector<JetCorrectionUncertainty*> vsrc(nsrc);
  
  // Load individual sources from file1
  if(verbose)cout <<"\nLoading individual sources ("<<nsrc<<") from file1..." << endl;
  for (int isrc = 0; isrc < nsrc; isrc++) {
    
    const char *name = srcnames[isrc];
    if(verbose)cout << Form("=> %s:%s",file1.c_str(),name) << endl << flush;
    JetCorrectorParameters *p = new JetCorrectorParameters(file1.c_str(), name);
    JetCorrectionUncertainty *unc = new JetCorrectionUncertainty(*p);
    vsrc[isrc] = unc;
  } // for isrc
  
  // Load total uncertainty source from file1
  if(verbose)cout << "\nLoading Total source from file1..." << endl;
  if(verbose)cout << Form("=> %s:%s",file1.c_str(),srcnames[nsrc]) << endl << flush;
  JetCorrectorParameters *p = new JetCorrectorParameters(file1.c_str(),srcnames[nsrc]);
  JetCorrectionUncertainty *total = new JetCorrectionUncertainty(*p);
  
  JetCorrectorParameters *p2=0;
  JetCorrectionUncertainty *total2=0;
  if(file2!=""){
    // Load total uncertainty from file2
    if(verbose)cout << "\nLoading total uncertainty from file2..." << endl;
    if(verbose)cout << "=> " << file2 << endl << flush;
    p2 = new JetCorrectorParameters(file2.c_str());
    total2 = new JetCorrectionUncertainty(*p2);
  }
  
  // Calculate uncertainty per source and as a total
  double sum2_up(0), sum2_dw(0), sum2(0);
  for (int isrc = 0; isrc != nsrc; isrc++) {
    
    JetCorrectionUncertainty *unc = vsrc[isrc];
    unc->setJetPt(jetpt);
    unc->setJetEta(jeteta);
    double sup = unc->getUncertainty(true); // up variation
    if(debug)printf("%20s: %10.7f \n",srcnames[isrc],sup); 
    unc->setJetPt(jetpt);
    unc->setJetEta(jeteta);
    double sdw = unc->getUncertainty(false); // down variation
    
    sum2_up += pow(max(sup,sdw),2);
    sum2_dw += pow(min(sup,sdw),2);
    sum2 += pow(max(fabs(sup),fabs(sdw)),2);
  } // for isrc

  // Check that uncertainties are symmetric
  assert(fabs(sum2_up-sum2_dw)<5e-4);
  assert(fabs(sum2-fabs(sum2_up))<5e-4);
  
  total->setJetPt(jetpt);
  total->setJetEta(jeteta);
  double uncert = total->getUncertainty(true);
  
  double uncert2=-1;
  if(file2!=""){
    total2->setJetPt(jetpt);
    total2->setJetEta(jeteta);
    uncert2 = total2->getUncertainty(true);
  }
  
  bool fail = false;

  // Check that quadratic sum of sources equals total uncertainty
  if(verbose)cout << "\nTesting sum versus file1 total...";
  if (fail = (fabs(uncert - sqrt(sum2)) > 5e-4)) {
    cout << "FAIL" << endl;
    cout << "Error: Quadratic sum of sources does not agree with total" << endl
	 << "       Difference is "<<uncert<<"(total) - "<<sqrt(sum2)
	 << "(sum) = " << uncert - sqrt(sum2) << endl;
    //assert(fabs(uncert - sqrt(sum2_up)) < 1e-3);
  }
  else
    if(verbose)cout << "ok" << endl;
  
  if(file2!=""){
    if(verbose)cout << "Testing sum versus file2 total...";
    if (fail = (fabs(uncert2 - sqrt(sum2)) > 5e-4)) {
      cout << "FAIL" << endl;
      cout << "Error: Quadratic sum of sources does not agree with total" << endl
	   << "       Difference is "<<uncert2<<"(total) - "<<sqrt(sum2)
	   << "(sum) = " << uncert2 - sqrt(sum2) << endl;
      //assert(fabs(uncert2 - sqrt(sum2_up)) < 1e-3);
    }
    else
      if(verbose)cout << "ok" << endl;
  }

  if(verbose)cout << "Test result: " << (fail ? "FAIL" : "PASS") << endl;
  if(verbose)cout << "Tested eta="<<jeteta<<" pt="<<jetpt<<endl;

  if(fail)nFailedTests++;

  return (!fail);
} // testSources