Index: trunk/examples/CMakeLists.txt =================================================================== --- trunk/examples/CMakeLists.txt (revision 370) +++ trunk/examples/CMakeLists.txt (revision 371) @@ -1,162 +1,162 @@ #=============================================================================== # CMakeLists.txt (examples) # -# Copyright (C) 2010-2016 Tobias Toll and Thomas Ullrich +# Copyright (C) 2010-2019 Tobias Toll and Thomas Ullrich # # This file is part of Sartre. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation. # This program is distributed in the hope that it will be useful, # but without any warranty; without even the implied warranty of # merchantability or fitness for a particular purpose. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # Author: Thomas Ullrich # Last update: # $Date$ # $Author$ #=============================================================================== cmake_minimum_required (VERSION 3.1) project(SARTRE_EXAMPLES) # # Compiler options # set(CMAKE_CXX_FLAGS "-W -Wall -Wextra -pedantic -Wno-long-long") set(CMAKE_CXX_FLAGS_DEBUG "-g") set(CMAKE_CXX_FLAGS_RELEASE "-O") set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) # # Set the location of the installed sartre package # set(SARTRE_DIR "$ENV{SARTRE_DIR}") if (IS_DIRECTORY "${SARTRE_DIR}" AND IS_DIRECTORY "${SARTRE_DIR}/lib" AND IS_DIRECTORY "${SARTRE_DIR}/include" AND IS_DIRECTORY "${SARTRE_DIR}/gemini" AND IS_DIRECTORY "${SARTRE_DIR}/tables") message (STATUS "Using Sartre installed in ${SARTRE_DIR}") else() message(FATAL_ERROR "Environment variable SARTRE_DIR does not point to a valid Sartre installation.") endif() message(STATUS "System = ${CMAKE_SYSTEM}") # # User can select if Sartre is to be compiled # in multithreaded mode or not. # Default is off. # cmake -DMULTITHREADED=ON . # option(MULTITHREADED "Switch on/off multithreaded mode" OFF) if (MULTITHREADED) add_definitions(-DSARTRE_IN_MULTITHREADED_MODE) message (STATUS "MULTITHREADED mode is ON") endif (MULTITHREADED) # # See if optional libraries (Glut & OpenGL) are present. # If not skip the examples that require them. # # GLUT #find_package(GLUT) #if (GLUT_FOUND) # message("blah") # include_directories(${GLUT_INCLUDE_DIR}) # set(LIBS ${LIBS} ${GLUT_LIBRARIES}) #endif() # OpenGL find_package(OpenGL) if (OPENGL_FOUND) include_directories(${OPENGL_INCLUDE_DIR}) set(LIBS ${LIBS} ${OPENGL_LIBRARIES}) endif() # # Built all programs in example directory # add_executable(createBSatBDependenceTable createBSatBDependenceTable.cpp) add_executable(heraCompare heraCompare.cpp) add_executable(sartreMain sartreMain.cpp) add_executable(sartreTest sartreTest.cpp) add_executable(tableGeneratorMain tableGeneratorMain.cpp) add_executable(tableGeneratorUPCMain tableGeneratorUPCMain.cpp) add_executable(lambdaGeneratorMain lambdaGeneratorMain.cpp) add_executable(convergenceTest convergenceTest.cpp) #if (OPENGL_FOUND AND GLUT_FOUND) # add_executable(nucleusAnimation nucleusAnimation.cpp) #endif() # # Make sure the files to search for external libraries are available # set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/modules") # # Compiler options # set(CMAKE_C_FLAGS_DEBUG " -g -W") set(CMAKE_CXX_FLAGS_DEBUG " -g -W -Wall -Wextra -pedantic -Wno-long-long -std=c++11") set(CMAKE_C_FLAGS_RELEASE " -O -W") set(CMAKE_CXX_FLAGS_RELEASE " -O -W -Wall -Wextra -pedantic -Wno-long-long -std=c++11") set(CMAKE_C_FLAGS " -O -W") set(CMAKE_CXX_FLAGS " -O -std=c++11 -W -Wall -Wextra -pedantic -Wno-long-long") # # Include files locations # include_directories("${SARTRE_DIR}/include") # # Find external required packages # (see also FindGSL.cmake and FindROOT.cmke in cmake/modules) # # GSL find_package(GSL REQUIRED) include_directories(${GSL_INCLUDE_DIR}) set(LIBS ${LIBS} ${GSL_LIBRARIES}) # ROOT find_package(ROOT REQUIRED) include_directories(${ROOT_INCLUDE_DIR}) set(LIBS ${LIBS} ${ROOT_LIBRARIES} "-lEG -lMathMore -lUnuran" ) #BOOST if (MULTITHREADED) set(Boost_USE_MULTITHREADED ON) find_package(Boost 1.39 COMPONENTS thread REQUIRED) if(Boost_FOUND) include_directories(${Boost_INCLUDE_DIR}) set(LIBS ${LIBS} ${Boost_LIBRARIES} -lboost_system) endif(Boost_FOUND) endif (MULTITHREADED) # # Libraries to link with # #link_directories(${SARTRE_DIR}/lib) file (GLOB ALLSARTRE ${SARTRE_DIR}/lib/*) set(LIBS ${ALLSARTRE} ${ALLSARTRE} ${LIBS} ${ALLSARTRE}) target_link_libraries(createBSatBDependenceTable ${LIBS}) target_link_libraries(heraCompare ${LIBS}) target_link_libraries(sartreMain ${LIBS}) target_link_libraries(sartreTest ${LIBS}) target_link_libraries(tableGeneratorMain ${LIBS}) target_link_libraries(tableGeneratorUPCMain ${LIBS}) target_link_libraries(lambdaGeneratorMain ${LIBS}) target_link_libraries(convergenceTest ${LIBS}) #if (OPENGL_FOUND AND GLUT_FOUND) # target_link_libraries(nucleusAnimation ${LIBS}) #endif() Index: trunk/examples/lambdaGeneratorMain.cpp =================================================================== --- trunk/examples/lambdaGeneratorMain.cpp (revision 370) +++ trunk/examples/lambdaGeneratorMain.cpp (revision 371) @@ -1,192 +1,192 @@ //============================================================================== // lambdaGeneratorMain.cpp // -// Copyright (C) 2010-2018 Tobias Toll and Thomas Ullrich +// Copyright (C) 2010-2019 Tobias Toll and Thomas Ullrich // // This file is part of Sartre. // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation. See . // // Author: Thomas Ullrich // Last update: Sat Aug 13 02:18:37 2011 //============================================================================== // // Main program to create lambda lookup tables. // [Developer only] //============================================================================== #include #include #include #include #include "Amplitudes.h" #include "TH1D.h" #include "TFile.h" #include "Constants.h" #include "Table.h" #include "Settings.h" #include "TableGeneratorSettings.h" #include "Enumerations.h" #include "Kinematics.h" #include #include #define PR(x) cout << #x << " = " << (x) << endl; using namespace std; TableGeneratorSettings* settings = TableGeneratorSettings::instance(); int main(int argc, char *argv[]){ //To explicitly delete all new histograms myself: TH1::AddDirectory(false); // // Check arguments // char* runcard; if (argc != 4) { cout<<"Usage: lambdaGeneratorMain runcard startBin endBin"<setStartBin(atoi(argv[2])); settings->setEndBin(atoi(argv[3])); } settings->readSettingsFromFile(runcard); settings->setA(1); settings->setModesToCalculate(1); settings->setNumberOfConfigurations(1); settings->consolidateSettings(); int nBinQ2 = settings->Q2bins(); int nBinW2 = settings->W2bins(); int nBinT= settings->tbins(); double Q2min= settings->Q2min(); double Q2max= settings->Q2max(); double Wmin= settings->Wmin(); double Wmax= settings->Wmax(); double W2min=Wmin*Wmin; double W2max=Wmax*Wmax; double tmin= settings->tmin(); double tmax= settings->tmax(); unsigned int massA=settings->A(); int vmPDG = settings->vectorMesonId(); DipoleModelType model = settings->dipoleModelType(); DipoleModelParameterSet pset = settings->dipoleModelParameterSet(); int startingBin=settings->startBin(); int endingBin=settings->endBin(); int modes=settings->modesToCalculate(); Table tableT; Table tableL; bool logQ2=true, logW2=false, logT=false, logC=false; //set filenames for the tables string rootfile=settings->rootfile(); ostringstream filenameT, filenameL, filenameT2, filenameL2; filenameT.str(""); filenameT<::epsilon(); hplus -= numeric_limits::epsilon(); //calculate contents and fill tables: double lambda[2]={0, 0}; kinematicPoint[2]= W2+hplus; amps.calculate(kinematicPoint); double ampPlus[2]={0, 0}; ampPlus[0]=amps.amplitudeT(); ampPlus[1]=amps.amplitudeL(); kinematicPoint[2]=W2-hminus; amps.calculate(kinematicPoint); double ampMinus[2]={0, 0}; ampMinus[0]=amps.amplitudeT(); ampMinus[1]=amps.amplitudeL(); for(int j=0; j<2; j++){ PR(ampMinus[j]); PR(ampPlus[j]); // Don't calculate unless numerically viable: if(ampPlus[j]==0 || ampMinus[j]==0){ lambda[j]=0; } else{ //Calculate derivate d(logA/dW2)=log(A+/A-)/(h+-h-): double derivate=log(abs(ampPlus[j]/ampMinus[j]))/(hplus+hminus); // Finally calculate lambda: double jacobian = (W2-protonMass2+Q2); lambda[j] = jacobian*derivate; } } tableT.fill(i, lambda[0]); tableL.fill(i, lambda[1]); if(i%static_cast((endingBin-startingBin)/10+1)==0) cout<<"Processed "<<100*(i-startingBin)/(endingBin-startingBin)<<" %"<verbose()){ cout << "bin = " << setw(8) << left << i; cout << "Q2 = " << setw(10) << left << fixed << setprecision(3) << Q2; cout << "W2 = " << setw(11) << left << fixed << W2; cout << "t = " << setw(14) << left << scientific << t; cout << "lambdaT = " << setw(12) << left << scientific << lambda[0]<. // // Author: Thomas Ullrich // Last update: // $Date$ // $Author$ //============================================================================== // // Developer test program. Checks individual components. // Should not be in the distribution. // //============================================================================== #include "EventGeneratorSettings.h" #include "Table.h" #include #include "TParticlePDG.h" #include "TRandom2.h" #include "Event.h" #include "ExclusiveFinalStateGenerator.h" #include "Kinematics.h" #include "FrangibleNucleus.h" #include "Enumerations.h" #include "TableCollection.h" #include "Sartre.h" #include #include #include "TFile.h" #include "TH3D.h" #include "TH2D.h" #include "Nucleus.h" using namespace std; #define PR(x) cout << #x << " = " << (x) << endl; //#define TEST_SETTINGS //#define TEST_WRITETABLE //#define TEST_READTABLE //#define TEST_BREAKUP //#define TEST_FINALSTATE //#define TEST_TABLECOLLECTION //#define TEST_GENERATOR //#define TEST_INTERPOLATE //#define TEST_SLOPE //#define TEST_CROSSSECTION -//#define TEST_GLAUBER -#define TEST_UPC_TABLE +#define TEST_GLAUBER +//#define TEST_UPC_TABLE #if defined(TEST_INTERPOLATE) struct InterTestPoint { double t, Q2, W2, value; }; #endif #if defined(TEST_SLOPE) struct InterTestSlope { double t, Q2, W2, slope; }; #endif #if defined(TEST_UPC_TABLE) double testfun(double x, double t) { return fabs(log(x)*exp(t)*(exp(t)+x)+sin(t*300)); } #endif int main() { #if defined(TEST_SETTINGS) // // Test Settings // EventGeneratorSettings* settings = EventGeneratorSettings::instance(); settings->readSettingsFromFile("sartreRuncard.txt"); settings->setVerbose(true); settings->setVerboseLevel(3); settings->list(); // // Test PDG lookup // TParticlePDG *part = settings->lookupPDG(113); PR(part->Mass()); PR(part->ParticleClass()); PR(part->GetName()); #endif // // Test reading tables // #if defined(TEST_READTABLE) Table table1, table2; table1.read("table1.root"); table2.read("table2.root"); table3.read("table3.root"); table1.list(cout, false); table2.list(cout, false); table3.list(cout, false); #endif #if defined (TEST_UPC_TABLE) cout << "Creating UPC tables" << endl; Table tableA; Table tableA2; int n1 = tableA.create(50, 1e-5, 0.2, // x 100, -0.051, 0, // t true, false, true, // bool logx, bool logt, bool logContent, mean_A, transverse, 197, 411, bSat, HMPZ, "tableA.root"); int n2 = tableA2.create(1000, 1e-5, 0.2, 1000, -0.051, 0, true, false, true, mean_A2, transverse, 197, 411, bSat, HMPZ, "tableA2.root"); cout << "Filling UPC tables" << endl; double xpom, t; for (int i=0; ieBeam(); event.particles[1].p = settings->hBeam(); generator.generate(443, 0, -event.t, event.y, event.Q2, false, &event); cout << endl; event.list(); cout << endl; #endif #if defined(TEST_BREAKUP) FrangibleNucleus kern(208, true); kern.normalizationOfT(); TLorentzVector someVec(0.5, 0.3, 99., sqrt(0.5*0.5+0.3*0.3+99.*99.)+0.01); kern.breakup(someVec); kern.listBreakupProducts(); kern.breakup(someVec); kern.listBreakupProducts(); kern.breakup(someVec); kern.listBreakupProducts(); #endif #if defined(TEST_TABLECOLLECTION) TableCollection coll; coll.init(197, bSat, 443); PR(coll.minQ2()); PR(coll.maxQ2()); PR(coll.minW2()); PR(coll.maxW2()); PR(coll.minW()); PR(coll.maxW()); PR(coll.minT()); PR(coll.maxT()); #endif #if defined(TEST_GENERATOR) Sartre sartre; sartre.init("sartreRuncard.txt"); Event *myEvent = sartre.generateEvent(); myEvent->list(); PR(sartre.totalCrossSection()); #endif #if defined(TEST_INTERPOLATE) TableCollection coll; coll.init(1, bSat, 22); vector vector_L; ifstream ifs("../testing/dvcs/randomPoints_L.txt"); double t, Q2, W2, val; while (ifs.good() && !ifs.eof()) { ifs >> t >> Q2 >> W2 >> val; if (ifs.eof()) break; InterTestPoint point; point.t = t; point.Q2 = Q2; point.W2 = W2; point.value = val; vector_L.push_back(point); } vector vector_L2; ifstream ifs2("../testing/dvcs/randomPoints_L2.txt"); while (ifs2.good() && !ifs2.eof()) { ifs2 >> t >> Q2 >> W2 >> val; if (ifs2.eof()) break; InterTestPoint point; point.t = t; point.Q2 = Q2; point.W2 = W2; point.value = val; vector_L2.push_back(point); } vector vector_T; ifstream ifs3("../testing/dvcs/randomPoints_T.txt"); while (ifs3.good() && !ifs3.eof()) { ifs3 >> t >> Q2 >> W2 >> val; if (ifs3.eof()) break; InterTestPoint point; point.t = t; point.Q2 = Q2; point.W2 = W2; point.value = val; vector_T.push_back(point); } vector vector_T2; ifstream ifs4("../testing/dvcs/randomPoints_T2.txt"); while (ifs4.good() && !ifs4.eof()) { ifs4 >> t >> Q2 >> W2 >> val; if (ifs4.eof()) break; InterTestPoint point; point.t = t; point.Q2 = Q2; point.W2 = W2; point.value = val; vector_T2.push_back(point); } PR(vector_T.size()); PR(vector_T2.size()); PR(vector_L.size()); PR(vector_L2.size()); TFile *hfile = new TFile("interTest.root","RECREATE"); TH1D histoL("histoL", "L", 100, -0.1, 0.1); for (unsigned int i=0; iWrite(); hfile->Close(); #endif #if defined(TEST_SLOPE) // // For this test need to remove jacobian in CrossSection::logDerivateOfAmplitude() // and make the method public // TableCollection coll; coll.init(1, bSat, 443); CrossSection xSection(&coll); vector vector_L; ifstream ifs("randomPoints_dAdW2L.txt"); double t, Q2, W2, val; while (ifs.good() && !ifs.eof()) { ifs >> t >> Q2 >> W2 >> val; if (ifs.eof()) break; InterTestSlope point; point.t = t; point.Q2 = Q2; point.W2 = W2; point.slope = val; vector_L.push_back(point); } vector vector_T; ifstream ifs2("randomPoints_dAdW2T.txt"); while (ifs2.good() && !ifs2.eof()) { ifs2 >> t >> Q2 >> W2 >> val; if (ifs2.eof()) break; InterTestSlope point; point.t = t; point.Q2 = Q2; point.W2 = W2; point.slope = val; vector_T.push_back(point); } PR(vector_T.size()); PR(vector_L.size()); TFile *hfile = new TFile("slopeTest.root","RECREATE"); TH1D histoL("histoL", "L", 100, -0.1, 0.1); for (unsigned int i=0; iWrite(); hfile->Close(); #endif #if defined(TEST_CROSSSECTION) Sartre sartre; EventGeneratorSettings* settings = sartre.runSettings(); bool useCorrections = true; settings->setVerbose(true); settings->setVerboseLevel(1); settings->setNumberOfEvents(0); settings->setTimesToShow(0); settings->setQ2min(1); settings->setQ2max(2); settings->setWmin(64); settings->setWmax(65); settings->setVectorMesonId(333); settings->setElectronBeamEnergy(20); settings->setHadronBeamEnergy(100); settings->setA(1); settings->setDipoleModelType(bNonSat); settings->setCorrectForRealAmplitude(true); settings->setCorrectSkewedness(true); settings->setEnableNuclearBreakup(false); settings->setMaxLambdaUsedInCorrections(0.2); // settings->list(); bool ok = sartre.init(); if (!ok) { cout << "Initialization of sartre failed." << endl; return 0; } // Normalize Sartre cross-section double sartreCS = sartre.totalCrossSection(); cout << "sartreCS = " << sartreCS << endl; - + #endif #if defined(TEST_GLAUBER) + Nucleus deuteron(2); + Nucleus lead(208); + lead.normalizationOfT(); + deuteron.normalizationOfT(); + /* TFile *hfile = new TFile("glauberTest.root","RECREATE"); TH1D h1("h1","Density", 300, 0, 15.); TH2D h2xy("h2xy","xy", 60, -15, 15., 60, -15., 15.); TH2D h2xz("h2xz","xz", 60, -15, 15., 60, -15., 15.); TH2D h2yz("h2yz","yz", 60, -15, 15., 60, -15., 15.); TH2D h2xy_1("h2xy_1","xy", 60, -15, 15., 60, -15., 15.); TH2D h2xz_1("h2xz_1","xz", 60, -15, 15., 60, -15., 15.); TH2D h2yz_1("h2yz_1","yz", 60, -15, 15., 60, -15., 15.); TH2D h2xy_2("h2xy_2","xy", 60, -15, 15., 60, -15., 15.); TH2D h2xz_2("h2xz_2","xz", 60, -15, 15., 60, -15., 15.); TH2D h2yz_2("h2yz_2","yz", 60, -15, 15., 60, -15., 15.); TH2D h2xy_3("h2xy_3","xy", 60, -15, 15., 60, -15., 15.); TH2D h2xz_3("h2xz_3","xz", 60, -15, 15., 60, -15., 15.); TH2D h2yz_3("h2yz_3","yz", 60, -15, 15., 60, -15., 15.); double binsize = h1.GetBinWidth(1); NewNucleus nucleus(208); vector nucleons; const unsigned int numberOfNuclei = 100000; for (unsigned int i=0; i < numberOfNuclei; i++) { if (i%10000 == 0) cout << i << endl; nucleus.generate(); nucleons = nucleus.configuration(); for (unsigned int k=0; kWrite(); hfile->Close(); cout << "Histograms written to file 'glauberTest.root'" << endl; + */ #endif return 0; } Index: trunk/examples/createBSatBDependenceTable.cpp =================================================================== --- trunk/examples/createBSatBDependenceTable.cpp (revision 370) +++ trunk/examples/createBSatBDependenceTable.cpp (revision 371) @@ -1,132 +1,132 @@ //============================================================================== // createBSatBDependenceTable.cpp // -// Copyright (C) 2010-2013 Tobias Toll and Thomas Ullrich +// Copyright (C) 2010-2019 Tobias Toll and Thomas Ullrich // // This file is part of Sartre. // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation. // This program is distributed in the hope that it will be useful, // but without any warranty; without even the implied warranty of // merchantability or fitness for a particular purpose. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // Author: Thomas Ullrich // Last update: // $Date$ // $Author$ //============================================================================== // // Main program to create impact parameter lookup table. // [Developer only] //============================================================================== #include #include #include #include #include #include "TableGeneratorNucleus.h" #include "TableGeneratorSettings.h" #include "TFile.h" #include "TH2F.h" #include "TVector3.h" #include "Constants.h" #include "DipoleModelParameters.h" #define PR(x) cout << #x << " = " << (x) << endl; using namespace std; double overlapFunctionT(double); void createLookUpTableOnFile(unsigned int, unsigned int); DipoleModelParameters *gParameters; int main(int argc, const char* argv[]) { if (argc != 3) { cout << "Usage: " << argv[0] << " A numberOfConfigurations" << endl; return 2; } gParameters = new DipoleModelParameters(bSat, KMW); //To explicitly delete all new histograms myself: TH1::AddDirectory(false); unsigned int A=atoi(argv[1]); unsigned int numConf=atoi(argv[2]); cout<<"Create table for A="<BG(); // GeV^-2 double arg = (b*b/hbarc2) / (2*BG); return 1/(2*M_PI*BG) * exp(-arg); } void createLookUpTableOnFile(unsigned int A, unsigned int numberOfConfigurations) { // // A function to create a lookup table of nucleon configurations and save them on a file // This function is supposed to be independent from the rest of the code // and be called in the Main program with the nucleus number as an argument. // TableGeneratorNucleus myNucleus(A); // myNucleus.init(A); TableGeneratorSettings::instance()->setSeed(42); // sets also seed for ROOT vector hConfigurations(numberOfConfigurations); int numBbins=1e3, numAngleBins=1e3; double bRange=upperIntegrationLimit*myNucleus.radius()*1.1, angleRange=2*M_PI; ostringstream histoName; for(unsigned int iNuclei=0; iNucleiGetXaxis()->GetBinCenter(ib); for(int iphi=1; iphi <= numAngleBins; iphi++) { double phi=hConfigurations[iNuclei]->GetYaxis()->GetBinCenter(iphi); TVector3 bvector=TVector3(b*cos(phi), b*sin(phi), 0.); double sumOfT=0.; for(unsigned int iA=0; iA < A; iA++){ sumOfT+=overlapFunctionT((bvector-myNucleus.configuration.at(iA).position()).Perp()); } //for iA hConfigurations[iNuclei]->SetBinContent(ib, iphi, sumOfT); }//for iphi } //for ib if(iNuclei % (numberOfConfigurations/10) == 0){ cout<Write(); delete hConfigurations[i]; hConfigurations[i] = 0; } lufile->Close(); cout<<" done, bye!"<. // // Author: Thomas Ullrich // Last update: // $Date$ // $Author$ //============================================================================== // // Main program to create amplitude lookup tables. // [Developer only] // // Usage: // tableGeneratorMain runcard startBin endBin // // Bins run from 0 to nbin-1. // Loop fill all bins from startBIn to endBin (including endBin). // If endBin exceeds the size of the table it set to the nbin-1. // //============================================================================== #include #include #include #include #include #include #include "Amplitudes.h" #include "TROOT.h" #include "TH1D.h" #include "TFile.h" #include "Nucleus.h" #include "Constants.h" #include "Table.h" #include "TableGeneratorSettings.h" #include "Enumerations.h" #include "DglapEvolution.h" #include "Version.h" #define PR(x) cout << #x << " = " << (x) << endl; using namespace std; int main(int argc, char *argv[]) { // // Print header // time_t theStartTime = time(0); string ctstr(ctime(&theStartTime)); ctstr.erase(ctstr.size()-1, 1); cout << "/========================================================================\\" << endl; cout << "| |" << endl; cout << "| Sartre, Version " << setw(54) << left << VERSION << right << '|' << endl; cout << "| |" << endl; cout << "| An event generator for exclusive diffractive vector meson production |" << endl; cout << "| in ep and eA collisions based on the dipole model. |" << endl; cout << "| |" << endl; cout << "| Copyright (C) 2010-2018 Tobias Toll and Thomas Ullrich |" << endl; cout << "| |" << endl; cout << "| This program is free software: you can redistribute it and/or modify |" << endl; cout << "| it under the terms of the GNU General Public License as published by |" << endl; cout << "| the Free Software Foundation, either version 3 of the License, or |" << endl; cout << "| any later version. |" << endl; cout << "| |" << endl; cout << "| Code compiled on " << setw(12) << left << __DATE__; cout << setw(41) << left << __TIME__ << right << '|' << endl; cout << "| Run started at " << setw(55) << left << ctstr.c_str() << right << '|' << endl; cout << "| |" << endl; cout << "| -------------------------------------------------------------------- |" << endl; cout << "| |" << endl; cout << "| Sartre Table Generator (Experts only) |" << endl; cout << "| |" << endl; cout << "\\========================================================================/" << endl; TH1::AddDirectory(false); // to explicitly delete all new histograms by hand TableGeneratorSettings* settings = TableGeneratorSettings::instance(); // // Check arguments // char* runcard; if (argc != 4) { cout << "Usage: tableGeneratorMain runcard startBin endBin" << endl; return 2; } else { runcard = argv[1]; settings->setStartBin(atoi(argv[2])); settings->setEndBin(atoi(argv[3])); } cout << "Reading settings from runcard." << endl; settings->readSettingsFromFile(runcard); settings->consolidateSettings(); int nBinQ2 = settings->Q2bins(); int nBinW2 = settings->W2bins(); int nBinT = settings->tbins(); double Q2min = settings->Q2min(); double Q2max = settings->Q2max(); double Wmin = settings->Wmin(); double Wmax = settings->Wmax(); double W2min = Wmin*Wmin; double W2max = Wmax*Wmax; double tmin = settings->tmin(); double tmax = settings->tmax(); unsigned int massA = settings->A(); int vmPDG = settings->vectorMesonId(); DipoleModelType model = settings->dipoleModelType(); DipoleModelParameterSet pset = settings->dipoleModelParameterSet(); int startingBin = settings->startBin(); int endingBin = settings->endBin(); int modes = settings->modesToCalculate(); unsigned char priority = settings->priority(); settings->list(); // // Check if lambda tables can be calculated // bool createLambdaTables = true; if (massA == 1 && modes == 1 && settings->numberOfConfigurations() == 1) { cout << "\nLambda tables will be generated." << endl; } else { cout << "\nLambda tables will not be generated. Requires A = 1, mode = 1, and 1 configuration only." << endl; createLambdaTables = false; } // // Check bins // // Table's bin indices run from 0 ... nbins-1 // int maxbins = nBinQ2*nBinW2*nBinT; if (endingBin >= maxbins) { cout << "Warning, given end bin (" << endingBin << ") exceeds the size of the table." << endl; cout << " set to maximum value (" << maxbins-1 << ") now." << endl; endingBin = maxbins-1; } // // Define all tables. Depending on tableset type some // will not be written but we define them all anyway. // Table tableT; Table tableL; Table tableT2; Table tableL2; Table tableVarT; Table tableVarL; Table tableLambdaT; Table tableLambdaL; bool logQ2=true, logW2=true, logT=false, logC=true; // // Set filenames for the tables. // Be as desciptive as possible. Helps when mass producing tables. // // We create all tables and decide later what // gets written and what not. // string rootfile=settings->rootfile(); rootfile += "_" + settings->dipoleModelName(); rootfile += "_" + settings->dipoleModelParameterSetName(); ostringstream filenameT, filenameL, filenameT2, filenameL2, filenameVarT, filenameVarL, filenameLambdaT, filenameLambdaL; filenameT.str(""); filenameT << rootfile << "_" << settings->vectorMesonId() << "_bin" << startingBin << "-" << endingBin <<"_T.root"; filenameL.str(""); filenameL << rootfile << "_" << settings->vectorMesonId() << "_bin" << startingBin << "-" << endingBin << "_L.root"; filenameT2.str(""); filenameT2 << rootfile << "_" << settings->vectorMesonId() << "_bin" << startingBin << "-" << endingBin << "_T2.root"; filenameL2.str(""); filenameL2 << rootfile << "_" << settings->vectorMesonId() << "_bin" << startingBin << "-" << endingBin << "_L2.root"; filenameVarT.str(""); filenameVarT << rootfile << "_" << settings->vectorMesonId() << "_bin" << startingBin << "-" << endingBin << "_VarT.root"; filenameVarL.str(""); filenameVarL << rootfile << "_" << settings->vectorMesonId() << "_bin" << startingBin << "-" << endingBin << "_VarL.root"; filenameLambdaT.str(""); filenameLambdaT << rootfile << "_" << settings->vectorMesonId() << "_bin" << startingBin << "-" << endingBin << "_LambdaT.root"; filenameLambdaL.str(""); filenameLambdaL << rootfile << "_" << settings->vectorMesonId() << "_bin" << startingBin << "-" << endingBin << "_LambdaL.root"; (void) tableT.create(nBinQ2, Q2min, Q2max, nBinW2, W2min, W2max, nBinT, tmin, tmax, logQ2, logW2, logT, logC, // all bools mean_A, transverse, massA, vmPDG, model, pset, filenameT.str().c_str(), priority); (void) tableL.create(nBinQ2, Q2min, Q2max, nBinW2, W2min, W2max, nBinT, tmin, tmax, logQ2, logW2, logT, logC, // all bools mean_A, longitudinal, massA, vmPDG, model, pset, filenameL.str().c_str(), priority); (void) tableT2.create(nBinQ2, Q2min, Q2max, nBinW2, W2min, W2max, nBinT, tmin, tmax, logQ2, logW2, logT, logC, // all bools mean_A2, transverse, massA, vmPDG, model, pset, filenameT2.str().c_str(), priority); (void) tableL2.create(nBinQ2, Q2min, Q2max, nBinW2, W2min, W2max, nBinT, tmin, tmax, logQ2, logW2, logT, logC, // all bools mean_A2, longitudinal, massA, vmPDG, model, pset, filenameL2.str().c_str(), priority); bool contentVar = modes == 1 ? false : logC; // if mode = 1 they will be 0 so lin is better (void) tableVarT.create(nBinQ2, Q2min, Q2max, nBinW2, W2min, W2max, nBinT, tmin, tmax, logQ2, logW2, logT, contentVar, // all bools variance_A, transverse, massA, vmPDG, model, pset, filenameVarT.str().c_str(), priority); (void) tableVarL.create(nBinQ2, Q2min, Q2max, nBinW2, W2min, W2max, nBinT, tmin, tmax, logQ2, logW2, logT, contentVar, // all bools variance_A, longitudinal, massA, vmPDG, model, pset, filenameVarL.str().c_str(), priority); double contentLambda = false; // content lin (void) tableLambdaT.create(nBinQ2, Q2min, Q2max, nBinW2, W2min, W2max, nBinT, tmin, tmax, logQ2, logW2, logT, contentLambda, // all bools lambda_A, transverse, massA, vmPDG, model, pset, filenameLambdaT.str().c_str(), priority); (void) tableLambdaL.create(nBinQ2, Q2min, Q2max, nBinW2, W2min, W2max, nBinT, tmin, tmax, logQ2, logW2, logT, contentLambda, // all bools lambda_A, longitudinal, massA, vmPDG, model, pset, filenameLambdaL.str().c_str(), priority); cout << "\nAll tables created:" << endl; tableT.list(); tableL.list(); tableT2.list(); tableL2.list(); tableVarT.list(); tableVarL.list(); tableLambdaT.list(); tableLambdaL.list(); cout << "\nTables have " << maxbins << " bins each.\n" << endl; if (settings->useBackupFile()) { int ibin = settings->startingBinFromBackup(); tableT.setAutobackup("tableT", ibin); tableL.setAutobackup("tableL", ibin); tableT2.setAutobackup("tableT2", ibin); tableL2.setAutobackup("tableL2", ibin); tableVarT.setAutobackup("tableVarT", ibin); tableVarL.setAutobackup("tableVarL", ibin); tableLambdaT.setAutobackup("tableLambdaT", ibin); tableLambdaL.setAutobackup("tableLambdaL", ibin); cout << "Automatic backup of tables is enabled." << endl; } else cout << "Automatic backup of tables is off.\n" << endl; // // DGLAP Evolution can be speed up by using lookup tables // DglapEvolution &dglap = DglapEvolution::instance(); dglap.generateLookupTable(1000, 1000); dglap.useLookupTable(true); // // Create and initialize the amplitudes calculator // Amplitudes amps; // // Generate the the nucleon configurations // amps.generateConfigurations(); // // Print out settings // cout << endl; cout << "Tables will be generated for:" << endl; cout << "\tNucleus mass A="<dipoleModelName() << endl; cout << "\tDipole model parameter set: " << settings->dipoleModelParameterSetName() << endl; cout << "\tTable set mode: " << settings->tableSetTypeName() << endl; cout << endl; // // Calculate contents and fill tables // // Note that we fill all tables. What is written // at the end is another story. // cout << "Start filling tables" << endl; time_t tableFillStart = time(0); int nShow = (endingBin - startingBin)/100; for (int i=startingBin; i<=endingBin; i++) { if (nShow && (i%nShow == 0 || i == startingBin || i == endingBin)) cout << "processing bin " << i << endl; double Q2, W2, t; tableT.binCenter(i, Q2, W2, t); double kinematicPoint[3]={t, Q2, W2}; amps.calculate(kinematicPoint); double aT = 0; double aL = 0; double aT2 = 0; double aL2 = 0; double aVarT = 0; double aVarL = 0; // // For mode = 1 only coherent is // calculated and incoherent is therefore // assumed to be 0. // Hence total == coherent // // Recall: // coherent = A // total = A2 // incoherent = variance = A2 - A*A // aL = amps.amplitudeL(); aT = amps.amplitudeT(); tableT.fill(i, aT); tableL.fill(i, aL); if (modes != 1) { aT2 = amps.amplitudeT2(); aL2 = amps.amplitudeL2(); } else { aT2 = aT*aT; aL2 = aL*aL; } tableT2.fill(i, aT2); tableL2.fill(i, aL2); if (modes != 1) { aVarT = aT2-aT*aT; aVarL = aL2-aL*aL; } tableVarT.fill(i, aVarT); tableVarL.fill(i, aVarL); // // Calculate lambda and fill table // if (createLambdaTables) { double hplus, hminus; hplus=hminus=(W2max-W2min)/(4*1e4); //This value comes from tests of large and small W2 hminus=min(hminus, W2-W2min); hplus=min(hplus, W2max-W2); hminus -= numeric_limits::epsilon(); hplus -= numeric_limits::epsilon(); double lambda[2]={0, 0}; kinematicPoint[2]=W2+hplus; amps.calculate(kinematicPoint); double ampPlus[2]={0, 0}; ampPlus[0]=amps.amplitudeT(); ampPlus[1]=amps.amplitudeL(); kinematicPoint[2]=W2-hminus; amps.calculate(kinematicPoint); double ampMinus[2]={0, 0}; ampMinus[0]=amps.amplitudeT(); ampMinus[1]=amps.amplitudeL(); for (int j=0; j<2; j++) { // Don't calculate unless numerically viable: if (ampPlus[j]==0 || ampMinus[j]==0) { lambda[j]=0; } else { //Calculate derivate d(logA/dW2)=log(A+/A-)/(h+-h-): double derivate=log(abs(ampPlus[j]/ampMinus[j]))/(hplus+hminus); // Finally calculate lambda: double jacobian = (W2-protonMass2+Q2); lambda[j] = jacobian*derivate; } } tableLambdaT.fill(i, lambda[0]); tableLambdaL.fill(i, lambda[1]); } } time_t tableFillEnd = time(0); // // Report CPU time/cell // cout << endl; cout << "CPU time/bin: " << static_cast(tableFillEnd-tableFillStart)/(endingBin-startingBin+1) << " s" << endl; cout << "Total time: " << static_cast(tableFillEnd-tableFillStart)/60./60. << " h" << endl << endl; // // We write out all tables. // // Whoever runs the production can then decide // later what to keep and what to delete. // If the desired run mode is total_and_coherent or // coherent_and_incoherent, if this is just to improve // a coherent table in some phase space, or if one wants // to maintain redundancy, all these factor might affect // your choice. // tableT.write(); tableL.write(); tableT2.write(); tableL2.write(); tableVarT.write(); tableVarL.write(); if (createLambdaTables) { tableLambdaT.write(); tableLambdaL.write(); } cout << "All tables written" << endl; cout << "All done. Bye." << endl; return 0; } Index: trunk/examples/sartreMain.cpp =================================================================== --- trunk/examples/sartreMain.cpp (revision 370) +++ trunk/examples/sartreMain.cpp (revision 371) @@ -1,291 +1,291 @@ //============================================================================== // sartreMain.cpp // -// Copyright (C) 2010-2018 Tobias Toll and Thomas Ullrich +// Copyright (C) 2010-2019 Tobias Toll and Thomas Ullrich // // This file is part of Sartre. // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation. // This program is distributed in the hope that it will be useful, // but without any warranty; without even the implied warranty of // merchantability or fitness for a particular purpose. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // Author: Thomas Ullrich // Last update: // $Date$ // $Author$ //============================================================================== // // Example main program. Use to get started. // //============================================================================== #include #include #include "TTree.h" #include "TFile.h" #include "Sartre.h" -#include "DipoleModelParameters.h" // TMP +#include "DipoleModelParameters.h" #include "TGenPhaseSpace.h" #include "Settings.h" #include "TH1D.h" #include "TROOT.h" #include "TLorentzVector.h" #include "TClonesArray.h" #define PR(x) cout << #x << " = " << (x) << endl; using namespace std; struct rootSartreEvent { double t; double Q2; double x; double s; double y; double W; double xpom; int iEvent; int pol; // 0=transverse or 1=longitudinal int dmode; // 0=coherent, 1=Incoherent }; rootSartreEvent myRootSartreEvent; void randomlyReverseBeams(Event* ); // for UPC mode int main(int argc, char *argv[]) { // // Check command line arguments // if (! (argc == 2 || argc == 3) ) { cout << "Usage: " << argv[0] << " runcard [rootfile]" << endl; return 2; } string runcard = argv[1]; // // Create the generator and initialize it. // Once initialized you cannot (should not) change // the settings w/o re-initialing sartre. // Sartre sartre; bool ok = sartre.init(runcard); if (!ok) { cerr << "Initialization of sartre failed." << endl; return 1; } EventGeneratorSettings* settings = sartre.runSettings(); // // ROOT file // Use the one from command line unless not given // in which case the one in the runcard is used. // string rootfile; if (argc == 3) { rootfile = argv[2]; settings->setRootfile(argv[2]); } else rootfile = settings->rootfile(); // // Print out all Sartre settings // settings->list(); TFile *hfile = 0; if (rootfile.size()) { hfile = new TFile(rootfile.c_str(),"RECREATE"); cout << "ROOT file is '" << rootfile.c_str() << "'." << endl; } // // Setup ROOT tree // TLorentzVector *eIn = new TLorentzVector; TLorentzVector *pIn = new TLorentzVector; TLorentzVector *vm = new TLorentzVector; TLorentzVector *eOut = new TLorentzVector; TLorentzVector *pOut = new TLorentzVector; TLorentzVector *gamma = new TLorentzVector; TLorentzVector *vmDaughter1 = new TLorentzVector; TLorentzVector *vmDaughter2 = new TLorentzVector; TClonesArray protons("TLorentzVector"); TClonesArray neutrons("TLorentzVector"); TClonesArray remnants("TLorentzVector"); TTree tree("tree","sartre"); tree.Branch("event", &myRootSartreEvent.t, "t/D:Q2/D:x/D:s/D:y/D:W/D:xpom/D:iEvent/I:pol/I:dmode/I"); tree.Branch("eIn", "TLorentzVector", &eIn, 32000, 0); tree.Branch("pIn", "TLorentzVector", &pIn, 32000, 0); tree.Branch("vm", "TLorentzVector", &vm, 32000, 0); tree.Branch("eOut", "TLorentzVector", &eOut, 32000, 0); tree.Branch("pOut", "TLorentzVector", &pOut, 32000, 0); tree.Branch("gamma","TLorentzVector", &gamma, 32000, 0); tree.Branch("vmDaughter1", "TLorentzVector", &vmDaughter1, 32000, 0); tree.Branch("vmDaughter2", "TLorentzVector", &vmDaughter2, 32000, 0); if(settings->enableNuclearBreakup()){ tree.Branch("protons", &protons); tree.Branch("neutrons", &neutrons); tree.Branch("nuclearRemnants", &remnants); } // // Prepare event generation // TGenPhaseSpace decay; // for VM decays int daughterID = settings->userInt(); double daughterMasses[2] = {0, 0}; bool doPerformDecay = false; if (daughterID && settings->vectorMesonId() != 22) { doPerformDecay = true; daughterMasses[0] = settings->lookupPDG(daughterID)->Mass(); daughterMasses[1] = settings->lookupPDG(-daughterID)->Mass(); cout << "Will decay vector meson: "; cout << settings->lookupPDG(settings->vectorMesonId())->GetName(); cout << " -> "; cout << settings->lookupPDG(daughterID)->GetName(); cout << " "; cout << settings->lookupPDG(-daughterID)->GetName(); cout << endl; } int nPrint; if (settings->timesToShow()) nPrint = settings->numberOfEvents()/settings->timesToShow(); else nPrint = 0; unsigned long maxEvents = settings->numberOfEvents(); cout << "Generating " << maxEvents << " events." << endl << endl; // // Event generation // for (unsigned long iEvent = 0; iEvent < maxEvents; iEvent++) { // // Generate one event // Event *event = sartre.generateEvent(); if (nPrint && (iEvent+1)%nPrint == 0 && iEvent != 0) { cout << "processed " << iEvent+1 << " events" << endl; } // // If Sartre is run in UPC mode, half of the events needs to be // rotated around and axis perpendicular to z: // if(settings->UPC() and settings->A()==settings->UPCA()){ randomlyReverseBeams(event); } // // Print out (here only for the first few events) // if (iEvent < 10) event->list(); // // Fill ROOT tree // myRootSartreEvent.iEvent = event->eventNumber; myRootSartreEvent.t = event->t; myRootSartreEvent.Q2 = event->Q2; myRootSartreEvent.x = event->x; myRootSartreEvent.y = event->y; myRootSartreEvent.s = event->s; myRootSartreEvent.W = event->W; myRootSartreEvent.xpom = event->xpom; myRootSartreEvent.pol = event->polarization == transverse ? 0 : 1; myRootSartreEvent.dmode = event->diffractiveMode == coherent ? 0 : 1; eIn = &event->particles[0].p; pIn = &event->particles[1].p; eOut = &event->particles[2].p; pOut = &event->particles[6].p; vm = &event->particles[4].p; gamma = &event->particles[3].p; //If the event is incoherent, and nuclear breakup is enabled, fill the remnants to the tree if(settings->enableNuclearBreakup() and event->diffractiveMode == incoherent){ protons.Clear(); neutrons.Clear(); remnants.Clear(); for(unsigned int iParticle=7; iParticle < event->particles.size(); iParticle++){ if(event->particles[iParticle].status == 1) { // Final-state particle const Particle& particle = event->particles[iParticle]; switch (abs(particle.pdgId)) { case 2212: // (Anti-)proton new(protons[protons.GetEntries()]) TLorentzVector(particle.p); break; case 2112: // (Anti-)neutron new(neutrons[neutrons.GetEntries()]) TLorentzVector(particle.p); break; default: // Any other remnant new(remnants[remnants.GetEntries()]) TLorentzVector(particle.p); break; } // switch } // if } // for } // if // // Decay the vector meson and fill the decay roducts in the tree: // if(doPerformDecay) { if( decay.SetDecay(*vm, 2, daughterMasses) ){ double weight = decay.Generate(); // weight is always 1 here if ( (weight-1) > FLT_EPSILON) { cout << "sartreMain: Warning weight != 1, weight = " << weight << endl; } vmDaughter1 = decay.GetDecay(0); vmDaughter2 = decay.GetDecay(1); } else { cout << "sartreMain: Warning: Kinematics of Vector Meson does not allow decay!" << endl; } } tree.Fill(); } cout << "All events processed\n" << endl; // // That's it, finish up // double totalCS=sartre.totalCrossSection(); TH1D* histoForCSandNumberOfEvents = new TH1D("histoForCSandNumberOfEvents", "Cross-section and Number of Events", 2, 0., 1.); histoForCSandNumberOfEvents->SetBinContent(1, totalCS); histoForCSandNumberOfEvents->SetBinContent(2, maxEvents); double runTime = sartre.runTime(); hfile->Write(); cout << rootfile.c_str() << " written." << endl; cout << "Total cross-section: " << totalCS << " nb" << endl; sartre.listStatus(); cout << "CPU Time/event: " << 1000*runTime/maxEvents << " msec/evt" << endl; return 0; } // UPC only void randomlyReverseBeams(Event* myEvent) { TRandom3 *random = EventGeneratorSettings::randomGenerator(); if(random->Uniform(1) > 0.5){ for(unsigned int i=0; iparticles.size(); i++) myEvent->particles.at(i).p.RotateX(M_PI); } } Index: trunk/examples/convergenceTestRuncard.txt =================================================================== --- trunk/examples/convergenceTestRuncard.txt (revision 370) +++ trunk/examples/convergenceTestRuncard.txt (revision 371) @@ -1,136 +1,136 @@ //============================================================================== // tableGeneratorRuncard.txt // -// Copyright (C) 2010-2016 Tobias Toll and Thomas Ullrich +// Copyright (C) 2010-2019 Tobias Toll and Thomas Ullrich // // This file is part of Sartre. // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation. // This program is distributed in the hope that it will be useful, // but without any warranty; without even the implied warranty of // merchantability or fitness for a particular purpose. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // Author: Tobias Toll // Last update: // $Date: 2017-03-01 01:36:16 +0530 (Wed, 01 Mar 2017) $ // $Author: ullrich $ //============================================================================== // // Example Runcard for Sartre Table Generator. // // Comments start with a # or # // // Name and value are separated by a "=": name = value // (alternatively ":" can be used as well) //============================================================================== # # Nucleus number # A = 2 # # Which moments of the amplitude to calculate: # 0 analytical, averaged over configurations # 1 only, analytical # 2 , and both averaged over configurations # modesToCalculate = 2 # # Rootfile This is a prefix table type (T and L, or T2 and L2) and ".root" will be appended # numberOfConfigurations = 100 rootfile = test_100.root # # Model parameters # vectorMesonId = 443 dipoleModel = bSat dipoleModelParameterSet = KMW # # Table Set Type (experts only) # tableSetType = total_and_coherent #tableSetType = coherent_and_incoherent # # Developer only # Only takes affect when dipoleModelParameterSet = CUSTOM # All parameters must be given. # # For bSat and bNonSat (8 parameters): # m_u m_d m_s m_c BG mu02 lambdaG Ag # For bCGC (10 parameters): # m_u m_d m_s m_c dkappa dN0 dx0 dlambda dgammas dBcgc # #dipoleModelCustomParameters = 0.14 0.14 0.14 1.27 4. 1.51 0.058 2.308 # Path for the b-dependence lookup table for bSat. Not used with bCGC. bSatLookupPath = /home/tollto/sartreSVN/sartre/bSatLookupTables/ # # Kinematic range # # EIC limits: # Say we aim s = 20000 (30000 for pp) # That implies: # Q2 = 0.0001 - 20000 (or with x<1e-2, Q2<200) # t = -3 - 0 # W2 = 1 - 20000 (W = 1-141) # Q2min = 0.01 Q2max = 20. Wmin = 10 Wmax = 380 tmin = -.5 tmax = -.0 #H1 DVCS: #Q2min = 6.5 #Q2max = 80. #Wmin = 30 #Wmax = 140 #tmin = -1. #tmax = -.0 # # Number of bins in the tables: # # # ZEUS test, bin density for # 40x40x40: 64000/(99.85*190*1)=3.37 bins/GeV^5 # # Or in different directions: # Q2: 40/100=0.4 bins/GeV^2 # W: 40/190=0.21 bins/GeV # t: 40/1= 40 bins/GeV^2 # Q2bins = 20 W2bins = 20 tbins = 50 # # If a run fails, use the backup and continue: # If in doubt use the tableInspector to make sure the rest # of the runcard is as it should be. # useBackupFile = false startingBinFromBackup=2 # # If the table you are making should take presendence # over previous tables, make it with a higher priority # priority = 0 Index: trunk/examples/tableGeneratorRuncard.txt =================================================================== --- trunk/examples/tableGeneratorRuncard.txt (revision 370) +++ trunk/examples/tableGeneratorRuncard.txt (revision 371) @@ -1,135 +1,135 @@ //============================================================================== // tableGeneratorRuncard.txt // -// Copyright (C) 2010-2016 Tobias Toll and Thomas Ullrich +// Copyright (C) 2010-2019 Tobias Toll and Thomas Ullrich // // This file is part of Sartre. // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation. // This program is distributed in the hope that it will be useful, // but without any warranty; without even the implied warranty of // merchantability or fitness for a particular purpose. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // Author: Tobias Toll // Last update: // $Date$ // $Author$ //============================================================================== // // Example Runcard for Sartre Table Generator. // // Comments start with a # or # // // Name and value are separated by a "=": name = value // (alternatively ":" can be used as well) //============================================================================== # # Nucleus number # A = 197 # # Which moments of the amplitude to calculate: # 0 analytical, averaged over configurations # 1 only, analytical # 2 , and both averaged over configurations # modesToCalculate = 2 # # Rootfile This is a prefix table type (T and L, or T2 and L2) and ".root" will be appended # rootfile = bintests # # Model parameters # vectorMesonId = 443 dipoleModel = bSat dipoleModelParameterSet = KMW # # Table Set Type (experts only) # tableSetType = total_and_coherent #tableSetType = coherent_and_incoherent # # Developer only # Only takes affect when dipoleModelParameterSet = CUSTOM # All parameters must be given. # # For bSat and bNonSat (8 parameters): # m_u m_d m_s m_c BG mu02 lambdaG Ag # For bCGC (10 parameters): # m_u m_d m_s m_c dkappa dN0 dx0 dlambda dgammas dBcgc # #dipoleModelCustomParameters = 0.14 0.14 0.14 1.27 4. 1.51 0.058 2.308 # Path for the b-dependence lookup table for bSat. Not used with bCGC. bSatLookupPath = ./ numberOfConfigurations = 100 # # Kinematic range # # EIC limits: # Say we aim s = 20000 (30000 for pp) # That implies: # Q2 = 0.0001 - 20000 (or with x<1e-2, Q2<200) # t = -3 - 0 # W2 = 1 - 20000 (W = 1-141) # Q2min = 0.01 Q2max = 20. Wmin = 10 Wmax = 380 tmin = -.5 tmax = -.0 #H1 DVCS: #Q2min = 6.5 #Q2max = 80. #Wmin = 30 #Wmax = 140 #tmin = -1. #tmax = -.0 # # Number of bins in the tables: # # # ZEUS test, bin density for # 40x40x40: 64000/(99.85*190*1)=3.37 bins/GeV^5 # # Or in different directions: # Q2: 40/100=0.4 bins/GeV^2 # W: 40/190=0.21 bins/GeV # t: 40/1= 40 bins/GeV^2 # Q2bins = 20 W2bins = 20 tbins = 50 # # If a run fails, use the backup and continue: # If in doubt use the tableInspector to make sure the rest # of the runcard is as it should be. # useBackupFile = false startingBinFromBackup=2 # # If the table you are making should take presendence # over previous tables, make it with a higher priority # priority = 0 Index: trunk/examples/tableGeneratorUPCMain.cpp =================================================================== --- trunk/examples/tableGeneratorUPCMain.cpp (revision 370) +++ trunk/examples/tableGeneratorUPCMain.cpp (revision 371) @@ -1,417 +1,417 @@ //============================================================================== // tableGeneratorMain.cpp // -// Copyright (C) 2010-2018 Tobias Toll and Thomas Ullrich +// Copyright (C) 2010-2019 Tobias Toll and Thomas Ullrich // // This file is part of Sartre. // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation. // This program is distributed in the hope that it will be useful, // but without any warranty; without even the implied warranty of // merchantability or fitness for a particular purpose. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // Author: Thomas Ullrich // Last update: // $Date$ // $Author$ //============================================================================== // // Main program to create amplitude lookup tables. // [Developer only] // // Usage: // tableGeneratorMain runcard startBin endBin // // Bins run from 0 to nbin-1. // Loop fill all bins from startBIn to endBin (including endBin). // If endBin exceeds the size of the table it set to the nbin-1. // //============================================================================== #include #include #include #include #include #include #include "Amplitudes.h" #include "TROOT.h" #include "TH1D.h" #include "TFile.h" #include "Nucleus.h" #include "Constants.h" #include "Table.h" #include "TableGeneratorSettings.h" #include "Enumerations.h" #include "DglapEvolution.h" #include "Version.h" #define PR(x) cout << #x << " = " << (x) << endl; using namespace std; int main(int argc, char *argv[]) { // // Print header // time_t theStartTime = time(0); string ctstr(ctime(&theStartTime)); ctstr.erase(ctstr.size()-1, 1); cout << "/========================================================================\\" << endl; cout << "| |" << endl; cout << "| Sartre, Version " << setw(54) << left << VERSION << right << '|' << endl; cout << "| |" << endl; cout << "| An event generator for exclusive diffractive vector meson production |" << endl; cout << "| in ep and eA collisions based on the dipole model. |" << endl; cout << "| |" << endl; cout << "| Copyright (C) 2010-2018 Tobias Toll and Thomas Ullrich |" << endl; cout << "| |" << endl; cout << "| This program is free software: you can redistribute it and/or modify |" << endl; cout << "| it under the terms of the GNU General Public License as published by |" << endl; cout << "| the Free Software Foundation, either version 3 of the License, or |" << endl; cout << "| any later version. |" << endl; cout << "| |" << endl; cout << "| Code compiled on " << setw(12) << left << __DATE__; cout << setw(41) << left << __TIME__ << right << '|' << endl; cout << "| Run started at " << setw(55) << left << ctstr.c_str() << right << '|' << endl; cout << "| |" << endl; cout << "| -------------------------------------------------------------------- |" << endl; cout << "| |" << endl; cout << "| Sartre Table Generator (Experts only) |" << endl; cout << "| |" << endl; cout << "\\========================================================================/" << endl; TH1::AddDirectory(false); // to explicitly delete all new histograms by hand TableGeneratorSettings* settings = TableGeneratorSettings::instance(); // // Check arguments // char* runcard; if (argc != 4) { cout << "Usage: tableGeneratorMain runcard startBin endBin" << endl; return 2; } else { runcard = argv[1]; settings->setStartBin(atoi(argv[2])); settings->setEndBin(atoi(argv[3])); } cout << "Reading settings from runcard." << endl; settings->readSettingsFromFile(runcard); settings->consolidateSettings(); int nBinT = settings->tbins(); int nBinX = settings->xbins(); double tmin = settings->tmin(); double tmax = settings->tmax(); double xmin = settings->xmin(); double xmax = settings->xmax(); unsigned int massA = settings->A(); int vmPDG = settings->vectorMesonId(); DipoleModelType model = settings->dipoleModelType(); DipoleModelParameterSet pset = settings->dipoleModelParameterSet(); int startingBin = settings->startBin(); int endingBin = settings->endBin(); int modes = settings->modesToCalculate(); unsigned char priority = settings->priority(); settings->list(); // // Check if lambda tables can be calculated // bool createLambdaTables = true; if (massA == 1 && modes != 1 && settings->numberOfConfigurations() == 1) { cout << "\nLambda tables will be generated." << endl; } else { cout << "\nLambda tables will not be generated. Requires A = 1, mode != 1, and 1 configuration only." << endl; createLambdaTables = false; } // // Check bins // // Table's bin indices run from 0 ... nbins-1 // int maxbins = nBinX*nBinT; if (endingBin >= maxbins) { cout << "Warning, given end bin (" << endingBin << ") exceeds the size of the table." << endl; cout << " set to maximum value (" << maxbins-1 << ") now." << endl; endingBin = maxbins-1; } // // Define all tables. Depending on tableset type some // will not be written but we define them all anyway. // Table tableT; Table tableT2; Table tableVarT; Table tableLambdaRealT; Table tableLambdaSkewT; bool logX=true, logT=false, logC=true; // // Set filenames for the tables. // Be as desciptive as possible. Helps when mass producing tables. // // We create all tables and decide later what // gets written and what not. // string rootfile=settings->rootfile(); rootfile += "_"; rootfile += settings->dipoleModelName(); rootfile += "_"; rootfile += settings->dipoleModelParameterSetName(); rootfile += "_A"; rootfile += to_string(settings->A()); rootfile += "_UPC"; ostringstream filenameT, filenameT2, filenameVarT, filenameLambdaTReal, filenameLambdaTSkew; filenameT.str(""); filenameT << rootfile << "_" << settings->vectorMesonId() << "_bin" << startingBin << "-" << endingBin <<"_T.root"; filenameT2.str(""); filenameT2 << rootfile << "_" << settings->vectorMesonId() << "_bin" << startingBin << "-" << endingBin << "_T2.root"; filenameVarT.str(""); filenameVarT << rootfile << "_" << settings->vectorMesonId() << "_bin" << startingBin << "-" << endingBin << "_VarT.root"; filenameLambdaTReal.str(""); filenameLambdaTReal << rootfile << "_" << settings->vectorMesonId() << "_bin" << startingBin << "-" << endingBin << "_LambdaTReal.root"; filenameLambdaTSkew.str(""); filenameLambdaTSkew << rootfile << "_" << settings->vectorMesonId() << "_bin" << startingBin << "-" << endingBin << "_LambdaTSkew.root"; (void) tableT.create(nBinX, xmin, xmax, nBinT, tmin, tmax, logX, logT, logC, // all bools mean_A, transverse, massA, vmPDG, model, pset, filenameT.str().c_str(), priority); (void) tableT2.create(nBinX, xmin, xmax, nBinT, tmin, tmax, logX, logT, logC, // all bools mean_A2, transverse, massA, vmPDG, model, pset, filenameT2.str().c_str(), priority); bool contentVar = modes == 1 ? false : logC; // if mode = 1 they will be 0 so lin is better (void) tableVarT.create(nBinX, xmin, xmax, nBinT, tmin, tmax, logX, logT, contentVar, // all bools variance_A, transverse, massA, vmPDG, model, pset, filenameVarT.str().c_str(), priority); double contentLambda = false; // content lin if(createLambdaTables){ (void) tableLambdaRealT.create(nBinX, xmin, xmax, nBinT, tmin, tmax, logX, logT, contentLambda, // all bools lambda_A, transverse, massA, vmPDG, model, pset, filenameLambdaTReal.str().c_str(), priority); (void) tableLambdaSkewT.create(nBinX, xmin, xmax, nBinT, tmin, tmax, logX, logT, contentLambda, // all bools lambda_skew, transverse, massA, vmPDG, model, pset, filenameLambdaTSkew.str().c_str(), priority); } cout << "\nAll tables created:" << endl; tableT.list(); tableT2.list(); tableVarT.list(); if(createLambdaTables){ tableLambdaRealT.list(); tableLambdaSkewT.list(); } cout << "\nTables have " << maxbins << " bins each.\n" << endl; if (settings->useBackupFile()) { int ibin = settings->startingBinFromBackup(); tableT.setAutobackup("tableT", ibin); tableT2.setAutobackup("tableT2", ibin); tableVarT.setAutobackup("tableVarT", ibin); tableLambdaRealT.setAutobackup("tableLambdaRealT", ibin); tableLambdaSkewT.setAutobackup("tableLambdaSkewT", ibin); cout << "Automatic backup of tables is enabled." << endl; } else cout << "Automatic backup of tables is off.\n" << endl; // // DGLAP Evolution can be speed up by using lookup tables // DglapEvolution &dglap = DglapEvolution::instance(); // dglap.generateLookupTable(100, 100); dglap.generateLookupTable(1000, 1000); dglap.useLookupTable(true); // // Create and initialize the amplitudes calculator // Amplitudes amps; // // Generate the the nucleon configurations // amps.generateConfigurations(); // // Print out settings // cout << endl; cout << "Tables will be generated for:" << endl; cout << "\tNucleus mass A="<dipoleModelName() << endl; cout << "\tDipole model parameter set: " << settings->dipoleModelParameterSetName() << endl; cout << "\tTable set mode: " << settings->tableSetTypeName() << endl; cout << endl; // // Calculate contents and fill tables // // Note that we fill all tables. What is written // at the end is another story. // cout << "Start filling tables" << endl; time_t tableFillStart = time(0); int nShow = (endingBin - startingBin)/100; if(nShow==0) nShow=1; for (int i=startingBin; i<=endingBin; i++) { if (i%nShow == 0 || i == startingBin || i == endingBin) cout << "processing bin " << i << endl; double xpom, t; tableT.binCenter(i, xpom, t); double kinematicPoint[2]={t, xpom}; amps.calculate(kinematicPoint); double aT = 0; double aT2 = 0; double aVarT = 0; // // For mode = 1 only coherent is // calculated and incoherent is therefore // assumed to be 0. // Hence total == coherent // // coherent = A // total = A2 // incoherent = variance = A2 - A*A // aT = amps.amplitudeT(); tableT.fill(i, aT); if (modes != 1) { aT2 = amps.amplitudeT2(); } else { aT2 = aT*aT; } tableT2.fill(i, aT2); aVarT = aT2-aT*aT; tableVarT.fill(i, aVarT); // // Calculate lambda and fill table lambda=dlog(A)/dlog(1/x) // if (createLambdaTables) { double hplus, hminus; hplus=hminus=xpom*1e-4; //This value needs to be tested double lambdaReal=0; double lambdaSkew=0; kinematicPoint[1]=xpom+hplus; amps.calculate(kinematicPoint); double ampPlus=amps.amplitudeT(); double ampSkewPlus=amps.amplitudeTForSkewednessCorrection(); kinematicPoint[1]=xpom-hminus; amps.calculate(kinematicPoint); double ampMinus=amps.amplitudeT(); double ampSkewMinus=amps.amplitudeTForSkewednessCorrection(); // Don't calculate unless numerically viable: if (ampPlus==0 || ampMinus==0) { lambdaReal=0; } else { //Calculate derivate d(logA/dxpom)=log(A+/A-)/(h+-h-): double derivate=log(abs(ampPlus/ampMinus))/(hplus+hminus); // Finally calculate lambdas: double jacobian = -xpom; lambdaReal = jacobian*derivate; } // Don't calculate unless numerically viable: if (ampSkewPlus==0 || ampSkewMinus==0) { lambdaSkew=0; } else { //Calculate derivate d(logA/dxpom)=log(A+/A-)/(h+-h-): double derivate=log(abs(ampSkewPlus/ampSkewMinus))/(hplus+hminus); // Finally calculate lambdas: double jacobian = -xpom; lambdaSkew = jacobian*derivate; } tableLambdaRealT.fill(i, lambdaReal); tableLambdaSkewT.fill(i, lambdaSkew); } } time_t tableFillEnd = time(0); // // Report CPU time/cell // cout << endl; cout << "CPU time/bin: " << static_cast(tableFillEnd-tableFillStart)/(endingBin-startingBin+1) << " s" << endl; cout << "Total time: " << static_cast(tableFillEnd-tableFillStart)/60./60. << " h" << endl << endl; // // We write out all tables. // // Whoever runs the production can then decide // later what to keep and what to delete. // If the desired run mode is total_and_coherent or // coherent_and_incoherent, if this is just to improve // a coherent table in some phase space, or if one wants // to maintain redundancy, all these factor might affect // your choice. // tableT.write(); tableT2.write(); tableVarT.write(); if (createLambdaTables) { tableLambdaRealT.write(); tableLambdaSkewT.write(); } cout << "All tables written" << endl; cout << "All done. Bye." << endl; return 0; } Index: trunk/examples/sartreRuncard.txt =================================================================== --- trunk/examples/sartreRuncard.txt (revision 370) +++ trunk/examples/sartreRuncard.txt (revision 371) @@ -1,124 +1,140 @@ //============================================================================== // sartreRuncard.txt // -// Copyright (C) 2010-2016 Tobias Toll and Thomas Ullrich +// Copyright (C) 2010-2019 Tobias Toll and Thomas Ullrich // // This file is part of Sartre. // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation. // This program is distributed in the hope that it will be useful, // but without any warranty; without even the implied warranty of // merchantability or fitness for a particular purpose. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // Author: Thomas Ullrich // Last update: // $Date$ // $Author$ //============================================================================== // // Example Runcard for Sartre Event Generator. // // Comments start with a # or // // // Name and value are separated by a "=": name = value // (alternatively ":" can be used as well) //============================================================================== # # Define beams # eBeamEnergy = 20 hBeamEnergy = 100 -A = 197 +A = 1 # # UPC settings, to run in UPC mode set UPC=true and UPCA into the photon emitting species # -#UPC=false +UPC=false #UPCA=197 #xpomMin = 1e-5 #xpomMax = 1 # # Number of events and printout frequency # numberOfEvents = 10000 timesToShow = 20 # # Set verbosity # verbose = true verboseLevel = 2 - # # Rootfile # rootfile = example.root # # Dipole model # +# dipoleModel: can be bSat or bNonSat +# dipoleModelParameterSet: +# KMW: older set but most complete +# HMPZ: new parameters with still a limited set +# of tables. For eA use KMW. +# dipoleModel = bSat -dipoleModelParameterSet = KMW +dipoleModelParameterSet = HMPZ # -# Model parameters -# -# vectorMesonID: 22, 113, 333, 443 +# Vector mesons to create. +# Note that not all vector mesons +# have tables for each dipole model and +# available A. +# +# vectorMesonID: +# 22 DVCS +# 113 rho +# 333 phi +# 443 J/psi +# 553 Upsilon # vectorMesonId = 443 # # Table Set Type (experts only) # tableSetType = total_and_coherent #tableSetType = coherent_and_incoherent # -# User variable used for vector meson decays +# User variable +# If you use the provided sartreMain.cpp this is +# used for vector meson decays # PDG: pi+ = 211, K+ = 321, e- = 11, mu- = 13 +# with BR=100% # userInt = 11 # # Kinematic range min > max means no limits (given by table range) # Q2min = 1000000 Q2max = 0 Wmin = 1000000 Wmax = 0 # # Corrections # correctForRealAmplitude = true correctSkewedness = true -# maxLambdaUsedInCorrections = 0.65 +maxLambdaUsedInCorrections = 0.4 # # Misc # enableNuclearBreakup = false maxNuclearExcitationEnergy = 3.0 # # Random generator seed (if not given current time is used) # #seed = 2011987 # # User parameters # # userDouble = 0. # userString = "Hello World!" # userInt = 0 # # Expert flags # # applyPhotonFlux = true Index: trunk/examples/nucleusAnimation.cpp =================================================================== --- trunk/examples/nucleusAnimation.cpp (revision 370) +++ trunk/examples/nucleusAnimation.cpp (revision 371) @@ -1,300 +1,300 @@ //============================================================================== // nucleusAnimation.cpp // -// Copyright (C) 2010-2013 Tobias Toll and Thomas Ullrich +// Copyright (C) 2010-2019 Tobias Toll and Thomas Ullrich // // This file is part of Sartre. // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation. // This program is distributed in the hope that it will be useful, // but without any warranty; without even the implied warranty of // merchantability or fitness for a particular purpose. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // Author: Tobias Toll // Last update: // $Date$ // $Author$ //============================================================================== #include #include #include #include "TVector3.h" #include #include #include #include "Nucleus.h" #include "TableGeneratorNucleus.h" #include #define PR(x) cout << #x << " = " << (x) << endl; using namespace std; // actual vector representing the camera's direction float lx=0.0f,lz=-1.0f; // XZ position of the camera float x=0.0f, y=40.0f, z=5.0f; // the key states. These variables will be zero // when no key is being presses float deltalr=0.0f, deltaud=0.0f; bool newNucleus=0; float deltazoom=0.0f; TableGeneratorNucleus* myNucleus;// = new TableGeneratorNucleus; void changeSize(int w, int h) { // Prevent a divide by zero, when window is too short // (you cant make a window of zero width). if (h == 0) h = 1; float ratio = w * 1.0 / h; // Use the Projection Matrix glMatrixMode(GL_PROJECTION); // Reset Matrix glLoadIdentity(); // Set the viewport to be the entire window glViewport(0, 0, w, h); // Set the correct perspective. gluPerspective(45.0f, ratio, 0.1f, 100.0f); // Get Back to the Modelview glMatrixMode(GL_MODELVIEW); } void drawNucleon() { // glColor3f(1.0f, .0f, .0f); glTranslatef(0.0f ,0.75f, 0.0f); glutSolidSphere(0.7f,20,20); } void computeDir(){ double sud=sin(deltaud), cud=cos(deltaud), slr=sin(deltalr), clr=cos(deltalr); double zoom=1.+deltazoom; // theta=lr, phi=ud, psi=0; x= (clr*x + sud*slr*y + cud*slr*z)*zoom; y= ( cud*y + (-sud)*z)*zoom; z=(-slr*x + sud*clr*y + cud*clr*z)*zoom; } // Position the light at the origin. const GLfloat light_pos[] = { 0.0, 50.0, 0.0, 1.0 }; // Attenuation factors for light. GLfloat const_att = 1.0; void renderScene(void) { if (deltalr or deltaud or deltazoom) computeDir(); if( newNucleus ) while(!myNucleus->generate()){}; // Clear Color and Depth Buffers glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Reset transformations glLoadIdentity(); // Set the camera gluLookAt(x, y, z, // camera position 0., 0., 0., //camera focus 0.0f, 1., 0.0f); //Vector pointing up for(unsigned int i=0; iconfiguration.size(); i++){ TVector3 pos=myNucleus->configuration.at(i).position(); glPushMatrix(); glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, const_att); glLightfv(GL_LIGHT0, GL_POSITION, light_pos); glTranslatef(pos.X(),pos.Y(),pos.Z()); drawNucleon(); glPopMatrix(); } glutSwapBuffers(); } void idle(void){ glutPostRedisplay(); } void pressKey(int key, int xx, int yy) { xx=yy; switch (key) { case GLUT_KEY_LEFT : deltalr = -0.01; break; case GLUT_KEY_RIGHT : deltalr = 0.01; break; case GLUT_KEY_UP : deltaud = 0.01; break; case GLUT_KEY_DOWN : deltaud = -0.01; break; case 27 : case 81 : case 113: exit(0); break; case 110: case 78: newNucleus=true; break; case 122: case 90: deltazoom = 0.01; break; case 65: case 97: deltazoom = -0.01; break; } } void releaseKey(int key, int x, int y) { x=y; switch (key) { case GLUT_KEY_LEFT : case GLUT_KEY_RIGHT : deltalr = 0.0; break; case GLUT_KEY_UP : case GLUT_KEY_DOWN : deltaud = 0; break; case 110: case 78: newNucleus=false; break; case 122: case 90: case 65: case 97: deltazoom = 0; break; } } void exitFunction(){ delete myNucleus; } void usage(const char* prog) { cout << "Usage: " << prog << "[-w] A" << endl; cout << " Valid A are: 208, 197, 110, 63, 40, 27, 16, 1" << endl; cout << " -w White instead of black background" << endl; } int main(int argc, char **argv) { atexit(exitFunction); if (argc < 2) { usage(argv[0]); return 2; } bool hasWhiteBackground = false; int ch; while ((ch = getopt(argc, argv, "w")) != -1) { switch (ch) { case 'w': hasWhiteBackground = true; break; default: usage(argv[0]); return 2; break; } } if (optind == argc) { usage(argv[0]); return 2; } string str(argv[optind]); for (unsigned int i=0; igenerate()){}; cout<<"List of Commands:"<. // // Author: Tobias Toll // Last update: // $Date: 2017-02-28 15:06:16 -0500 (Tue, 28 Feb 2017) $ // $Author: ullrich $ //============================================================================== // // Example Runcard for Sartre Table Generator. // // Comments start with a # or # // // Name and value are separated by a "=": name = value // (alternatively ":" can be used as well) //============================================================================== # # Are tables for ultra-peripheral collisions # # UPC=true # Nucleus number # A = 1 # # Which moments of the amplitude to calculate: # 0 analytical, averaged over configurations # 1 only, analytical # 2 , and both averaged over configurations # modesToCalculate = 0 # # Rootfile This is a prefix table type (T and L, or T2 and L2) and ".root" will be appended # rootfile = test # # Model parameters # vectorMesonId = 443 dipoleModel = bSat dipoleModelParameterSet = HMPZ # # Table Set Type (experts only) # #tableSetType = total_and_coherent tableSetType = coherent_and_incoherent # # Developer only # Only takes affect when dipoleModelParameterSet = CUSTOM # All parameters must be given. # # For bSat and bNonSat (8 parameters): # m_u m_d m_s m_c BG mu02 lambdaG Ag # For bCGC (10 parameters): # m_u m_d m_s m_c dkappa dN0 dx0 dlambda dgammas dBcgc # #dipoleModelCustomParameters = 0.14 0.14 0.14 1.27 4. 1.51 0.058 2.308 # Path for the b-dependence lookup table for bSat. Not used with bCGC. bSatLookupPath = /home/tollto/SNU/sartre-inclusive165/bSatLookupTables/GaussBg4/ numberOfConfigurations = 1 # # Kinematic range # xmin = 1e-8 xmax = 2e-2 tmin = -.5 tmax = -.0 # # Number of bins in the tables: # # xbins = 5 tbins = 5 # # If a run fails, use the backup and continue: # If in doubt use the tableInspector to make sure the rest # of the runcard is as it should be. # useBackupFile = false startingBinFromBackup=2 # # If the table you are making should take presendence # over previous tables, make it with a higher priority # priority = 8 Index: trunk/examples/sartreUPCRuncard.txt =================================================================== --- trunk/examples/sartreUPCRuncard.txt (revision 370) +++ trunk/examples/sartreUPCRuncard.txt (revision 371) @@ -1,124 +1,124 @@ //============================================================================== // sartreRuncard.txt // -// Copyright (C) 2010-2018 Tobias Toll and Thomas Ullrich +// Copyright (C) 2010-2019 Tobias Toll and Thomas Ullrich // // This file is part of Sartre. // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation. // This program is distributed in the hope that it will be useful, // but without any warranty; without even the implied warranty of // merchantability or fitness for a particular purpose. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // Author: Thomas Ullrich // Last update: // $Date: 2018-06-20 16:34:51 -0400 (Wed, 20 Jun 2018) $ // $Author: ullrich $ //============================================================================== // // Example Runcard for Sartre Event Generator running in UPC mode // // Comments start with a # or // // // Name and value are separated by a "=": name = value // (alternatively ":" can be used as well) //============================================================================== # # Define beams # # LHC UPC PbPb mode sqrt(s)=2.76 TeV eBeamEnergy = 1380 hBeamEnergy = 1380 A = 208 # Examples: # LHC UPC pPb mode #eBeamEnergy = 1575 #hBeamEnergy = 4000 #A = 1 # # UPC settings, to run in UPC mode set UPC=true and UPCA into the photon emitting species # UPC=true UPCA=208 xpomMin = 1 // min > max means no user limits xpomMax = 0 # # Number of events and printout frequency # numberOfEvents = 10000 timesToShow = 20 # # Set verbosity # verbose = true verboseLevel = 2 # # Rootfile # rootfile = example.root # # Dipole model # dipoleModel = bSat dipoleModelParameterSet = HMPZ # # Model parameters # # vectorMesonID: 22, 113, 333, 443 # vectorMesonId = 443 # # Table Set Type (experts only) # tableSetType = coherent_and_incoherent # # User variable used for vector meson decays # PDG: pi+ = 211, K+ = 321, e- = 11, mu- = 13 # userInt = 11 # # Corrections # correctForRealAmplitude = true correctSkewedness = true maxLambdaUsedInCorrections = 0.1 # # Misc # enableNuclearBreakup = false maxNuclearExcitationEnergy = 3.0 # # Random generator seed (if not given current time is used) # seed = 2011987 # # User parameters # # userDouble = 0. # userString = "Hello World!" # userInt = 0 # # Expert flags # # applyPhotonFlux = true Index: trunk/examples/heraCompare.cpp =================================================================== --- trunk/examples/heraCompare.cpp (revision 370) +++ trunk/examples/heraCompare.cpp (revision 371) @@ -1,1702 +1,1702 @@ //============================================================================== // heraCompare.cpp // -// Copyright (C) 2010-2018 Tobias Toll and Thomas Ullrich +// Copyright (C) 2010-2019 Tobias Toll and Thomas Ullrich // // This file is part of Sartre. // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation. // This program is distributed in the hope that it will be useful, // but without any warranty; without even the implied warranty of // merchantability or fitness for a particular purpose. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // Author: Thomas Ullrich and Tobias Toll // Last update: // $Date$ // $Author$ //============================================================================== // // Main program to compare Sartre with HERA data (J/psi and DVCS) // Usage: // heraCompare rootfile jpsi|phi|dvcs // // Output are graphs with HERA and Sartre data to compare. //============================================================================== #include #include #include #include #include "Sartre.h" #include "TFile.h" #include "TGraphAsymmErrors.h" #include "TGraphErrors.h" #include "Constants.h" using namespace std; #define PR(x) cout << #x << " = " << (x) << endl; double betaMin=0.7; double xpomMax=1e-2; double maxLam=0.35; DipoleModelType theDipoleModelType = bNonSat; DipoleModelParameterSet theDipoleModelParameterSet = HMPZ; TableSetType theTableSetType = total_and_coherent; // or coherent_and_incoherent; struct HeraDataPoint { double Q2; double W; double t; double tmin; double tmax; double Q2min; double Q2max; double Wmin; double Wmax; double xsection; double xsection_stat; double xsection_sys; double xsection_sys_up; double xsection_sys_lo; HeraDataPoint(); }; HeraDataPoint::HeraDataPoint() { t=-1; tmin=-1; tmax=-1; Q2=-1; Q2min=-1; Q2max=-1; W=-1; Wmin=-1; Wmax=-1; xsection=-1; xsection_stat=-1; xsection_sys=-1; xsection_sys_up=-1; xsection_sys_lo=-1; } void loadJpsiData(vector&); void loadPhiData(vector&); void loadDVCSData(vector&, vector&); void compareJpsi(string&); void compareDVCS(string&); void comparePhi(string&); double chi2_global = 0; int ndof_global = 0; int main(int argc, char** argv) { // // Check command line arguments // if (argc != 3) { cout << "Usage: " << argv[0] << " rootfile jpsi|phi|dvcs|all" << endl; return 2; } // // Run the requested comparison(s) // string rootfile = argv[1]; string what = argv[2]; if (what.find("jpsi") != string::npos) compareJpsi(rootfile); else if (what.find("dvcs") != string::npos) compareDVCS(rootfile); else if (what.find("phi") != string::npos) comparePhi(rootfile); else if (what.find("all") != string::npos){ compareDVCS(rootfile); comparePhi(rootfile); compareJpsi(rootfile); cout << "-------------------------------------------------" << endl; cout << "Global Comparison HERA-Sartre:" << endl; cout << "chi2 = " << chi2_global << endl; cout << "ndof = " << ndof_global << endl; cout << "chi2/ndof = " << chi2_global/ndof_global << endl; cout << "-------------------------------------------------" << endl; } else { cout << "Error: '" << what.c_str() << "' no such probe to compare." << endl; return 2; } return 0; } void comparePhi(string& rootfile) { // // PHI HERA/ZEUS data // double heraProtonEnergy = 920; double heraElectronEnergy = 27.6; vector zeusDataPhi_table1; loadPhiData(zeusDataPhi_table1); vector graphVec; vector sgraphVec; vector sgraphName; vector graphName; // Table 1 TGraphErrors *graph1a = new TGraphErrors(7); graph1a->SetTitle("Q2=2.4"); graphVec.push_back(graph1a); graphName.push_back("graph1a"); TGraphErrors *graph1b = new TGraphErrors(6); graph1b->SetTitle("Q2=3.8"); graphVec.push_back(graph1b); graphName.push_back("graph1b"); TGraphErrors *graph1c = new TGraphErrors(6); graph1c->SetTitle("Q2=6.5"); graphVec.push_back(graph1c); graphName.push_back("graph1c"); TGraphErrors *graph1d = new TGraphErrors(6); graph1d->SetTitle("Q2=13.0"); graphVec.push_back(graph1d); graphName.push_back("graph1d"); TGraphErrors *sgraph1a = new TGraphErrors(7); sgraph1a->SetTitle("Q2=2.4"); sgraphVec.push_back(sgraph1a); sgraphName.push_back("sgraph1a"); TGraphErrors *sgraph1b = new TGraphErrors(6); sgraph1b->SetTitle("Q2=3.8"); sgraphVec.push_back(sgraph1b); sgraphName.push_back("sgraph1b"); TGraphErrors *sgraph1c = new TGraphErrors(6); sgraph1c->SetTitle("Q2=6.5"); sgraphVec.push_back(sgraph1c); sgraphName.push_back("sgraph1c"); TGraphErrors *sgraph1d = new TGraphErrors(6); sgraph1d->SetTitle("Q2=13.0"); sgraphVec.push_back(sgraph1d); sgraphName.push_back("sgraph1d"); // Table 3 TGraphErrors *graph3 = new TGraphErrors(9); graph3->SetTitle("Q2"); graphVec.push_back(graph3); graphName.push_back("graph3"); TGraphErrors *sgraph3 = new TGraphErrors(9); sgraph3->SetTitle("Q2"); sgraphVec.push_back(sgraph3); sgraphName.push_back("sgraph3"); // // Loop over data points and for each initialize Sartre and // calculate the cross-section. We are using no runcard but // set thigs for each data point // Sartre sartre; EventGeneratorSettings* settings = sartre.runSettings(); // // Table 1 // double diff_table1, chi2_table1 = 0; double diff_table3, chi2_table3 = 0; int ndof_table1 = 0; int ndof_table3 = 0; int graphCounter = 0; int pointCounter = 0; for (unsigned int i=0; iSetPoint(pointCounter, zeusDataPhi_table1[i].W, zeusDataPhi_table1[i].xsection); if(graphCounter==4) graphVec[graphCounter]->SetPoint(pointCounter, zeusDataPhi_table1[i].Q2, zeusDataPhi_table1[i].xsection); double error = sqrt(zeusDataPhi_table1[i].xsection_stat*zeusDataPhi_table1[i].xsection_stat + zeusDataPhi_table1[i].xsection_sys*zeusDataPhi_table1[i].xsection_sys); graphVec[graphCounter]->SetPointError(pointCounter, 0., error); // set up sartre settings->setVerbose(true); settings->setVerboseLevel(2); settings->setNumberOfEvents(0); settings->setTimesToShow(0); settings->setVectorMesonId(333); settings->setApplyPhotonFlux(false); settings->setElectronBeamEnergy(heraElectronEnergy); settings->setHadronBeamEnergy(heraProtonEnergy); settings->setDipoleModelType(theDipoleModelType); settings->setDipoleModelParameterSet(theDipoleModelParameterSet); settings->setA(1); settings->setCorrectForRealAmplitude(true); settings->setCorrectSkewedness(true); settings->setMaxLambdaUsedInCorrections(maxLam); settings->setEnableNuclearBreakup(false); settings->setQ2min(zeusDataPhi_table1[i].Q2min); double Q2min=settings->Q2min(); settings->setQ2max(zeusDataPhi_table1[i].Q2max); double Q2max=settings->Q2max(); settings->setWmin(zeusDataPhi_table1[i].Wmin); double Wmin=settings->Wmin(); settings->setWmax(zeusDataPhi_table1[i].Wmax); double Wmax=settings->Wmax(); if(Wmax > 142 || Wmin > 142) continue; //calculate in the t=0 limits, mp=0: TParticlePDG *vectorMesonPDG = settings->lookupPDG(settings->vectorMesonId()); double vmMass = vectorMesonPDG->Mass(); double beta=Q2min/(vmMass*vmMass + Q2min); double xpom=(vmMass*vmMass + Q2max) / (Wmin*Wmin + Q2max - protonMass2); if(xpom > xpomMax) continue; if(beta < betaMin) continue; bool ok = sartre.init(); if (!ok) { cout << "Initialization of sartre failed. Going to next data point." << endl; continue; } settings->list(); // // Sartre cross-section // vector > limits = sartre.kinematicLimits(); // t, Q2, W double lower[3], upper[3]; lower[0] = -zeusDataPhi_table1[i].tmax; // t upper[0] = -zeusDataPhi_table1[i].tmin; lower[1] = limits[1].first; // Q2 upper[1] = limits[1].second; lower[2] = limits[2].first; // W upper[2] = limits[2].second; double CS = sartre.totalCrossSection(lower, upper); CS /= upper[0]-lower[0]; CS /= limits[1].second - limits[1].first; CS /= limits[2].second*limits[2].second - limits[2].first*limits[2].first; if(graphCounter<4){ sgraphVec[graphCounter]->SetPoint(pointCounter, zeusDataPhi_table1[i].W, CS); sgraphVec[graphCounter]->SetPointError(pointCounter, 0., 0.); } if(graphCounter==4){ sgraphVec[graphCounter]->SetPoint(pointCounter, zeusDataPhi_table1[i].Q2, CS); sgraphVec[graphCounter]->SetPointError(pointCounter, 0., 0.); } // // chi2 calculation // if(graphCounter<4){ diff_table1 = CS - zeusDataPhi_table1[i].xsection; chi2_table1 += (diff_table1*diff_table1) / (error*error); ndof_table1++; chi2_global+=(diff_table1*diff_table1) / (error*error); ndof_global++; } if(graphCounter==4){ diff_table3 = CS - zeusDataPhi_table1[i].xsection; chi2_table3 += (diff_table3*diff_table3) / (error*error); ndof_table3++; chi2_global+=(diff_table3*diff_table3) / (error*error); ndof_global++; } // // Print out // cout << endl; cout << "dsig/dt at |t|=" << fabs(zeusDataPhi_table1[i].t) << ", Q2=" << zeusDataPhi_table1[i].Q2 << ", W=" << zeusDataPhi_table1[i].W << endl; cout << "\t\tSartre: " << CS << endl; // in nb/GeV2 cout << "\t\tZeus: " << zeusDataPhi_table1[i].xsection << "+/-" << zeusDataPhi_table1[i].xsection_stat << "+/-" <Write(graphName[i].c_str()); sgraphVec[i]->Write(sgraphName[i].c_str()); } // Table 1 // graph1a->Write("graph1a"); // sgraph1a->Write("sgraph1a"); // for(int i=0; i<3; i++){ // graphVec.at(i)->Write("graph1a"); // sgraphVec.at(i)->Write("sgraph1a"); // } hfile->Close(); } void compareDVCS(string& rootfile) { // // DVCS HERA/H1 data // double heraProtonEnergy = 920; double heraElectronEnergy = 27.6; vector h1DataDVCS_table4; vector h1DataDVCS_table1; loadDVCSData(h1DataDVCS_table1, h1DataDVCS_table4); vector graphVec; vector sgraphVec; vector sgraphName; vector graphName; // Table 4 TGraphErrors *graph4a = new TGraphErrors(4); graph4a->SetTitle("Q2=8, W=40"); graphVec.push_back(graph4a); graphName.push_back("graph4a"); TGraphErrors *graph4b = new TGraphErrors(4); graph4b->SetTitle("Q2=8, W=70"); graphVec.push_back(graph4b); graphName.push_back("graph4b"); TGraphErrors *graph4c = new TGraphErrors(4); graph4c->SetTitle("Q2=8, W=100"); graphVec.push_back(graph4c); graphName.push_back("graph4c"); TGraphErrors *graph4d = new TGraphErrors(4); graph4d->SetTitle("Q2=20, W=40"); graphVec.push_back(graph4d); graphName.push_back("graph4d"); TGraphErrors *graph4e = new TGraphErrors(4); graph4e->SetTitle("Q2=20, W=70"); graphVec.push_back(graph4e); graphName.push_back("graph4e"); TGraphErrors *graph4f = new TGraphErrors(4); graph4f->SetTitle("Q2=20, W=100"); graphVec.push_back(graph4f); graphName.push_back("graph4f"); TGraphErrors *sgraph4a = new TGraphErrors(4); sgraph4a->SetTitle("Q2=8, W=40"); sgraphVec.push_back(sgraph4a); sgraphName.push_back("sgraph4a"); TGraphErrors *sgraph4b = new TGraphErrors(4); sgraph4b->SetTitle("Q2=8, W=70"); sgraphVec.push_back(sgraph4b); sgraphName.push_back("sgraph4b"); TGraphErrors *sgraph4c = new TGraphErrors(4); sgraph4c->SetTitle("Q2=8, W=100"); sgraphVec.push_back(sgraph4c); sgraphName.push_back("sgraph4c"); TGraphErrors *sgraph4d = new TGraphErrors(4); sgraph4d->SetTitle("Q2=20, W=40"); sgraphVec.push_back(sgraph4d); sgraphName.push_back("sgraph4d"); TGraphErrors *sgraph4e = new TGraphErrors(4); sgraph4e->SetTitle("Q2=20, W=70"); sgraphVec.push_back(sgraph4e); sgraphName.push_back("sgraph4e"); TGraphErrors *sgraph4f = new TGraphErrors(4); sgraph4f->SetTitle("Q2=20, W=100"); sgraphVec.push_back(sgraph4f); sgraphName.push_back("sgraph4f"); // Table 1 TGraphErrors *graph1a = new TGraphErrors(4); graph1a->SetTitle("30 < W < 140, |t|<1"); TGraphErrors *sgraph1a = new TGraphErrors(4); sgraph1a->SetTitle("30 < W < 140, |t|<1"); TGraphErrors *graph1b = new TGraphErrors(5); graph1b->SetTitle("6.5 < Q2 < 80, |t|<1"); TGraphErrors *sgraph1b = new TGraphErrors(5); sgraph1b->SetTitle("6.5 < Q2 < 80, |t|<1"); // // Loop over data points and for each initialize Sartre and // calculate the cross-section. We are using no runcard but // set thigs for each data point // Sartre sartre; EventGeneratorSettings* settings = sartre.runSettings(); // // Table 4 // double diff_table4, chi2_table4 = 0; int ndof_table4 = 0; int graphCounter, pointCounter; for (unsigned int i=0; iSetPoint(pointCounter, fabs(h1DataDVCS_table4[i].t), h1DataDVCS_table4[i].xsection); double error = sqrt(h1DataDVCS_table4[i].xsection_stat*h1DataDVCS_table4[i].xsection_stat + h1DataDVCS_table4[i].xsection_sys*h1DataDVCS_table4[i].xsection_sys); graphVec[graphCounter]->SetPointError(pointCounter, 0., error); // set up sartre settings->setVerbose(false); settings->setVerboseLevel(0); settings->setNumberOfEvents(0); settings->setTimesToShow(0); settings->setVectorMesonId(22); settings->setApplyPhotonFlux(false); settings->setElectronBeamEnergy(heraElectronEnergy); settings->setHadronBeamEnergy(heraProtonEnergy); settings->setDipoleModelType(theDipoleModelType); settings->setDipoleModelParameterSet(theDipoleModelParameterSet); settings->setA(1); settings->setCorrectForRealAmplitude(false); settings->setCorrectSkewedness(false); settings->setEnableNuclearBreakup(false); settings->setQ2min(h1DataDVCS_table4[i].Q2-.1); settings->setQ2max(h1DataDVCS_table4[i].Q2+.1); settings->setWmin(h1DataDVCS_table4[i].W-.1); settings->setWmax(h1DataDVCS_table4[i].W+.1); if (settings->Wmax() > 142 || settings->Wmin()>142) continue; settings->setMaxLambdaUsedInCorrections(maxLam); bool ok = sartre.init(); if (!ok) { cout << "Initialization of sartre failed. Going to next data point." << endl; continue; } // // Sartre cross-section // vector > limits = sartre.kinematicLimits(); // t, Q2, W double lower[3], upper[3]; lower[0] = -h1DataDVCS_table4[i].t-0.05; // t upper[0] = -h1DataDVCS_table4[i].t+0.05; lower[1] = limits[1].first; // Q2 upper[1] = limits[1].second; lower[2] = limits[2].first; // W upper[2] = limits[2].second; double CS = sartre.totalCrossSection(lower, upper); CS /= upper[0]-lower[0]; CS /= limits[1].second - limits[1].first; CS /= limits[2].second*limits[2].second - limits[2].first*limits[2].first; sgraphVec[graphCounter]->SetPoint(pointCounter, fabs(h1DataDVCS_table4[i].t), CS); sgraphVec[graphCounter]->SetPointError(pointCounter, 0., 0.); // // chi2 calculation // diff_table4 = CS - h1DataDVCS_table4[i].xsection; chi2_table4 += (diff_table4*diff_table4) / (error*error); ndof_table4++; // // Print out // cout << endl; cout << "dsig/dt at |t|=" << fabs(h1DataDVCS_table4[i].t) << ", Q2=" << h1DataDVCS_table4[i].Q2 << ", W=" << h1DataDVCS_table4[i].W << endl; cout << "\t\tSartre: " << CS << endl; // in nb/GeV2 cout << "\t\tH1: " << h1DataDVCS_table4[i].xsection << "+/-" << h1DataDVCS_table4[i].xsection_stat << "+/-" < > limits = sartre.kinematicLimits(); // t, Q2, W double lower[3], upper[3]; lower[0] = -1; // t upper[0] = limits[0].second; lower[1] = limits[1].first; // Q2 upper[1] = limits[1].second; lower[2] = limits[2].first; // W upper[2] = limits[2].second; double CS = sartre.totalCrossSection(lower, upper); // H1 cross-section sum for crosschecks double h1cs = h1DataDVCS_table1[i].xsection; h1cs *= h1DataDVCS_table1[i].Q2max - h1DataDVCS_table1[i].Q2min; // Q2 h1cs *= h1DataDVCS_table1[i].Wmax - h1DataDVCS_table1[i].Wmin; // W if (i < 4) { sigma_a += CS; h1_sigma_a += h1cs; } else { sigma_b += CS; h1_sigma_b += h1cs; } limits = sartre.kinematicLimits(); CS /= limits[1].second - limits[1].first; // Q2 CS /= limits[2].second*limits[2].second - limits[2].first*limits[2].first; // W2 // fill graphs if (i < 4) { sgraph1a->SetPoint(i, fabs(h1DataDVCS_table1[i].Q2), CS); sgraph1a->SetPointError(i , 0., 0.); } else { sgraph1b->SetPoint(i-4, fabs(h1DataDVCS_table1[i].W), CS); sgraph1b->SetPointError(i-4 , 0., 0.); } // // chi2 calculation // diff_table1 = CS - h1DataDVCS_table1[i].xsection; chi2_table1 += (diff_table1*diff_table1) / (error*error); chi2_global += (diff_table1*diff_table1) / (error*error); ndof_table1++; ndof_global++; // // Print out // cout << endl; cout << "\t\tSartre: " << CS << endl; cout << "\t\tH1: " << h1DataDVCS_table1[i].xsection << "+/-" << h1DataDVCS_table1[i].xsection_stat << "+/-" <Write(graphName[i].c_str()); sgraphVec[i]->Write(sgraphName[i].c_str()); } // Table 1 graph1a->Write("graph1a"); graph1b->Write("graph1b"); sgraph1a->Write("sgraph1a"); sgraph1b->Write("sgraph1b"); hfile->Close(); } void compareJpsi(string& rootfile) { // // J/Psi HERA/ZEUS data // double heraProtonEnergy = 920; double heraElectronEnergy = 27.5; vector zeusDataJpsi; loadJpsiData(zeusDataJpsi); double chi2=0; double ndof=0; // HERA data - table 1 TGraphAsymmErrors *graph1H = new TGraphAsymmErrors(3); graph1H->SetTitle("0.15 < Q2 < 0.8"); TGraphAsymmErrors *graph2H = new TGraphAsymmErrors(6); graph2H->SetTitle("2 < Q2 < 5"); TGraphAsymmErrors *graph3H = new TGraphAsymmErrors(6); graph3H->SetTitle("5 < Q2 < 10"); TGraphAsymmErrors *graph4H = new TGraphAsymmErrors(6); graph4H->SetTitle("10 < Q2 < 100"); // Sartre results - table 1 TGraphAsymmErrors *graph1S = new TGraphAsymmErrors(3); graph1S->SetTitle("0.15 < Q2 < 0.8"); TGraphAsymmErrors *graph2S = new TGraphAsymmErrors(6); graph2S->SetTitle("2 < Q2 < 5"); TGraphAsymmErrors *graph3S = new TGraphAsymmErrors(6); graph3S->SetTitle("5 < Q2 < 10"); TGraphAsymmErrors *graph4S = new TGraphAsymmErrors(6); graph4S->SetTitle("10 < Q2 < 100"); // HERA data - table 2 TGraphAsymmErrors *graph5H = new TGraphAsymmErrors(8); graph5H->SetTitle("30 < W < 220"); TGraphAsymmErrors *graph6H = new TGraphAsymmErrors(7); graph6H->SetTitle("45 < W < 160"); // Sartre results - table 2 TGraphAsymmErrors *graph5S = new TGraphAsymmErrors(8); graph5S->SetTitle("30 < W < 220"); TGraphAsymmErrors *graph6S = new TGraphAsymmErrors(7); graph6S->SetTitle("45 < W < 160"); // // Loop over data points and for each initialize Sartre and // calculate the cross-section. We are using no runcard but // set things for each data point // Sartre sartre; EventGeneratorSettings* settings = sartre.runSettings(); double diff; for (unsigned int i=0; isetVerbose(true); settings->setVerboseLevel(2); settings->setNumberOfEvents(0); settings->setTimesToShow(0); settings->setQ2min(zeusDataJpsi[i].Q2min); settings->setQ2max(zeusDataJpsi[i].Q2max); settings->setWmin(zeusDataJpsi[i].Wmin); settings->setWmax(zeusDataJpsi[i].Wmax); settings->setVectorMesonId(443); settings->setApplyPhotonFlux(true); settings->setElectronBeamEnergy(heraElectronEnergy); settings->setHadronBeamEnergy(heraProtonEnergy); settings->setDipoleModelType(theDipoleModelType); settings->setDipoleModelParameterSet(theDipoleModelParameterSet); settings->setA(1); settings->setCorrectForRealAmplitude(true); settings->setCorrectSkewedness(true); settings->setEnableNuclearBreakup(false); settings->setMaxLambdaUsedInCorrections(maxLam); settings->setTableSetType(theTableSetType); bool ok = sartre.init(); if (!ok) { cout << "Initialization of sartre failed. Going to next data point." << endl; continue; } settings->list(); cout << "Total cross-sections for Q2=[" << zeusDataJpsi[i].Q2min << ", " << zeusDataJpsi[i].Q2max << "], "; cout << "W=[" << zeusDataJpsi[i].Wmin << ", " << zeusDataJpsi[i].Wmax<< "], |t| < 1" << endl; cout << "\t\tSartre: " << sartre.totalCrossSection()*1000 << endl; // in pb cout << "\t\tZEUS: " << zeusDataJpsi[i].xsection << "+/-" << zeusDataJpsi[i].xsection_stat << "+" <= 3 && i <= 8) { graphS = graph2S; graphH = graph2H; offset = 3; } else if (i >= 9 && i <= 14) { graphS = graph3S; graphH = graph3H; offset = 9; } else if (i >= 15 && i <= 20) { graphS = graph4S; graphH = graph4H; offset = 15; } else if (i >= 21 && i <= 28) { graphSS = graph5S; graphHH = graph5H; offset = 21; } else if (i >= 29 && i <= 35) { graphSS = graph6S; graphHH = graph6H; offset = 29; } double meanW, meanQ2, exl, exu, eyl, eyu; eyl = sqrt(zeusDataJpsi[i].xsection_stat*zeusDataJpsi[i].xsection_stat + zeusDataJpsi[i].xsection_sys_lo*zeusDataJpsi[i].xsection_sys_lo); eyu = sqrt(zeusDataJpsi[i].xsection_stat*zeusDataJpsi[i].xsection_stat + zeusDataJpsi[i].xsection_sys_up*zeusDataJpsi[i].xsection_sys_up); if (graphS && graphH) { meanW = (zeusDataJpsi[i].Wmax+zeusDataJpsi[i].Wmin)/2; graphS->SetPoint(i-offset, meanW, 1000*sartre.totalCrossSection()); graphS->SetPointError(i-offset, 0, 0, 0, 0); exl = meanW-zeusDataJpsi[i].Wmin; exu = zeusDataJpsi[i].Wmax-meanW; graphH->SetPoint(i-offset, meanW, zeusDataJpsi[i].xsection); graphH->SetPointError(i-offset, exl, exu, eyl, eyu); } else if (graphSS && graphHH) { meanQ2 = (zeusDataJpsi[i].Q2max+zeusDataJpsi[i].Q2min)/2; graphSS->SetPoint(i-offset, meanQ2, 1000*sartre.totalCrossSection()); graphSS->SetPointError(i-offset, 0, 0, 0, 0); exl = meanQ2-zeusDataJpsi[i].Q2min; exu = zeusDataJpsi[i].Q2max-meanQ2; graphHH->SetPoint(i-offset, meanQ2, zeusDataJpsi[i].xsection); graphHH->SetPointError(i-offset, exl, exu, eyl, eyu); } diff = 1000*sartre.totalCrossSection() - zeusDataJpsi[i].xsection; if ( zeusDataJpsi[i].xsection > 1000*sartre.totalCrossSection() ) { chi2 += (diff*diff) / (eyl*eyl); chi2_global+= (diff*diff) / (eyl*eyl); } else { chi2 += (diff*diff) / (eyu*eyu); chi2_global += (diff*diff) / (eyu*eyu); } ndof++; } cout << "-------------------------------------------------" << endl; cout << "Comparison HERA-Sartre:" << endl; cout << "chi2 = " << chi2 << endl; cout << "ndof = " << ndof << endl; cout << "chi2/ndof = " << chi2/ndof << endl; cout << "-------------------------------------------------" << endl; // // ROOT file // TFile *hfile = 0; hfile = new TFile(rootfile.c_str(),"RECREATE"); cout << "ROOT file is '" << rootfile.c_str() << "'." << endl; graph1H->Write("graph1H"); graph1S->Write("graph1S"); graph2H->Write("graph2H"); graph2S->Write("graph2S"); graph3H->Write("graph3H"); graph3S->Write("graph3S"); graph4H->Write("graph4H"); graph4S->Write("graph4S"); graph5H->Write("graph5H"); graph5S->Write("graph5S"); graph6H->Write("graph6H"); graph6S->Write("graph6S"); hfile->Close(); return; } void loadJpsiData(vector& vec) { // // J/Psi HERA/ZEUS data // // Data for e p -> e' p' J/psi // Journal reference: Nucl.Phys.B695:3-37,2004 // arXiv:hep-ex/0404008v1 // // All data are for |t|<1 GeV2 // Cross section in pb // vector zeusDataJpsi(21+15); unsigned int i = 0; // table 1 (21 entries) zeusDataJpsi[i].Q2min=0.15; zeusDataJpsi[i].Q2max=0.8; zeusDataJpsi[i].Wmin=30; zeusDataJpsi[i].Wmax=65; zeusDataJpsi[i].xsection=217; zeusDataJpsi[i].xsection_stat=53; zeusDataJpsi[i].xsection_sys_up=12; zeusDataJpsi[i].xsection_sys_lo=19; i++; zeusDataJpsi[i].Q2min=0.15; zeusDataJpsi[i].Q2max=0.8; zeusDataJpsi[i].Wmin=65; zeusDataJpsi[i].Wmax=105; zeusDataJpsi[i].xsection=257; zeusDataJpsi[i].xsection_stat=46; zeusDataJpsi[i].xsection_sys_up=18; zeusDataJpsi[i].xsection_sys_lo=17; i++; zeusDataJpsi[i].Q2min=0.15; zeusDataJpsi[i].Q2max=0.8; zeusDataJpsi[i].Wmin=105; zeusDataJpsi[i].Wmax=220; zeusDataJpsi[i].xsection=498; zeusDataJpsi[i].xsection_stat=89; zeusDataJpsi[i].xsection_sys_up=37; zeusDataJpsi[i].xsection_sys_lo=38; i++; zeusDataJpsi[i].Q2min=2; zeusDataJpsi[i].Q2max=5; zeusDataJpsi[i].Wmin=30; zeusDataJpsi[i].Wmax=45; zeusDataJpsi[i].xsection=41.5; zeusDataJpsi[i].xsection_stat=8.4; zeusDataJpsi[i].xsection_sys_up=5.6; zeusDataJpsi[i].xsection_sys_lo=6.6; i++; zeusDataJpsi[i].Q2min=2; zeusDataJpsi[i].Q2max=5; zeusDataJpsi[i].Wmin=45; zeusDataJpsi[i].Wmax=70; zeusDataJpsi[i].xsection=48.8; zeusDataJpsi[i].xsection_stat=5.2; zeusDataJpsi[i].xsection_sys_up=3.1; zeusDataJpsi[i].xsection_sys_lo=3.9; i++; zeusDataJpsi[i].Q2min=2; zeusDataJpsi[i].Q2max=5; zeusDataJpsi[i].Wmin=70; zeusDataJpsi[i].Wmax=90; zeusDataJpsi[i].xsection=36.4; zeusDataJpsi[i].xsection_stat=4.1; zeusDataJpsi[i].xsection_sys_up=10.5; zeusDataJpsi[i].xsection_sys_lo=3.0; i++; zeusDataJpsi[i].Q2min=2; zeusDataJpsi[i].Q2max=5; zeusDataJpsi[i].Wmin=90; zeusDataJpsi[i].Wmax=112; zeusDataJpsi[i].xsection=35.4; zeusDataJpsi[i].xsection_stat=4.0; zeusDataJpsi[i].xsection_sys_up=3.0; zeusDataJpsi[i].xsection_sys_lo=4.5; i++; zeusDataJpsi[i].Q2min=2; zeusDataJpsi[i].Q2max=5; zeusDataJpsi[i].Wmin=112; zeusDataJpsi[i].Wmax=145; zeusDataJpsi[i].xsection=44.7; zeusDataJpsi[i].xsection_stat=5.0; zeusDataJpsi[i].xsection_sys_up=9.0; zeusDataJpsi[i].xsection_sys_lo=4.3; i++; zeusDataJpsi[i].Q2min=2; zeusDataJpsi[i].Q2max=5; zeusDataJpsi[i].Wmin=145; zeusDataJpsi[i].Wmax=220; zeusDataJpsi[i].xsection=76.5; zeusDataJpsi[i].xsection_stat=10.3; zeusDataJpsi[i].xsection_sys_up=11.5; zeusDataJpsi[i].xsection_sys_lo=5.1; i++; zeusDataJpsi[i].Q2min=5; zeusDataJpsi[i].Q2max=10; zeusDataJpsi[i].Wmin=30; zeusDataJpsi[i].Wmax=50; zeusDataJpsi[i].xsection=19.6; zeusDataJpsi[i].xsection_stat=4.1; zeusDataJpsi[i].xsection_sys_up=3.9; zeusDataJpsi[i].xsection_sys_lo=1.9; i++; zeusDataJpsi[i].Q2min=5; zeusDataJpsi[i].Q2max=10; zeusDataJpsi[i].Wmin=50; zeusDataJpsi[i].Wmax=74; zeusDataJpsi[i].xsection=19.3; zeusDataJpsi[i].xsection_stat=2.2; zeusDataJpsi[i].xsection_sys_up=2.9; zeusDataJpsi[i].xsection_sys_lo=1.3; i++; zeusDataJpsi[i].Q2min=5; zeusDataJpsi[i].Q2max=10; zeusDataJpsi[i].Wmin=74; zeusDataJpsi[i].Wmax=96; zeusDataJpsi[i].xsection=15.6; zeusDataJpsi[i].xsection_stat=1.8; zeusDataJpsi[i].xsection_sys_up=1.6; zeusDataJpsi[i].xsection_sys_lo=1.4; i++; zeusDataJpsi[i].Q2min=5; zeusDataJpsi[i].Q2max=10; zeusDataJpsi[i].Wmin=96; zeusDataJpsi[i].Wmax=120; zeusDataJpsi[i].xsection=13.5; zeusDataJpsi[i].xsection_stat=1.7; zeusDataJpsi[i].xsection_sys_up=1.1; zeusDataJpsi[i].xsection_sys_lo=0.7; i++; zeusDataJpsi[i].Q2min=5; zeusDataJpsi[i].Q2max=10; zeusDataJpsi[i].Wmin=120; zeusDataJpsi[i].Wmax=150; zeusDataJpsi[i].xsection=14.9; zeusDataJpsi[i].xsection_stat=1.9; zeusDataJpsi[i].xsection_sys_up=1.1; zeusDataJpsi[i].xsection_sys_lo=1.3; i++; zeusDataJpsi[i].Q2min=5; zeusDataJpsi[i].Q2max=10; zeusDataJpsi[i].Wmin=150; zeusDataJpsi[i].Wmax=220; zeusDataJpsi[i].xsection=27.9; zeusDataJpsi[i].xsection_stat=4.1; zeusDataJpsi[i].xsection_sys_up=4.5; zeusDataJpsi[i].xsection_sys_lo=1.4; i++; zeusDataJpsi[i].Q2min=10; zeusDataJpsi[i].Q2max=100; zeusDataJpsi[i].Wmin=30; zeusDataJpsi[i].Wmax=55; zeusDataJpsi[i].xsection=10.9; zeusDataJpsi[i].xsection_stat=3.1; zeusDataJpsi[i].xsection_sys_up=0.8; zeusDataJpsi[i].xsection_sys_lo=1.0; i++; zeusDataJpsi[i].Q2min=10; zeusDataJpsi[i].Q2max=100; zeusDataJpsi[i].Wmin=55; zeusDataJpsi[i].Wmax=78; zeusDataJpsi[i].xsection=8.4; zeusDataJpsi[i].xsection_stat=1.2; zeusDataJpsi[i].xsection_sys_up=1.4; zeusDataJpsi[i].xsection_sys_lo=0.4; i++; zeusDataJpsi[i].Q2min=10; zeusDataJpsi[i].Q2max=100; zeusDataJpsi[i].Wmin=78; zeusDataJpsi[i].Wmax=100; zeusDataJpsi[i].xsection=8.6; zeusDataJpsi[i].xsection_stat=1.1; zeusDataJpsi[i].xsection_sys_up=0.9; zeusDataJpsi[i].xsection_sys_lo=1.4; i++; zeusDataJpsi[i].Q2min=10; zeusDataJpsi[i].Q2max=100; zeusDataJpsi[i].Wmin=100; zeusDataJpsi[i].Wmax=124; zeusDataJpsi[i].xsection=8.4; zeusDataJpsi[i].xsection_stat=1.1; zeusDataJpsi[i].xsection_sys_up=0.4; zeusDataJpsi[i].xsection_sys_lo=1.2; i++; zeusDataJpsi[i].Q2min=10; zeusDataJpsi[i].Q2max=100; zeusDataJpsi[i].Wmin=124; zeusDataJpsi[i].Wmax=160; zeusDataJpsi[i].xsection=10.8; zeusDataJpsi[i].xsection_stat=1.4; zeusDataJpsi[i].xsection_sys_up=2.1; zeusDataJpsi[i].xsection_sys_lo=0.8; i++; zeusDataJpsi[i].Q2min=10; zeusDataJpsi[i].Q2max=100; zeusDataJpsi[i].Wmin=160; zeusDataJpsi[i].Wmax=220; zeusDataJpsi[i].xsection=25.1; zeusDataJpsi[i].xsection_stat=3.8; zeusDataJpsi[i].xsection_sys_up=1.7; zeusDataJpsi[i].xsection_sys_lo=1.2; i++; // table 2 (15 entries) zeusDataJpsi[i].Q2min=0.15; zeusDataJpsi[i].Q2max=0.8; zeusDataJpsi[i].Wmin=30; zeusDataJpsi[i].Wmax=220; zeusDataJpsi[i].xsection=954; zeusDataJpsi[i].xsection_stat=108; zeusDataJpsi[i].xsection_sys_up=63; zeusDataJpsi[i].xsection_sys_lo=74; i++; zeusDataJpsi[i].Q2min=2; zeusDataJpsi[i].Q2max=3.2; zeusDataJpsi[i].Wmin=30; zeusDataJpsi[i].Wmax=220; zeusDataJpsi[i].xsection=150; zeusDataJpsi[i].xsection_stat=14; zeusDataJpsi[i].xsection_sys_up=53; zeusDataJpsi[i].xsection_sys_lo=8; i++; zeusDataJpsi[i].Q2min=3.2; zeusDataJpsi[i].Q2max=5; zeusDataJpsi[i].Wmin=30; zeusDataJpsi[i].Wmax=220; zeusDataJpsi[i].xsection=132; zeusDataJpsi[i].xsection_stat=12; zeusDataJpsi[i].xsection_sys_up=8; zeusDataJpsi[i].xsection_sys_lo=17; i++; zeusDataJpsi[i].Q2min=5; zeusDataJpsi[i].Q2max=7; zeusDataJpsi[i].Wmin=30; zeusDataJpsi[i].Wmax=220; zeusDataJpsi[i].xsection=59.9; zeusDataJpsi[i].xsection_stat=6.1; zeusDataJpsi[i].xsection_sys_up=5.5; zeusDataJpsi[i].xsection_sys_lo=3.6; i++; zeusDataJpsi[i].Q2min=7; zeusDataJpsi[i].Q2max=10; zeusDataJpsi[i].Wmin=30; zeusDataJpsi[i].Wmax=220; zeusDataJpsi[i].xsection=42.6; zeusDataJpsi[i].xsection_stat=4.3; zeusDataJpsi[i].xsection_sys_up=4.7; zeusDataJpsi[i].xsection_sys_lo=5.0; i++; zeusDataJpsi[i].Q2min=10; zeusDataJpsi[i].Q2max=15; zeusDataJpsi[i].Wmin=30; zeusDataJpsi[i].Wmax=220; zeusDataJpsi[i].xsection=36.7; zeusDataJpsi[i].xsection_stat=4.0; zeusDataJpsi[i].xsection_sys_up=1.4; zeusDataJpsi[i].xsection_sys_lo=2.9; i++; zeusDataJpsi[i].Q2min=15; zeusDataJpsi[i].Q2max=40; zeusDataJpsi[i].Wmin=30; zeusDataJpsi[i].Wmax=220; zeusDataJpsi[i].xsection=29.3; zeusDataJpsi[i].xsection_stat=3.7; zeusDataJpsi[i].xsection_sys_up=2.0; zeusDataJpsi[i].xsection_sys_lo=4.7; i++; zeusDataJpsi[i].Q2min=40; zeusDataJpsi[i].Q2max=100; zeusDataJpsi[i].Wmin=30; zeusDataJpsi[i].Wmax=220; zeusDataJpsi[i].xsection=4.5; zeusDataJpsi[i].xsection_stat=1.5; zeusDataJpsi[i].xsection_sys_up=0.5; zeusDataJpsi[i].xsection_sys_lo=1.1; i++; zeusDataJpsi[i].Q2min=2; zeusDataJpsi[i].Q2max=3.2; zeusDataJpsi[i].Wmin=45; zeusDataJpsi[i].Wmax=160; zeusDataJpsi[i].xsection=96; zeusDataJpsi[i].xsection_stat=11; zeusDataJpsi[i].xsection_sys_up=5; zeusDataJpsi[i].xsection_sys_lo=14; i++; zeusDataJpsi[i].Q2min=3.2; zeusDataJpsi[i].Q2max=5; zeusDataJpsi[i].Wmin=45; zeusDataJpsi[i].Wmax=160; zeusDataJpsi[i].xsection=91.6; zeusDataJpsi[i].xsection_stat=8.9; zeusDataJpsi[i].xsection_sys_up=12.2; zeusDataJpsi[i].xsection_sys_lo=6.6; i++; zeusDataJpsi[i].Q2min=5; zeusDataJpsi[i].Q2max=7; zeusDataJpsi[i].Wmin=45; zeusDataJpsi[i].Wmax=160; zeusDataJpsi[i].xsection=48.7; zeusDataJpsi[i].xsection_stat=5.2; zeusDataJpsi[i].xsection_sys_up=1.2; zeusDataJpsi[i].xsection_sys_lo=2.5; i++; zeusDataJpsi[i].Q2min=7; zeusDataJpsi[i].Q2max=10; zeusDataJpsi[i].Wmin=45; zeusDataJpsi[i].Wmax=160; zeusDataJpsi[i].xsection=32.5; zeusDataJpsi[i].xsection_stat=3.4; zeusDataJpsi[i].xsection_sys_up=4.4; zeusDataJpsi[i].xsection_sys_lo=2.4; i++; zeusDataJpsi[i].Q2min=10; zeusDataJpsi[i].Q2max=15; zeusDataJpsi[i].Wmin=45; zeusDataJpsi[i].Wmax=160; zeusDataJpsi[i].xsection=24.1; zeusDataJpsi[i].xsection_stat=2.8; zeusDataJpsi[i].xsection_sys_up=1.2; zeusDataJpsi[i].xsection_sys_lo=1.6; i++; zeusDataJpsi[i].Q2min=15; zeusDataJpsi[i].Q2max=40; zeusDataJpsi[i].Wmin=45; zeusDataJpsi[i].Wmax=160; zeusDataJpsi[i].xsection=18.4; zeusDataJpsi[i].xsection_stat=2.4; zeusDataJpsi[i].xsection_sys_up=0.9; zeusDataJpsi[i].xsection_sys_lo=1.4; i++; zeusDataJpsi[i].Q2min=40; zeusDataJpsi[i].Q2max=100; zeusDataJpsi[i].Wmin=45; zeusDataJpsi[i].Wmax=160; zeusDataJpsi[i].xsection=2.2; zeusDataJpsi[i].xsection_stat=0.9; zeusDataJpsi[i].xsection_sys_up=0.4; zeusDataJpsi[i].xsection_sys_lo=0.6; vec = zeusDataJpsi; } void loadDVCSData(vector& vec1, vector& vec4) { // // DVCS HERA/ZEUS data // // Origin: // Journal reference: Phys.Lett.B659:796-806,2008 // Report number: DESY-07-142 // Cite as: arXiv:0709.4114v1 [hep-ex] vector h1DataDVCS_table1(4+5); vector h1DataDVCS_table4(12+12); unsigned int i = 0; // Table 1a (4 points versus Q2) h1DataDVCS_table1[i].Wmin=30; h1DataDVCS_table1[i].Wmax=140; h1DataDVCS_table1[i].W=82; // W is ref only h1DataDVCS_table1[i].tmin=0; h1DataDVCS_table1[i].tmax=1; h1DataDVCS_table1[i].Q2min=6.5; h1DataDVCS_table1[i].Q2max=11; h1DataDVCS_table1[i].Q2=8.75; // Q2 is ref value only h1DataDVCS_table1[i].xsection=3.59; h1DataDVCS_table1[i].xsection_stat=.21; h1DataDVCS_table1[i].xsection_sys=.41; i++; h1DataDVCS_table1[i].Wmin=30; h1DataDVCS_table1[i].Wmax=140;; h1DataDVCS_table1[i].W=82; // W is ref only h1DataDVCS_table1[i].tmin=0; h1DataDVCS_table1[i].tmax=1; h1DataDVCS_table1[i].Q2min=11; h1DataDVCS_table1[i].Q2max=20; h1DataDVCS_table1[i].Q2=15.5; h1DataDVCS_table1[i].xsection=1.38; h1DataDVCS_table1[i].xsection_stat=.1; h1DataDVCS_table1[i].xsection_sys=.21; i++; h1DataDVCS_table1[i].Wmin=30; h1DataDVCS_table1[i].Wmax=140;; h1DataDVCS_table1[i].W=82; // W is ref only h1DataDVCS_table1[i].tmin=0; h1DataDVCS_table1[i].tmax=1; h1DataDVCS_table1[i].Q2min=20; h1DataDVCS_table1[i].Q2max=30; h1DataDVCS_table1[i].Q2=25; h1DataDVCS_table1[i].xsection=.58; h1DataDVCS_table1[i].xsection_stat=.09; h1DataDVCS_table1[i].xsection_sys=.09; i++; h1DataDVCS_table1[i].Wmin=30; h1DataDVCS_table1[i].Wmax=140;; h1DataDVCS_table1[i].W=82; // W is ref only h1DataDVCS_table1[i].tmin=0; h1DataDVCS_table1[i].tmax=1; h1DataDVCS_table1[i].Q2min=30; h1DataDVCS_table1[i].Q2max=80; h1DataDVCS_table1[i].Q2=55; h1DataDVCS_table1[i].xsection=.13; h1DataDVCS_table1[i].xsection_stat=.03; h1DataDVCS_table1[i].xsection_sys=.04; i++; // Table 1b (5 points versus W) h1DataDVCS_table1[i].tmin=0; h1DataDVCS_table1[i].tmax=1; h1DataDVCS_table1[i].Q2min=6.5; h1DataDVCS_table1[i].Q2max=80; h1DataDVCS_table1[i].Q2=8; // Q2 is ref only h1DataDVCS_table1[i].Wmin=30; h1DataDVCS_table1[i].Wmax=60; h1DataDVCS_table1[i].W=45; h1DataDVCS_table1[i].xsection=2.91; h1DataDVCS_table1[i].xsection_stat=.2; h1DataDVCS_table1[i].xsection_sys=.25; i++; h1DataDVCS_table1[i].tmin=0; h1DataDVCS_table1[i].tmax=1; h1DataDVCS_table1[i].Q2min=6.5; h1DataDVCS_table1[i].Q2max=80; h1DataDVCS_table1[i].Q2=8; // Q2 is ref only h1DataDVCS_table1[i].Wmin=60; h1DataDVCS_table1[i].Wmax=80; h1DataDVCS_table1[i].W=70;// W is ref value only h1DataDVCS_table1[i].xsection=3.96; h1DataDVCS_table1[i].xsection_stat=.32; h1DataDVCS_table1[i].xsection_sys=.37; i++; h1DataDVCS_table1[i].tmin=0; h1DataDVCS_table1[i].tmax=1; h1DataDVCS_table1[i].Q2min=6.5; h1DataDVCS_table1[i].Q2max=80; h1DataDVCS_table1[i].Q2=8; // Q2 is ref only h1DataDVCS_table1[i].Wmin=80; h1DataDVCS_table1[i].Wmax=100; h1DataDVCS_table1[i].W=90; h1DataDVCS_table1[i].xsection= 4.78; h1DataDVCS_table1[i].xsection_stat=.41; h1DataDVCS_table1[i].xsection_sys=.57; i++; h1DataDVCS_table1[i].tmin=0; h1DataDVCS_table1[i].tmax=1; h1DataDVCS_table1[i].Q2min=6.5; h1DataDVCS_table1[i].Q2max=80; h1DataDVCS_table1[i].Q2=8; // Q2 is ref only h1DataDVCS_table1[i].Wmin=100; h1DataDVCS_table1[i].Wmax=120; h1DataDVCS_table1[i].W=110; h1DataDVCS_table1[i].xsection= 5.55; h1DataDVCS_table1[i].xsection_stat=.57; h1DataDVCS_table1[i].xsection_sys=.88; i++; h1DataDVCS_table1[i].tmin=0; h1DataDVCS_table1[i].tmax=1; h1DataDVCS_table1[i].Q2min=6.5; h1DataDVCS_table1[i].Q2max=80; h1DataDVCS_table1[i].Q2=8; h1DataDVCS_table1[i].Wmin=120; h1DataDVCS_table1[i].Wmax=140; h1DataDVCS_table1[i].W=130; h1DataDVCS_table1[i].xsection= 6.56; h1DataDVCS_table1[i].xsection_stat=1.17; h1DataDVCS_table1[i].xsection_sys=1.77; i++; vec1 = h1DataDVCS_table1; /* // Table 3a // PROBLEM: H1 gives W = 82 w/o specifying the bin range // and the same for Q=10. The call this reference value // which is pretty meaningless. The bins here are a guess // and are apparently not working. // We leave those out for the comparison. // h1DataDVCS[i].W=82; h1DataDVCS[i].Wmin=30; h1DataDVCS[i].Wmax=140; h1DataDVCS[i].Q2min=6.5; h1DataDVCS[i].Q2max=11; h1DataDVCS[i].Q2=8.; h1DataDVCS[i].tmin=0; h1DataDVCS[i].tmax=0.2; h1DataDVCS[i].t=0.1; h1DataDVCS[i].xsection=13.1; h1DataDVCS[i].xsection_stat=1.10; h1DataDVCS[i].xsection_sys=1.85; i++; h1DataDVCS[i].W=82; h1DataDVCS[i].Wmin=30; h1DataDVCS[i].Wmax=140; h1DataDVCS[i].Q2min=6.5; h1DataDVCS[i].Q2max=11; h1DataDVCS[i].Q2=8.; h1DataDVCS[i].tmin=0.2; h1DataDVCS[i].tmax=0.4; h1DataDVCS[i].t=0.3; h1DataDVCS[i].xsection=4.69; h1DataDVCS[i].xsection_stat=0.45; h1DataDVCS[i].xsection_sys=0.55; i++; h1DataDVCS[i].W=82; h1DataDVCS[i].Wmin=30; h1DataDVCS[i].Wmax=140; h1DataDVCS[i].Q2min=6.5; h1DataDVCS[i].Q2max=11; h1DataDVCS[i].Q2=8.; h1DataDVCS[i].tmin=0.4; h1DataDVCS[i].tmax=0.6; h1DataDVCS[i].t=0.5; h1DataDVCS[i].xsection=1.37; h1DataDVCS[i].xsection_stat=0.21; h1DataDVCS[i].xsection_sys=0.23; i++; h1DataDVCS[i].W=82; h1DataDVCS[i].Wmin=30; h1DataDVCS[i].Wmax=140; h1DataDVCS[i].Q2min=6.5; h1DataDVCS[i].Q2max=11; h1DataDVCS[i].Q2=8.; h1DataDVCS[i].tmin=0.6; h1DataDVCS[i].tmax=1; h1DataDVCS[i].t=0.8; h1DataDVCS[i].xsection=0.19; h1DataDVCS[i].xsection_stat=0.04; h1DataDVCS[i].xsection_sys=0.06; i++; //- h1DataDVCS[i].W=82; h1DataDVCS[i].Wmin=30; h1DataDVCS[i].Wmax=140; h1DataDVCS[i].Q2min=11; h1DataDVCS[i].Q2max=20; h1DataDVCS[i].Q2=15.5; h1DataDVCS[i].tmin=0; h1DataDVCS[i].tmax=0.2; h1DataDVCS[i].t=0.1; h1DataDVCS[i].xsection=4.37; h1DataDVCS[i].xsection_stat=0.47; h1DataDVCS[i].xsection_sys=0.86; i++; h1DataDVCS[i].W=82; h1DataDVCS[i].Wmin=30; h1DataDVCS[i].Wmax=140; h1DataDVCS[i].Q2min=11; h1DataDVCS[i].Q2max=20; h1DataDVCS[i].Q2=15.5; h1DataDVCS[i].tmin=0.2; h1DataDVCS[i].tmax=0.4; h1DataDVCS[i].t=0.3; h1DataDVCS[i].xsection=1.02; h1DataDVCS[i].xsection_stat=0.16; h1DataDVCS[i].xsection_sys=0.18; i++; h1DataDVCS[i].W=82; h1DataDVCS[i].Wmin=30; h1DataDVCS[i].Wmax=140; h1DataDVCS[i].Q2min=11; h1DataDVCS[i].Q2max=20; h1DataDVCS[i].Q2=15.5; h1DataDVCS[i].tmin=0.4; h1DataDVCS[i].tmax=0.6; h1DataDVCS[i].t=0.5; h1DataDVCS[i].xsection=0.49; h1DataDVCS[i].xsection_stat=0.08; h1DataDVCS[i].xsection_sys=0.08; i++; h1DataDVCS[i].W=82; h1DataDVCS[i].Wmin=30; h1DataDVCS[i].Wmax=140; h1DataDVCS[i].Q2min=11; h1DataDVCS[i].Q2max=20; h1DataDVCS[i].Q2=15.5; h1DataDVCS[i].tmin=0.6; h1DataDVCS[i].tmax=1; h1DataDVCS[i].t=0.8; h1DataDVCS[i].xsection=0.12; h1DataDVCS[i].xsection_stat=0.02; h1DataDVCS[i].xsection_sys=0.02; i++; //- h1DataDVCS[i].W=82; h1DataDVCS[i].Wmin=30; h1DataDVCS[i].Wmax=140; h1DataDVCS[i].Q2min=20; h1DataDVCS[i].Q2max=80; h1DataDVCS[i].Q2=25; h1DataDVCS[i].tmin=0; h1DataDVCS[i].tmax=0.2; h1DataDVCS[i].t=0.1; h1DataDVCS[i].xsection=1.41; h1DataDVCS[i].xsection_stat=0.40; h1DataDVCS[i].xsection_sys=0.43; i++; h1DataDVCS[i].W=82; h1DataDVCS[i].Wmin=30; h1DataDVCS[i].Wmax=140; h1DataDVCS[i].Q2min=20; h1DataDVCS[i].Q2max=80; h1DataDVCS[i].Q2=25; h1DataDVCS[i].tmin=0.2; h1DataDVCS[i].tmax=0.4; h1DataDVCS[i].t=0.3; h1DataDVCS[i].xsection=0.71; h1DataDVCS[i].xsection_stat=0.16; h1DataDVCS[i].xsection_sys=0.08; i++; h1DataDVCS[i].W=82; h1DataDVCS[i].Wmin=30; h1DataDVCS[i].Wmax=140; h1DataDVCS[i].Q2min=20; h1DataDVCS[i].Q2max=80; h1DataDVCS[i].Q2=25; h1DataDVCS[i].tmin=0.4; h1DataDVCS[i].tmax=0.6; h1DataDVCS[i].t=0.5; h1DataDVCS[i].xsection=0.28; h1DataDVCS[i].xsection_stat=0.07; h1DataDVCS[i].xsection_sys=0.04; i++; h1DataDVCS[i].W=82; h1DataDVCS[i].Wmin=30; h1DataDVCS[i].Wmax=140; h1DataDVCS[i].Q2min=20; h1DataDVCS[i].Q2max=80; h1DataDVCS[i].Q2=25; h1DataDVCS[i].tmin=0.6; h1DataDVCS[i].tmax=1; h1DataDVCS[i].t=0.8; h1DataDVCS[i].xsection=0.04; h1DataDVCS[i].xsection_stat=0.01; h1DataDVCS[i].xsection_sys=0.02; i++; // Table 3b h1DataDVCS[i].Q2=10; h1DataDVCS[i].Q2min=6.5; h1DataDVCS[i].Q2max=80; h1DataDVCS[i].Wmin=30; h1DataDVCS[i].Wmax=50; h1DataDVCS[i].W=40; h1DataDVCS[i].tmin=0; h1DataDVCS[i].tmax=0.2; h1DataDVCS[i].t=0.1; h1DataDVCS[i].xsection=4.99; h1DataDVCS[i].xsection_stat=0.66; h1DataDVCS[i].xsection_sys=0.54; i++; h1DataDVCS[i].Q2=10; h1DataDVCS[i].Q2min=6.5; h1DataDVCS[i].Q2max=80; h1DataDVCS[i].Wmin=30; h1DataDVCS[i].Wmax=50; h1DataDVCS[i].W=40; h1DataDVCS[i].tmin=0.2; h1DataDVCS[i].tmax=0.4; h1DataDVCS[i].t=0.3; h1DataDVCS[i].xsection=1.45; h1DataDVCS[i].xsection_stat=0.29; h1DataDVCS[i].xsection_sys=0.18; i++; h1DataDVCS[i].Q2=10; h1DataDVCS[i].Q2min=6.5; h1DataDVCS[i].Q2max=80; h1DataDVCS[i].Wmin=30; h1DataDVCS[i].Wmax=50; h1DataDVCS[i].W=40; h1DataDVCS[i].tmin=0.4; h1DataDVCS[i].tmax=0.6; h1DataDVCS[i].t=0.5; h1DataDVCS[i].xsection=0.49; h1DataDVCS[i].xsection_stat=0.14; h1DataDVCS[i].xsection_sys=0.08; i++; h1DataDVCS[i].Q2=10; h1DataDVCS[i].Q2min=6.5; h1DataDVCS[i].Q2max=80; h1DataDVCS[i].Wmin=30; h1DataDVCS[i].Wmax=50; h1DataDVCS[i].W=40; h1DataDVCS[i].tmin=0.6; h1DataDVCS[i].tmax=1; h1DataDVCS[i].t=0.8; h1DataDVCS[i].xsection=0.12; h1DataDVCS[i].xsection_stat=0.03; h1DataDVCS[i].xsection_sys=0.03; i++; //- h1DataDVCS[i].Q2=10; h1DataDVCS[i].Q2min=6.5; h1DataDVCS[i].Q2max=80; h1DataDVCS[i].Wmin=50; h1DataDVCS[i].Wmax=85; h1DataDVCS[i].W=70; h1DataDVCS[i].tmin=0; h1DataDVCS[i].tmax=0.2; h1DataDVCS[i].t=0.1; h1DataDVCS[i].xsection=7.78; h1DataDVCS[i].xsection_stat=0.69; h1DataDVCS[i].xsection_sys=0.87; i++; h1DataDVCS[i].Q2=10; h1DataDVCS[i].Q2min=6.5; h1DataDVCS[i].Q2max=80; h1DataDVCS[i].Wmin=50; h1DataDVCS[i].Wmax=85; h1DataDVCS[i].W=70; h1DataDVCS[i].tmin=0.2; h1DataDVCS[i].tmax=0.4; h1DataDVCS[i].t=0.3; h1DataDVCS[i].xsection=2.74; h1DataDVCS[i].xsection_stat=0.31; h1DataDVCS[i].xsection_sys=0.3; i++; h1DataDVCS[i].Q2=10; h1DataDVCS[i].Q2min=6.5; h1DataDVCS[i].Q2max=80; h1DataDVCS[i].Wmin=50; h1DataDVCS[i].Wmax=85; h1DataDVCS[i].W=70; h1DataDVCS[i].tmin=0.4; h1DataDVCS[i].tmax=0.6; h1DataDVCS[i].t=0.5; h1DataDVCS[i].xsection=0.81; h1DataDVCS[i].xsection_stat=0.14; h1DataDVCS[i].xsection_sys=0.11; i++; h1DataDVCS[i].Q2=10; h1DataDVCS[i].Q2min=6.5; h1DataDVCS[i].Q2max=80; h1DataDVCS[i].Wmin=50; h1DataDVCS[i].Wmax=85; h1DataDVCS[i].W=70; h1DataDVCS[i].tmin=0.6; h1DataDVCS[i].tmax=1; h1DataDVCS[i].t=0.8; h1DataDVCS[i].xsection=0.19; h1DataDVCS[i].xsection_stat=0.03; h1DataDVCS[i].xsection_sys=0.03; i++; //- h1DataDVCS[i].Q2=10; h1DataDVCS[i].Q2min=6.5; h1DataDVCS[i].Q2max=80; h1DataDVCS[i].Wmin=85; h1DataDVCS[i].Wmax=140; h1DataDVCS[i].W=100; h1DataDVCS[i].tmin=0; h1DataDVCS[i].tmax=0.2; h1DataDVCS[i].t=0.1; h1DataDVCS[i].xsection=10.9; h1DataDVCS[i].xsection_stat=1.14; h1DataDVCS[i].xsection_sys=2.36; i++; h1DataDVCS[i].Q2=10; h1DataDVCS[i].Q2min=6.5; h1DataDVCS[i].Q2max=80; h1DataDVCS[i].Wmin=85; h1DataDVCS[i].Wmax=140; h1DataDVCS[i].W=100; h1DataDVCS[i].tmin=0.2; h1DataDVCS[i].tmax=0.4; h1DataDVCS[i].t=0.3; h1DataDVCS[i].xsection=3.47; h1DataDVCS[i].xsection_stat=0.42; h1DataDVCS[i].xsection_sys=0.53; i++; h1DataDVCS[i].Q2=10; h1DataDVCS[i].Q2min=6.5; h1DataDVCS[i].Q2max=80; h1DataDVCS[i].Wmin=85; h1DataDVCS[i].Wmax=140; h1DataDVCS[i].W=100; h1DataDVCS[i].tmin=0.4; h1DataDVCS[i].tmax=0.6; h1DataDVCS[i].t=0.5; h1DataDVCS[i].xsection=1.49; h1DataDVCS[i].xsection_stat=0.21; h1DataDVCS[i].xsection_sys=0.24; i++; h1DataDVCS[i].Q2=10; h1DataDVCS[i].Q2min=6.5; h1DataDVCS[i].Q2max=80; h1DataDVCS[i].Wmin=85; h1DataDVCS[i].Wmax=140; h1DataDVCS[i].W=100; h1DataDVCS[i].tmin=0.6; h1DataDVCS[i].tmax=1; h1DataDVCS[i].t=0.8; h1DataDVCS[i].xsection=0.19; h1DataDVCS[i].xsection_stat=0.04; h1DataDVCS[i].xsection_sys=0.06; i++; */ // Table 4a i=0; h1DataDVCS_table4[i].Q2min=6.5; h1DataDVCS_table4[i].Q2max=11; h1DataDVCS_table4[i].Q2=8.; h1DataDVCS_table4[i].Wmin=30; h1DataDVCS_table4[i].Wmax=50; h1DataDVCS_table4[i].W=40; h1DataDVCS_table4[i].tmin=0; h1DataDVCS_table4[i].tmax=0.2; h1DataDVCS_table4[i].t=0.1; h1DataDVCS_table4[i].xsection=8.10; h1DataDVCS_table4[i].xsection_stat=1.22; h1DataDVCS_table4[i].xsection_sys=0.82; i++; h1DataDVCS_table4[i].Q2min=6.5; h1DataDVCS_table4[i].Q2max=11; h1DataDVCS_table4[i].Q2=8.; h1DataDVCS_table4[i].Wmin=30; h1DataDVCS_table4[i].Wmax=50; h1DataDVCS_table4[i].W=40; h1DataDVCS_table4[i].tmin=0.2; h1DataDVCS_table4[i].tmax=0.4; h1DataDVCS_table4[i].t=0.3; h1DataDVCS_table4[i].xsection=2.30; h1DataDVCS_table4[i].xsection_stat=0.54; h1DataDVCS_table4[i].xsection_sys=0.28; i++; h1DataDVCS_table4[i].Q2min=6.5; h1DataDVCS_table4[i].Q2max=11; h1DataDVCS_table4[i].Q2=8.; h1DataDVCS_table4[i].Wmin=30; h1DataDVCS_table4[i].Wmax=50; h1DataDVCS_table4[i].W=40; h1DataDVCS_table4[i].tmin=0.4; h1DataDVCS_table4[i].tmax=0.6; h1DataDVCS_table4[i].t=0.5; h1DataDVCS_table4[i].xsection=0.45; h1DataDVCS_table4[i].xsection_stat=0.22; h1DataDVCS_table4[i].xsection_sys=0.10; i++; h1DataDVCS_table4[i].Q2min=6.5; h1DataDVCS_table4[i].Q2max=11; h1DataDVCS_table4[i].Q2=8.; h1DataDVCS_table4[i].Wmin=30; h1DataDVCS_table4[i].Wmax=50; h1DataDVCS_table4[i].W=40; h1DataDVCS_table4[i].tmin=0.6; h1DataDVCS_table4[i].tmax=1; h1DataDVCS_table4[i].t=0.8; h1DataDVCS_table4[i].xsection=0.16; h1DataDVCS_table4[i].xsection_stat=0.06; h1DataDVCS_table4[i].xsection_sys=0.03; i++; //- h1DataDVCS_table4[i].Q2min=6.5; h1DataDVCS_table4[i].Q2max=11; h1DataDVCS_table4[i].Q2=8.; h1DataDVCS_table4[i].Wmin=50; h1DataDVCS_table4[i].Wmax=85; h1DataDVCS_table4[i].W=70; h1DataDVCS_table4[i].tmin=0; h1DataDVCS_table4[i].tmax=0.2; h1DataDVCS_table4[i].t=0.1; h1DataDVCS_table4[i].xsection=10.0; h1DataDVCS_table4[i].xsection_stat=1.30; h1DataDVCS_table4[i].xsection_sys=1.27; i++; h1DataDVCS_table4[i].Q2min=6.5; h1DataDVCS_table4[i].Q2max=11; h1DataDVCS_table4[i].Q2=8.; h1DataDVCS_table4[i].Wmin=50; h1DataDVCS_table4[i].Wmax=85; h1DataDVCS_table4[i].W=70; h1DataDVCS_table4[i].tmin=0.2; h1DataDVCS_table4[i].tmax=0.4; h1DataDVCS_table4[i].t=0.3; h1DataDVCS_table4[i].xsection=4.35; h1DataDVCS_table4[i].xsection_stat=0.63; h1DataDVCS_table4[i].xsection_sys=0.46; i++; h1DataDVCS_table4[i].Q2min=6.5; h1DataDVCS_table4[i].Q2max=11; h1DataDVCS_table4[i].Q2=8.; h1DataDVCS_table4[i].Wmin=50; h1DataDVCS_table4[i].Wmax=85; h1DataDVCS_table4[i].W=70; h1DataDVCS_table4[i].tmin=0.4; h1DataDVCS_table4[i].tmax=0.6; h1DataDVCS_table4[i].t=0.5; h1DataDVCS_table4[i].xsection=1.08; h1DataDVCS_table4[i].xsection_stat=0.27; h1DataDVCS_table4[i].xsection_sys=0.17; i++; h1DataDVCS_table4[i].Q2min=6.5; h1DataDVCS_table4[i].Q2max=11; h1DataDVCS_table4[i].Q2=8.; h1DataDVCS_table4[i].Wmin=50; h1DataDVCS_table4[i].Wmax=85; h1DataDVCS_table4[i].W=70; h1DataDVCS_table4[i].tmin=0.6; h1DataDVCS_table4[i].tmax=1; h1DataDVCS_table4[i].t=0.8; h1DataDVCS_table4[i].xsection=0.13; h1DataDVCS_table4[i].xsection_stat=0.06; h1DataDVCS_table4[i].xsection_sys=0.04; i++; //- h1DataDVCS_table4[i].Q2min=6.5; h1DataDVCS_table4[i].Q2max=11; h1DataDVCS_table4[i].Q2=8.; h1DataDVCS_table4[i].Wmin=85; h1DataDVCS_table4[i].Wmax=140; h1DataDVCS_table4[i].W=100; h1DataDVCS_table4[i].tmin=0; h1DataDVCS_table4[i].tmax=0.2; h1DataDVCS_table4[i].t=0.1; h1DataDVCS_table4[i].xsection=16.0; h1DataDVCS_table4[i].xsection_stat=2.11; h1DataDVCS_table4[i].xsection_sys=2.74; i++; h1DataDVCS_table4[i].Q2min=6.5; h1DataDVCS_table4[i].Q2max=11; h1DataDVCS_table4[i].Q2=8.; h1DataDVCS_table4[i].Wmin=85; h1DataDVCS_table4[i].Wmax=140; h1DataDVCS_table4[i].W=100; h1DataDVCS_table4[i].tmin=0.2; h1DataDVCS_table4[i].tmax=0.4; h1DataDVCS_table4[i].t=0.3; h1DataDVCS_table4[i].xsection=5.45; h1DataDVCS_table4[i].xsection_stat=0.80; h1DataDVCS_table4[i].xsection_sys=0.73; i++; h1DataDVCS_table4[i].Q2min=6.5; h1DataDVCS_table4[i].Q2max=11; h1DataDVCS_table4[i].Q2=8.; h1DataDVCS_table4[i].Wmin=85; h1DataDVCS_table4[i].Wmax=140; h1DataDVCS_table4[i].W=100; h1DataDVCS_table4[i].tmin=0.4; h1DataDVCS_table4[i].tmax=0.6; h1DataDVCS_table4[i].t=0.5; h1DataDVCS_table4[i].xsection=1.96; h1DataDVCS_table4[i].xsection_stat=0.41; h1DataDVCS_table4[i].xsection_sys=0.35; i++; h1DataDVCS_table4[i].Q2min=6.5; h1DataDVCS_table4[i].Q2max=11; h1DataDVCS_table4[i].Q2=8.; h1DataDVCS_table4[i].Wmin=85; h1DataDVCS_table4[i].Wmax=140; h1DataDVCS_table4[i].W=100; h1DataDVCS_table4[i].tmin=0.6; h1DataDVCS_table4[i].tmax=1; h1DataDVCS_table4[i].t=0.8; h1DataDVCS_table4[i].xsection=0.21; h1DataDVCS_table4[i].xsection_stat=0.09; h1DataDVCS_table4[i].xsection_sys=0.08; i++; // Table 4b h1DataDVCS_table4[i].Q2min=11; h1DataDVCS_table4[i].Q2max=80; h1DataDVCS_table4[i].Q2=20.; h1DataDVCS_table4[i].Wmin=30; h1DataDVCS_table4[i].Wmax=50; h1DataDVCS_table4[i].W=40; h1DataDVCS_table4[i].tmin=0; h1DataDVCS_table4[i].tmax=0.2; h1DataDVCS_table4[i].t=0.1; h1DataDVCS_table4[i].xsection=1.06; h1DataDVCS_table4[i].xsection_stat=0.28; h1DataDVCS_table4[i].xsection_sys=0.28; i++; h1DataDVCS_table4[i].Q2min=11; h1DataDVCS_table4[i].Q2max=80; h1DataDVCS_table4[i].Q2=20.; h1DataDVCS_table4[i].Wmin=30; h1DataDVCS_table4[i].Wmax=50; h1DataDVCS_table4[i].W=40; h1DataDVCS_table4[i].tmin=0.2; h1DataDVCS_table4[i].tmax=0.4; h1DataDVCS_table4[i].t=0.3; h1DataDVCS_table4[i].xsection=0.33; h1DataDVCS_table4[i].xsection_stat=0.07; h1DataDVCS_table4[i].xsection_sys=0.07; i++; h1DataDVCS_table4[i].Q2min=11; h1DataDVCS_table4[i].Q2max=80; h1DataDVCS_table4[i].Q2=20.; h1DataDVCS_table4[i].Wmin=30; h1DataDVCS_table4[i].Wmax=50; h1DataDVCS_table4[i].W=40; h1DataDVCS_table4[i].tmin=0.4; h1DataDVCS_table4[i].tmax=0.6; h1DataDVCS_table4[i].t=0.5; h1DataDVCS_table4[i].xsection=0.22; h1DataDVCS_table4[i].xsection_stat=0.06; h1DataDVCS_table4[i].xsection_sys=0.06; i++; h1DataDVCS_table4[i].Q2min=11; h1DataDVCS_table4[i].Q2max=80; h1DataDVCS_table4[i].Q2=20.; h1DataDVCS_table4[i].Wmin=30; h1DataDVCS_table4[i].Wmax=50; h1DataDVCS_table4[i].W=40; h1DataDVCS_table4[i].tmin=0.6; h1DataDVCS_table4[i].tmax=1; h1DataDVCS_table4[i].t=0.8; h1DataDVCS_table4[i].xsection=0.04; h1DataDVCS_table4[i].xsection_stat=0.01; h1DataDVCS_table4[i].xsection_sys=0.01; i++; //- h1DataDVCS_table4[i].Q2min=11; h1DataDVCS_table4[i].Q2max=80; h1DataDVCS_table4[i].Q2=20.; h1DataDVCS_table4[i].Wmin=50; h1DataDVCS_table4[i].Wmax=85; h1DataDVCS_table4[i].W=70; h1DataDVCS_table4[i].tmin=0; h1DataDVCS_table4[i].tmax=0.2; h1DataDVCS_table4[i].t=0.1; h1DataDVCS_table4[i].xsection=2.38; h1DataDVCS_table4[i].xsection_stat=0.29; h1DataDVCS_table4[i].xsection_sys=0.26; i++; h1DataDVCS_table4[i].Q2min=11; h1DataDVCS_table4[i].Q2max=80; h1DataDVCS_table4[i].Q2=20.; h1DataDVCS_table4[i].Wmin=50; h1DataDVCS_table4[i].Wmax=85; h1DataDVCS_table4[i].W=70; h1DataDVCS_table4[i].tmin=0.2; h1DataDVCS_table4[i].tmax=0.4; h1DataDVCS_table4[i].t=0.3; h1DataDVCS_table4[i].xsection=0.67; h1DataDVCS_table4[i].xsection_stat=0.12; h1DataDVCS_table4[i].xsection_sys=0.07; i++; h1DataDVCS_table4[i].Q2min=11; h1DataDVCS_table4[i].Q2max=80; h1DataDVCS_table4[i].Q2=20.; h1DataDVCS_table4[i].Wmin=50; h1DataDVCS_table4[i].Wmax=85; h1DataDVCS_table4[i].W=70; h1DataDVCS_table4[i].tmin=0.4; h1DataDVCS_table4[i].tmax=0.6; h1DataDVCS_table4[i].t=0.5; h1DataDVCS_table4[i].xsection=0.24; h1DataDVCS_table4[i].xsection_stat=0.05; h1DataDVCS_table4[i].xsection_sys=0.03; i++; h1DataDVCS_table4[i].Q2min=11; h1DataDVCS_table4[i].Q2max=80; h1DataDVCS_table4[i].Q2=20.; h1DataDVCS_table4[i].Wmin=50; h1DataDVCS_table4[i].Wmax=85; h1DataDVCS_table4[i].W=70; h1DataDVCS_table4[i].tmin=0.6; h1DataDVCS_table4[i].tmax=1; h1DataDVCS_table4[i].t=0.8; h1DataDVCS_table4[i].xsection=0.07; h1DataDVCS_table4[i].xsection_stat=0.01; h1DataDVCS_table4[i].xsection_sys=0.02; i++; //- h1DataDVCS_table4[i].Q2min=11; h1DataDVCS_table4[i].Q2max=80; h1DataDVCS_table4[i].Q2=20.; h1DataDVCS_table4[i].Wmin=85; h1DataDVCS_table4[i].Wmax=140; h1DataDVCS_table4[i].W=100; h1DataDVCS_table4[i].tmin=0; h1DataDVCS_table4[i].tmax=0.2; h1DataDVCS_table4[i].t=0.1; h1DataDVCS_table4[i].xsection=2.98; h1DataDVCS_table4[i].xsection_stat=0.49; h1DataDVCS_table4[i].xsection_sys=0.85; i++; h1DataDVCS_table4[i].Q2min=11; h1DataDVCS_table4[i].Q2max=80; h1DataDVCS_table4[i].Q2=20.; h1DataDVCS_table4[i].Wmin=85; h1DataDVCS_table4[i].Wmax=140; h1DataDVCS_table4[i].W=100; h1DataDVCS_table4[i].tmin=0.2; h1DataDVCS_table4[i].tmax=0.4; h1DataDVCS_table4[i].t=0.3; h1DataDVCS_table4[i].xsection=0.89; h1DataDVCS_table4[i].xsection_stat=0.17; h1DataDVCS_table4[i].xsection_sys=0.17; i++; h1DataDVCS_table4[i].Q2min=11; h1DataDVCS_table4[i].Q2max=80; h1DataDVCS_table4[i].Q2=20.; h1DataDVCS_table4[i].Wmin=85; h1DataDVCS_table4[i].Wmax=140; h1DataDVCS_table4[i].W=100; h1DataDVCS_table4[i].tmin=0.4; h1DataDVCS_table4[i].tmax=0.6; h1DataDVCS_table4[i].t=0.5; h1DataDVCS_table4[i].xsection=0.44; h1DataDVCS_table4[i].xsection_stat=0.08; h1DataDVCS_table4[i].xsection_sys=0.08; i++; h1DataDVCS_table4[i].Q2min=11; h1DataDVCS_table4[i].Q2max=80; h1DataDVCS_table4[i].Q2=20.; h1DataDVCS_table4[i].Wmin=85; h1DataDVCS_table4[i].Wmax=140; h1DataDVCS_table4[i].W=100; h1DataDVCS_table4[i].tmin=0.6; h1DataDVCS_table4[i].tmax=1; h1DataDVCS_table4[i].t=0.8; h1DataDVCS_table4[i].xsection=0.06; h1DataDVCS_table4[i].xsection_stat=0.02; h1DataDVCS_table4[i].xsection_sys=0.02; i++; vec4 = h1DataDVCS_table4; } void loadPhiData(vector& vec1) { vector ZEUSDataPhi_table1(7+6+6+6+9); unsigned int i = 0; ZEUSDataPhi_table1[i].Wmin=35; ZEUSDataPhi_table1[i].Wmax=45; ZEUSDataPhi_table1[i].W=40; ZEUSDataPhi_table1[i].Q2min=2; ZEUSDataPhi_table1[i].Q2max=3; ZEUSDataPhi_table1[i].Q2=2.4; ZEUSDataPhi_table1[i].tmin=0; ZEUSDataPhi_table1[i].tmax=1; ZEUSDataPhi_table1[i].xsection=76.4; ZEUSDataPhi_table1[i].xsection_stat=6.5; ZEUSDataPhi_table1[i].xsection_sys=5.9; i++; ZEUSDataPhi_table1[i].Wmin=45; ZEUSDataPhi_table1[i].Wmax=55; ZEUSDataPhi_table1[i].W=50; ZEUSDataPhi_table1[i].Q2min=2; ZEUSDataPhi_table1[i].Q2max=3; ZEUSDataPhi_table1[i].Q2=2.4; ZEUSDataPhi_table1[i].tmin=0; ZEUSDataPhi_table1[i].tmax=1; ZEUSDataPhi_table1[i].xsection=101.2; ZEUSDataPhi_table1[i].xsection_stat=7.7; ZEUSDataPhi_table1[i].xsection_sys=8.1; i++; ZEUSDataPhi_table1[i].Wmin=55; ZEUSDataPhi_table1[i].Wmax=65; ZEUSDataPhi_table1[i].W=60; ZEUSDataPhi_table1[i].Q2min=2; ZEUSDataPhi_table1[i].Q2max=3; ZEUSDataPhi_table1[i].Q2=2.4; ZEUSDataPhi_table1[i].tmin=0; ZEUSDataPhi_table1[i].tmax=1; ZEUSDataPhi_table1[i].xsection=101.9; ZEUSDataPhi_table1[i].xsection_stat=8.3; ZEUSDataPhi_table1[i].xsection_sys=7.4; i++; ZEUSDataPhi_table1[i].Wmin=65; ZEUSDataPhi_table1[i].Wmax=75; ZEUSDataPhi_table1[i].W=70; ZEUSDataPhi_table1[i].Q2min=2; ZEUSDataPhi_table1[i].Q2max=3; ZEUSDataPhi_table1[i].Q2=2.4; ZEUSDataPhi_table1[i].tmin=0; ZEUSDataPhi_table1[i].tmax=1; ZEUSDataPhi_table1[i].xsection=112.8; ZEUSDataPhi_table1[i].xsection_stat=9.4; ZEUSDataPhi_table1[i].xsection_sys=7.6; i++; ZEUSDataPhi_table1[i].Wmin=75; ZEUSDataPhi_table1[i].Wmax=85; ZEUSDataPhi_table1[i].W=80; ZEUSDataPhi_table1[i].Q2min=2; ZEUSDataPhi_table1[i].Q2max=3; ZEUSDataPhi_table1[i].Q2=2.4; ZEUSDataPhi_table1[i].tmin=0; ZEUSDataPhi_table1[i].tmax=1; ZEUSDataPhi_table1[i].xsection=107.; ZEUSDataPhi_table1[i].xsection_stat=11.; ZEUSDataPhi_table1[i].xsection_sys=10.; i++; ZEUSDataPhi_table1[i].Wmin=85; ZEUSDataPhi_table1[i].Wmax=95; ZEUSDataPhi_table1[i].W=90; ZEUSDataPhi_table1[i].Q2min=2; ZEUSDataPhi_table1[i].Q2max=3; ZEUSDataPhi_table1[i].Q2=2.4; ZEUSDataPhi_table1[i].tmin=0; ZEUSDataPhi_table1[i].tmax=1; ZEUSDataPhi_table1[i].xsection=122; ZEUSDataPhi_table1[i].xsection_stat=11.; ZEUSDataPhi_table1[i].xsection_sys=10.; i++; ZEUSDataPhi_table1[i].Wmin=95; ZEUSDataPhi_table1[i].Wmax=105; ZEUSDataPhi_table1[i].W=100; ZEUSDataPhi_table1[i].Q2min=2; ZEUSDataPhi_table1[i].Q2max=3; ZEUSDataPhi_table1[i].Q2=2.4; ZEUSDataPhi_table1[i].tmin=0; ZEUSDataPhi_table1[i].tmax=1; ZEUSDataPhi_table1[i].xsection=110.; ZEUSDataPhi_table1[i].xsection_stat=11.; ZEUSDataPhi_table1[i].xsection_sys=8.; i++; //***** Q2 = 3.8 ****************** ZEUSDataPhi_table1[i].Wmin=40; ZEUSDataPhi_table1[i].Wmax=50; ZEUSDataPhi_table1[i].W=45; ZEUSDataPhi_table1[i].Q2min=3; ZEUSDataPhi_table1[i].Q2max=5; ZEUSDataPhi_table1[i].Q2=2.4; ZEUSDataPhi_table1[i].tmin=0; ZEUSDataPhi_table1[i].tmax=1; ZEUSDataPhi_table1[i].xsection=47.; ZEUSDataPhi_table1[i].xsection_stat=4.1; ZEUSDataPhi_table1[i].xsection_sys=2.5; i++; ZEUSDataPhi_table1[i].Wmin=50; ZEUSDataPhi_table1[i].Wmax=60; ZEUSDataPhi_table1[i].W=55; ZEUSDataPhi_table1[i].Q2min=3; ZEUSDataPhi_table1[i].Q2max=5; ZEUSDataPhi_table1[i].Q2=2.4; ZEUSDataPhi_table1[i].tmin=0; ZEUSDataPhi_table1[i].tmax=1; ZEUSDataPhi_table1[i].xsection=44.3; ZEUSDataPhi_table1[i].xsection_stat=4.5; ZEUSDataPhi_table1[i].xsection_sys=3.6; i++; ZEUSDataPhi_table1[i].Wmin=60; ZEUSDataPhi_table1[i].Wmax=70; ZEUSDataPhi_table1[i].W=65; ZEUSDataPhi_table1[i].Q2min=3; ZEUSDataPhi_table1[i].Q2max=5; ZEUSDataPhi_table1[i].Q2=2.4; ZEUSDataPhi_table1[i].tmin=0; ZEUSDataPhi_table1[i].tmax=1; ZEUSDataPhi_table1[i].xsection=56.7; ZEUSDataPhi_table1[i].xsection_stat=5.1; ZEUSDataPhi_table1[i].xsection_sys=4.; i++; ZEUSDataPhi_table1[i].Wmin=70; ZEUSDataPhi_table1[i].Wmax=85; ZEUSDataPhi_table1[i].W=77.5; ZEUSDataPhi_table1[i].Q2min=3; ZEUSDataPhi_table1[i].Q2max=5; ZEUSDataPhi_table1[i].Q2=2.4; ZEUSDataPhi_table1[i].tmin=0; ZEUSDataPhi_table1[i].tmax=1; ZEUSDataPhi_table1[i].xsection=62.3; ZEUSDataPhi_table1[i].xsection_stat=5.; ZEUSDataPhi_table1[i].xsection_sys=4.3; i++; ZEUSDataPhi_table1[i].Wmin=85; ZEUSDataPhi_table1[i].Wmax=100; ZEUSDataPhi_table1[i].W=92.5; ZEUSDataPhi_table1[i].Q2min=3; ZEUSDataPhi_table1[i].Q2max=5; ZEUSDataPhi_table1[i].Q2=2.4; ZEUSDataPhi_table1[i].tmin=0; ZEUSDataPhi_table1[i].tmax=1; ZEUSDataPhi_table1[i].xsection=57.4; ZEUSDataPhi_table1[i].xsection_stat=5.4; ZEUSDataPhi_table1[i].xsection_sys=4.3; i++; ZEUSDataPhi_table1[i].Wmin=100; ZEUSDataPhi_table1[i].Wmax=115; ZEUSDataPhi_table1[i].W=107.5; ZEUSDataPhi_table1[i].Q2min=3; ZEUSDataPhi_table1[i].Q2max=5; ZEUSDataPhi_table1[i].Q2=2.4; ZEUSDataPhi_table1[i].tmin=0; ZEUSDataPhi_table1[i].tmax=1; ZEUSDataPhi_table1[i].xsection=59.0; ZEUSDataPhi_table1[i].xsection_stat=6.2; ZEUSDataPhi_table1[i].xsection_sys=3.; i++; //*******Q2=6.5****************** ZEUSDataPhi_table1[i].Wmin=45; ZEUSDataPhi_table1[i].Wmax=55; ZEUSDataPhi_table1[i].W=50; ZEUSDataPhi_table1[i].Q2min=5; ZEUSDataPhi_table1[i].Q2max=9; ZEUSDataPhi_table1[i].Q2=6.5; ZEUSDataPhi_table1[i].tmin=0; ZEUSDataPhi_table1[i].tmax=1; ZEUSDataPhi_table1[i].xsection=16.4; ZEUSDataPhi_table1[i].xsection_stat=1.8; ZEUSDataPhi_table1[i].xsection_sys=1.1; i++; ZEUSDataPhi_table1[i].Wmin=55; ZEUSDataPhi_table1[i].Wmax=70; ZEUSDataPhi_table1[i].W=62.5; ZEUSDataPhi_table1[i].Q2min=5; ZEUSDataPhi_table1[i].Q2max=9; ZEUSDataPhi_table1[i].Q2=6.5; ZEUSDataPhi_table1[i].tmin=0; ZEUSDataPhi_table1[i].tmax=1; ZEUSDataPhi_table1[i].xsection=19.1; ZEUSDataPhi_table1[i].xsection_stat=1.7; ZEUSDataPhi_table1[i].xsection_sys=1.5; i++; ZEUSDataPhi_table1[i].Wmin=70; ZEUSDataPhi_table1[i].Wmax=85; ZEUSDataPhi_table1[i].W=77.5; ZEUSDataPhi_table1[i].Q2min=5; ZEUSDataPhi_table1[i].Q2max=9; ZEUSDataPhi_table1[i].Q2=6.5; ZEUSDataPhi_table1[i].tmin=0; ZEUSDataPhi_table1[i].tmax=1; ZEUSDataPhi_table1[i].xsection=19.6; ZEUSDataPhi_table1[i].xsection_stat=1.9; ZEUSDataPhi_table1[i].xsection_sys=1.6; i++; ZEUSDataPhi_table1[i].Wmin=85; ZEUSDataPhi_table1[i].Wmax=100; ZEUSDataPhi_table1[i].W=92.5; ZEUSDataPhi_table1[i].Q2min=5; ZEUSDataPhi_table1[i].Q2max=9; ZEUSDataPhi_table1[i].Q2=6.5; ZEUSDataPhi_table1[i].tmin=0; ZEUSDataPhi_table1[i].tmax=1; ZEUSDataPhi_table1[i].xsection=21.6; ZEUSDataPhi_table1[i].xsection_stat=2.3; ZEUSDataPhi_table1[i].xsection_sys=1.1; i++; ZEUSDataPhi_table1[i].Wmin=100; ZEUSDataPhi_table1[i].Wmax=115; ZEUSDataPhi_table1[i].W=107.5; ZEUSDataPhi_table1[i].Q2min=5; ZEUSDataPhi_table1[i].Q2max=9; ZEUSDataPhi_table1[i].Q2=6.5; ZEUSDataPhi_table1[i].tmin=0; ZEUSDataPhi_table1[i].tmax=1; ZEUSDataPhi_table1[i].xsection=23.1; ZEUSDataPhi_table1[i].xsection_stat=2.5; ZEUSDataPhi_table1[i].xsection_sys=1.3; i++; ZEUSDataPhi_table1[i].Wmin=115; ZEUSDataPhi_table1[i].Wmax=135; ZEUSDataPhi_table1[i].W=125; ZEUSDataPhi_table1[i].Q2min=5; ZEUSDataPhi_table1[i].Q2max=9; ZEUSDataPhi_table1[i].Q2=6.5; ZEUSDataPhi_table1[i].tmin=0; ZEUSDataPhi_table1[i].tmax=1; ZEUSDataPhi_table1[i].xsection=25.3; ZEUSDataPhi_table1[i].xsection_stat=3.5; ZEUSDataPhi_table1[i].xsection_sys=3.9; i++; //*******Q2=13.0****************** ZEUSDataPhi_table1[i].Wmin=50; ZEUSDataPhi_table1[i].Wmax=60; ZEUSDataPhi_table1[i].W=55; ZEUSDataPhi_table1[i].Q2min=9; ZEUSDataPhi_table1[i].Q2max=30; ZEUSDataPhi_table1[i].Q2=13.; ZEUSDataPhi_table1[i].tmin=0; ZEUSDataPhi_table1[i].tmax=1; ZEUSDataPhi_table1[i].xsection=5.05; ZEUSDataPhi_table1[i].xsection_stat=.73; ZEUSDataPhi_table1[i].xsection_sys=.37; i++; ZEUSDataPhi_table1[i].Wmin=60; ZEUSDataPhi_table1[i].Wmax=75; ZEUSDataPhi_table1[i].W=67.5; ZEUSDataPhi_table1[i].Q2min=9; ZEUSDataPhi_table1[i].Q2max=30; ZEUSDataPhi_table1[i].Q2=13.; ZEUSDataPhi_table1[i].tmin=0; ZEUSDataPhi_table1[i].tmax=1; ZEUSDataPhi_table1[i].xsection=4.96; ZEUSDataPhi_table1[i].xsection_stat=.59; ZEUSDataPhi_table1[i].xsection_sys=.27; i++; ZEUSDataPhi_table1[i].Wmin=75; ZEUSDataPhi_table1[i].Wmax=90; ZEUSDataPhi_table1[i].W=82.5; ZEUSDataPhi_table1[i].Q2min=9; ZEUSDataPhi_table1[i].Q2max=30; ZEUSDataPhi_table1[i].Q2=13.; ZEUSDataPhi_table1[i].tmin=0; ZEUSDataPhi_table1[i].tmax=1; ZEUSDataPhi_table1[i].xsection=6.12; ZEUSDataPhi_table1[i].xsection_stat=.81; ZEUSDataPhi_table1[i].xsection_sys=.4; i++; ZEUSDataPhi_table1[i].Wmin=90; ZEUSDataPhi_table1[i].Wmax=105; ZEUSDataPhi_table1[i].W=97.5; ZEUSDataPhi_table1[i].Q2min=9; ZEUSDataPhi_table1[i].Q2max=30; ZEUSDataPhi_table1[i].Q2=13.; ZEUSDataPhi_table1[i].tmin=0; ZEUSDataPhi_table1[i].tmax=1; ZEUSDataPhi_table1[i].xsection=6.82; ZEUSDataPhi_table1[i].xsection_stat=.85; ZEUSDataPhi_table1[i].xsection_sys=.4; i++; ZEUSDataPhi_table1[i].Wmin=105; ZEUSDataPhi_table1[i].Wmax=125; ZEUSDataPhi_table1[i].W=115; ZEUSDataPhi_table1[i].Q2min=9; ZEUSDataPhi_table1[i].Q2max=30; ZEUSDataPhi_table1[i].Q2=13.; ZEUSDataPhi_table1[i].tmin=0; ZEUSDataPhi_table1[i].tmax=1; ZEUSDataPhi_table1[i].xsection=6.33; ZEUSDataPhi_table1[i].xsection_stat=.78; ZEUSDataPhi_table1[i].xsection_sys=.5; i++; ZEUSDataPhi_table1[i].Wmin=125; ZEUSDataPhi_table1[i].Wmax=145; ZEUSDataPhi_table1[i].W=135; ZEUSDataPhi_table1[i].Q2min=9; ZEUSDataPhi_table1[i].Q2max=30; ZEUSDataPhi_table1[i].Q2=13.; ZEUSDataPhi_table1[i].tmin=0; ZEUSDataPhi_table1[i].tmax=1; ZEUSDataPhi_table1[i].xsection=6.65; ZEUSDataPhi_table1[i].xsection_stat=.97; ZEUSDataPhi_table1[i].xsection_sys=.52; i++; //*****Q2 cross-section********** ZEUSDataPhi_table1[i].Wmin=35; ZEUSDataPhi_table1[i].Wmax=142; ZEUSDataPhi_table1[i].W=75; ZEUSDataPhi_table1[i].Q2min=2; ZEUSDataPhi_table1[i].Q2max=3; ZEUSDataPhi_table1[i].Q2=2.4; ZEUSDataPhi_table1[i].tmin=0; ZEUSDataPhi_table1[i].tmax=1; ZEUSDataPhi_table1[i].xsection=105.5; ZEUSDataPhi_table1[i].xsection_stat=3.4; ZEUSDataPhi_table1[i].xsection_sys=6.; i++; ZEUSDataPhi_table1[i].Wmin=35; ZEUSDataPhi_table1[i].Wmax=142; ZEUSDataPhi_table1[i].W=75; ZEUSDataPhi_table1[i].Q2min=3; ZEUSDataPhi_table1[i].Q2max=4.5; ZEUSDataPhi_table1[i].Q2=3.6; ZEUSDataPhi_table1[i].tmin=0; ZEUSDataPhi_table1[i].tmax=1; ZEUSDataPhi_table1[i].xsection=57.6; ZEUSDataPhi_table1[i].xsection_stat=2.4; ZEUSDataPhi_table1[i].xsection_sys=3.5; i++; ZEUSDataPhi_table1[i].Wmin=35; ZEUSDataPhi_table1[i].Wmax=142; ZEUSDataPhi_table1[i].W=75; ZEUSDataPhi_table1[i].Q2min=4.5; ZEUSDataPhi_table1[i].Q2max=6; ZEUSDataPhi_table1[i].Q2=5.2; ZEUSDataPhi_table1[i].tmin=0; ZEUSDataPhi_table1[i].tmax=1; ZEUSDataPhi_table1[i].xsection=31.1; ZEUSDataPhi_table1[i].xsection_stat=1.8; ZEUSDataPhi_table1[i].xsection_sys=1.8; i++; ZEUSDataPhi_table1[i].Wmin=35; ZEUSDataPhi_table1[i].Wmax=142; ZEUSDataPhi_table1[i].W=75; ZEUSDataPhi_table1[i].Q2min=6; ZEUSDataPhi_table1[i].Q2max=8; ZEUSDataPhi_table1[i].Q2=6.9; ZEUSDataPhi_table1[i].tmin=0; ZEUSDataPhi_table1[i].tmax=1; ZEUSDataPhi_table1[i].xsection=17.9; ZEUSDataPhi_table1[i].xsection_stat=1.1; ZEUSDataPhi_table1[i].xsection_sys=1.; i++; ZEUSDataPhi_table1[i].Wmin=35; ZEUSDataPhi_table1[i].Wmax=142; ZEUSDataPhi_table1[i].W=75; ZEUSDataPhi_table1[i].Q2min=8; ZEUSDataPhi_table1[i].Q2max=11; ZEUSDataPhi_table1[i].Q2=9.2; ZEUSDataPhi_table1[i].tmin=0; ZEUSDataPhi_table1[i].tmax=1; ZEUSDataPhi_table1[i].xsection=11.06; ZEUSDataPhi_table1[i].xsection_stat=0.73; ZEUSDataPhi_table1[i].xsection_sys=0.56; i++; ZEUSDataPhi_table1[i].Wmin=35; ZEUSDataPhi_table1[i].Wmax=142; ZEUSDataPhi_table1[i].W=75; ZEUSDataPhi_table1[i].Q2min=11; ZEUSDataPhi_table1[i].Q2max=15; ZEUSDataPhi_table1[i].Q2=12.6; ZEUSDataPhi_table1[i].tmin=0; ZEUSDataPhi_table1[i].tmax=1; ZEUSDataPhi_table1[i].xsection=6.42; ZEUSDataPhi_table1[i].xsection_stat=0.52; ZEUSDataPhi_table1[i].xsection_sys=0.24; i++; ZEUSDataPhi_table1[i].Wmin=35; ZEUSDataPhi_table1[i].Wmax=142; ZEUSDataPhi_table1[i].W=75; ZEUSDataPhi_table1[i].Q2min=15; ZEUSDataPhi_table1[i].Q2max=20; ZEUSDataPhi_table1[i].Q2=17.1; ZEUSDataPhi_table1[i].tmin=0; ZEUSDataPhi_table1[i].tmax=1; ZEUSDataPhi_table1[i].xsection=2.5; ZEUSDataPhi_table1[i].xsection_stat=0.37; ZEUSDataPhi_table1[i].xsection_sys=0.22; i++; ZEUSDataPhi_table1[i].Wmin=35; ZEUSDataPhi_table1[i].Wmax=142; ZEUSDataPhi_table1[i].W=75; ZEUSDataPhi_table1[i].Q2min=20; ZEUSDataPhi_table1[i].Q2max=30; ZEUSDataPhi_table1[i].Q2=24.; ZEUSDataPhi_table1[i].tmin=0; ZEUSDataPhi_table1[i].tmax=1; ZEUSDataPhi_table1[i].xsection=0.98; ZEUSDataPhi_table1[i].xsection_stat=0.19; ZEUSDataPhi_table1[i].xsection_sys=0.05; i++; ZEUSDataPhi_table1[i].Wmin=35; ZEUSDataPhi_table1[i].Wmax=142; ZEUSDataPhi_table1[i].W=75; ZEUSDataPhi_table1[i].Q2min=30; ZEUSDataPhi_table1[i].Q2max=70; ZEUSDataPhi_table1[i].Q2=38.8; ZEUSDataPhi_table1[i].tmin=0; ZEUSDataPhi_table1[i].tmax=1; ZEUSDataPhi_table1[i].xsection=0.37; ZEUSDataPhi_table1[i].xsection_stat=0.13; ZEUSDataPhi_table1[i].xsection_sys=0.04; i++; vec1 = ZEUSDataPhi_table1; }