void
CorrelationTimeArcGrbcat::initiate()
{
  TRACE("X: range = " << getXRange() << ", points = " << getXPoints() << ", delta = " << getXDelta());
  TRACE("Y: range = " << getYRange() << ", points = " << getYPoints() << ", delta = " << getYDelta());
  _histData.resize(getYPoints(), std::vector<std::size_t>(getXPoints(), 0));
  _histModel.resize(getYPoints(), std::vector<std::size_t>(getXPoints(), 0));
  _cf.resize(getYPoints(), std::vector<type::Float>(getXPoints(), 0.0));
}
void
CorrelationTimeArcGrbcat::doGenerate(Catalog& catalogData, Catalog& catalogModel)
{
  initiate();

  TRACE("GENERATING DATA HISTOGRAM");
  _pairsData = generateCF(catalogData, _histData);
  TRACE("GENERATING MODEL HISTOGRAM");
  _pairsModel = generateCF(catalogModel, _histModel);

  TRACE("PAIRS: DATA = " << _pairsData << ", MODEL = " << _pairsModel);

  for (std::size_t i = 0; i < getYPoints(); ++i)
  {
    for (std::size_t j = 0; j < getXPoints(); ++j)
    {
      if (_histModel[i][j])
      {
        _cf[i][j] =  _histData[i][j];
        _cf[i][j] /= 1.0 * _histModel[i][j];
      }
    }
  }
  normalize(_cf, _pairsModel / _pairsData);
}
void PairRegressionAnalyzer::printResults(QTableWidget * table) {
    table->setColumnCount(results.count());
    table->setRowCount(results[0].count());

    table->setHorizontalHeaderItem(0,new QTableWidgetItem("x"));
    table->setHorizontalHeaderItem(1,new QTableWidgetItem("y"));
    table->setHorizontalHeaderItem(2,new QTableWidgetItem("y''"));

    for(int col=0;col<results.count();col++)
        for(int row=0;row<results[col].count();row++)
            table->setItem(row,col,new QTableWidgetItem(QString::number(results[col][row])));

    Point3D coords;
    coords.x = 5.0f;
    coords.y = 5.0f;
    coords.z = 5.0f;
    Point3D coordsScale;
    coordsScale.x = 5.0/maxElement(results[0]);
    coordsScale.y = 5.0/maxElement(results[1]);
    coordsScale.z = 1;
    QList<QString> coordLables;

    QWidget * tab1 = AdditionalWidgets.at(0);
    tab1->setObjectName("График");
    PairRegressionAnalyzerGraphic * g1 = new PairRegressionAnalyzerGraphic(tab1);
    coordLables.append("");
    coordLables.append("");
    g1->SetCoordsData(coords, coordLables,Figure3D::black, Figure3D::darkGreen, &coordsScale);
    g1->SetPoints(getYPoints());
    g1->SetLinePoints(getY2Points());
    g1->SetErrorText("Качество оценивания: " + QString::number(R));
    g1->SetEquation("y'' = " + QString::number(A) + " + " + QString::number(B) + "x");
    tab1->setLayout(new QGridLayout());
    tab1->layout()->addWidget(g1);
}
void
CorrelationTimeArcGrbcat::normalize(std::vector< std::vector<type::Float>>& cf, type::Float norm)
{
  for (std::size_t i = 0; i < getYPoints(); ++i)
  {
    for (std::size_t j = 0; j < getXPoints(); ++j)
    {
      cf[i][j] *= norm;
    }
  }
}
// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
void RegularGridSampleSurfaceMesh::setupFilterParameters()
{
  FilterParameterVector parameters = getFilterParameters();
  parameters.push_back(IntFilterParameter::New("X Points", "XPoints", getXPoints(), FilterParameter::Parameter));
  parameters.push_back(IntFilterParameter::New("Y Points", "YPoints", getYPoints(), FilterParameter::Parameter));
  parameters.push_back(IntFilterParameter::New("Z Points", "ZPoints", getZPoints(), FilterParameter::Parameter));
  parameters.push_back(FloatVec3FilterParameter::New("Resolution", "Resolution", getResolution(), FilterParameter::Parameter));
  parameters.push_back(FloatVec3FilterParameter::New("Origin", "Origin", getOrigin(), FilterParameter::Parameter));
  parameters.push_back(StringFilterParameter::New("Data Container", "DataContainerName", getDataContainerName(), FilterParameter::CreatedArray));
  parameters.push_back(SeparatorFilterParameter::New("Cell Data", FilterParameter::CreatedArray));
  parameters.push_back(StringFilterParameter::New("Cell Attribute Matrix", "CellAttributeMatrixName", getCellAttributeMatrixName(), FilterParameter::CreatedArray));
  parameters.push_back(StringFilterParameter::New("Feature Ids", "FeatureIdsArrayName", getFeatureIdsArrayName(), FilterParameter::CreatedArray));
  setFilterParameters(parameters);
}
// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
void RegularGridSampleSurfaceMesh::readFilterParameters(AbstractFilterParametersReader* reader, int index)
{
  SampleSurfaceMesh::readFilterParameters(reader, index);
  reader->openFilterGroup(this, index);
  setXPoints(reader->readValue("XPoints", getXPoints()));
  setYPoints(reader->readValue("YPoints", getYPoints()));
  setZPoints(reader->readValue("ZPoints", getZPoints()));
  setResolution(reader->readFloatVec3("Resolution", getResolution()));
  setOrigin(reader->readFloatVec3("Origin", getOrigin()));
  setDataContainerName(reader->readString("DataContainerName", getDataContainerName()));
  setCellAttributeMatrixName(reader->readString("CellAttributeMatrixName", getCellAttributeMatrixName() ) );
  setFeatureIdsArrayName(reader->readString("FeatureIdsArrayName", getFeatureIdsArrayName() ) );
  reader->closeFilterGroup();
}
std::size_t
CorrelationTimeArcGrbcat::generateCF(Catalog& catalog,
                                     std::vector< std::vector<std::size_t> > hist)
{
  std::size_t pairs = 0;
  GreatCircleDistance distance(_formula);
  std::vector<CatalogEntry*> entries;

  filterEntries(catalog, entries);

  const std::size_t points = entries.size();
  const std::size_t pairsAll = points * (points -1) / 2;
  const std::size_t mod = std::pow(10.0, std::floor(std::log10(pairsAll)) - 4);

  std::printf("ENTRIES = %ld, PAIRS = %ld\n", points, pairsAll);

  std::size_t k = 0;
  for (std::size_t i = 0; i < points - 1; ++i)
  {
    CatalogEntryGrbcat* iEntry = static_cast<CatalogEntryGrbcat*>(entries[i]);
    for (std::size_t j = i + 1; j < points; ++j)
    {
      CatalogEntryGrbcat* jEntry = static_cast<CatalogEntryGrbcat*>(entries[j]);
      type::Float time = std::fabs(jEntry->getCoodinates().getTimeMJD() -
                                   iEntry->getCoodinates().getTimeMJD());
      type::Float dist = distance(jEntry->getCoodinates(), iEntry->getCoodinates());

      std::size_t xIdx = std::floor(time * getXDelta());
      std::size_t yIdx = std::floor(dist * getYDelta());

      if (xIdx < getXPoints() && yIdx < getYPoints())
      {
        ++hist[yIdx][xIdx];
        ++pairs;
      }

      if (++k % mod == 0)
      {
        std::printf("\rProgress %3.2f%% %ld/%ld - pairs = %ld" ,
                    100.0 * k / pairsAll, k, pairsAll, pairs);
      }
    }
  }
  std::printf("\rProgress %3.2f%% %ld/%ld - pairs = %ld\n" ,
              100.0 * k / pairsAll, k, pairsAll, pairs);

  return pairs;
}
Example #8
0
void drawSinglePtBin(TFile* file, int iPtBin, const std::string& recoGen, Float_t& extrapReso, Float_t& extrapReso_err, Float_t& trueReso, Float_t& trueReso_err, Float_t& intrReso, Float_t& intrReso_err, Float_t& extrapResp, Float_t& extrapResp_err, Float_t& trueResp, Float_t& trueResp_err, Float_t& intrResp, Float_t& intrResp_err, Float_t& imbalanceResp, Float_t& imbalanceResp_err) {

  Double_t Lower[NBINS_PT];
  fitTools::getPtBins(NBINS_PT, Lower);

  Double_t ptMin = Lower[iPtBin];
  Double_t ptMax = Lower[iPtBin+1];

 
  Int_t nPoints = 5;

  char xHistoName[90];
  sprintf( xHistoName, "ptBin_%d_%d/pt2ndJet%sMean_%d", (int)ptMin, (int)ptMax, recoGen.c_str(), iPtBin);

  Float_t x[nPoints];
  Float_t x_err[nPoints];

  getXPoints( file, xHistoName, nPoints, x, x_err);


  Float_t y_resp_recoPhot[nPoints];
  Float_t y_resp_recoPhot_err[nPoints];

  Float_t y_resp_genPhot[nPoints];
  Float_t y_resp_genPhot_err[nPoints];

  Float_t y_resp_recoGen[nPoints];
  Float_t y_resp_recoGen_err[nPoints];

  Float_t y_resp_genPart[nPoints];
  Float_t y_resp_genPart_err[nPoints];

  Float_t y_resp_partPhot[nPoints];
  Float_t y_resp_partPhot_err[nPoints];

  Float_t y_reso_recoPhot[nPoints];
  Float_t y_reso_recoPhot_err[nPoints];

  Float_t y_reso_genPhot[nPoints];
  Float_t y_reso_genPhot_err[nPoints];

  Float_t y_reso_recoGen[nPoints];
  Float_t y_reso_recoGen_err[nPoints];

  Float_t y_reso_genPart[nPoints];
  Float_t y_reso_genPart_err[nPoints];

  Float_t y_reso_partPhot[nPoints];
  Float_t y_reso_partPhot_err[nPoints];

  char yHistoName[100];
  sprintf( yHistoName, "ptBin_%d_%d/r_RecoPhot_vs_%s_%d", (int)ptMin, (int)ptMax, recoGen.c_str(), iPtBin);
  getYPoints( file, yHistoName, nPoints, y_resp_recoPhot, y_resp_recoPhot_err,  y_reso_recoPhot, y_reso_recoPhot_err);
  sprintf( yHistoName, "ptBin_%d_%d/r_GenPhot_vs_%s_%d", (int)ptMin, (int)ptMax, recoGen.c_str(), iPtBin);
  getYPoints( file, yHistoName, nPoints, y_resp_genPhot, y_resp_genPhot_err,  y_reso_genPhot, y_reso_genPhot_err);
  sprintf( yHistoName, "ptBin_%d_%d/r_RecoGen_vs_%s_%d", (int)ptMin, (int)ptMax, recoGen.c_str(), iPtBin);
  getYPoints( file, yHistoName, nPoints, y_resp_recoGen, y_resp_recoGen_err,  y_reso_recoGen, y_reso_recoGen_err);
  sprintf( yHistoName, "ptBin_%d_%d/r_GenPart_vs_%s_%d", (int)ptMin, (int)ptMax, recoGen.c_str(), iPtBin);
  getYPoints( file, yHistoName, nPoints, y_resp_genPart, y_resp_genPart_err,  y_reso_genPart, y_reso_genPart_err);
  sprintf( yHistoName, "ptBin_%d_%d/r_PartPhot_vs_%s_%d", (int)ptMin, (int)ptMax, recoGen.c_str(), iPtBin);
  getYPoints( file, yHistoName, nPoints, y_resp_partPhot, y_resp_partPhot_err,  y_reso_partPhot, y_reso_partPhot_err);

 
  //draw response histograms:

  TGraphErrors* gr_resp_recoPhot = new TGraphErrors(nPoints, x, y_resp_recoPhot, x_err, y_resp_recoPhot_err);
  gr_resp_recoPhot->SetMarkerStyle(20);
  gr_resp_recoPhot->SetMarkerColor(kRed);

  TGraphErrors* gr_resp_genPhot = new TGraphErrors(nPoints, x, y_resp_genPhot, x_err, y_resp_genPhot_err);
  gr_resp_genPhot->SetMarkerStyle(22);
  gr_resp_genPhot->SetMarkerColor(kBlack);

  TGraphErrors* gr_resp_recoGen = new TGraphErrors(nPoints, x, y_resp_recoGen, x_err, y_resp_recoGen_err);
  gr_resp_recoGen->SetMarkerStyle(21);
  gr_resp_recoGen->SetMarkerColor(kBlue);

  TGraphErrors* gr_resp_genPart = new TGraphErrors(nPoints, x, y_resp_genPart, x_err, y_resp_genPart_err);
  gr_resp_genPart->SetMarkerStyle(23);
  gr_resp_genPart->SetMarkerColor(kGreen);

  TGraphErrors* gr_resp_partPhot = new TGraphErrors(nPoints, x, y_resp_partPhot, x_err, y_resp_partPhot_err);
  gr_resp_partPhot->SetMarkerStyle(22);
  gr_resp_partPhot->SetMarkerColor(kBlack);


  Float_t lastX = x[nPoints-1];
  Float_t xMax_fit = lastX+2.;
  Float_t xMax_fit_green = x[2]+2.;

  Float_t xMax_axis;
  if( lastX <=12. ) 
    xMax_axis = 15.;
  else if( lastX <= 20. )
    xMax_axis = 25.;
  else if( lastX <= 25. )
    xMax_axis = 30.;
  else if( lastX <= 35. )
    xMax_axis = 40.;
  

  std::string xTitle;
  if( recoGen=="Reco" ) {
    xTitle = "p_{T}^{2ndJet reco} [GeV/c]";
  } else if( recoGen=="Gen" ) {
    xTitle = "p_{T}^{2ndJet gen} [GeV/c]";
  } else if( recoGen=="RecoRel" ) {
    xTitle = "p_{T}^{2ndJet reco}/p_{T}^{#gamma} [%]";
  } else if( recoGen=="GenRel" ) {
    xTitle = "p_{T}^{2ndJet gen}/p_{T}^{#gamma} [%]";
  }


  std::string fitFunct_name;
//  if( ptMin <=150. ) 
    fitFunct_name = "[0] - x*x*[1]";
//  else 
//    fitFunct_name = "[0] - x*[1]";

  TF1* fit_resp_genPart = new TF1("fit_resp_genPart", fitFunct_name.c_str());
  fit_resp_genPart->SetRange(0., xMax_fit);
  fit_resp_genPart->SetLineWidth(0.5);
  fit_resp_genPart->SetLineColor(kGreen);
  gr_resp_genPart->Fit( fit_resp_genPart, "RQ");

  TF1* fit_resp_genPhot = new TF1("fit_resp_genPhot", fitFunct_name.c_str());
  fit_resp_genPhot->SetRange(0., xMax_fit);
  fit_resp_genPhot->SetLineWidth(0.5);
  fit_resp_genPhot->SetLineColor(kBlack);
  gr_resp_genPhot->Fit( fit_resp_genPhot, "RQ");

  TF1* fit_resp_recoGen = new TF1("fit_resp_recoGen", "[0]");
  fit_resp_recoGen->SetRange(0., xMax_fit);
  fit_resp_recoGen->SetLineWidth(0.5);
  fit_resp_recoGen->SetLineColor(kBlue);
  gr_resp_recoGen->Fit( fit_resp_recoGen, "RQ");

  TF1* fit_resp_partPhot = new TF1("fit_resp_partPhot", fitFunct_name.c_str());
  fit_resp_partPhot->SetRange(0., xMax_fit);
  fit_resp_partPhot->SetLineWidth(0.5);
  fit_resp_partPhot->SetLineColor(kBlack);
  gr_resp_partPhot->Fit( fit_resp_partPhot, "RQ");

  std::string total_resp_str = (ONLYBLACK) ? "fit_resp_recoGen*fit_resp_genPhot" : "fit_resp_partPhot * fit_resp_genPart * fit_resp_recoGen";
  TF1* total_resp = new TF1("total_resp", total_resp_str.c_str());
  total_resp->SetRange(0., xMax_fit);
  total_resp->SetLineColor(kGray+2);

 
  fitFunct_name = "[0]*[1] - x*x*[2]";
  TF1* fit_respParabola = new TF1("fit_respParabola", fitFunct_name.c_str());
  fit_respParabola->SetRange(0., xMax_fit);
  if( NOQ ) //to evaluate syst
    fit_respParabola->FixParameter(1, 0.5*fit_resp_genPhot->GetParameter(0));
  else
    fit_respParabola->FixParameter(1, fit_resp_genPhot->GetParameter(0));
  fit_respParabola->SetLineColor(kRed);
  fit_respParabola->SetLineWidth(0.5);
  gr_resp_recoPhot->Fit( fit_respParabola, "RQ" );


  extrapResp = fit_respParabola->GetParameter(0);
  extrapResp_err = fit_respParabola->GetParError(0);

  intrResp = fit_resp_recoGen->GetParameter(0);
  intrResp_err = fit_resp_recoGen->GetParError(0);

  imbalanceResp = fit_resp_genPhot->GetParameter(0) - 1.;
  imbalanceResp_err = fit_resp_genPhot->GetParError(0);

  Float_t y0_partPhot = fit_resp_partPhot->GetParameter(0);
  Float_t y0_genPart = fit_resp_genPart->GetParameter(0);
  Float_t y0_recoGen = fit_resp_recoGen->GetParameter(0);
  Float_t y0_genPhot = fit_resp_genPhot->GetParameter(0);
  Float_t y0_err_partPhot = fit_resp_partPhot->GetParError(0);
  Float_t y0_err_genPart = fit_resp_genPart->GetParError(0);
  Float_t y0_err_recoGen = fit_resp_recoGen->GetParError(0);
  Float_t y0_err_genPhot = fit_resp_genPhot->GetParError(0);
  
  if( ONLYBLACK ) {
    trueResp = y0_genPhot*y0_recoGen;
    trueResp_err = y0_err_genPhot*y0_err_genPhot*y0_recoGen*y0_recoGen;
    trueResp_err += y0_genPhot*y0_genPhot*y0_err_recoGen*y0_err_recoGen;
    trueResp_err = sqrt( trueResp_err );
  } else {
    trueResp = y0_partPhot*y0_genPart*y0_recoGen;
    trueResp_err = y0_err_partPhot*y0_err_partPhot*y0_genPart*y0_genPart*y0_recoGen*y0_recoGen;
    trueResp_err += y0_partPhot*y0_partPhot*y0_err_genPart*y0_err_genPart*y0_recoGen*y0_recoGen;
    trueResp_err += y0_partPhot*y0_partPhot*y0_genPart*y0_genPart*y0_err_recoGen*y0_err_recoGen;
    trueResp_err = sqrt( trueResp_err );
  }

  //Float_t yMin_axis = (Lower[iPtBin]<50.) ? 0.7 : 0.8;
  Float_t yMin_axis = 0.8;
  TH2D* h2_axes_resp = new TH2D("axes_resp", "", 10, 0., xMax_axis, 10, yMin_axis, 1.1);
  h2_axes_resp->SetXTitle(xTitle.c_str());
  h2_axes_resp->GetXaxis()->SetTitleOffset(1.1);
  h2_axes_resp->SetYTitle("Response");
  h2_axes_resp->GetYaxis()->SetTitleOffset(1.2);

  TLegend* legend_resp = new TLegend(0.65, 0.65, 0.88, 0.88);
  legend_resp->SetTextSize(0.04);
  legend_resp->SetFillStyle(0);
  legend_resp->SetFillColor(kWhite);
  legend_resp->AddEntry(gr_resp_recoGen, "Intrinsic", "P");
  if( ONLYBLACK ) {
    legend_resp->AddEntry(gr_resp_genPhot, "Imbalance", "P");
  } else {
    legend_resp->AddEntry(gr_resp_partPhot, "Imbalance", "P");
    legend_resp->AddEntry(gr_resp_genPart, "Out of cone", "P");
  }
  legend_resp->AddEntry(total_resp, "Total", "L");
  legend_resp->AddEntry(gr_resp_recoPhot, "#gamma + jet", "P");

  char labeltext[50];
  sprintf(labeltext, "%d < p_{T}^{#gamma} < %d GeV/c", (int)ptMin, (int)ptMax);  
  TPaveText* label_resp = new TPaveText(0.15, 0.15, 0.4, 0.2, "brNDC");
  label_resp->SetFillColor(kWhite);
  label_resp->SetTextSize(0.035);
  label_resp->AddText(labeltext);

  TCanvas* c1_resp = new TCanvas("c1_resp", "c1_resp", 800, 600);
  c1_resp->cd();
  h2_axes_resp->Draw();
  total_resp->Draw("same");
  gr_resp_recoGen->Draw("Psame");
  if( ONLYBLACK ) {
    gr_resp_genPhot->Draw("Psame");
  } else { 
    gr_resp_genPart->Draw("Psame");
    gr_resp_partPhot->Draw("Psame");
  }
  gr_resp_recoPhot->Draw("Psame");
  legend_resp->Draw("same");
  label_resp->Draw("same");

  char canvasName_resp[100];
  sprintf(canvasName_resp, "%s/response_ptBin_%d_%d_%s.%s", OUTPUTDIR_.c_str(), (int)ptMin, (int)ptMax, recoGen.c_str(), PICTURE_FORMAT.c_str());
  c1_resp->SaveAs(canvasName_resp);

  delete c1_resp;
  delete h2_axes_resp;
  delete legend_resp;
  delete label_resp;



  //draw resolution histograms:

  TGraphErrors* gr_reso_recoPhot = new TGraphErrors(nPoints, x, y_reso_recoPhot, x_err, y_reso_recoPhot_err);
  gr_reso_recoPhot->SetMarkerStyle(20);
  gr_reso_recoPhot->SetMarkerColor(kRed);

  TGraphErrors* gr_reso_genPhot = new TGraphErrors(nPoints, x, y_reso_genPhot, x_err, y_reso_genPhot_err);
  gr_reso_genPhot->SetMarkerStyle(22);
  gr_reso_genPhot->SetMarkerColor(kBlack);

  TGraphErrors* gr_reso_recoGen = new TGraphErrors(nPoints, x, y_reso_recoGen, x_err, y_reso_recoGen_err);
  gr_reso_recoGen->SetMarkerStyle(21);
  gr_reso_recoGen->SetMarkerColor(kBlue);

  TGraphErrors* gr_reso_genPart = new TGraphErrors(nPoints, x, y_reso_genPart, x_err, y_reso_genPart_err);
  gr_reso_genPart->SetMarkerStyle(23);
  gr_reso_genPart->SetMarkerColor(kGreen);

  TGraphErrors* gr_reso_partPhot = new TGraphErrors(nPoints, x, y_reso_partPhot, x_err, y_reso_partPhot_err);
  gr_reso_partPhot->SetMarkerStyle(22);
  gr_reso_partPhot->SetMarkerColor(kBlack);


  Double_t x1, x2, y1, y2;
  TF1* fit_reso_genPart;
  if( FIT_RMS=="RMS" ) {
    fit_reso_genPart = new TF1("fit_reso_genPart", "[0] + x*[1]");
    fit_reso_genPart->SetRange(0., xMax_fit);
  } else {
    fit_reso_genPart = new TF1("fit_reso_genPart", "[0]");
    fit_reso_genPart->SetRange(0., xMax_fit_green);
  }
  gr_reso_genPart->GetPoint(1, x1, y1);
  fit_reso_genPart->SetParameter(0, y1);
  fit_reso_genPart->SetLineWidth(0.5);
  fit_reso_genPart->SetLineColor(kGreen);
  gr_reso_genPart->Fit(fit_reso_genPart, "RQ");
  fit_reso_genPart->SetRange(0., xMax_fit);

  TF1* fit_reso_partPhot = new TF1("fit_reso_partPhot", "[0] + x*[1]");
  fit_reso_partPhot->SetRange(0., xMax_fit);
  gr_reso_partPhot->GetPoint(1, x1, y1);
  gr_reso_partPhot->GetPoint(2, x2, y2);
  fit_reso_partPhot->SetParameter(0, 0.);
  fit_reso_partPhot->SetParameter(1, (y2-y1)/(x2-x1));
  fit_reso_partPhot->SetLineWidth(0.5);
  fit_reso_partPhot->SetLineColor(kBlack);
  gr_reso_partPhot->Fit(fit_reso_partPhot, "RQ");

  TF1* fit_reso_genPhot = new TF1("fit_reso_genPhot", "[0] + x*[1]");
  fit_reso_genPhot->SetRange(0., xMax_fit);
  fit_reso_genPhot->SetLineWidth(0.5);
  fit_reso_genPhot->SetLineColor(kBlack);
  gr_reso_genPhot->Fit(fit_reso_genPhot, "RQ");

//  std::cout << " ptBin: " << ptMin << "-" << ptMax << "\t" << "slope: " << fit_reso_genPhot->GetParameter(1) << "+/-" << fit_reso_genPhot->GetParError(1)<< std::endl;

  TF1* fit_reso_recoGen = new TF1("fit_reso_recoGen", "[0]");
  fit_reso_recoGen->SetRange(0., xMax_fit);
  gr_reso_recoGen->GetPoint(1, x1, y1);
  gr_reso_recoGen->GetPoint(2, x2, y2);
  fit_reso_recoGen->SetParameter(0, y1);
  fit_reso_recoGen->SetLineWidth(0.5);
  fit_reso_recoGen->SetLineColor(kBlue);
  gr_reso_recoGen->Fit(fit_reso_recoGen, "RQ");



  TF1* sum_intrinsic = new TF1("sum_intrinsic", "sqrt( fit_reso_genPart*fit_reso_genPart + fit_reso_recoGen*fit_reso_recoGen )");
  sum_intrinsic->SetRange(0., xMax_fit);
  sum_intrinsic->SetLineColor(kViolet);
  sum_intrinsic->SetLineStyle(3);


  std::string sum_str;
  if( ONLYBLACK ) {
    sum_str = "sqrt( fit_reso_recoGen*fit_reso_recoGen + fit_reso_genPhot*fit_reso_genPhot )";
  } else {
    sum_str = "sqrt( sum_intrinsic*sum_intrinsic + fit_reso_partPhot*fit_reso_partPhot )";
  }

  TF1* sum= new TF1("sum", sum_str.c_str());
  sum->SetRange(0., xMax_fit);
  sum->SetLineColor(kGray+2);

  Double_t x1_reco, y1_reco;
  gr_reso_recoPhot->GetPoint(1, x1_reco, y1_reco);
  Double_t x2_reco, y2_reco;
  gr_reso_recoPhot->GetPoint(2, x2_reco, y2_reco);

  // genPhot: y = mx + q
  // recoGen: y = c
  Float_t c = fit_reso_recoGen->GetParameter(0);
  Float_t q = fit_reso_genPhot->GetParameter(0);
  Float_t m = fit_reso_genPhot->GetParameter(1);
  // [0] = c; [1] = q; [2] = m
  TF1* fit_extrapToZero_sqrt = new TF1("fit_extrapToZero_sqrt", "sqrt([0]*[0] + [1]*[1] + 2.*[1]*[2]*x + [2]*[2]*x*x)");
  fit_extrapToZero_sqrt->SetRange(0., xMax_fit);
  fit_extrapToZero_sqrt->SetParameter(0, c);
  fit_extrapToZero_sqrt->SetParLimits(0, 0.01, 0.3);
  if( NOQ )
    fit_extrapToZero_sqrt->FixParameter(1, 0.5*q); //to evaluate syst
  else
    fit_extrapToZero_sqrt->FixParameter(1, q); //fixed
  //fit_extrapToZero_sqrt->SetParLimits(1, 0., 0.1);
  fit_extrapToZero_sqrt->SetParameter(2, m);
  fit_extrapToZero_sqrt->SetParLimits(2, 0., 0.05);
  fit_extrapToZero_sqrt->SetLineColor(kRed);
  fit_extrapToZero_sqrt->SetLineWidth(0.5);

  TF1* fit_extrapToZero_line = new TF1("fit_extrapToZero_line", "[0]+[1]*x");
  fit_extrapToZero_line->SetRange(0., xMax_fit);
  fit_extrapToZero_line->SetParameter(0, y1_reco);
  fit_extrapToZero_line->SetParameter(1, (y2_reco-y1_reco)/(x2_reco-x1_reco));
  fit_extrapToZero_line->SetParLimits(0, 0., 0.4);
  fit_extrapToZero_line->SetLineColor(kRed);
  fit_extrapToZero_line->SetLineWidth(0.5);

  gr_reso_recoPhot->Fit(fit_extrapToZero_sqrt, "RQ");
  extrapReso = fit_extrapToZero_sqrt->GetParameter(0);
  extrapReso_err = fit_extrapToZero_sqrt->GetParError(0);
  //extrapReso = sqrt(fit_extrapToZero_sqrt->GetParameter(0));
  //extrapReso_err = ( 1. / (2.*sqrt(extrapReso)) * fit_extrapToZero_sqrt->GetParError(0)); //error propag

  intrReso = fit_reso_recoGen->GetParameter(0);
  intrReso_err = fit_reso_recoGen->GetParError(0);

  trueReso = sum->Eval(0.);
  if( ONLYBLACK )
    trueReso_err = sqrt( fit_reso_genPhot->GetParError(0)*fit_reso_genPhot->GetParError(0) + fit_reso_recoGen->GetParError(0)*fit_reso_recoGen->GetParError(0) );
  else 
    trueReso_err = sqrt( fit_reso_genPart->GetParError(0)*fit_reso_genPart->GetParError(0) + fit_reso_recoGen->GetParError(0)*fit_reso_recoGen->GetParError(0) + fit_reso_partPhot->GetParError(0)*fit_reso_partPhot->GetParError(0) );



  Float_t ymax;
  if( Lower[iPtBin] < 40. ) ymax = (RECOTYPE_=="pf") ? 0.5 : 0.8;
  else if( Lower[iPtBin] < 70. ) ymax = (RECOTYPE_=="pf") ? 0.4 : 0.6;
  else ymax = 0.3;

  TH2D* h2_axes_reso = new TH2D("axes_reso", "", 10, 0., xMax_axis, 10, 0., ymax);
  h2_axes_reso->SetXTitle(xTitle.c_str());
  h2_axes_reso->GetXaxis()->SetTitleOffset(1.1);
  h2_axes_reso->SetYTitle("Resolution");
  h2_axes_reso->GetYaxis()->SetTitleOffset(1.2);

  TPaveText* label_reso = new TPaveText(0.67, 0.83, 0.8, 0.86, "brNDC");
  label_reso->SetFillColor(kWhite);
  label_reso->SetTextSize(0.035);
  label_reso->AddText(labeltext);

  Float_t minLegend = (ONLYBLACK) ? 0.2 : 0.15;
  TLegend* legend_reso = new TLegend(minLegend, 0.6, 0.45, 0.85);
  legend_reso->SetTextSize(0.04);
  legend_reso->SetFillStyle(0);
  legend_reso->SetFillColor(kWhite);
  legend_reso->AddEntry(gr_reso_recoGen, "Intrinsic", "P");
  if( ONLYBLACK ) {
    legend_reso->AddEntry(gr_reso_genPhot, "Imbalance", "P");
  } else {
    legend_reso->AddEntry(gr_reso_partPhot, "Imbalance", "P");
    legend_reso->AddEntry(gr_reso_genPart, "Out of Cone", "P");
  }
  if( !ONLYBLACK )
    legend_reso->AddEntry(sum_intrinsic, "Intrinsic #oplus OoC", "L");
  legend_reso->AddEntry(sum, "Total", "L");
  legend_reso->AddEntry(gr_reso_recoPhot, "#gamma + jet", "P");

  TCanvas* c1_reso = new TCanvas("c1_reso", "c1_reso", 800, 600);
  c1_reso->cd();
  h2_axes_reso->Draw();
  sum->Draw("same");
  if( !ONLYBLACK )
    sum_intrinsic->Draw("same");
  gr_reso_recoPhot->Draw("Psame");
  gr_reso_recoGen->Draw("Psame");
  if( ONLYBLACK ) {
    gr_reso_genPhot->Draw("Psame");
  } else {
    gr_reso_genPart->Draw("Psame");
    gr_reso_partPhot->Draw("Psame");
  }
  legend_reso->Draw("same");
  label_reso->Draw("same");


  char canvasName_reso[100];
  sprintf(canvasName_reso, "%s/resolution_ptBin_%d_%d_%s.%s", OUTPUTDIR_.c_str(), (int)ptMin, (int)ptMax, recoGen.c_str(), PICTURE_FORMAT.c_str());
  c1_reso->SaveAs(canvasName_reso);

  if( ptMin==197. ) {
    h2_axes_reso->Draw();
    sum->Draw("same");
    if( !ONLYBLACK )
      sum_intrinsic->Draw("same");
    gr_reso_recoGen->Draw("Psame");
    if( ONLYBLACK ) {
      gr_reso_genPhot->Draw("Psame");
    } else {
      gr_reso_genPart->Draw("Psame");
      gr_reso_partPhot->Draw("Psame");
    }
    legend_reso->Draw("same");
    label_reso->Draw("same");
    sprintf(canvasName_reso, "%s/resolution_ptBin_%d_%d_%s_NORECO.%s", OUTPUTDIR_.c_str(), (int)ptMin, (int)ptMax, recoGen.c_str(), PICTURE_FORMAT.c_str());
    c1_reso->SaveAs(canvasName_reso);
  }

  delete c1_reso;
  delete h2_axes_reso;
  delete legend_reso;
  delete label_reso;


  delete gr_resp_recoPhot;
  delete gr_resp_genPart;
  delete gr_resp_partPhot;
  delete gr_resp_recoGen;

  delete gr_reso_recoPhot;
  delete gr_reso_genPart;
  delete gr_reso_partPhot;
  delete gr_reso_recoGen;

}