2017-03-26 13 views
2

はい、タイトルは奇妙ですが、このstiuationはタイトルとして奇妙です。 私はROOTスクリプトを書いており、このスクリプトの結果は2つのヒストグラムを描く必要があります。スクリプトにはいくつかのROOTヘッダファイルと乱数ジェネレータがあります。端末でこれを実行すると、ROOTの結果がcmake .exeと端末コマンドの間で一致しません

$ 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コマンドが有効であるためです。しかし、ランダムコマンドには奇妙な動作があります。 CMakeLists.txtが間違っているか、重要なことを忘れましたか?

+0

フルコードを投稿できますか?私。どのようにtb1とtb2を得るか。これは、ルートC++インタプリタと適切にコンパイルされたバージョンとで異なる未定義の動作を引き起こすコードのバグが原因である可能性があります。 –

+0

はこちらですhttps://gist.github.com/agenel/695aa9f678314daf4a484703013c837d – agenel

+3

をお試しください。私は問題は、コンパイラが整数バージョンにデフォルト設定されているので、あなたのv1pxなどが1か0であると思います。インタープリタでは他にもたくさんのものが含まれていますので、 –

答えて

2

マクロスクリプトとしてROOTを実行すると、コードがどのようになるべきかについて特定の前提があります。ただし、コードをコンパイルしても同じ前提はありません。

あなたの場合、ROOTは、ヒストグラムを書き込む変数が浮動小数点であるとみなしますが、コンパイラはそれらがintであると判断します。 (これは、数学的なライブラリがインポートされているため、教育上の推測として)

ROOTとコンパイラとの間に違いがある場合、コンパイラは常に正しいです。

一貫した動作を保証する唯一の方法は、明示的にコードを記述することです。たとえば、コンパイラが整数として解釈する変数に対してキャストを使用します。

+1

お返事ありがとうございました – agenel

+0

昔は昔でしたが、歓迎です:) – Neztor

関連する問題