Visual Studio 2017のVC++プロジェクトのプロパティページが中途半端に英語になる

f:id:onsanai:20180614145808p:plain:w400

なんでだろう。

OKIのプリンターでトナーの使う量を減らす(節約する)

OKI C811の場合

f:id:onsanai:20180613144845p:plain:w400

ログイン -> 管理者設定 -> 印刷設定 -> トナーセーブ -> トナーセーブ量 -> やや多い

選択肢は オフ・少ない・やや多い・多いの4つある

OKI B841の場合

f:id:onsanai:20180613145334p:plain:w400

ログイン -> プリンタ -> 印刷メニュー -> 印刷品質 -> トナーセーブモード -> オン

選択肢はユウコウ・ムコウの2通り

ちなみに初期パスワードは「aaaaaa」

WindowsでVPNを使うために必須の機能 RAS 接続マネージャー管理キット (CMAK)

今まで使えていたVPNが突然使えなくなった。

ユーザー は終了した  という接続をダイヤルしました。終了時に戻された理由コードは 829 です。

が出てVPNが接続できなくなったが、原因は Windowsの機能の有効化または無効化で

RAS 接続マネージャー管理キット (CMAK)

をオフにしたのが原因だった。オンにして再起動でVPNが使えるようになった。

ツイッターで検索したときにキーボードショートカットで「j、k」でツイートを選択したときにツイート内容が隠れるバグ

ツイッター公式には、ホーム画面や検索画面でキーボードショートカットを使うことが出来る。どういうショートカットか有効かは「?」を画面で押してみると良い。

f:id:onsanai:20180610014929p:plain:w500

ホーム画面では、このショートカットで次のツイートを表示する「j」前のツイートを表示する「k」はよく働いている。しかし、検索画面でこの機能を使うと、どういう内容で検索したかというバーが邪魔をし、選択したツイートが隠れてしまうと言うバグが存在する。この1年ほどこのバグが修正されていないのだけれど、だれか解決方法知っている人はいませんか?

2ちゃんねる (5ちゃんねる) の AA を正しく表示するためのCSS

.message {
    font-family:"MS Pゴシック";
    font-size: 16px;
    line-height: 18px;
}

Windows10でシステムの冷却ポリシーや最大のプロセッサの状態を表示させる

ascii.jp

この内容はWindows10でも有効である。

Surface Pro 3 のOSのアップデートをすると、以前有効にした電源の詳細設定の項目がなくなってしまう。上記の記事を参考に、以下の項目の Attributes キーを作成し、 DWORD2 を追加した。

  • 最大のプロセッサの状態 bc5038f7-23e0-4960-96da-33abaf5935ec
  • システムの冷却ポリシー 94D3A615-A899-4AC5-AE2B-E4D8F634367F

冷却ポリシーは、ざっくり言えばファンの挙動を変えてくれる。

f:id:onsanai:20180528100303p:plain

表示されましたね。

Windows 10 で 3Dオブジェクトフォルダを削除する

アップグレードのたびにフォルダが作成されるのがウザいので、レジストリから削除するスクリプトを作った。 delete_3Dobj.reg とでもして管理者権限で実行されたし。

Windows Registry Editor Version 5.00

[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\{0DB7E03F-FC29-4DC6-9020-FF41B59E513A}]
[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\{3dfdf296-dbec-4fb4-81d1-6a3438bcf4de}]
[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\{24ad3ad4-a569-4530-98e1-ab02f9417aa8}]
[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\{f86fa3ab-70d2-4fc7-9c99-fcbf05467f3a}]
[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\{d3162b92-9365-467a-956b-92703aca08af}]

デスクトップ {B4BFCC3A-DB2C-424C-B029-7FE99A87C641} ダウンロード {088e3905-0323-4b02-9826-5d99428e115f}

は残したいので入れず。

全部消す場合は以下のように。上から順に3Dオブジェクト ドキュメント 音楽 ピクチャー ビデオ デスクトップ ダウンロードです。

Windows Registry Editor Version 5.00

[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\{0DB7E03F-FC29-4DC6-9020-FF41B59E513A}]
[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\{3dfdf296-dbec-4fb4-81d1-6a3438bcf4de}]
[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\{24ad3ad4-a569-4530-98e1-ab02f9417aa8}]
[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\{f86fa3ab-70d2-4fc7-9c99-fcbf05467f3a}]
[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\{d3162b92-9365-467a-956b-92703aca08af}]
[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}]
[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\{088e3905-0323-4b02-9826-5d99428e115f}]

参照

blog.yuizi.com

Windows 10 Fall Creators Updateにて現れた 3Dオブジェクトフォルダを削除する – 友蔵保管庫

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

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

高エネルギー粒子をシミュレーションするときは、乾板の表面に入ってから出ていくまでを直線と仮定して差し支えないが、低エネルギー粒子の飛跡をシミュレーションで再現しようとするときは、PhysicsListが低エネルギー側でどの程度現実の物理を反映しているかどうかは別にして、それなりに細かいStepで飛跡の位置情報を出力したいと誰しも思うだろう。

Geant4でこのような検出器を実装するには、 G4PVReplica という機能を使う。

G4PVReplicaG4VPhysicalVolume から継承されているクラスで、先に作った箱(例えば G4Box)をある方向に分割する機能である。X軸、Y軸、Z軸の3回分割を繰り返せば、細かい要素に箱を区切ることができる。シミュレーションしたい内容に応じて、細かさは調整すればよい。 コメントで指摘があったとおり、最小要素(Elmt)を四角柱(Stick)に詰め、それを平面に伸びる四角柱(Srfc)に詰め、さらに箱(Box)に詰めている、という考え方の方が分かりやすい。

次の例では、簡単のために一辺100ミリメートルの立方体を、一辺10ミクロンの立方体で区切る。計10の12乗のチャンネル数がGeant4にできていることになる。

G4double leng_EmulsionBox = 100.0*mm;     // X-full-length of emulsion box 
G4double leng_EmulsionElmt = 0.01*mm;     // X-full-length of emulsion element
G4int nDiv = std::round(leng_EmulsionBox / leng_EmulsionElmt);

//Emulsionを格納するBOX
auto* solid_EmulsionBox =
    new G4Box("Solid_EmulsionBox", leng_EmulsionBox / 2.0, leng_EmulsionBox / 2.0, leng_EmulsionBox / 2.0);
auto* materi_EmulsionBox = materi_Man->FindOrBuildMaterial("G4_AIR");
auto* logVol_EmulsionBox =
    new G4LogicalVolume(solid_EmulsionBox, materi_EmulsionBox, "LogVol_EmulsionBox", 0, 0, 0);

//XYに伸びる四角柱(平面)
auto* solid_EmulsionSrfc =
    new G4Box("Solid_EmulsionSrfc", leng_EmulsionBox / 2.0, leng_EmulsionBox / 2.0, leng_EmulsionElmt / 2.0);
auto* materi_EmulsionSrfc = materi_Man->FindOrBuildMaterial("G4_AIR");
auto* logVol_EmulsionSrfc =
    new G4LogicalVolume(solid_EmulsionSrfc, materi_EmulsionSrfc, "LogVol_EmulsionSrfc", 0, 0, 0);
new G4PVReplica("PhysVol_EmulsionSrfc", logVol_EmulsionSrfc, logVol_EmulsionBox, kZAxis,
    nDiv, leng_EmulsionElmt);

//X方向に伸びる四角柱(棒)
auto* solid_EmulsionStick =
    new G4Box("Solid_EmulsionStick", leng_EmulsionBox / 2.0, leng_EmulsionElmt / 2.0, leng_EmulsionElmt / 2.0);
auto* materi_EmulsionStick = materi_Man->FindOrBuildMaterial("G4_AIR");
auto* logVol_EmulsionStick =
    new G4LogicalVolume(solid_EmulsionStick, materi_EmulsionStick, "LogVol_EmulsionStick", 0, 0, 0);
new G4PVReplica("PhysVol_EmulsionStick", logVol_EmulsionStick, logVol_EmulsionSrfc, kYAxis,
    nDiv, leng_EmulsionElmt);

//最小単位 (Element)
auto* solid_EmulsionElmt =
    new G4Box("Solid_EmulsionElmt", leng_EmulsionElmt / 2.0, leng_EmulsionElmt / 2.0, leng_EmulsionElmt / 2.0);
auto* materi_EmulsionElmt = materi_Man->FindOrBuildMaterial("EmulsionE373");
auto* logVol_EmulsionElmt =
    new G4LogicalVolume(solid_EmulsionElmt, materi_EmulsionElmt, "LogVol_EmulsionElmt", 0, 0, 0);
new G4PVReplica("PhysVol_EmulsionElmt", logVol_EmulsionElmt, logVol_EmulsionStick, kXAxis,
    nDiv, leng_EmulsionElmt);

auto threeVect_LogV = G4ThreeVector(0, 0, 0);
auto trans3D_LogV = G4Transform3D(G4RotationMatrix(), threeVect_LogV);
new G4PVPlacement(trans3D_LogV, "Emulsion", logVol_EmulsionBox, physVol_World, false, 0);

こういう使い方は、Geant4の開発者が想定する使用方法ではないと思うが、大丈夫ですか? (エラい人へ)

参考文献

https://wiki.kek.jp/display/geant4/Geant4+Japanese+Tutorial+for+Detector+Simulation+2017

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

Geant4: A toolkit for the simulation of the passage of particles through matter

WindowsでGeant4を入れたお話。

皆さん誤解しているかもしれませんが、WindowsでGeant4は動きます。GUIや、他のLinuxにしか対応していないツールや、マルチスレッド関連を除けば、ちゃんと動きます。 深いことをやろうとすると動かなくなることがありますが、とりあえず構造を作って粒子を打ち込むのであればできる。

と思っていたわけだ。こんなに苦労するとは思わなかった(8時間ほど)。詰まったのは G4LIB_BUILD_DLLプリプロセッサに追加するところだった。一通り導入方法を書きます。質問があればコメントでどうぞ。

Geant4のWindows + Visual Studioでの導入方法

Geant4の入手

まず、ダウンロードページからデータファイルとコンパイル済みのライブラリを入手しましょう。

http://geant4.web.cern.ch/geant4/support/download.shtml

「compiled using VC++ 14.0 on Windows 7」と書いてありますが、VC++15は14と互換性があるので問題ないし、Windows10でも動きます。

コンパイル済みのライブラリは C:\Program Files (x86)\Geant4 10.3 にインストールしたとします。初期設定でそうなっていると思います。

ソースファイルの入手

インストールした先のexamplesにサンプルコードはありますが、分かりにくいです。全然ベーシックじゃねぇです。KEKのGean4初心者講習の実習用ソースコードの方が分かりやすいです。KEK万歳です。 Geant4Tutorial20171129\TutorialMaterials\P01_FirstStep\source にあります。 直下にある *.cc と、srcにある *.cc includeにある *.hh を使います。

KEK wiki https://wiki.kek.jp/display/geant4/Geant4+Japanese+Tutorial+for+Detector+Simulation+2017

ソリューション、プロジェクトを作る

Visual Studio 2017で、適当な名前を付けて作ってください。

先ほどの *.cc *.hh を全部コピーして、ソースファイルとヘッダーファイルに突っ込みます。正しい流儀ではありませんが、気にしたら負けです。

プロジェクトの設定

Visual Studio内で、インクルードパスを設定し、ライブラリファイルを設定します。

  • インクルードパス: プロパティ→構成プロパティ→VC++ディレクトリ→インクルードディレクトC:\Program Files (x86)\Geant4 10.3\include\Geant4
  • ライブラリファイル: プロパティ→構成プロパティ→リンカー→入力→追加の依存ファイル C:\Program Files (x86)\Geant4 10.3\lib\*.lib

適宜インストール先に置きかえてください。

いくつかのプリプロセッサを設定する必要があります。プリプロセッサは プロパティ→構成プロパティ→C/C++プリプロセッサプリプロセッサの定義に、

G4LIB_BUILD_DLL
WIN32
_CRT_SECURE_NO_WARNINGS

を設定してください。

上から、DLLを呼び出す(dllimport を使う)設定、Windowsのヘッダにするための設定、古いCの関数でエラーを出さないための設定です。

環境変数

環境変数のpathに C:\Program Files (x86)\Geant4 10.3\bin を追加しましょう。

データファイルの環境変数は適宜下記のものを設定してください。使う物理リストによっては他の変数を要求されることもあります。

G4ENSDFSTATEDATA=C:\G4ENSDFSTATE2.2
G4LEDATA=C:\G4EMLOW7.3
G4LEVELGAMMADATA=C:\PhotonEvaporation5.2
G4NEUTRONXSDATA=C:\G4NEUTRONXS1.4
G4SAIDXSDATA=C:\G4SAIDDATA1.1

動かしてみる

P1というサンプルコードを動かすと、次のようにコンソールに表示されて止まります。ここにコマンドを入れていくと、粒子を買えたりビームを打ったりすることができます。warningが出ていますが、とりあえず気にしません。なぜ出るのかエラい人教えてください。

*************************************************************
 Geant4 version Name: geant4-10-03-patch-03    (20-October-2017)
                      Copyright : Geant4 Collaboration
                      Reference : NIM A 506 (2003), 250-303
                            WWW : http://cern.ch/geant4
*************************************************************

<<< Geant4 Physics List simulation engine: FTFP_BERT 2.0


 FTFP_BERT : new threshold between BERT and FTFP is over the interval
 for pions :   3 to 12 GeV
 for kaons :   3 to 12 GeV
 for proton :  3 to 12 GeV
 for neutron : 3 to 12 GeV

### Adding tracking cuts for neutron  TimeCut(ns)= 10000  KinEnergyCut(MeV)= 0
Available UI session types: [ Win32, GAG, csh ]

-------- WWWW ------- G4Exception-START -------- WWWW -------
*** G4Exception : UI0002
      issued by : G4UIExecutive::G4UIExecutive()
Specified session type is not build in your system,
or no session type is specified.
A fallback session type is used.
*** This is just a warning message. ***
-------- WWWW -------- G4Exception-END --------- WWWW -------

Idle>

講義資料に使い方が載っています。やってみましょう。とりあえず色々動かしてみましょう。

https://wiki.kek.jp/display/geant4/Geant4+Japanese+Tutorial+for+Detector+Simulation+2017

ソースコードを書く

好きにソースコードを書きましょう。例えば、Geant4でHello World!を書くには次のようにするそうです。

#include <G4coutDestination.hh>

int main() {
    G4cout << "Hello world!" << G4endl;
}

IO部分はとりあえずの実装で良いなら、 std::coutstd::ofstream を使っても動きます。

では、良いシュミレーションライフを。

原子核乾板の元素組成と密度

原子核乾板 (Nuclear Emulsion) の組成や密度を実測することは難しい。 軽元素から重元素までの測定レンジを持つ組成の測定法は存在しないため、同じ条件で全ての元素組成を測定することはできない。 また、環境の湿度が変化すると乾板に含まれる水分量も変化するため、これも測定を難しくしている。 原料自体の組成は測定しやすいものの、原子核乳剤を製造する工程に水洗工程があり、この工程で何がどれだけ流出したかをどう推定するかで結果が変わる。

よくある測定方法

軽元素である水素、炭素、窒素、硫黄、酸素の質量比(通常の装置では水素、炭素、窒素)は、元素分析装置による測定が可能である[8]。硫黄についてはその存在比が少ないため、元素分析装置での測定は一般には不可能である。 重元素については、銀、臭素ヨウ素の比はSEM-EDXによる測定が可能である[8]。 定着(FIX)前後の厚みと質量測定により、AgBrIとバインダーの比及び密度を測定することが可能である[8]。 アルファ線の飛程からエネルギーとレンジ(飛程)の関係式を導き出す方法が最も精度の良い密度測定方法(密度の相対誤差0.3%)でかつ系統誤差を抑えられる方法である[1]。ただし、ここで求まる密度は、α線のエネルギーとレンジ(飛程)の関係式を媒介する、換算密度とも呼ばれるものである。 論文等で紹介されている各原子核乾板の組成を紹介する。

Emulsion Ilford G-5

  • Density 3.907g/cc
H C N O S Ag Br
Mass % 1.4 6.9 0.07 6.9 0.2 47.4 34.8

SRIMのCompound.dat より

Photographic Emulsion (ICRU-215) = Standard emulsion

  • Density 3.815g/cc
H C N O S Ag Br I
Mass % 1.4 7.2 1.9 6.6 0.2 47.4 34.9 0.3

Fuji ET-7B ET-7C/D

  • 密度: 3.73 g/cc (Fuji ET-7B)
  • 密度: 3.60 g/cc (Fuji ET-7C/D)
  • 相対湿度: 68%

結晶サイズ

  • ET-7B 240±78 nm [7]
  • ET-7C 260 nm [9]
  • ET-7D 176 nm [9]
H C N O S Ag Br I
Mass % 1.5 9.3 3.1 6.8 0.2 45.4 33.4 0.3
Atomic % 39.6 20.6 5.9 11.3 0.2 11.2 11.1 0.1
Binder AgBrI
Mass % 20.9 79.1
Volume % 50.0 50.0
Density g/cc 1.71 6.473

Binderの密度はAgBrIの密度が6.473g/ccとした場合の体積支配率からの推定。

Fuji OPERA film

  • 密度: 2.71g/cc [6]

結晶サイズ

  • 200±16 nm [7]

組成 [6]

H C N O S Si Na Sr Ba Ag Br I
Mass % 2.4 13.0 4.81 12.43 0.09 0.08 0.08 0.02 0.01 38.34 27.86 0.81
Binder AgBrI
Mass % 33.0 67.0
Volume % 69.0 31.0
Density g/cc 1.43 6.473

Binderの密度は、AgBrIの密度が6.473g/ccとした場合の体積支配率からの推定。

組成は原料からの計算値である。特に水洗工程での水溶液側に抜ける成分に仮定が入っている。(桑原氏のコメントより)

Nagoya NIT [8]

  • 乳剤層の密度: 3.44 g/cc
  • AgBrの密度: 6.473g/cc
  • ゼラチンの密度: 1.32g/cc
  • PVAの密度: 1.19g/cc

結晶サイズ

  • NIT 44.2±6.8 nm
  • UNIT 24.8±4.3 nm

組成

H C N O Ag Br I
Mass % 1.6 10.1 2.7 7.4 44.5 31.8 1.9
Atomic % 41.1 21.4 4.9 11.7 10.5 10.1 0.4
Binder AgBrI
Mass % 21.9 78.2
Density g/cc 1.29 6.473

AgBrIの分量は原料からの計算値、HとCとNは実測値、Oはそこからの推定値である。

参考文献

  1. 吉田ら https://doi.org/10.1016/j.nima.2016.11.044
  2. SRIM http://www.srim.org/
  3. Photographic Emulsion (ICRU-215) https://physics.nist.gov/cgi-bin/Star/compos.pl?refer=ap&matno=215
  4. E531実験検出器(Fuji ET-7B) https://doi.org/10.1016/0167-5087(84)90446-0
  5. 市川 博士論文 京都大学 https://repository.kulib.kyoto-u.ac.jp/dspace/bitstream/2433/150816/3/D_Ichikawa_Atsuko.pdf
    1. Patrizii ら https://dx.doi.org/10.1088/1748-0221/3/07/P07002
  6. 中村琢ら NIM A 556 (2006) 80–86 https://dx.doi.org/10.1016/j.nima.2005.08.109
  7. 浅田 吉本ら https://doi.org/10.1093/ptep/ptx076
  8. 福永 修士論文 岐阜大学教育学研究科 2012年2月21日
      1. Barkas Il Nuo. Cim. Volume 8, Issue 2, pp 185–200 (1958) https://link.springer.com/article/10.1007/BF02747737

文責: 吉本

間違いがあればメール or コメントをください

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

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 unittest2
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.4 ドキュメント