root 结果在 cmake .exe 和终端命令之间不匹配
ROOT results does not match between cmake .exe and terminal command
是的,标题看起来很奇怪,但这种情况和标题一样奇怪。
我写了一个 ROOT 脚本,这个脚本的结果必须是绘制两个直方图。脚本有几个 ROOT header 文件和随机数生成器。当我 运行 使用终端
$ root example.cpp
它按照我想要的方式执行。输出直方图;
但是用cmake编译成exe文件时,无法正常运行。结果与终端输出不匹配,并且 - 我认为 - 随机生成器无法正常工作。这个输出清楚地说明了这种情况,
如您在此直方图中所见,值叠加在几个值之上。我很困惑。 CMake命令和制作exe文件不报错,制作正常。但是相同的代码,相同的随机生成器和结果彼此之间有很大的不同。
我的意见是 CMakeLists.txt 文件没有正确准备。因为我在互联网示例中找到它并进行了编辑。
现在这是 C++ 文件:
#include "TRandom3.h"
#include "TH1F.h"
#include "TLorentzVector.h"
#include "TCanvas.h"
void TLV()
{
TCanvas* c1 = new TCanvas("table", "TLVs", 800,800 );
TH1F* histoM = new TH1F("masses","Lorentz Vectors' Masses",600,0,20.);
TH1F* histoPt = new TH1F("pts","Lorentz PTs", 600,-0.5 , 7.);
TRandom3* uret = new TRandom3(); // - RANDOM GENERATOR
uret->SetSeed(855); // SEED
TLorentzVector v1; // - DECLARING LORENTZ
TLorentzVector v2; // VECTORS
TPad *pad1 = new TPad("pad1", "pad1", 0, 0.5, 1, 1.0);
TPad *pad2 = new TPad("pad2", "pad2", 0, 0.05, 1, 0.5);
for (int j=0;j<100;j++){
// doing some calculation
histoPt->Fill(tb2); //INSERT VALUES TO HISTOGRAMS
histoM->Fill(tb1);
};
// drawing
}
/*---------- END OF FUNCTION -------------*/
int main() { TLV(); }
和CMakeLists.txt:
cmake_minimum_required(VERSION 2.8)
project(TLV)
set(CMAKE_CXX_FLAGS "-O3 -fPIC -Wall -Wextra -std=c++11 -m64")
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} $ENV{ROOTSYS}/etc/cmake)
#print conf
message(STATUS "Environmental CMAKE_MODULE_PATH is $ENV{ROOTSYS}")
find_package(ROOT MODULE REQUIRED Cling TreePlayer Tree Rint Postscript Matrix RIO Core Foam RooStats RooFit RooFitCore Gpad Graf3d Graf Hist Net TMVA XMLIO MLP)
include(${ROOT_USE_FILE})
message(STATUS "Environmental ROOTSYS is $ENV{ROOTSYS}")
message(STATUS "found root at: ${ROOT_USE_FILE}")
message(STATUS "ROOT_LIBRARIES=${ROOT_LIBRARIES}")
set(EXECUTABLE_OUTPUT_PATH EXE_CIKTI)
add_executable( TLV TLV.cpp )
target_link_libraries(TLV ${ROOT_LIBRARIES})
根库很好地包含了 cmake。因为 TLorentzVector 命令在结果中是有效的。但是 Random 命令有奇怪的行为。
CMakeLists.txt 是错了还是我漏掉了什么重要的东西。
当您 运行 作为宏脚本进行 ROOT 时,它会对您的代码应该如何进行某些假设。但是,当您编译代码时,它不会做出相同的假设。
在您的情况下,ROOT 假定您填充直方图的变量是浮点数,而您的编译器认为它们是整数。 (这是因为它导入了一些数学库,作为有根据的猜测)
编译器总是对的,如果ROOT和编译器有一些区别
确保行为一致的唯一方法是编写明确的代码。例如,对将被编译器解释为整数的变量使用强制转换。
是的,标题看起来很奇怪,但这种情况和标题一样奇怪。 我写了一个 ROOT 脚本,这个脚本的结果必须是绘制两个直方图。脚本有几个 ROOT header 文件和随机数生成器。当我 运行 使用终端
$ root example.cpp
它按照我想要的方式执行。输出直方图;
但是用cmake编译成exe文件时,无法正常运行。结果与终端输出不匹配,并且 - 我认为 - 随机生成器无法正常工作。这个输出清楚地说明了这种情况,
如您在此直方图中所见,值叠加在几个值之上。我很困惑。 CMake命令和制作exe文件不报错,制作正常。但是相同的代码,相同的随机生成器和结果彼此之间有很大的不同。 我的意见是 CMakeLists.txt 文件没有正确准备。因为我在互联网示例中找到它并进行了编辑。 现在这是 C++ 文件:
#include "TRandom3.h"
#include "TH1F.h"
#include "TLorentzVector.h"
#include "TCanvas.h"
void TLV()
{
TCanvas* c1 = new TCanvas("table", "TLVs", 800,800 );
TH1F* histoM = new TH1F("masses","Lorentz Vectors' Masses",600,0,20.);
TH1F* histoPt = new TH1F("pts","Lorentz PTs", 600,-0.5 , 7.);
TRandom3* uret = new TRandom3(); // - RANDOM GENERATOR
uret->SetSeed(855); // SEED
TLorentzVector v1; // - DECLARING LORENTZ
TLorentzVector v2; // VECTORS
TPad *pad1 = new TPad("pad1", "pad1", 0, 0.5, 1, 1.0);
TPad *pad2 = new TPad("pad2", "pad2", 0, 0.05, 1, 0.5);
for (int j=0;j<100;j++){
// doing some calculation
histoPt->Fill(tb2); //INSERT VALUES TO HISTOGRAMS
histoM->Fill(tb1);
};
// drawing
}
/*---------- END OF FUNCTION -------------*/
int main() { TLV(); }
和CMakeLists.txt:
cmake_minimum_required(VERSION 2.8)
project(TLV)
set(CMAKE_CXX_FLAGS "-O3 -fPIC -Wall -Wextra -std=c++11 -m64")
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} $ENV{ROOTSYS}/etc/cmake)
#print conf
message(STATUS "Environmental CMAKE_MODULE_PATH is $ENV{ROOTSYS}")
find_package(ROOT MODULE REQUIRED Cling TreePlayer Tree Rint Postscript Matrix RIO Core Foam RooStats RooFit RooFitCore Gpad Graf3d Graf Hist Net TMVA XMLIO MLP)
include(${ROOT_USE_FILE})
message(STATUS "Environmental ROOTSYS is $ENV{ROOTSYS}")
message(STATUS "found root at: ${ROOT_USE_FILE}")
message(STATUS "ROOT_LIBRARIES=${ROOT_LIBRARIES}")
set(EXECUTABLE_OUTPUT_PATH EXE_CIKTI)
add_executable( TLV TLV.cpp )
target_link_libraries(TLV ${ROOT_LIBRARIES})
根库很好地包含了 cmake。因为 TLorentzVector 命令在结果中是有效的。但是 Random 命令有奇怪的行为。 CMakeLists.txt 是错了还是我漏掉了什么重要的东西。
当您 运行 作为宏脚本进行 ROOT 时,它会对您的代码应该如何进行某些假设。但是,当您编译代码时,它不会做出相同的假设。
在您的情况下,ROOT 假定您填充直方图的变量是浮点数,而您的编译器认为它们是整数。 (这是因为它导入了一些数学库,作为有根据的猜测)
编译器总是对的,如果ROOT和编译器有一些区别
确保行为一致的唯一方法是编写明确的代码。例如,对将被编译器解释为整数的变量使用强制转换。