Page MenuHomeHEPForge

No OneTemporary

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1c6a7b2..1644b80 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,177 +1,185 @@
cmake_minimum_required(VERSION 3.1 FATAL_ERROR)
set(CMAKE_LEGACY_CYGWIN_WIN32 0)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
project("Reversed HEJ" VERSION 0.0.1 LANGUAGES C CXX)
## Flags for the compiler. No warning allowed.
if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Werror")
elseif (MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4 /WX /EHsc")
endif()
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD 14)
## Create Version
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
# Get the latest abbreviated commit hash of the working branch
execute_process(
COMMAND git rev-parse HEAD
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
OUTPUT_VARIABLE PROJECT_GIT_REVISION
OUTPUT_STRIP_TRAILING_WHITESPACE
)
# Get the current working branch
execute_process(
COMMAND git rev-parse --abbrev-ref HEAD
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
OUTPUT_VARIABLE PROJECT_GIT_BRANCH
OUTPUT_STRIP_TRAILING_WHITESPACE
)
CONFIGURE_FILE( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Templates/Version.hh.in
${PROJECT_BINARY_DIR}/include/RHEJ/Version.hh @ONLY )
## Add directories and find dependences
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include ${PROJECT_BINARY_DIR}/include)
find_package(fastjet REQUIRED)
include_directories(${fastjet_INCLUDE_PATH})
find_package(clhep 2.3 REQUIRED)
include_directories(${clhep_INCLUDE_PATH})
find_package(lhapdf REQUIRED)
include_directories(${lhapdf_INCLUDE_PATH})
find_package(gsl REQUIRED)
include_directories(${gsl_INCLUDE_PATH})
find_package(Boost REQUIRED COMPONENTS iostreams)
include_directories(${Boost_INCLUDE_DIRS})
find_package(yaml-cpp)
include_directories(${YAML_CPP_INCLUDE_DIR})
find_package(HepMC 2)
if(${HepMC_FOUND})
message (STATUS "HepMC installation found: ${HepMC_INCLUDE_DIRS}")
set(
CMAKE_CXX_FLAGS
"${CMAKE_CXX_FLAGS} -DRHEJ_BUILD_WITH_HepMC_VERSION=${HepMC_VERSION_MAJOR}"
)
include_directories(${HepMC_INCLUDE_DIRS})
+ find_package(rivet)
+ if(${rivet_FOUND})
+ include_directories(${rivet_INCLUDE_PATH})
+ set(
+ CMAKE_CXX_FLAGS
+ "${CMAKE_CXX_FLAGS} -DRHEJ_BUILD_WITH_RIVET"
+ )
+ endif()
endif()
find_package(QCDloop 2)
if(${QCDloop_FOUND})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DRHEJ_BUILD_WITH_QCDLOOP")
include_directories(SYSTEM ${QCDloop_INCLUDE_DIRS})
endif()
add_subdirectory(src)
## define executable
add_executable(rHEJ src/main.cc)
## link libraries
target_link_libraries(rHEJ rhej)
#plugins
add_subdirectory("analysis-plugins")
file(GLOB rhej_headers ${CMAKE_CURRENT_SOURCE_DIR}/include/RHEJ/*.hh ${PROJECT_BINARY_DIR}/include/RHEJ/*.hh)
file(GLOB lhef_headers ${CMAKE_CURRENT_SOURCE_DIR}/include/LHEF/*.h)
install(FILES ${rhej_headers} DESTINATION include/RHEJ/)
install(FILES ${lhef_headers} DESTINATION include/LHEF/)
install(TARGETS rHEJ DESTINATION bin)
enable_testing()
set(tst_dir "${CMAKE_CURRENT_SOURCE_DIR}/t")
add_executable(test_Matrix ${tst_dir}/test_Matrix.cc)
add_executable(test_classify ${tst_dir}/test_classify.cc)
add_executable(test_psp ${tst_dir}/test_psp.cc)
add_executable(test_ME_h_3j ${tst_dir}/test_ME_h_3j.cc)
add_executable(test_ME_hjets_mt174 ${tst_dir}/test_ME_hjets_mt174.cc)
add_executable(check_res ${tst_dir}/check_res.cc)
add_executable(check_lhe ${tst_dir}/check_lhe.cc)
add_library(scales SHARED ${tst_dir}/scales.cc)
add_executable(test_scale_import ${tst_dir}/test_scale_import)
target_link_libraries(test_Matrix rhej)
target_link_libraries(test_classify rhej)
target_link_libraries(test_psp rhej)
target_link_libraries(test_ME_h_3j rhej)
target_link_libraries(test_ME_hjets_mt174 rhej)
target_link_libraries(check_res rhej)
target_link_libraries(check_lhe rhej)
target_link_libraries(test_scale_import rhej)
add_test(
NAME t_matrix
COMMAND test_Matrix
)
add_test(
NAME t_classify
COMMAND test_classify ${tst_dir}/classify.lhe.gz
)
add_test(
NAME t_psp
COMMAND test_psp ${tst_dir}/psp_gen.lhe.gz
)
add_test(
NAME t_ME
COMMAND test_ME_h_3j
)
if(${QCDloop_FOUND})
add_test(
NAME t_ME_mt174
COMMAND test_ME_hjets_mt174
)
endif()
add_test(
NAME t_2j
COMMAND check_res ${tst_dir}/2j.lhe.gz 3.382e7 752159
)
add_test(
NAME t_3j
COMMAND check_res ${tst_dir}/3j.lhe.gz 2.5019e+06 97075
)
add_test(
NAME t_4j
COMMAND check_res ${tst_dir}/4j.lhe.gz 479170 19203.9
)
add_test(
NAME t_h_3j
COMMAND check_res ${tst_dir}/h_3j.lhe.gz 0.793107 0.0479054
)
add_test(
NAME t_h_3j_uno
COMMAND check_res ${tst_dir}/h_3j_uno.lhe.gz 0.0260428 0.00129855 uno
)
if(${HepMC_FOUND})
file(READ "${tst_dir}/jet_config.yml" config)
file(WRITE "${tst_dir}/jet_config_withHepMC.yml" "${config} - tst.hepmc")
add_test(
NAME t_main
COMMAND rHEJ ${tst_dir}/jet_config_withHepMC.yml ${tst_dir}/2j.lhe.gz
)
if(${HepMC_VERSION_MAJOR} GREATER 2)
add_executable(check_hepmc ${tst_dir}/check_hepmc.cc)
target_link_libraries(check_hepmc rhej)
add_test(
NAME t_hepmc
COMMAND check_hepmc tst.hepmc
)
endif()
else()
add_test(
NAME t_main
COMMAND rHEJ ${tst_dir}/jet_config.yml ${tst_dir}/2j.lhe.gz
)
endif()
add_test(
NAME t_lhe
COMMAND check_lhe tst.lhe
)
add_test(
NAME t_scale_import
COMMAND test_scale_import ${tst_dir}/jet_config_with_import.yml
)
diff --git a/FixedOrderGen/CMakeLists.txt b/FixedOrderGen/CMakeLists.txt
index 16d9a1a..c4a5067 100644
--- a/FixedOrderGen/CMakeLists.txt
+++ b/FixedOrderGen/CMakeLists.txt
@@ -1,68 +1,62 @@
cmake_minimum_required(VERSION 3.1 FATAL_ERROR)
set(CMAKE_LEGACY_CYGWIN_WIN32 0)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
project("Fixed Order Generation" C CXX)
## Flags for the compiler. No warning allowed.
if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Werror")
elseif (MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4 /WX /EHsc")
endif()
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD 14)
## Add directories and find dependences
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/../include)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/../cmake/Modules/")
find_package(fastjet REQUIRED)
include_directories(${fastjet_INCLUDE_PATH})
find_package(clhep 2.3 REQUIRED)
include_directories(${clhep_INCLUDE_PATH})
find_package(lhapdf REQUIRED)
include_directories(${lhapdf_INCLUDE_PATH})
-find_package(gsl REQUIRED)
-include_directories(${gsl_INCLUDE_PATH})
find_package(Boost REQUIRED COMPONENTS iostreams)
include_directories(${Boost_INCLUDE_DIRS})
find_package(yaml-cpp)
include_directories(${YAML_CPP_INCLUDE_DIR})
-find_package(HepMC 2)
find_package(QCDloop 2)
if(${QCDloop_FOUND})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DRHEJ_BUILD_WITH_QCDLOOP")
include_directories(SYSTEM ${QCDloop_INCLUDE_DIRS})
endif()
## define executable
file(GLOB FOgen_source ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cc)
list(REMOVE_ITEM FOgen_source ${CMAKE_CURRENT_SOURCE_DIR}/src/main.cc)
add_library(hejfog STATIC ${FOgen_source})
add_executable(FOgen ${CMAKE_CURRENT_SOURCE_DIR}/src/main.cc)
## link libraries
-set(libraries ${CMAKE_DL_LIBS} ${LHAPDF_LIBRARIES} ${CLHEP_LIBRARIES} ${FASTJET_LIBRARIES} ${GSL_LIBRARIES} ${Boost_LIBRARIES} ${YAML_CPP_LIBRARIES})
+set(libraries ${CMAKE_DL_LIBS} ${LHAPDF_LIBRARIES} ${CLHEP_LIBRARIES} ${FASTJET_LIBRARIES} ${Boost_LIBRARIES} ${YAML_CPP_LIBRARIES})
if(${QCDloop_FOUND})
list(APPEND libraries ${QCDloop_LIBRARIES} quadmath)
endif()
-if(${HepMC_FOUND})
- list(APPEND libraries ${HepMC_LIBRARIES})
-endif()
# add libraries for reversed HEJ <by hand>
list(APPEND libraries rhej)
target_link_libraries(hejfog ${libraries})
target_link_libraries(FOgen hejfog)
install(TARGETS FOgen DESTINATION bin)
enable_testing()
set(tst_dir "${CMAKE_CURRENT_SOURCE_DIR}/t")
foreach(tst h_2j h_3j h_5j h_3j_uno1 h_3j_uno2 h_2j_decay)
add_executable(test_${tst} ${tst_dir}/${tst}.cc)
target_link_libraries(test_${tst} hejfog)
add_test(NAME t_${tst} COMMAND test_${tst} WORKING_DIRECTORY ${tst_dir})
endforeach()
diff --git a/analysis-plugins/src/Rivet_Analysis.cc b/analysis-plugins/src/Rivet_Analysis.cc
deleted file mode 100644
index 8d6a2ab..0000000
--- a/analysis-plugins/src/Rivet_Analysis.cc
+++ /dev/null
@@ -1,69 +0,0 @@
-#include "Rivet_Analysis.hh"
-
-#include <ostream>
-
-#include "RHEJ/Event.hh"
-
-#include "yaml-cpp/yaml.h"
-
-// @TODO guards for proper rivet-use
-
-#include "Rivet/AnalysisHandler.hh"
-
-// namespace RHEJ {
- Rivet_Analysis::Rivet_Analysis(YAML::Node const & config):
- output_name_{config["output"].as<std::string>()},
- first_event_(true)
- {
- // read in analyses
- const auto & name_node = config["analysis"];
- switch(name_node.Type()){
- case YAML::NodeType::Scalar:
- std::cout << name_node.as<std::string>();
- analyses_names_.push_back(name_node.as<std::string>());
- break;
- case YAML::NodeType::Sequence:
- for(YAML::const_iterator it = name_node.begin(); it != name_node.end(); ++it){
- std::cout << it->as<std::string>() << " ";
- analyses_names_.push_back(it->as<std::string>());
- }
- break;
- default:
- throw std::invalid_argument{
- "No Analysis was provided to rivet. "
- "Either give a analysis or deactivate this plugin."
- };
- }
- }
-
- void Rivet_Analysis::init(RHEJ::Event const & event){
- const auto & central = event.central();
- for(size_t i = 0; i < event.variations().size(); ++i){
- const auto & vari = event.variations(i);
- std::ostringstream name;
- // calculate name ratio of the scales and use them for the output file name
- name << ".Scale" << i << "_MuR" << vari.mur/central.mur
- << "_MuF" << vari.muf/central.muf;
- rivet_runs_.push_back({std::make_unique<Rivet::AnalysisHandler>()
- , name.str(), RHEJ::HepMCInterface()});
- rivet_runs_.back().handler->addAnalyses(analyses_names_);
- }
- }
-
- void Rivet_Analysis::fill(RHEJ::Event const & event, RHEJ::Event const &){
- if(first_event_){
- first_event_=false;
- init(event);
- }
- for(auto & run: rivet_runs_){
- run.handler->analyze(run.hepmc(event));
- }
- }
-
- void Rivet_Analysis::finalise(){
- for(auto const & run: rivet_runs_){
- run.handler->finalize();
- run.handler->writeData(output_name_+run.name+std::string(".yoda"));
- }
- }
-// }
diff --git a/cmake/Modules/Findrivet.cmake b/cmake/Modules/Findrivet.cmake
new file mode 100644
index 0000000..cd7d2ec
--- /dev/null
+++ b/cmake/Modules/Findrivet.cmake
@@ -0,0 +1,27 @@
+include (FindPackageMessage)
+
+message (STATUS "Detecting rivet installation")
+execute_process (COMMAND rivet-config --prefix
+ OUTPUT_VARIABLE rivet_PREFIX
+ )
+if (rivet_PREFIX)
+ string (STRIP ${rivet_PREFIX} rivet_PREFIX)
+ message (STATUS "rivet installation found: ${rivet_PREFIX}")
+ EXECUTE_PROCESS(COMMAND rivet-config --libs OUTPUT_VARIABLE
+ rivet_LIBRARIES OUTPUT_STRIP_TRAILING_WHITESPACE)
+ # set (rivet_INCLUDE_PATH ${rivet_PREFIX}/include)
+ EXECUTE_PROCESS(COMMAND rivet-config --includedir OUTPUT_VARIABLE
+ rivet_INCLUDE_PATH OUTPUT_STRIP_TRAILING_WHITESPACE)
+ set (rivet_FOUND TRUE)
+else (rivet_PREFIX)
+ set (rivet_FOUND FALSE)
+endif (rivet_PREFIX)
+
+if (NOT rivet_FOUND)
+ message(STATUS "rivet installation not found!")
+endif (NOT rivet_FOUND)
+
+mark_as_advanced(
+ rivet_INCLUDE_PATH
+ rivet_LIBRARIES
+)
diff --git a/analysis-plugins/include/Rivet_Analysis.hh b/include/RHEJ/Rivet_Analysis.hh
similarity index 71%
rename from analysis-plugins/include/Rivet_Analysis.hh
rename to include/RHEJ/Rivet_Analysis.hh
index 38bd355..86f2d5a 100644
--- a/analysis-plugins/include/Rivet_Analysis.hh
+++ b/include/RHEJ/Rivet_Analysis.hh
@@ -1,63 +1,65 @@
/** \file Rivet_Analysis.hh
* \brief A custom analysis that calles multiple rivet analyses
*/
#include <memory>
#include <string>
#include <utility>
#include "RHEJ/Analysis.hh"
#include "RHEJ/HepMCInterface.hh"
namespace RHEJ {
class Event;
}
namespace Rivet {
class AnalysisHandler;
}
namespace YAML {
class Node;
}
-// namespace RHEJ {
-/**
- * @brief Rivet analysis which can be called as a normal rHEJ analysis
- * @details In the input file both "analysis" (list of rivet analysis to be called)
- * and "output" (prefix for the .yoda files)
- */
+namespace RHEJ {
+ /**
+ * @brief Rivet analysis which can be called as a normal rHEJ analysis
+ * @details In the input file both "analysis" (list of rivet analysis to be called)
+ * and "output" (prefix for the .yoda files)
+ */
class Rivet_Analysis: public RHEJ::Analysis {
public:
+ static std::unique_ptr<Analysis> create(YAML::Node const & config);
+
Rivet_Analysis(YAML::Node const & config);
void fill(RHEJ::Event const & event, RHEJ::Event const &) override;
bool pass_cuts(RHEJ::Event const &, RHEJ::Event const &) override
{return true;} //< no additional cuts are applied
void finalise() override;
private:
std::vector<std::string> analyses_names_;
const std::string output_name_;
/// struct to organise the infos per rivet run/scale setting
struct rivet_info {
std::unique_ptr<Rivet::AnalysisHandler> handler;
std::string name;
RHEJ::HepMCInterface hepmc;
};
std::vector<rivet_info> rivet_runs_;
/** @brief Calculates the scale variation from the first event for the output file
* @note Name is wrong if multiple scale functions are choosen
* @TODO is there a better way of finding the scale factor?
*/
void init(RHEJ::Event const & event);
bool first_event_;
};
-// }
-
-extern "C"
-__attribute__((visibility("default")))
-std::unique_ptr<RHEJ::Analysis> make_analysis(
- YAML::Node const & config
-){
- return std::make_unique<Rivet_Analysis>(config);
}
+
+// extern "C"
+// __attribute__((visibility("default")))
+// std::unique_ptr<RHEJ::Analysis> make_analysis(
+// YAML::Node const & config
+// ){
+// return std::make_unique<Rivet_Analysis>(config);
+// }
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 43d94e3..a41811f 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,14 +1,17 @@
file(GLOB src_files *.cc)
add_library(rhej SHARED ${src_files})
set(libraries ${CMAKE_DL_LIBS} ${LHAPDF_LIBRARIES} ${CLHEP_LIBRARIES} ${FASTJET_LIBRARIES} ${GSL_LIBRARIES} ${Boost_LIBRARIES} ${YAML_CPP_LIBRARIES} yaml-cpp)
if(${QCDloop_FOUND})
list(APPEND libraries ${QCDloop_LIBRARIES} quadmath)
endif()
if(${HepMC_FOUND})
list(APPEND libraries ${HepMC_LIBRARIES})
+ if(${rivet_FOUND})
+ list(APPEND libraries ${rivet_LIBRARIES})
+ endif()
endif()
target_link_libraries(rhej ${libraries})
install(TARGETS rhej DESTINATION lib)
diff --git a/src/Rivet_Analysis.cc b/src/Rivet_Analysis.cc
new file mode 100644
index 0000000..e0bb33b
--- /dev/null
+++ b/src/Rivet_Analysis.cc
@@ -0,0 +1,98 @@
+#include "RHEJ/Rivet_Analysis.hh"
+
+#ifdef RHEJ_BUILD_WITH_RIVET
+
+#include <ostream>
+
+#include "RHEJ/Event.hh"
+
+#include "yaml-cpp/yaml.h"
+#include "Rivet/AnalysisHandler.hh"
+
+namespace RHEJ {
+ std::unique_ptr<Analysis> Rivet_Analysis::create(YAML::Node const & config){
+ return std::unique_ptr<Analysis>{new Rivet_Analysis{config}};
+ }
+
+ Rivet_Analysis::Rivet_Analysis(YAML::Node const & config):
+ output_name_{config["output"].as<std::string>()},
+ first_event_(true)
+ {
+ // read in analyses
+ const auto & name_node = config["rivet"];
+ switch(name_node.Type()){
+ case YAML::NodeType::Scalar:
+ analyses_names_.push_back(name_node.as<std::string>());
+ break;
+ case YAML::NodeType::Sequence:
+ for(YAML::const_iterator it = name_node.begin(); it != name_node.end(); ++it){
+ analyses_names_.push_back(it->as<std::string>());
+ }
+ break;
+ default:
+ throw std::invalid_argument{
+ "No Analysis was provided to rivet. "
+ "Either give an analysis or deactivate rivet."
+ };
+ }
+ }
+
+ void Rivet_Analysis::init(Event const & event){
+ const auto & central = event.central();
+ for(size_t i = 0; i < event.variations().size(); ++i){
+ const auto & vari = event.variations(i);
+ std::ostringstream name;
+ // calculate name ratio of the scales and use them for the output file name
+ name << ".Scale" << i << "_MuR" << vari.mur/central.mur
+ << "_MuF" << vari.muf/central.muf;
+ rivet_runs_.push_back({std::make_unique<Rivet::AnalysisHandler>()
+ , name.str(), HepMCInterface()});
+ rivet_runs_.back().handler->addAnalyses(analyses_names_);
+ }
+ }
+
+ void Rivet_Analysis::fill(Event const & event, Event const &){
+ if(first_event_){
+ first_event_=false;
+ init(event);
+ }
+ for(auto & run: rivet_runs_){
+ run.handler->analyze(run.hepmc(event));
+ }
+ }
+
+ void Rivet_Analysis::finalise(){
+ for(auto const & run: rivet_runs_){
+ run.handler->finalize();
+ run.handler->writeData(output_name_+run.name+std::string(".yoda"));
+ }
+ }
+} // namespace RHEJ
+
+#else // no rivet => create empty analysis
+
+namespace Rivet {
+ class AnalysisHandler {};
+}
+
+namespace RHEJ {
+ std::unique_ptr<Analysis> Rivet_Analysis::create(YAML::Node const & config){
+ return std::unique_ptr<Analysis>{new Rivet_Analysis{config}};
+ }
+
+ Rivet_Analysis::Rivet_Analysis(YAML::Node const &)
+ {
+ throw std::invalid_argument(
+ "Failed to create Rivet_Analysis: "
+ "Reversed HEJ was built without rivet support"
+ );
+ }
+
+ void Rivet_Analysis::init(Event const &){}
+
+ void Rivet_Analysis::fill(Event const &, Event const &){}
+
+ void Rivet_Analysis::finalise(){}
+} // namespace RHEJ
+
+#endif
diff --git a/src/get_analysis.cc b/src/get_analysis.cc
index 91eff64..c9a6718 100644
--- a/src/get_analysis.cc
+++ b/src/get_analysis.cc
@@ -1,29 +1,32 @@
#include "RHEJ/get_analysis.hh"
#include <dlfcn.h>
#include "yaml-cpp/yaml.h"
+#include "RHEJ/Rivet_Analysis.hh"
#include "RHEJ/EmptyAnalysis.hh"
namespace RHEJ{
std::unique_ptr<Analysis> get_analysis(YAML::Node const & parameters){
if(!parameters["plugin"]){
+ if(parameters["rivet"])
+ return Rivet_Analysis::create(parameters);
return EmptyAnalysis::create(parameters);
}
using AnalysisMaker = std::unique_ptr<Analysis> (*)(YAML::Node);
const auto plugin_name = parameters["plugin"].as<std::string>();
auto handle = dlopen(plugin_name.c_str(), RTLD_NOW);
char * error = dlerror();
if(error != nullptr) throw std::runtime_error(error);
void * sym = dlsym(handle, "make_analysis");
error = dlerror();
if(error != nullptr) throw std::runtime_error(error);
auto make_analysis = reinterpret_cast<AnalysisMaker>(sym);
return make_analysis(parameters);
}
}

File Metadata

Mime Type
text/x-diff
Expires
Tue, Jan 21, 1:45 AM (1 d, 11 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
4243503
Default Alt Text
(18 KB)

Event Timeline