Physics-Station phst.hateblo.jp

旧 http://physics-station.blogspot.jp/ から当はてなブログに移行しました。間違ってるところがあればコメントください。記述の正確性は保証しません。

直交座標から球面座標系に変換するときの誤差伝搬

Error propagation when converting from rectangular coordinate system to spherical coordinate system

飛跡のベクトルが次のように得られたとする

Assume that a vector of trajectory is obtained as follows

 \displaystyle

V_x = x \pm \delta x \\
V_y = y \pm \delta y \\
V_z = z \pm \delta z \\

Range、Theta、Phiは次のようになる

Range, Theta, Phi are as follows

 \displaystyle
Range = r = \sqrt{x^2+y^2+z^2}\\
Theta = \theta =  acos(z/r)\\
Phi = \phi = atan(y/x)\\

誤差伝搬を計算すると誤差は次のようになる

By calculating the error propagation, the error becomes as follows

 \displaystyle
\delta r = \frac{ \sqrt{  (x\,\delta x)^2+ (y\,\delta y)^2+ (z\,\delta z)^2 }}{r} \\

\delta \theta = \frac { \sqrt{ (x^2 \, \delta x^2+y^2 \, \delta y^2)z^2      + (x^2+y^2)^2\delta z^2    }    }                {r^2\sqrt{x^2+y^2}}\\

\delta \phi =        \frac{\sqrt{(y \, \delta x)^2+(x \, \delta y)^2}}       {x^2+y^2}

検索用

参照

Derivative Calculator with Steps

Gitでサブモジュールの追加

新しいサブモジュールを追加。 root_macros フォルダに リポジトリ root_macros.gitを追加する。

git submodule add https://gitlab.com/yoshimoto/root_macros.git root_macros

リモートが更新されたら取り込む

git submodule foreach git pull origin master

[Git] git submodule は癖がすごいとの噂だったが素直につきあっていけそうという話 | deadwood git submoduleしてるリポジトリをリモートの最新に更新する - Qiita

Pattern matching sample パターンマッチングサンプル

(ja) パターンマッチング可能な飛跡ファイル

https://1drv.ms/f/s!Ap9xAxIuzM0xlLxu6slGIjkY3gSjNg

Q1. どういう手段でもいいので、 beam_4372-2_u.txt の飛跡と beam_4372-2_d.txt の飛跡の位置ずれを計算しよう。

Q2. 計算方法について、互いに紹介しよう。

Q3. これは、位置ずれのピークを求めるソースコードである。 std::map はどういう働きをするのか調べよう。

Q4. 前回配布したファイルはパターンマッチングが成功しない。成功しないと言うためにはどうすればよいか考えよう。

https://1drv.ms/t/s!Ap9xAxIuzM0xlLlaOr2g5qaKpYqF2w

https://1drv.ms/t/s!Ap9xAxIuzM0xlLlbUgqNsGvbe4Eq6w

(en)

Trajectory file for pattern-matching

https://1drv.ms/f/s!Ap9xAxIuzM0xlLxu6slGIjkY3gSjNg

Q1. Calculate the position shift between the trajectory of beam_4372-2_u.txt and the trajectory ofbeam_4372-2_d.txt with any way.

Q2. Introduce each other about your calculation methods.

Q3. This is a source code to search peak position shift . Examine what std::map does.

  • Position shift of all trajectories are packed in a histogram for each bin_width .
  • Create a blurred histogram with surrounding n_bin_bg x n_bin_bg .
  • Subtract the histogram from the blurred histogram
  • Find the peak with the the maximum content

Q4. Pattern matching does not succeed in files distributed last time. Let's see what we should say to show that the pattern matching does not succeed.

https://1drv.ms/t/s!Ap9xAxIuzM0xlLlaOr2g5qaKpYqF2w

https://1drv.ms/t/s!Ap9xAxIuzM0xlLlbUgqNsGvbe4Eq6w

#include <string>
#include <iostream>
#include <vector>
#include <fstream>
#include <sstream>
#include <map>

int main() {
    string path1 = "beam_4372-2_u.txt";
    string path2 = "beam_4372-2_d.txt";
    vector<track> vtrack1, vtrack2;

    cout << vtrack1.size() << " -> ";
    read_txt(path1, vtrack1);
    cout << vtrack1.size() << endl;

    cout << vtrack2.size() << " -> ";
    read_txt(path2, vtrack2);
    cout << vtrack2.size() << endl;

    map<string, int> hist;
    map<string, int> hist_bg;

    double bin_width = 0.002; //bin width
    int n_bin_bg = 3; //number of bin for background

    //add displacement to bins
    for (int i1 = 0; i1 < vtrack1.size(); i1++) {
        for (int i2 = 0; i2 < vtrack2.size(); i2++) {
            double dx = vtrack2[i2].px - vtrack1[i1].px;
            double dy = vtrack2[i2].py - vtrack1[i1].py;

            int dxi = round(dx / bin_width);
            int dyi = round(dy / bin_width);
            hist[to_string(dxi) + "_" + to_string(dyi)]++;
            for (int bgx = -(n_bin_bg - 1) / 2; bgx <= (n_bin_bg - 1) / 2; bgx++) {
                for (int bgy = -(n_bin_bg - 1) / 2; bgy <= (n_bin_bg - 1) / 2; bgy++) {
                    hist_bg[to_string(dxi + bgx) + "_" + to_string(dyi + bgy)]++;
                }
            }
        }
    }

    //search peak
    int max_value = 0;
    string peak_position = "";
    for (auto &p : hist) {
        p.second -= hist_bg[p.first] / double(n_bin_bg*n_bin_bg);
        if (max_value < p.second)
        {
            peak_position = p.first;
            max_value = p.second;
        }
    }

    //convert to position
    string buf;
    stringstream ss(peak_position);
    getline(ss, buf, '_');
    int peak_position_x = std::stoi(buf);
    getline(ss, buf, '_');
    int peak_posision_y = std::stoi(buf);

    //draw 7x7 bins
    for (int ix = -3; ix <= 3; ix++) {
        for (int iy = -3; iy <= 3; iy++) {
            string str = std::to_string(ix + peak_position_x) + "_" + std::to_string(iy + peak_posision_y);
            cout << hist[str] << " ";
        }
        cout << endl;
    }
    cout << "peak (x, y) = (" << peak_position_x*bin_width << ", " << peak_posision_y*bin_width << ") " << endl;
    cout << "peak bin content = " << max_value << endl;
    cin.get(); //to stop the console.
}

Read track text file

Read track files

Track struct has 6 members. four double members and two int members. The double members include position x, position y, angle x, angle y. The int members include pulse height and pulse height volume.

Q1. Make track class.

class track {
public:
    //insert here.
    //insert here.
};

The track data files is as follows. Lines that start with # are comments.

#pos_x[mm] pos_y[mm] angle_x angle_y ph phv
-58.5483 156.9036   -0.0039 -0.0358    16.0 1430.8
-58.5148 156.8275   0.0016 -0.0544    16.0 6449.2
-58.5998 156.8236   -0.0370 -0.0273    16.0 6325.0
-58.5134 156.8441   -0.0415 -0.0422    16.0 1698.3
-58.5704 156.8770   -0.0004 -0.0117    16.0 454.6
-58.5388 156.8782   0.0233 -0.0309    16.0 759.4
-58.4927 156.8461   0.0506 -0.0412    16.0 1826.0
-58.5128 156.8928   0.0409 -0.0024    16.0 1784.3
-58.5469 156.8413   0.0558 -0.0208    16.0 2264.7

Q2. Make read function.

#include <string>
#include <iostream>
#include <vector>
#include <fstream>
#include <sstream>

void read_txt(std::string filepath, std::vector<track> &vin)
{
    std::ifstream ifs(filepath);
    if (!ifs) {
        throw std::exception(("cannot open " + filepath).c_str());
    }
    std::string str;
    while (getline(ifs, str))
    {
        if (str.size() == 0) { continue; } //to ignore null lines
        if (str[0] == '#') { continue; } //to ignore comment lines
        stringstream ss(str);
        //insert here
        //insert here
        //insert here
    }
}

Download these files.

https://1drv.ms/t/s!Ap9xAxIuzM0xlLlaOr2g5qaKpYqF2w

https://1drv.ms/t/s!Ap9xAxIuzM0xlLlbUgqNsGvbe4Eq6w

Q3. Make main function to check the size of the tracks each file.

int main() {
    string path1 = "beam_4372-0_u.txt";
    string path2 = "beam_4372-0_d.txt";
    vector<track> vtrack1, vtrack2;
    //insert here
    //insert here
    //insert here
    //insert here
}

自作Pythonモジュールをアップロードするまでの流れ

自分用のメモ以上でもメモ以下でもないので、詳細は各自検索されたし。

各モジュールのインストール

pip install nose
pip install wheel
pip install twine

アップロード前に nose でtestしておこう

nosetests

ホームディレクトリに .pypirc ファイルを作成

[pypi]
username: user
password: password

モジュールのソースとインストーラーを作り、アップロードする

python setup.py sdist
python setup.py bdist_wheel --universal
twine upload dist/*

--universal は2系と3系を共存させるため。

古い記述がGoogleから駆逐されずに残っていて、良くないよね。

参照

Python nose でユニットテストを書いてみた / 桃缶食べたい。

Pythonで作成したライブラリを、PyPIに公開/アップロードする - Qiita

4. ソースコード配布物を作成する — Python 3.6.1 ドキュメント

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

参照: 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. = " << INT16_MIN
        << " max. = " << INT16_MAX << endl
        << "long int min. = " << INT32_MIN
        << " max. = " << INT32_MAX << endl
        << "long long int min. = " << INT64_MIN
        << " max. = " << INT64_MAX << endl;

    cout 
        << "unsigned char max. = " << int(UINT8_MAX) << endl
        << "unsigned short int max. = " << UINT16_MAX << endl
        << "unsigned long int max. = " << UINT32_MAX << endl
        << "unsigned long long int max. = " << UINT64_MAX << endl;

    return 0;
}

サンプルコード2

#include <iostream>
#include <cstdint>

using namespace std;
int main(int argc, char** argv) {

    cout
        << "bytes of char = " << sizeof(char) << endl
        << "bytes of short = " << sizeof(short) << endl
        << "bytes of int = " << sizeof(int) << endl
        << "bytes of long = " << sizeof(long long) << endl;

    return 0;
}

Windowsの設定を変更するとき1回目にしばらく動作を受け付けなくなる

Windowsを再起動した後、Windowsの設定を操作するときに一定時間(数十秒)ほど設定ができなくなる。

例えば、アクションセンターを開き、画面の輝度を変更しようとしたとする。

一回目は明るさを変更するためのボタン「おすすめ/明るい」などが表示されるが、それをクリックしても反応はなく、再度アクションセンターを開くと明るさを変更するためのボタン等がすべて表示されない。数十秒経ってからアクションセンターを開くと、ボタンが表示され、輝度の変更ができるようになる。

この、何か設定を変更しようとする→設定変更できず設定のボタンが消える→数十秒後に復活してその他全ての設定が即座に変更可能になる。

というのが、明るさを変更するためのボタンだけでなく、Wi-Fiの設定、Bluetooth、電源の設定を含めた、様々なもので起きる。

f:id:onsanai:20170814085711p:plain:w400

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

筆者は世に出すサンプルコードのことを甘く見ているので、こんなコードではダメだということに気づかれた方は、お手数でもコメントにお書きください。よろしくお願いいたします。

Visual Studio 2013 は中途半端にC++11が実装されており、スレッドまわりの全ての機能を使うことができない。 そこで、 Poco::Thread を使おうと考えた。

今回は、stlstd::vector で複数のPoco::Threadを管理する。例えば、Poco::Thread を複数作ることを許容し、その上限数を管理しする場合に使える。

#include <iostream>
#include <vector>

#include <Poco/Thread.h>
#include <Poco/Runnable.h>
#include <Poco/ErrorHandler.h>

class HeavyWorker : public Poco::Runnable
{
public:
    int i;
private:
    void run()
    {
        Sleep(1000);
        std::cout << "おわった id=" << i << std::endl;
        //throw std::exception();
    }
};

//例外クラス
class MyHandler : public Poco::ErrorHandler {

public:
    virtual void exception(const Poco::Exception& exc) {
        std::cout << "Poco Exception: " << exc.displayText() << std::endl;
    }
    virtual void exception(const std::exception& exc) {
        std::cout << "std::exception: " << exc.what() << std::endl;
    }
    virtual void exception() {
        std::cout << "Other exception" << std::endl;
    }
};

int main() {
    MyHandler handler;
    Poco::ErrorHandler::set(&handler);


    // スレッド管理用のベクタ
    std::vector<Poco::Thread*> vthread;
    // ワーカー管理用のベクタ
    std::vector<HeavyWorker*> vworker;
    int maxNumThread = 4;

    for (int i = 0; i < 20; i++) {

        while (true) {
            if (vthread.size() < maxNumThread) { break; }
            for (int i = 0; i < vthread.size(); i++) {
                if (vthread[i]->tryJoin(1)) {
                    delete vworker[i];
                    vworker.erase(vworker.begin() + i);
                    delete vthread[i];
                    vthread.erase(vthread.begin() + i);
                    i--;
                }
            }
        }
        std::cout << "現在のスレッド数" << vthread.size() << std::endl;

        Poco::Thread *thread = new Poco::Thread();
        HeavyWorker *worker = new HeavyWorker();
        worker->i = i;
        vworker.emplace_back(worker);
        thread->start(*worker);
        vthread.emplace_back(thread);
        Sleep(100);
    }
    for (int i = 0; i < vthread.size(); i++) {
        vthread[i]->join();
        delete vworker[i];
        vworker.erase(vworker.begin() + i);
        delete vthread[i];
        vthread.erase(vthread.begin() + i);
        i--;
        std::cout << "現在のスレッド数" << vthread.size() << std::endl;
    }
    //std::cin.get();
    return 0;
}

出力例

現在のスレッド数0
現在のスレッド数1
現在のスレッド数2
現在のスレッド数3
おわった id=0
現在のスレッド数3
おわった id=1
現在のスレッド数3
おわった id=2
現在のスレッド数3
おわった id=3
現在のスレッド数3
おわった id=4
現在のスレッド数3
おわった id=5
現在のスレッド数3
おわった id=6
現在のスレッド数3
おわった id=7
現在のスレッド数3
おわった id=8
現在のスレッド数3
おわった id=9
現在のスレッド数3
おわった id=10
現在のスレッド数3
おわった id=11
現在のスレッド数3
おわった id=12
現在のスレッド数3
おわった id=13
現在のスレッド数3
おわった id=14
現在のスレッド数3
おわった id=15
現在のスレッド数3
おわった id=16
現在のスレッド数3
おわった id=17
現在のスレッド数2
おわった id=18
現在のスレッド数1
おわった id=19
現在のスレッド数0

参照

Class Poco::Thread

Threadを使ってみる(エラーハンドリング) | DIGI-CON 技術部

POCO::Foundationでデザインパターン - マルチスレッド編 - (1/3):CodeZine(コードジン)

テキストファイルの読み取りと、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>());
    if (str.size() < 3)
    {
        return str;
    }
    // UTF-8のBOM付きをチェック
    if (str[0] == -17 && str[1] == -69 && str[2] == -65)
    {
        return str.substr(3);
    }
    else
    {
        return str;
    }
}

//array型のJSONファイルの読み取り
picojson::array read_json_arr(std::string path)
{
    std::ifstream ifs(path);
    if (!ifs)
    {
        throw std::exception("File cannot be opened.");
    }
    std::string json = read_txt(path);
    picojson::value val;
    std::string err;
    picojson::parse(val, json.c_str(), json.c_str() + strlen(json.c_str()), &err);
    if (!err.empty())
    {
        throw std::exception("JSON format error in");
    }
    picojson::array &obj = val.get<picojson::array>();
    return obj;
}

こういうファイルを読み取りたい

[
  {
    "Nogs": [
      [
        1.0,
        2.0,
        3.0
       ]
    ]
  }
]

読み取り例

void sample()
{
    auto arr = read_json_arr("file.json");
    for (int i = 0; i < arr.size(); i++)
    {
        auto obj = arr[i].get<picojson::object>();
        auto nog = obj.at("Nogs").get<picojson::array>()[0].get<picojson::array>();
        for (int j = 0; j < nog.size(); j++)
        {
            std::cout << nog[j].get<double>() << " ";
        }
        std::cout << std::endl;
    }
}

期待される出力

1.00000 2.00000 3.00000

デバッグしてないので取り扱いに注意して下さい。

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 Cross Tools Command Prompt for VS 2017
    64bit パソコンで 32bit パソコン用の実行ファイルを作る

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

普段は ただし の文は無視してもらってかまわない。64bitマシンでも WOW64 というサブシステムのおかげで32bit パソコン用の実行ファイルが動くからである。

参照

方法: 64 ビットの Visual C++ ツールセットをコマンド ラインから有効にする

WOW64 - Wikipedia

f:id:onsanai:20170723013559p:plain

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」が足りないと言われたら、Visual Studio Installer 「C++によるデスクトップ開発」の中から探して入れる。

以上。

オプションの中身? 自分で調べるべし。

参照 mataro777.hateblo.jp

f:id:onsanai:20170723013438p:plain

ATOK2017の日本語入力でVisual Studio 2017のGitのcommitメッセージを書こうとすると異常終了する

Visual Studioが異常終了します。常に異常終了するわけではありません。原因と解決をご存じの方いませんか?

ちなみに、Visual Studio 2015でも同様の現象は起きます。過去にGoogle-IMEでVS2013及びVS2015を使っていましたが、同様の事象は確認していません。

robocopyでフォルダ間をコピーするときのメモ

Windows の堅牢性の高いファイル コピー

よく使うコマンド

robocopy "C:\src" "C:\dst" /S /E /R:0 /NP  1>log.txt

/MIRはdstの削除をするので注意

/S :: サブディレクトリをコピーしますが、空のディレクトリはコピーしません。
/E :: 空のディレクトリを含むサブディレクトリをコピーします。
/R:n :: 失敗したコピーに対する再試行数: 既定値は 1,000,000。
/NP :: 進行状況なし - コピーの完了率を表示しません。

/MIR :: ディレクトリ ツリーをミラー化します (/E および /PURGE と同等)。

bash on Windows

Windows上のUbuntuをアンインストー

lxrun /uninstall /full

Windows上にWindowsをインストー

lxrun /install

32文字のパスワードを32個生成

 pwgen 32 32

Ubuntuのバージョン

cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.5 LTS"

アーキテクチャ

arch
x86_64

OneDriveと同期できません というエラーの解決方法を探索中

X個のファイルが OneDriveと同期できません。

エラー ファイルで遅延が発生しています。

解決方法 ファイルのダウンロード/アップロードは後ほど行います。

f:id:onsanai:20170426213534p:plain:w500

という表示が消えない。

やったことは、メインPC2個で、

onedrive /reset

同期にずいぶん時間がかかったが、同様の表示は出なくなった。

ついでに、使用頻度の低いフォルダを圧縮して一つのファイルにまとめた。これも効いているのかもしれない。