Paper: DESY-20-080 [arXiv:2005.14471] submitted to EPJ C Title: Measurement of Exclusive pi+pi- and rho0 Meson Photoproduction at HERA Authors: H1 Collaboration ASCII tables with full uncertainty breakdown are provided here: http://www-h1.desy.de/publications/H1publication.short_list.html The tables are provided in the CSV format. Lines starting with a # character are comment lines not intended for parsing. They give a human-readable description of the table content. The data section of each table has a header line for naming the table columns, followed by a number of data rows. The files ending with _syst.csv provide the following information: measurement, statistical uncertainty, (correlated) systematic uncertainties The files ending with _statCorr.csv provide information on statistical correlation coefficients ========================================================================= Here is example C code for reading two tables and plotting a fit and its uncertainty envelope (table 9, cf. figure 11 of the paper) /* This is example code how to parse and read the "stat" and "syst" files with the full uncertainty breakdown corresponding to table 9 (the fit depicted in figure 11) The code is optimized for execution with the Root analysis framework. Copyright: 2020 for the benefit of the H1 collaboration When using this code, please include a proper citation to our work in your publication. */ void d20_080t8_Wfit(char const *name="d20-080t9-Wfit2_syst.csv", char const *nameStat="d20-080t9-Wfit2_statCorr.csv") { // systematic (offset variations) vector > syserrUp,syserrDown; // parameter and stat error vector par,dparStat; // papameter names vector nameUp,nameDown; // loop over "syst" file ifstream infile(name); while(!infile.eof()) { char line[10000]; infile.getline(line,9999); line[9999]=0; // skip comment lines if(line[0]=='#') continue; // replace ",' by blanks for easy parsing for(int i=0;line[i];i++) { if(line[i]==',') line[i]=32; } // parse a single line, arguments separated by blanks istringstream sline(line); string name; // first entry is not used (parameter number) sline>>name; // second entry: parameter name sline>>name; if(name=="parName") { // header line of the CSV // this is used to determine the number of systematic variations string chan,val,stat,tpos,tneg; sline>>chan>>val>>stat>>tpos>>tneg; // this loop reads all systematic parameter names and counts them while(!sline.eof()) { string up,down; sline>>up>>down; if(sline.fail()) continue; nameUp.push_back(up); nameDown.push_back(down); } // resize array of systematic shifts syserrUp.resize(nameUp.size()); syserrDown.resize(nameDown.size()); } else { // data line of the CSV // channel (for table 8 always elastic) string chan; sline>>chan; // read central value, stat error, total positive and negative error double x,stat=0.,up=0.,dn=0.; sline>>x>>stat>>up>>dn; if(!sline.fail()) { // parameter is valid -> store it par.push_back(x); dparStat.push_back(stat); int ierr=0; // in this loop, read all systematic up and down shifts double sysUp=0.,sysDown=0.; while(!sline.eof()) { double eup=0.,edn=0.; // shift resultig from up and down variation sline>>eup>>edn; if(sline.fail()) break; syserrUp[ierr].push_back(eup); syserrDown[ierr++].push_back(edn); // the following is for determining the total up and down // systematic uncertainty (not used for plotting, only for // consistency check) if(eup0.) sysUp =TMath::Hypot(sysUp,eup); if(edn<0.) sysDown =TMath::Hypot(sysDown,edn); } double totUp =TMath::Hypot(sysUp,stat); double totDown =TMath::Hypot(sysDown,stat); // verify total uncertainty in table cout<>ipar>>jpar>>iname>>jname; if(!sline.fail()) { string dummy; sline>>dummy; sline>>dummy; double rho; sline>>rho; if(sline.fail()) continue; // only one half f teh matrix is stored, so set both Vij and Vji rhoij(ipar,jpar)=rho; rhoij(jpar,ipar)=rho; Vstat(ipar,jpar)=rho*dparStat[ipar]*dparStat[jpar]; Vstat(jpar,ipar)=rho*dparStat[ipar]*dparStat[jpar]; } } // determine independent eigenvectors, these can be added quadratically later TMatrixDSymEigen EStat(Vstat); vector Wi,fi,fstatP,fstatM,ftotP,ftotM; // loop over the W range to plot // logarithmic spacing for(double W=2.;W<300.;W*=1.2) { // offset variation of stat eigenvalues and sys errors for(int ivar=0;ivar<1+2*par.size() +syserrUp.size()+syserrDown.size();ivar++) { // ivar=0: central value double A=par[0]; double fR=par[1]; double deltaR=par[2]; double deltaP=par[3]; if(ivar>0.) { // ivar>0: statistical of systematic variation if(ivar<=2*par.size()) { // statistical eigenvector variation TVectorD eval=EStat.GetEigenValues(); TMatrixD evec=EStat.GetEigenVectors(); int k=(ivar-1)%(2*par.size()); // iv: variant number int iv=k%par.size(); double d=sqrt(eval[iv]); // positive variations: k=0..N-1 // negative variations: k=N..2*N-1 if(k>=par.size()) d=-d; // modify central value A += d*evec(0,iv); fR += d*evec(1,iv); deltaR += d*evec(2,iv); deltaP += d*evec(3,iv); } else { // systematic offset up/down variations int k=ivar-1-2*par.size(); if(k