物理の駅 by onsanai

Physics-station 研究で日々感じたことを忘れないための備忘録

C/C++

Windows10とVisual Studio 2017でGeant4を動かした

Overview | geant4.web.cern.ch WindowsでGeant4を入れたお話。 皆さん誤解しているかもしれませんが、WindowsでGeant4は動きます。GUIや、他のLinuxにしか対応していないツールや、マルチスレッド関連を除けば、ちゃんと動きます。 深いことをやろうとする…

Windows Subsystem for Linux (WSL) でCERN ROOTバージョン6を動かすまで

この解説は、Linux PCやMac PCがなく、かつLinuxの仮想環境を動かせない人、UpdateされたWindows 10を持っている人、ROOT6を使いたい人向けのものです。 ROOT講習会2019用に加筆修正しました。 Ubuntu 18.04 LTSのインストール WindowsにUbuntuをインストー…

OpenCVを使った画像内のピーク検出プログラム

ピークの周波数によって、途中のBoxFilterとGaussianBlurのカーネルサイズは変えると良い。 背景の強度を求めて、有意度を求めるのがこのプログラムのミソである。 var size = new OpenCvSharp.Size(nbin, nbin); Mat signal = Mat.Zeros(size, MatType.CV_3…

螺旋を描くためのC++ソースコード

uint64_t range = 1000; int x = 0; int y = 0; uint64_t loop = 0; uint64_t shift = 0; for (uint64_t i = 1; i < range * range; i++) { std::cout<<x<<" "<<y<<" "<<i<<std::endl; if (i == (loop * 2 + 1) * (loop * 2 + 1)) { loop++; shift = 0; x++; } else { shift++; if (shift >= loop * 6) { x++; } else if (s…</x<<">

filesystemを使ってディレクトリ(フォルダ)内にあるファイル等をリストしたりディレクトリを作成したり

VS2017の環境では、 /std:c++latest または /std:c++17 をコンパイルオプションに追加する必要がある。 #include <iostream> #include <filesystem> namespace fs = std::filesystem; int main(int argc, char** argv) { if (argc == 1)return -1; fs::path path1(argv[1]); //ファ</filesystem></iostream>…

exeのfull pathとDLLのfull pathを得る方法

tbb.dll (例)のフルパスを得る方法と、実行中のexeそのもののフルパスを得る方法 char path[2048]; GetModuleFileNameA(GetModuleHandleA("tbb.dll"), path, 2048); cout << path; GetModuleFileNameA(NULL, path, 2048); cout << path; pathに日本語名が入…

Python3でROOT+C++と同様にフィッティングとパラメータの標準誤差を算出する

まずはCERN ROOT + C++ で実装する。 お手本通り、平均値0、標準偏差1、ガウス分布(正規分布)に沿う乱数を10000個作り、ROOTのヒストグラムに詰め、 TF1 の ガウス分布 gaus でフィッティングした。オプション等は何もつけていない。も普通に結果を引用した…

OpenCV 2系でGPUで膨張処理をさせる方法

OpenCV 2系でGPUで膨張処理をさせる方法で詰まったので書いておく。最後に検証に使った全コードがあるのでどうぞ。 CPUで膨張処理をさせるとき、さくっと書けば次のようになる。 cv::Mat src, dst; int width = 256; int height = 256; src = cv::Mat::eye(c…

Geant4で原子核乾板 (10の12乗チャンネル) を実装した

ミクロンの空間分解能を持ちながら、ミリメートルからメートルのサイズを持つ放射線検出器は原子核乾板以外に存在しない。通常、チャンネル数はある特定の数になるが、原子核乾板の場合はそういう概念はないに近い。1平方センチあたり10の14乗を程度チャンネ…

文字型と整数型の上限値と下限値、各データ型のサイズ

参照: ATLAS Japan C++ Course -- Lesson 2 サンプルコード1 #include <iostream> #include <cstdint> using namespace std; int main(int argc, char** argv) { cout << "char min. = " << int(INT8_MIN) << " max. = " << int(INT8_MAX) << endl << "short int min. = " << IN</cstdint></iostream>…

Pocoで複数のPoco::Threadを管理してみる

筆者は世に出すサンプルコードのことを甘く見ているので、こんなコードではダメだということに気づかれた方は、お手数でもコメントにお書きください。よろしくお願いいたします。 Visual Studio 2013 は中途半端にC++11が実装されており、スレッドまわりの全…

テキストファイルの読み取りと、JSONファイルの読み取り方 特殊なサンプル1

ヘッダー #include <picojson.h> // あるファイルの情報を読み取り std::string read_txt(std::string filepath) { // ファイルの最初のbyteから最後のbyteまで読み取り std::string str((std::istreambuf_iterator<char>(std::ifstream(filepath))), std::istreambuf_iterator<char></char></char></picojson.h>…

Visual Studio の Cross Tools / Native Toolsって何?

x86_x64 Cross Tools Command Prompt for VS 2017 32bit パソコンで64bit パソコン用の実行ファイルを作る ただし、64bitパソコンでも動く x64 Native Tools Command Prompt for VS 2017 64bit パソコンで 64bit パソコン用の実行ファイルを作る x64_x86 Cro…

PocoをVisual Studio 2017でとにかくビルドするコマンド

Poco をダウンロードする。 pocoproject.org Visual Studio 2017の場合 x64 Native Tools Command Prompt for VS 2017 を起動し、次のコマンドを叩く buildwin.cmd 150 build all both x64 nosamples notests msbuild 「Windows SDK バージョン 8.1」が足り…

C++で任意の文字でstringを分割する方法

std::getlineは名前の通りstreamから1行ごとにstringを得る関数だが、デリミタ(delimiter)を指定することも可能である。分かれば簡単。 std::string str = "a_ab_abc"; std::stringstream ss(str); std::string item; std::vector<std::string> vitem; while(std::getline</std::string>…

Visual Studio 2017 + OpenCV 3.2.0 + x64の初期設定 とOpenCVに関する質問の受け付け(コメント欄へ)

Visual Studio 2017 x64 で OpenCV 3.4.2 を使う方法 OpenCVをとにかく使いたい。けどNuGetは使えない、使いたくないっていう人のために、この記事の最終更新時点での最新版のインストール方法を書きました。2.4.Xの頃と比べて.libの数が減って設定が楽になりま…

2個の自作クラスの配列(std::vector<MyClass>とか)から重複とかを探す

2個の数列(std::vector<int>とか)から重複とかを探す - Physics-Station phst.hateblo.jp の続き 2個の自作クラスの配列(ベクター)から重複等を探す方法。Linuxのjoinコマンドを高速化する場合など。 #include <algorithm>に便利な関数が用意されている。 ソートして、重複を</algorithm></int>…

Pocoによる共有メモリの書き込み・読み出しの実装例

Pocoはc++のライブラリの一つで、boostより比較的軽量に設計されている。バージョン1.7.3を使って共有メモリの書き込み・読み出しの実装例を書いた。 読み出しでもAM_WRITEになっているのは読み出しで先にOPENしてしまうと書き込みのほうで例外が投げられる…

PocoによるTCP/IP通信のサーバー・クライアント実装例

Pocoはc++のライブラリの一つで、boostより比較的軽量に設計されている。バージョン1.7.3を使ってTCP通信のサーバー・クライアントの実装例を書いた。例外処理は甘いところがあるので適宜変更されたし。 サーバーの実装例 #include <iostream> #include <Poco/Net/Socket.h> #include <Poco/Net/TCPServer.h> #in</poco/net/tcpserver.h></poco/net/socket.h></iostream>…

OpenCVのgpu::countNonZeroをgpu::Streamで高速化する

cv::gpu::countNonZeroをgpu::Streamで高速化したいという需要があったので、その解決策を書いておく。 opencvの2系のcountNonZeroはstreamを使うことが出来ない。そのため、非同期処理を行い高速化する際のボトルネックになる。cv::gpu::reduceは2次元画像…

3Dの位置と角度を持った情報の2次元プロジェクションマップ

CERNが開発しているROOT (バージョン5)を用いた検出器内の飛跡を2次元プロジェクションに投影して描画する方法。 具体的には三次元情報を持つ飛跡を二次元に投影したい時に使う。 #include <vector> #include <random> #include <limits> #include <TArrow.h> #include <TGraph.h> #include <TAxis.h> #include <TCanvas.h> #i</tcanvas.h></taxis.h></tgraph.h></tarrow.h></limits></random></vector>…

2個の数列(std::vector<int>とか)から重複とかを探す

2個の数列から重複等を探す方法。Linuxのjoinコマンドを高速化する場合など。 続きは 2個の自作クラスの配列(std::vector<MyClass>とか)から重複とかを探す - Physics-Station phst.hateblo.jp #include <algorithm>に便利な関数が用意されている。 ソートして、重複を削除した後</algorithm></myclass>…

OpenMPでfor文を高速化する

openmpでfor文を高速化してみよう。OpenMPを有効にするには、Visual Studioのプロジェクトのプロパティページを開いて、C/C++の言語のOpenMPのサポートをはい(/openmp)にする必要がある。 例として1から50000までの数が素数(prime)かどうかを調べてみよう。…

Visual Studio 2013でstd::min std::maxが使えなくなった時の対処

std::max - cppreference.com Visual Studio 2013以降、Visual Studio 2015も完全にalgorithmに移動したらしいので以下の記述が必要。 #include <algorithm> //必要 int main() { int i = std::max(1,2); int j = std::min(3,4); } ちなみにVisual Studio 2012以下は以</algorithm>…

メモリリークしているソースコードの行を特定する

#include <cstdlib> #include <new> #include <memory> #include <crtdbg.h> #define _CRTDBG_MAP_ALLOC #define new ::new(_NORMAL_BLOCK, __FILE__, __LINE__) void main() { int *i = new int; _CrtDumpMemoryLeaks(); return; } これをデバックモードで実行すると Detected memory leaks!</crtdbg.h></memory></new></cstdlib>…

catchしなかった例外が発生した際の ***は動作を停止しました「WerFault」を表示させない・表示させる

問題が発生したため、プログラムが正しく動作しなくなりました。プログラムは閉じられ、解決策がある場合はWindowsから通知されます。 を表示させないプログラムは以下のとおり。 #include <exception> #include <Windows.h> void main() { SetErrorMode(SEM_NOGPFAULTERRORBOX); t</windows.h></exception>…

マルチスレッドにおける例外処理の受け渡し (VC++)

別スレッド中の例外を、本スレッドに渡す方法のメモ。動作確認はVisual Studio 2013 C++で行っている。 詳しい説明は スレッド間の例外転送 を参照してね。 #include <thread> #include <iostream> //マルチスレッド用の関数 void f1(std::exception_ptr &eptr) { try { throw </iostream></thread>…