ROMA结果在cmake .exe和终端命令

时间:2017-03-26 14:19:02

标签: c++ cmake root-framework

是的,标题看起来很奇怪,但这个标题与标题一样奇怪。 我写了一个ROOT脚本,这个脚本的结果必须画两个直方图。脚本有一些ROOT头文件和随机数生成器。当我用终端

运行时
$ root example.cpp

它按照我想要的方式执行。输出直方图; Terminal output

但是当使用cmake编译到exe文件时,它无法正常工作。结果与终端输出不匹配,并且-i think-random generator无法正常工作。此输出使这种情况变得清晰, exe file output

正如您在此直方图中看到的那样,值堆叠在一些值上。我很困惑。 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错误或者我错过了重要的事情。

1 个答案:

答案 0 :(得分:3)

当您将ROOT作为宏脚本运行时,它会对您的代码应该如何做出某些假设。编译代码时,它不会做出相同的假设。

在您的情况下,ROOT假定您填充直方图的变量是浮点数,而您的编译器认为它们是整数。 (这将是因为它导入的一些数学库,作为有根据的猜测)

如果ROOT和编译器之间存在一些差异,编译器总是正确的。

确保一致行为的唯一方法是编写代码,使其明确。例如,对变量进行转换,这些变量将由编译器解释为整数。