Update History

Version 1.1.1

- Unit display: CPM, mRem/h, µSv/h
-1 Roentgen = 1 Rad = 1 Rem, for gamma/beta and whole body exposure.
- CPM is converted to mRem or uSv by a conversion factor. (変換係数)
- For conversion factor x: (変換係数)
1 mRem per hour = 10 µSv per hour = x Counts Per Second.

Conversion factor (変換係数) is usually calibrated to gamma activity from a Co-60 source.  It is specific to your tube, the radioisotope, and type of radiation.  It is usually given only for gamma radiation.

As an approximation, use 10 for smaller tubes, and 20 for large tubes (like the SBM-20).

Sample Conversion Factors:

For a Kvarts DRSB-01 (SBM-20 tube):
- Co-60: 22
- Ra-226: 29

For a CDV-700:
- Co-60: 10

Version 1.2

- complete overhaul of audio engine to use low-level PCM buffer access.  much greater accuracy.

Version 1.3

- Graphing!
- User settings screen
    - all changes are "live" upon exiting the screen, no restart or zeroing needed
- iOS deployment target -> to 3.1.3 (1st gen iPhone/iPod touch) (may change)
- Framerate default -> 15 Hz (from 1 Hz)
- GPS coordinates
- Standard deviation

The - / + buttons now cycle through displays on the virtual LCD:
1.  Standard count rate w/ standard deviation (sigma)
2.  Graph: Absolute count by second (1 Hz update speed)
3.  Graph: CPS "pulse" for last frame (user framerate update speed)
4.  Standard count rate w/ GPS coordinates (if location enabled on settings screen)

Version 1.3.1 (Atlantis)

- minor release primarily to improve Japanese localization
- about/credits screen to thank those who have helped with Geiger Bot
- reset to default action (right column in settings screen)

Version 1.3.2 (Atlantis Final)

- iPad native display support
- graph scale control (- / +)
- iPhone LCD display (ディスプレイ) tab indicator
- improved localizations
- 2nd graph is now current RMS power (
- update rate (画面リフレッシュ) limit now 1024 Hz to show RMS power graph (実効値電力) in realtime

Version 1.3.3 (Discovery)

- adaptive audio engine (♪ 自動調整): no settings required!  (just give it a few seconds to adapt)
- audio graph: numerous improvements
- volume threshold (音量しきい値) has been changed to a normal 1...32767 scale instead of reversed
- graph autoscaling, redraw, individual scales, faster speed
- improved .de localization (thanks Michael)
- manual override for audio engine (in case the auto mode doesn't work for you for some reason)
    - these are the old-school parameters that have always been there
- some wallpaper variants for iPad version that can be cycled through
- iPad new install crash bug fix

Version 1.3.3a (Discovery)

Thanks to Apple for the expedited approval of this patch release.

- Fix for .de / .ru iPad version crash bug.
    - The iPad interface files for those localizations had become corrupted, and have been rebuilt
    - Unrelated to the previous iPad bug fixed in 1.3.3

Version 1.3.4 (Endeavour)

    - dosimeter (accumulated total dose) display
        - double-tap zero to reset
        - flashes red when the graphic changes to alert you that your radiation exposure has increased significantly

    - unlocking experimental audio changes
       - these enable some preliminary high-end automatic performance scaling
       - only apply to "auto adjust" mode.  recommend one at a time (they partially conflict, see below).
       - Settings -> Advanced
         - Delay Windows: (ENABLE adaptive delay)
           - enter "77"
         - Volume Threshold: (ENABLE extra volume adaptation)***
           - enter "77"

        (*** was enabled by default in 1.3.3)

    - improved German localization (thanks Kristof)
        - forgot to update the settings screen on the iPhone version.  This is why testing software at 1am is bad.  It'll be fixed in the next version.

    - new default iPad wallpaper (thanks Stefan)
       - the "Fukushima pattern", recreated as it once was

       - original blog post and image here
       - also, iPad wallpaper selection is now saved

Version 1.3.4a

- Товарищи! Смотри! Великой Отечественной переводе с носителями языка. Из Америки с любовью.
- Rotation support
- New Graphs: CPM measurement, CPS histogram
- GPS: now in DD format, tap to copy to clipboard

- Adaptive audio delay improved and enabled by default

- radiation warning icon scaling changes
    - now based on count rate and sensitivity (conversion factor)
    - radiation trefoil: displayed at > ~0.50 uSv/h

        - indicates radiation above typical background levels
    - ВНИМАНИЕ: displayed at > ~3.5 uSv/h
        - this is equal to the point at which the ВНИМАНИЕ LED flashes red on the Kvarts DRSB-01
        - for that authentic Soviet Russian styling

Version 1.3.4b

- 測定のPachubeライブストリーミングアップデート
- 無料のアカウントhttp://www.pachube.com参照ください
- 無料のアカウントに対しては、1日あたり500のデータポイントの更新を持っている。それはガイガーのボットで6分のアップロード間隔です。

- 自動調整、オーディオの拡張(ボリューム、デッドタイム)

- 電子メールの計測CSVログファイル(設定のボタンを押したまま)(またはダブルタップの設定]ボタン)

- 、より少ないメモリ/ CPUを使用するバグ修正
- ショーの詳細な情報を支援するコンソール
- Pachubeトラブルシューティングする場合に特に便利
- 表示/非表示にiPhoneの画面をタップする

   - Two datastreams, CPM, mR/h, uSv/h selection
    - calculated from the time and counts measured since the last Pachube update

- adaptive volume improvements
- adaptive delay ("dead time") improvements

- email count log results as CSV
    - hold or double-tap settings icon to send mail
    - hold or double-tap reset/zero icon to clear log file
    - will allow you to import into Excel or Numbers, make charts, do stats, etc

- settings have been completely rewritten to be available from Settings.app (the main Apple program) as well as in-app, and fully localized
- new setting: Inherent tube background count; ie, an offset
    - default of 0 so people don't get terribly confused
    - SBM-20/U is 60 CPM on tube sheet, about 12-13 CPM in testing by Osamu Higuchi
- new setting: default email address for logs
    - just fills out the email to make sending logs easier
    - not used elsewhere.  I'm not a marketing company.  Don't care.

- new UI paradigm: purple below keys means "double-tap or hold for this alternate function"
- graph scale bug fixed (finally!)
- memory and performance tweaks, especially after the app's been running a while
    - memory usage now reported in console @ 10 min intervals
    - memory usage reduced for background images on iPad version (no caching)
- console
    - useful for troubleshooting Pachube config / connection issues (read-only atm)
    - iPhone: tap on virtual LCD to show/hide
    - iPad: tap to left of virtual LCD (where the settings used to be) to show/hide
    - enabled by default on iPad
    - auto-hides on iPhone
    - sort of Quake 1-style although I don't think anyone will get the reference...

Version 1.3.4c (current release)

Fast patch approval by Apple.  This primarily fixes the log file bug.

- bugfix: log file not staying attached to email
- bugfix: missing font on iOS 3.1.3
    - for iPhone/iPod Touch 1G
- Soeks-01M: better compatibility

    - should adapt better to variety of digital-created clicks/chirps/beeps
- console messages: misc improvements
    - no more CPM graph rescaling spam, better Pachube status and startup messages, memory use no longer displayed every 10 minutes
    - whether it will attempt to use Pachube is shown explicitly upon startup or after leaving the settings screen.  It will display why it will not use Pachube, or if it will, what settings it is using.
    - if an error code is received, it will look it up in a table and return a description indicating what the problem is
- conversion factors: more reference values
    - changed Gamma-Scout to LND-712, added Co-60 value from mfr specs
    - added Cs-137 value for SBM-20
    - added alternate CDV-700 value (could not find any tube spec sheets for this)
- Pachube: better default settings
    - lower upload time, prepopulated datastream IDs
    - if enabled, first Pachube upload will always happen after 1 minute.  This is so you don't have to wait around for an hour to make sure everything is working.

Version 1.3.4d

    -       PACHUBE:     
        - GPSのアップロード
        - 設定で"Pachube Feed Title"を設定してください
    -       ログファイル:     
        - GPSの位置
        - カスタム記録時間間隔
        - 線量率
    -       オーディオエンジン:     
        - 増加する最小量のしきい値(バックグラウンドノイズを防ぐために)
    -       換算係数:     
        - 参考文献は、古いドイツの管のために追加
    -       IOS 3.1.3:     
        - 行方不明ユニットのタイトルを修正しました。
        - カスタム時間間隔
        - 今00:00:00表示
        - > 3.5 USV/ hで、アクティブ(または1分間入力がない)。
        - リセットが押されるまで切ることはウィル。
        - 非常に迷惑。デフォルトでは無効。
    -       ディスプレイ統計:     
        - 新しいデフォルト:エラー%(δ%)
        - 標準偏差(単位または%)の設定で"σ"を選択できます。
        - 95%信頼区間を選択できる"±"の設定で(単位または%)
        - エラー δ <5%: テキストの色は緑に設定されています

    -       PACHUBE:     
        - GPS location upload
(thanks to Ben Pirt @ Pachube for helping troubleshoot this)
        - switched to more complex data format (XML, from CSV)
            - done in order to support GPS location upload
            - now requires "feed title" aka "environment title" during upload
                - required by Pachube
            - will overwrite whatever you set on the website
            - can set on Pachube settings screen in Geiger Bot
                - default: "My Geiger Bot Feed"

    -       LOG FILE:     
        - now logs GPS location (if enabled)
        - custom recording interval
            - new default: 1 minute (from 1 second)
            - range: 1 second to 1 day
            - can now disable logging (time of 0 seconds)
        - new columns
            - Latitude
            - Longitude
            - Elevation (meters)
            - CPM
            - uSv/h
        - note: the CPM and uSv/h rates are for the time interval the log has recorded.  They are not average overall rates from the display.  This is much like Pachube.

    -       AUDIO ENGINE:     
        - auto adjust: absolute minimum changed to 4k (from 1k)
            - to eliminate counts from background noise if Geiger counter's batteries die
        - fixed bug reporting lower max volumes than were actually recorded
        - references added for oldschool German counters
        - thanks to Fred Groesbeek for submitting the data
      IOS 3.1.3:     
        - fix for missing unit label (maybe symbols too) (can't test directly)
        - misc background image changes
          MEASUREMENT TIME:     
        - custom fixed time ranges (range: 1 second - 1 day)
        - faster update with fixed time ranges (fractional second floating point calculation)

        - elapsed time now displayed HH:MM:SS on main display (instead of SS "s")
        - alerts at > 3.5 uSv/h or no input for 1 minute
        - will not stop playing alarm warning sound until "zero" is tapped, kind of like a smoke detector
        - very loud, obnoxious and annoying... just like a radiation alarm should be
        - disabled by default (thankfully)
        - somewhat compensated for in audio input
            - subtract mean volume of output from input, change adaptation behavior, increase minimum volume threshold, etc... but is still imperfect
        - probably will not play with headset adapter cable plugged in and no speaker connected to cable
        - theoretically, this could also be used to monitor a pump running, and alarm if it turns off, or stuff like that.  if it's running at a high RPM you may want to increase the conversion factor by... a lot... so it only alarms at silence.
    -       DISPLAY STATS:     
        - new default: Error % (δ%)
            - mean squared error @ 95% confidence interval (z-score = 1.96)

            - can change default in settings -> display -> display statistic
        - now 3 display stats:
σ: standard deviation
            - δ: mean squared error
            - ±: 95% confidence interval boundaries
        - now 2 display modes:
            - σ%, δ%, ±%: percent, relative
               - ie: 34 CPM ±10%
            - σ, δ, ±: in terms of units displayed
               - ie: 34 CPM ± 3.4
        - now calculated correctly for chosen time interval and units
        - regardless of displayed stat, will turn green at error δ < 5%

Version 1.3.4e

Patch release, incomplete localization of new text in UI.

- iPhone: fixed audio resume bug after phone call
- iPhone: sounds now play at correct volume
- iPhone: now uses top microphone

- Clickify: Added and enabled by default
    - Generates a click, every time Geiger Bot detects a count (with math.  Not a sound file.)
    - Turn that wimpy digital chirp into a proper click
    - Echo cancellation filtering is used to prevent Clickify's output from being counted
    - Very amusing with music
    - I recommend disabling echo cancellation filter while surveying high activity sources

- Failsafe:  Added failsafe to crash app if necessary, to reinit things like the sound engine without having to reboot the entire device.
    - Can also do this (requires iOS 4+) with the multitasking bar icons
    - Unlock the failsafe (one shot per unlock) in Settings -> Advanced.
    - If the watchdog timer cannot autofix a severe problem with the audio engine, it will advise you to do this via a repeating console message and virtual LCD overlay informing you of the audio system failure.  So you won't be left wondering why Geiger Bot can't see your counter's sound.
    - Alternatively, you may attempt to clear an audio system failure state by tapping and holding the RESET button.  This only really works if things have somehow resolved on their own.  If the watchdog timer detects the problem is still there, the message will come back in a few seconds.

Version 1.3.5

             1. ClickifyLab          
        - カスタム"をクリック"のサウンドを作成する
        - アナログスタイルのチューニング
        - ライブプレビューグラフ
        - "マイク入力"おもちゃ機能音声歪みフィードバックのために使用するヘッドフォン

    -          2. ヒステリシスフィルタ         
        - 振動ノイズを低減
        - 特に古いガイガーカウンターからライン入力用。これらは、高電圧ノイズを持つことができます。

         3.  超高速カウントレートモード          
        - 高活性の源と"パンケーキ"ガイガープローブ用の
        - 時々音単調、ファンの回転数などを測定することができます
        - 無効にClickify

    -          4.  グラフの拡張        
        - CPS/ CPMのグラフは、曲線の下に網掛け

          5. 測定時間自動調整           
         - マニュアルリセットを必要とせず、良好な測定精度
        - 2分の時間間隔ターゲット
        - 突然の変化に応じてリセットされる
        - 20番目のしきい値> 3増加または10倍減少する
        - 10番目のしきい値>10倍増加または20倍減少する
        - Soeks-01Mと同様にファームウェア1.AL+離散間隔代わりに、しかし連続測定

              1. ClickifyLab          
        - control sound... with MATH!
        - customize your click sound
        - analog-style tuning controls and choice of mathematical functions
        - live preview sound and graph of waveform (and its components)
        - also: "Mic Input" switch (toy feature)
            - live real-time sound distortion using the same maths
            - due to feedback issues, recommend using headphones

          2. Hysteresis Filter         
        - for reducing oscillating noise (real-world example for microphone: an electric desk fan)
        - especially for line-input cable users with high-voltage noise from old analog electronics
        - says that the waveform has to pass -value/2 and +value/2 before it is counted (very bad explanation of hysteresis...)
        - thanks to Fred Groesbeek for suggestion

          3. Ultrafast Count Rate Mode           
        - similar to old "experimental" feature
        - for high activity sources, users with pancake probes etc and certain types of equipment where detecting the frequency of sound is key
        - also can tell Hz of a single monotone, fan/engine RPM (sort of), etc though this is not a tool for analyzing multifrequency sound
            - if you want to measure Hz, set the conversion factor to 1, and set the units to mR/h
        - disables Clickify, echo filtering, and some adaptive delay processing while enabled
        - about 1000 Hz/CPS or 60000 RPM/CPM effective max rate currently (with microphone frequency response curve)

          4. Graph Enhancements        
        - CPS/CPM graphs now have transparent shading below the curve (yellow->orange, logarithmic shading)

            5. Auto/Adaptive Measurement Time           
        - now default mode (others are all still there)
        - basically a 2 minute count that resets itself when a sudden change is detected
        - fairly accurate without having to worry about zeroing it etc
        - 20s threshold: > 3x increase or 10x decrease (one arrow on console message)
        - 10s threshold: > 10x increase or 20x decrease (two arrows on console message)
        - similar to the Soeks-01M 1.AL+ firmware algorithm, but continuous rather than discrete time intervals and two threshold levels

          6. Localization Improvements         
        - Most new stuff is machine translation, please let me know of any errors

          7. Removed: Hybrid Audio Engine          
        - after further investigation it appears the scope of this isn't going to work well with Geiger Bot, so this has been shelved, and related options have been removed.  However, echo cancellation, auto-ducking, and hysteresis filtering are all now implemented without it, and I'll continue to work on improving them and adding further DSP filters as necessary.

    -             8. Clickify, Feedback, and Count Rates: FYI          
        - Please note the following:
- Clickify may cause feedback in certain circumstances depending on the sound generated, volume level, how the environment reflects sound, how the speaker makes the device reverberate, etc
        - Clickify's default sound is relatively short and quiet.  With ClickifyLab, you can make it both louder and longer, and this increases the risk of feedback.
        - Clickify's echo filter also includes auto-ducking.  In most circumstances this will eliminate any feedback issues.  However, the echo filter will also make the count rate max out at ~600 CPM or so.  At background levels it should not have a statistically significant effect.
        - These filters will likely have no effect upon the alarm sounds.  The exception is the hysteresis filter which attenuates the "duck and cover" alarm sound.
        - Clickify can be used without the echo filter, but you may have to control the volume level manually with your device's volume buttons if you are using the default speaker/microphone
        - ClickifyLab's "mic input" novelty feature creates feedback that no filter can attenuate.  The only pseudo-exception to this I have found is setting the 1st frequency function to COS and to be somewhat higher than the 2nd (SIN) frequency function, while setting the power function to the square root of x.  This both attenuates the volume(amplitude) and shifts the sound out of phase enough to prevent a great majority of the feedback.

Version 1.3.6 (invalidated)

I have manually invalidated this release in place of the 1.3.4e critical patch re-release, and these features will be coming in 1.3.7.

    - 1. iPhone:バグ修正:CPS/オーディオグラフの移調
    - 2. iPhone:バグ修正:ゼロボタンがランドスケープモードに回転しないことは正しく
    - 3. iPhone:Retinaディスプレイの起動画像の追加
    - 4. ボタンの二次的な機能:高速な応答(クリック/ホールド倍にする)
    - 5. 懐中電灯は:"CPM"グラフのスケールボタンを押したまま、iPhone4でカメラのフラッシュを使用しています

    - 1. bugfix: iPhone CPS/audio graphs
    - 2. bugfix: iPhone zero button not rotating correctly to landscape orientation
    - 3. bugfix: Retina Display launch image
    - 4. secondary functions: faster response to hold / double tap
    - 5. Flashlight / torch: hold down or double-tap "CPM" graph scale button to toggle LED camera flash on/off (currently only iPhone 4 hardware supports this)
        - non-iPhone 4: whitens screen
(not green like the Pip-Boy, but...)

Version 1.3.6

Recompile of 1.3.4e, without sound output, to resolve the thread timing issue experienced on the iPhone 3GS.

Version 1.4.0

Key improvements are to ease of use:
    - Re-organized and simplified settings
    - Automatic measurement time to reduce manual setting / zeroing

New features:
    - Clickify: Back and sounds like a CDV-700 now.  Disabled by default.
    - ClickifyLab, alarms, graph shading, hysteresis filter, ultrafast rates mode and other 1.3.5 features are also back in
    - "torch mode" on iPhone 4 (screen light on other devices) added

    - iPhone button rotation
    - resync count time with system clock for increased accuracy
    - bugfix for stats display with long custom measurement times
    - misc. iOS 3.1.3 compatibility issues / fonts
    - ClickifyLab will now play manual preview sounds even if Clickify is not enabled

iOS 5 Updates:
    - minor font fix for iPad version (prev/next background image buttons)
    - "screen light" function now sets max hardware screen brightness on iOS 5 devices if a LED camera flash is not present

Version 1.4.1

iOS5 Fixes:
- fix for crash upon changing textfield in settings
- console retract animation does not play
    - ClickifyLab reset sometimes does not fully reset
    - logfile (sometimes) produces NaN result for rate calculations (div by 0) after resuming from app suspend in background

Version 1.4.2

More iOS5 Fixes:
    - fix for iPad background transparency
    - fix for alarm sounds not playing on iOS 5

Version 1.4.3

- bugfix: extraneous counts on startup
- bugfix: iOS 5 dosimeter scale alignment

- new custom I/O setting: enable AGC (iOS 5+)
    - by default, this is enabled, such that iOS 5 and iOS 4 behave the same
        - recommended setting: ON
    - iOS 5 allows apps to use a new mode for audio I/O, "measurement mode"
    - this mode disables the automatic gain control (AGC) that normally occurs in sound input

    - if disabled, you will see lower volume levels than normal on the audio graph
    - this may be of use to users with variable volume issues or noise on the line input
- new display setting: keep display on
    - by default, this is disabled to maximize battery life
        - recommended setting: OFF (unless temporarily taking a long measurement or using AC power)
    - prevents sleep mode (potentially draining the entire battery if not managed)
    - same as disabling screen lock in Apple's Settings.app

- dose equivalent (dosimeter value) now saved
- iPhone version: screen transitions changed from fades to page slides to make navigation more intuitive
- reliability: now should automatically recover from system audio server crashes in most circumstances

- significantly less CPU utilization by Clickify

iOS 5:  In performing additional testing I have found that Geiger Bot is being suspended when the LCD turns off, either by timeout or by pressing the power button.  Tested on an iPad 2 and US CDMA iPhone 4S.  I have filed a bug report with Apple.  (this is a greater issue with all audio apps that do recording or playback without multitasking)  Version 1.4.3 adds the "keep display on" setting as a work-around for iOS 5 users.

Version 1.4.4

iO1.4.4 は、2011年のガイガーボットの最後のリリースとなります。私はすぐにそれにパッチを適用することができないだろう、新しいリリースで見つかった問題は (これまでに起こることではないことを... ...)があった場合はApp Storeの提出がダウンして12月22日から12月29日まで、したがってです。 1.4.4は、私は今のところそれは安全なプレイいただくために固体のようです。


また、ガイガーのボットは、SMSメッセージを受信するような別のプロセスによって中断されるカウント時間の同期のバグに対する修正が含まれています。また、フォームは、ヘルプを要求する私にメールする。とオフラインのドキュメント。 (英語でのみ今のところ。)

私 はそれが人々が1.4.3に気づいていたというのカウント時間の同期のバグであることを今考える。コンソール上でランダムにあなたがそれだったものを、 やっていませんでした:あなたは"sys: resuming control"を見た場合。私はそれを再現することができなかったことが、私は1.4.4がそれを解決することは非常に確信しています。カウント時間は まだ同様に高い精度のために再同期されます。


1.4.4 will be the last release of Geiger Bot for 2011.  App Store submission is down from Dec. 22 to Dec. 29 and thus if there were a problem found in a new release (not that that would ever happen...) I would not be able to patch it quickly.  1.4.4 seems to be solid so I'll play it safe for now.

Version 1.4.4 fixes the auto measurement time display bug.  It is also completely rewritten to be faster and smarter about detecting change.*

It also contains a fix for a count time sync bug when Geiger Bot is interrupted by another process such as receiving a SMS message, a form to email me to request help, and offline documentation. (in English only at the moment.)

I think now that it is the count time sync bug that people were noticing in 1.4.3.  If you saw "sys: resuming control" on the console randomly when you weren't doing anything, that was it.  I never could reproduce it, but I am very confident that 1.4.4 resolves it.  The count time is still resynchronized for greater accuracy as well.

*(it now uses confidence intervals as thresholds in comparing sample sets rather than a simple linear proportion of the average)

Version 1.4.5


最良の結果を得るには、各データの収集"ドライブ"の前にログファイルをクリアする。 (それにもかかわらず、これは任意のサイズのログファイルを処理することができます)

This is a major update that adds the mapping module which has been under development for quite some time.  I will add online data integration in a future version.

For best results, clear the log file before each data collection "drive".  (nevertheless, this can handle log files of any size)

- NEW:ログファイルからのデータのマッピング
- BUGFIX:iPhone:設定は何からアクセスされた後、不正確な表示が、最初の表示画面
- 強化:換算係数:もはや最も近い整数に切り捨てしない
- ENHANCEMENT:オーディオのエラーコードと変更は、現在表示されている。これは、ライン入力ケーブルに関する問題のトラブルシューティングを支援することです。
- 強化:よりユニットの種類がPachubeデータストリームのために選択することができます。
- ENHANCEMENT:簡潔で使いやすいグラフィカルなヘルプガイドがドキュメントに追加されました。
- 注意:マッピングは、アプリケーションに大きな変化です。それは、テスト中に検出されない問題が発生する可能性があります。

[設定] - > [ログファイル - >マップを無効にする。


- NEW:  Mapping of data from logfile
- BUGFIX:  iPhone: display incorrect after settings is accessed from anything but the first display screen
- ENHANCEMENT: Conversion Factor: no longer rounded down to nearest whole number
- ENHANCEMENT: Audio error codes and changes are now shown.  This is to help troubleshoot problems with line input cables.
- ENHANCEMENT: More unit types can be selected for Pachube datastreams.
- ENHANCEMENT: A concise and easy-to-use graphical help guide has been added to the documentation.
- NOTE:  Mapping is a major change to the app.  It may cause problems not found during testing.

Therefore, as a failsafe, a switch to disable mapping has been added.
Settings -> Log File -> Disable Map.

You must force close and restart the app after changing this setting.  Please see the documentation for more information.

Version 1.4.6

- 地図:高速なパフォーマンスとマルチスレッド
- 地図:表示されているデータの有意な増加量
- 地図:Safecastマップデータベースが含まれている(日本のみ)
- 地図:いくつかの新しい偽のカラーパレット
- マップ:詳細のレベルを選択することができます

1。 マッピングは、データベース駆動型です。したがって、マップの上部のツールバーの"インポート"をクリックしてデータベースに古いログファイルをインポー-
トする必要があります。これだけは一度実行する必要があります。 すべての新しいデータがデータベースに自動的に移動します。
2。 以前はページングに使用されるマッピングボタン
3。 ガイガーボットは、WiFi接続を介してダウンロードする必要があります。 これはSafecastデータベース(36MB)を含むためです。 (携帯データの上限は20 MBです)

- Maps: Faster performance and multithreading  (credit to Ken Turley for multithreading assistance)
- Maps: Significantly increased amount of data displayed
- Maps: Safecast map database included (Japan-only)
- Maps: Several new false color palettes
- Maps: Can select level of detail

1. Mapping is now database driven. Therefore, you must import your old log file into the database by clicking "Import" on the map's top toolbar. This only needs to be done once. All new data will automatically go into the database.
2. The mapping buttons formerly used for paging now select the false color palette. Paging is no longer necessary (due to the database's superior performance).
3. Geiger Bot must be downloaded over a WiFi connection. This is due to including the Safecast database (36MB). (the cellular data limit is 20 MB)

Version 1.4.7

- Safecast database
    - new and completely rebinned to favor new points (vs. averages) where possible
    - expanded global coverage
    - expanded and updated Japan coverage
    - twice the data... and twice the size
    - 981K rows vs. 514K rows
- Map LUT: fast LUT switching (credit to Ricewind)
- Map LUT: now database driven, with additional LUTs
- Map LUT: correct scale colors
- Map LUT: you can change the map scale by swiping up/down on the scale legend
Above, the new LUT scale control shows levels along I-15 from Goodsprings to McCarran, from the new database.

- Map: points are now brighter against the map
- Map: lower point density settings have increasing size and opacity, such that they are more useful for showing things like road/driving data plots
- Map LOD: scaled LOD density better for iPhone screen
- Map: slightly improved render speeds

- Bugfix: Pachube unit labels on settings screen (CPM and mR/h are swapped)
- Bugfix: Missing iPad background texture

Version 1.4.8

- マップ:レンダリング速度:大幅に向上
- 地図:ほとんどのLODは、現在のグリッド·ディスプレイを使用
- 地図スケール:多くの優れた感度/制御
- マップ:設定可能なマップの明るさ
- マップ:設定可能なマップタイプ
- マップ:設定はセッション間で保存されます。

- Map: Render Speed: Significantly improved
- Map: Most LODs now use a grid display
- Map Scale: Much better sensitivity / control
- Map: Configurable map brightness
- Map: Configurable map type
- Map: Settings are now saved between sessions

Version 1.4.9

- マップ:さらに描画速度の向上
- 地図メモリー使用量が減少
- マップ:パンしながら修正グリッドアーティファクトを導入
- マップ:直交射影緯度の影響を部分的に補正
- 地図: "ドロー"モード:2倍のサイズで点を描画
     - 増加するRAMやCPUを使用せずにマップのポイントの"アンチエイリアシング"効果を提供しています
     - 表示を滑らかにし、直交投影によって作成されたグリッドのアーチファクトを低減
     - <50%ポイントのアルファは、このことをお勧めします
- 地図:ポイントモードが保存されるようになりました
- 地図:ポイントアルファスライダーが正しく保存された設定に従って設定されています
- 地図:日付ビニングの範囲は、90日に拡大
     - であった​​:30

- 地図スケール:リニア/トグルログを追加
     - 2つの指を左にスワイプ
     - 詳細はドキュメントにグラフィックヘルプを参照してください
- 地図スケール:ログモードラベル/リニア追加
- 地図スケール:付加中間の25%/75%のラベル

- 地図LUTはいくつかの追加のLUTを追加

- Map: Further rendering speed improvements
- Map: Reduced memory use
- Map: Fix for grid artifacts introduced while panning
- Map: Partial correction for effects of latitude on orthogonal projection
- Map: "Overdraw" mode: draw points at 2x size
    - provides an "antialiasing" effect for the map points without increased RAM or CPU use
    - smooths display and reduces grid artifacts created by orthogonal projection
    - < 50% point alpha is recommended for this
- Map: Point mode is now saved
- Map: Point alpha slider is now set as per saved preference correctly
- Map: Date binning range expanded to 90 days
    - was: 30

- Map Scale: added linear/log toggle
    - two finger left swipe
    - see help graphic in documentation for more info
- Map Scale: added linear/log mode label
- Map Scale: added intermediate 25% / 75% labels

- Map LUTs: added several additional LUTs

Version 1.5.0

- 入力:ケーブルラインでの自動設定を行います。(自動調整モード)
- バグ修正:カスタムI / O設定:RMSウィンドウのサイズになりました(結果として、16にリセット)が正しく適用された
- バグ修正:マップ:ポイント数のデフォルト値は正しく設定され
- IOS5.1:マイナーフォントシンボルの修正、コンパスのキャリブレーションポップアップ修正
- iPadのRetinaディスプレイのサポート:利用可能なように、アイコンの背景のほとんどを更新しました

  • Input: Automatic settings for line-in cables
    • This is only applied under the following conditions:
      • 1.  Line input cable (or headset) present
      • 2.  Auto-Adjust: ON
      • 3.  RMS Window: 16* (default)
      • 4.  Delay Windows: 18* (default)
    • Without changing your settings, Geiger Bot will (temporarily) override them with:
      • 1.  RMS Window: 2
      • 2.  Delay Windows: 128
    • This provides better detection of shorter pulses of sound, typical of line input, while preserving the existing dead time after a count for compatibility with counters that have very long count sounds
    • This should resolve problems users were having with line input varying too much in detected amplitude, resulting in dropped counts
    • If the line input cable or headset is removed, this stops being applied
    • You can set 2/128 at any time under Geiger Counter - Custom -> I/O Settings if you wish to also use this with the microphone
    • Note this will only be applied for 16/18/auto.  If you have changed the RMS or delay windows from their default it will use your settings only.

  • Bugfix: Custom I/O Settings: RMS window size now applied correctly
    • On the settings screen, the prefs key "rmsWindow" was instead "rmsWIndow".  And it's case sensitive.
    • As a result, anything entered on the settings screen was never used; it thought the value had never been set, and just used the default (16)
    • So no matter what you changed this to, it was *always* 16
    • The exception is with Ultrafast Rates, where it did get set to 1.  Ultrafast Rates was always working correctly.
    • As a result, 1.5.0 will reset everyone's RMS window to the default (16) which is what it was using anyway in 1.4.9.
    • Note that the delay is (RMS window size * delay windows).  By default that's 16x18 = 228 samples.  So remember that you may need to change the delay if you change the RMS window size in the future, as all timings you've seen from this lately have been multiplied by 16.

  • Bugfix: Map: Default number of points now set correctly
    • Was defaulting to 300 (instead of 6000 as it should)
    • This resulted in a very checkered / incomplete view of many points, such as the Safecast data in Japan
    • If you ever changed the LOD, this is fixed already for you.  If not, it will be now.

  • iOS 5.1: Minor font symbol fix, compass calibration popup fix
    • Sadly, in iOS 5.1, the Unicode glyphs for the watch and mail envelope are no more.  They have been replaced by Emoji characters, which in turn I have replaced with .PNGs of the original Unicode glyphs as per the Unicode standard.
    • In iOS 5.1, at least on the iPhone, the compass calibration seems to be very twitchy.  Resulting in very annoying and incessant pop-ups.
    • So, if calibration is needed, I disable the part of the map that uses the compass to prevent this message from showing.  If you're wondering why the map isn't rotating any more, you need to recalibrate.  This is basically how Apple's Maps.app does it in iOS 5.1 so I just copied that.
    • You will be briefly see one calibration message nonetheless, but it will automatically dismiss.
    • Since I was tracking the magnetometer anyway, I added magnetic anomaly detection.  A console message will be logged.  This should only happen in very strong magnetic fields.

  • iPad Retina Display Support: Updated icon, most of backgrounds as available
    • I could only update about half the backgrounds, and will include iPad Retina launch images in the next release
    • I am looking for a higher resolution scan of a HP 28C or 28S as well.
    • I could not find one online, and while I have a HP 28S personally, all the scanners I have access to or own are the new kind of sensor that has no DOF at all.  A scanner with an older CCD sensor seems to be required.

Version 1.5.1

 Normal click sound (150 samples)  After Haar wavelet transform

  • Audio engine: wavelet filtering
    • New experimental feature
    • You can enable applying a Haar 1D discrete wavelet transform to input data
    • This provides both shaping (as a square wave) and significant noise reduction (from processing the coefficients matrix)
    • However, it reduces the resolution of input data by half (due to the in-place transform)
    • In general, I would think most users will obtain better performance with this disabled (which it is by default)

  EPA Uranium Mines DB - Overall Coverage (US only)

Brighter intensity indicates greater number of mines.

 Mining the Mojave

Quite a few mines in the Goodsprings and Sloan areas.
 "Numeric" mode

The label shows the mine name (if available) and number of other mines.

If multiple mines comprise a point, the name chosen is the most recent in the database.

  • Mapping - Uranium Mines Database
    • Inclusion of the US EPA's uranium mines database as an optional layer
    • There is no live online version of this data
    • There are approximately 14k mines in the US contained in this data
    • Unfortunately, I have been unable to find data sources for outside the US so far
      • No data for Uranium City, Saskatchewan :(
    • LUT is fixed orange for varying intensity with number of mines.  Automatic contrast based on range of data being displayed.
    • Numeric mode shows mine name.
  • Database Management
    • (Recycling Icon) - Database Cleanup
      • Replaces "Import" button
      • Average all points within 11.1m of each other together into a single datapoint, reducing storage and increasing speed
      • This could take up to several minutes if you have a great deal of data logged.
      • (NOTE: this feature works, but the percentage reduction displayed is not accurate.  Sorry, my bad)

  Version 1.5.2 (current release)

  • USGS US/Canada gamma spectroscopy aerial survey database
    • Currently, 5km grid for continental US only
    • Had some issues with source data, may be able to expand coverage later
    • Two layers:
      • 1. Dose equivalent rate (uSv/h)
        • includes cosmic radiation estimation
      • 2. Uranium concentration (ppm)
        • Recommend setting LUT scale to max of 10+
    • For single core devices, I recommend lowering the display refresh rate in settings while using the map if you have render time issues

 это радиоактивный туман!


NaI scint probe histogram of soil sample contaminated with Cs-134 / Cs-137 from Fukushima (credit: Shintaro Funabasama)
 Geiger Bot 1.5.2's binning of the same data. 

  • Gamma Spectroscopy / virtual "MCA" support
    • Very early alpha implementation of gamma spectroscopy is complete
      • Please send feedback about this.  My scint counter does not have audio out.  It works with test data but its real-world performance with scint probes is unproven.
    • 150 bins.  Linear interpolation between min/max limits.  Y axis = log 10.
    • Max rate of 1000 CPS for spectra energy data.
    • Amplitude used for binning is peak amplitude during click + dead time (delay windows)
    • Special thanks to Shintaro Funabasama for providing suggestions and preliminary test data
    • Thanks to CyberElectronics and the GammaGrapher project for earlier ideas
    • What is this?
      • With a scintillation counter, the volume of the "click" is relative to the energy of the gamma photon detected
      • This is different than a Geiger counter, where regardless of the photon energy, a tube discharge is binary, on or off.
      • Thus from this, you can determine the isotopes (sometimes)
  • Bugfixes
    • LUT scaling when max DER on map scale is < 1.0 uSv/h
    • Text when using the database clean-up (recycling icon) function
      • This feature does work, however I neglected to multiply the fractional amount by 100 so it usually displays 0%, even when it does do something.

Version 1.5.3 

1.5.3 mainly contains a significant overhaul of gamma spectroscopy functionality.  Note this requires a scintillation counter.

For details on actually how to set up and use the gamma spectroscopy features, please see the "Documentation" link.  There is a tl;dr section on it near the top.


Left: New Histogram; Right: Old

Scale differences are due to linear vs. log10 scaling on the y-axis

Will replace old histogram.

  • New histogram control
    • Especially for gamma spectroscopy
    • Supports zoom/pan, trace with energy and count display
  • High performance, 32k raw bins, no limit to detection count rate
  • High resolution display, each display bin is 1 pixel wide on a retina display
  • Support linear, log10, natural log scales

  • Changes to Audio Engine
    • Sample rate increased from 22khz to 44khz
      • Only for scintillation probe mode = ON
      • Geiger counter users should not notice a difference
        • Technically, all input is at 44khz now, but the RMS window and delay window are multiplied by 2x when scint mode is disabled.  This is to make this transparent to users with Geiger counters such that they don't need to change anything.
        • Power users with pancake probes or alpha counters/sources wanting a higher max count rate and greater accuracy at a higher count rate can enable scint mode but disable most of the scint-specific DSP as amplitude binning is meaningless with a GM tube sensor
    • This will enable much more accurate results for gamma spectroscopy
    • This is a major core change so I will need to test it more extensively before releasing it
    • In testing with recorded scintillation probe samples, this dramatically increased the performance of spectroscopy, more than anything else, even the fancy DSP below.  I think this will give the first real usable results for gamma spectroscopy in Geiger Bot.
    • To counteract the increased performance requirements on older devices I have replaced parts of the DSP code with Accelerate-framework based vDSP functions

  • Scintillation probe specific DSP
    • Some DSP specific to scint probes has been added to best extract energy spectra
    • These are all disabled as a group by default so as not to interfere with normal count-only Geiger counter type operation
    • If it looks like I stole these from FitzPeaks, it's because I did
    • Thus far
      • Base delay (RMS windows)
        • This delays recognition of amplitude for spectra generation after the volume threshold is exceeded.
        • It is to negate the leading edge of the waveform, as sampling that lowers accuracy if it is looked at instead of the peak
        • Note this (and the peak) must still occur in the normal lifespan of the count, so this must be less than the normal "Delay windows" setting.
        • This *does* affect count rate accumulation.
      • Maximum length for conversion (RMS windows)
        • Sort of like a hysteresis filter in a way
        • This will prevent the sample from being used for spectra data if it is above the volume threshold for the length of time specified
        • This occurs simultaneously with the normal "Delay windows" setting.  Its purpose is to filter out invalid data, rather than prevent double counts.  In fact, it does not affect count accumulation at all.
      • Use two samples
        • Instead of the maximum amplitude alone being used for spectra, this averages the top two together (assuming there are two)
        • This may enhance accuracy depending on the length of the sound pulses involved
      • Baseline samples
        • This is to counteract ripple artifacts from power supplies
        • Basically it monitors the noise floor and subtracts the average from the peaks
      • Polarity
        • Allows a selection of all, positive, or negative only input values
        • Basically, you should toggle between + and - and see which has the highest volume peaks, and use that one

  • Auto-adjust settings - line input
    • Change from 2 / 128 to 2 / 151 to exactly match time per count of mic settings, as some users were encountering issues with double counts (frankly I'm surprised pulses via line input are longer than 10ms...)
      • 16 + 16 *   18 = 304
      •   2 +   2 * 151 = 304
        • (approx. 14ms, from 12ms)
    • This only applies if you have the default settings enabled and connect via the line input (RMS: 16, delay: 18, auto-adjust on)

  • Auto-framerate adjust when map is maximized
    • Framerate of main app count rate display and graphs will autoset to 2 Hz, and then restore your setting when the map is minimized
    • This will increase performance of map rendering, especially on single-core devices

Version 1.5.4


- すべてのドメインのパフォーマンスが大幅に増加
- これは(のようにMMX / SSE)SIMDベクトル演算を用いて達成された

1.5.4 is all about speed.

- Significant performance increases in every domain
- This was accomplished using SIMD vector math (like MMX/SSE)

Limited Edition Safecast Geiger Counter

Update: The Kickstarter project was a huge success!  Thanks to anyone who participated and helped out Safecast.  And congratulations on getting an awesome deal on a Geiger counter with a full-sized pancake tube.

To anyone who missed out, you will be able to purchase Safecast Geiger counters made by International Medcom later this year.  These devices will help Safecast collect data from known good units and expand their coverage globally.    Stay tuned for further information from Safecast concerning iOS and Android clients.

Version 1.5.5

Above: new histogram in 1.5.5.  This is showing a hybrid bar / line plot with isotope list in iPhone landscape mode.  The new "bin divisor" feature has been set to 8.0, which reduces the number of display bins from 960 to 120.  The default LUT has been changed to "Blue Red Blended" from "Rainbow HC" in response to reports that Rainbow HC was too dark.

 Device  Screen  Zoom  Divisor Divisor
 Name  Orientation  Size
 iPhone  Portrait  Mini  640  320  160  80  40
 iPhone  Landscape  Mini  640  320  160  80  40
 iPhone  Portrait
 Full  640
 iPhone  Landscape  Full  960  480  240  120  60
 iPad  Portrait  Mini  640  320
 160  80  40
 iPad  Landscape  Mini  640  320  160  80  40
 iPad  Portrait  Full  1536  768
 384  192  96
 iPad  Landscape  Full  2048  1024  512  256  128
    Table: Histogram Display Bins/Channels, All "Bin Divisor" Setting Combinations

1.5.5 is another gamma spectroscopy focused release, however performance improvements and reduced memory usage continue to be made in all domains, especially the Safecast map rendering which was completely rewritten.

I still have not yet received my scintillation probe so I could not test the gamma spectroscopy code, but hopefully the changes to base delay will help users with ringing artifacts from their amplifier.

- アンプのリンギング歪みフィルタが追加されました( "
base delay"を参照)
- 同位体IDは、ヒストグラムに追加されます。 IAEAの基準テーブルから308の同位体が含まれています。
- フルスクリーンズーム拡大レンズ付きのコーナースワイプしてドラッグ)を追加
- ヒストグラムの新しい描画モードおよびその他のオプション
- ヒストグラムの2つの新たな"ハンター"のLUT一つは、Cs-134/Cs-137汚染を見つけるためにハイライトカラーを提供しています。もう一つは、自然バックグラウンド放射線(NORM)を対象としています。これは、天然供給源からの汚染を区別するためです。
- ヒストグラムは、現在"リセット"(ボタンを押したまま)でクリアする必要があります。これは、スペクトルデータの偶発的な損失を防ぐためです。

- より速く、Safecastデータの下位メモリのレンダリング

- iPadのマップのバグ修正のパン/ズーム(GPSが無効になっている場合
- iPadの背景変更のバグ修正
- 多数のパフォーマンス向上と低RAMの使用

Gamma Spectroscopy
- Amplifier ringing distortion filter added ("base delay")
- Isotope ID added to histogram.  Includes 308 isotopes from the IAEA's reference tables.
- Full-screen zoom added (swipe and drag into corner with magnifying lens)
- New drawing modes and misc options for histogram
- Two new "hunter" LUTs for histogram.  One provides color highlighting to help find Cs-134/Cs-137 contamination.  Another one targets natural background radiation sources (NORM).  This is to help you distinguish contamination from natural sources.
- Histogram must now be cleared by "reset" (hold button down).  This is to prevent accidental loss of spectra data.

- Much faster and lower memory rendering of Safecast data

- Bugfix for iPad map pan/zoom (if GPS is disabled)
- Bugfix for iPad background change
- Numerous performance improvements and reduced RAM use

Version 1.5.6


1.5.6修正ガイガーカウンタが+ "ベースの遅延"フィルターバグを修正しました。

Big thanks to Apple's App Review team for the quick approval of this patch.

1.5.6 fixes the Geiger counter + "base delay" filter bug.

Version 1.5.8  (current release)

This significantly improves mapping and gamma spectroscopy; still not perfect, but gradually improving.

1.5.8 is about 213 MB, slightly smaller than 1.5.7 (247 MB).  Despite having significantly more mapping data I was able to reduce disk usage a bit.  I believe this can be further improved in the future.  (On the App Store the download was listed at ~100 MB)

 DatabaseUncompressed Size
 % of Total
 EPA Uranium Mines
3.4 MB 
 IAEA Isotope Table
62 KB
 LUTs 256 KB 0.09%
 Safecast and US DOE/NNSA Japan
 206 MB
 USGS et al NURE North America
64.6 MB 

  • Done
    • Mapping
      • Interface Changes
        • Map layer / database and LUT are now selected from a picker ("slot machine" type) list
      • New Engine
        • Much faster performance still (but not perfect... bottleneck in disk I/O)
        • Much better level-of-detail / gridding
      • New Data
        • North America
          • USGS NURE: Added Canada and Alaska data.  Cosmic ray dose correction much more accurate.  Higher detail.
            • Note: This is uSv/h only.  I am currently unable to convert additional uranium concentration data so that remains US-only at this time.
        • Japan
          • DOE/NNSA:  Added Cs-134/Cs137 aerial gamma survey data.  Their activity (in MBq) is corrected for radioactive decay since the survey was taken (2011-06-30) to whenever you look at the map.
          • Safecast: Updated Safecast database.  Slightly higher level of detail than before.
          • DOE/NNSA:  Updated dose equivalent rate data with DOE/NNSA predicted values for 2011-06-30 (basically, 2 months more up to date than before).  Also slightly higher level of detail than previously.
    • Gamma Spectroscopy
      • Improved Pulse Shape Recognition
        • Thanks to Steven Sesselmann, the sample training is now more PRA-like (the peak is "centered" rather than "left" aligned, basically) and this produces superior accuracy and faster pulse detection in my testing
      • Histogram
        • Isotope List now autocentered on cursor keV with an indicator, fixing the earlier problem where the isotope for the bin you had selected might not be displayed
        • Energy calibration is now much easier and more quickly done from sample bin/keV points you enter-- no more firing up Microsoft Excel to do a linear regression. (requires at least two points)
        • Bugfixes
          • Fixed bug that switched the isotope highlights between the NORM and cesium "hunter" LUTs (whoops.)
          • Fixed two minor memory leak bugs with isotope list

Version 1.5.7

2012-07-15 Update

At long last, 1.5.7 has been submitted to the App Store and is pending review.

Some further notes:

  • Mapping
    • I would recommend checking out +1 / +2 LOD modes for Safecast/DOE data.
    • The amount of detail they display is pretty amazing.
    • This is the single-most comprehensive map presentation of dose rate surveys in Japan anywhere to my knowledge.
    • There's no interpolation between flight lines; you see the exact path of the vehicles during the survey.
  • Map Speed:
    • Reference: ~20% of the DOE data takes > 30 mins to render in Google Earth (Core2Duo)
    • Geiger Bot: 40 seconds for image on right
    • About 4x more data than v1.5.6

ABOVE: Comparison of coverage of Safecast (red) and DOE/NNSA data (green).  LOD = +2.

  • US DOE data
    • This data is from http://www.nnsaresponsedata.net/
    • It was collected in 2011 by the US DOD, and DOE/NNSA
    • This data set is a matter of some political controversy;
      • I don't want to get into politics but a simple explanation:
        • Basically, it was felt that the Japanese government didn't disseminate this information quickly enough
        • Data shows contamination far outside of the initial evac zone
        • In fact at least one Japanese official admitted to a cover-up regarding the US-collected data
    • I've omitted the very early measurements from Geiger Bot's map data
      • The reason is the early data measures *very* high due to the presence of more short-lived radioisotopes that are not present today; it is good historical information, but not for telling you what areas have potentially dangerous levels today.  Further, there are many gross beta counts that cannot be directly mapped as dose equivalent rates.
    • Instead, I include a composite of all the "AMS" datasets
      • one collected by a C-12 Huron fixed-wing aircraft
      • two collected by UH-1 Huey and UH-60 Black Hawk helicopters (over the coastal areas)
      • one collected by a variety of ground vehicles, similar in some respects to the Safecast "drives"
    • Note this data is older in many cases than the Safecast data.
      • Both datasets are actually very congruent overall
      • However, you will see some areas where the Safecast measurement is lower
      • This is the effects of time on both radioactive decay and dispersal.
    • The US DOE / NNSA today
      • After these surveys, the US DOE / NNSA team switched over to a support role, providing MEXT with equipment and training
      • MEXT has published maps of this as non-spatially referenced, low-resolution raster images in PDFs with heavy interpolation for press releases and media use
      • Unfortunately MEXT has not published the source data, nor did they even share it with the US DOE/NNSA; this is the first and last aerial gamma survey of Japan that is accessible in any detail.

  • Pulse Shape Training -- Sample size:
    • PRA uses a default of 16 samples.  As does Geiger Bot, in emulation of it.
    • Additionally, I have added the ability to customize the sample size as arguably 16 samples @ 44kHz is too much longer than any one pulse (PRA is usually used at higher sample rates with PC sound codecs)
    • Available sample sizes: 8, 10, 12, 14, 16
    • The "trained" reference sample is contingent upon the number of samples to a significant extent.
      • If you change the sample size on the fly, you will need to do a reset and retrain for accurate results.
      • I do not do this automatically because I do not want to interfere with field use (the old shape sort of works)
      • You are reminded of needing to reset on the training screen's console.
    • This was a rather late addition, and I was only able to perform preliminary testing.  I did not get good results with a sample size of 8.  10 and 12 seemed ok.

  • Pulse Height Calculation
    • The new PRA-like pulse height calculation uses the dot product of the ring buffer with the normalized reference sample.
      • TL;DR:  The result depends on the trained shape.
    • Thus retraining = possible need to redo energy calibration (bin -> keV conversion)
    • You can enable the optional "USE MAX AS AMPLITUDE" option in order to use an absolute value here that is independent of the reference sample, but I suspect accuracy will be lost

  • The only "old" setting that still matters: Volume Threshold
    • All reference samples are trained by a triggered volume threshold.
    • This is also used if you enable the option "TRIGGER MATCH ONLY"; it makes matching behave more like training
    • I seemed to get the best results empirically with a threshold of 2000.
    • Too low of a threshold:
      • Too much noise in signal as noise floor is approached
      • Trigger fires on too many false-positive events
      • Result: massive 0 bin growth on histogram
    • Too high of a threshold:
      • Trigger fires too late and misses too many leading-edge samples causing the pulse shape to be incomplete
      • Result: very few samples matched
    • Ninjas
      • Geiger Bot's default volume threshold is 10K.
      • So if you're doing training and the setting is 10K, it ninja substitutes in 2K on the fly without telling you to match the best results I got in testing.
      • I doubt anyone will notice this, but figured I'd mention it.
    • Caveats
      • I don't fully know how PRA's training method works.  This threshold model was something I made up as I went.
      • My biggest concern is that inaccuracies will be introduced by missing leading-edge samples of the waveform using this model, but only broader testing by more people with different hardware will say for sure.

  • Training Conditions
    • For whatever reason, training works best at background levels, rather than with a test source
    • This is also what I experienced with PRA

  • Shape Tolerance
    • The default for this is 50%.  This is somewhat high relative to PRA settings (usually 10%), and may indicate a flaw in either my methodology or code, or perhaps just a platform limitation.
    • In testing, I found values > 75% would match too much on noise.  But this will likely depend on your hardware.

2012-07-11 Update

I am performing final testing for a release soon.  This release will contain the pulse shape recognition, and new Safecast + US DOE mapping data.

Note some of the "old" DSP options for gamma spectroscopy will remain, as the count rate is separate from the pulse shape recognition. (the pulse shape recognition rejects too many samples to be used for the count rate)

Two options are available for pulse shape recognition:

1.  Use Max As Amplitude:

Normally, to emulate PRA, the pulse height is calculated as the dot product of the ring buffer sample and the reference shape.  This means it is a measurement of the overall, average volume of the peak.

This option instead simply uses the maximum value found.  I believe this possibly may be more accurate if you have a short pulse duration, as a short pulse would be averaged to too low of a value across the 16 samples it uses.

2.  Trigger Match Only:

To train pulses, a trigger is used, then the next 16 samples are captured.  Yet, for recognition, the default behavior is a continually shifting ring buffer, advancing 1 sample at a time.

This option makes recognition behave more like training.  Instead of continually trying to match everything, it waits for a triggering event, then only compares the next 16 samples.

This can enhance precision, but significantly reduces the rate at which spectra data is gathered.

2012-07-11 Update

Results of pulse shape recognition are now superior to the old DSP code.

The new pulse shape recognition in action.  It could still be improved, as the FWHM in the above image for Cs-137 is a bit high vs PRA, but it's significantly better than the existing DSP.
This is the new configuration / training screen.  Most of the previous settings are now unnecessary.  All you do is flip the switch and allow it to gather 512 samples.

In this screen, when training is off, the red shape is the last successfully matched peak.  Blue is the referenced average shape it has constructed with training.

So, it is an interactive screen that gives you easy-to-understand visual feedback of what the underlying DSP is doing.

2012-07-11 Update

Pulse shape recognition results are now at least on par with the current DSP in my testing.  Still some bugs to fix, but we're getting there.

2012-07-08 Update

Gamma Spectroscopy - Pulse Shape Recognition

I've fully completed the basic implementation of pulse shape recognition, and an interface to train and display the learned pulse shape.

However, the accuracy is not quite there yet, and it will require further tuning and tweaking before it is suitable for release.  My goal is to at least match the current level of accuracy as the easier autoconfiguration alone makes it much easier to use.

Mapping Changes

Further, I have integrated a great deal of US DOE / NNSA aerial gamma spectroscopy surveys of Fukushima from 2011 into the database (whose display is optional), improved map rendering speeds further significantly, and the Safecast data has been updated with the 2012-07-01 dataset.

The US DOE data is of some political noteworthiness due to the current debate regarding data availability within the Japanese (political) Diet.  The first data sample was collected on 2011-03-12 aboard the USS Ronald Reagan (CVN-76).

This image below is the US DOE AMS dataset, mostly concentrated around the Fukushima plant area.  It is a combination of an aircraft survey, two helicopter surveys along the coast, and some ground vehicle surveys.

Currently, Japan mapping data is a higher development priority than updating North America USGS NURE data, so that will likely get pushed back to a later release.

2012-06-27 Update: it's been slow going but I have made progress and gotten the shape recognition working in a preliminary state.  If these results hold up, you can expect much more accurate and easier to configure gamma spectroscopy in the next release. 

  • further speed improvements to Safecast map rendering
  • (possibly) expanded USGS NURE map data for .ca / .ak.us
    • improved cosmic ray dose estimation
  • PRA-like pulse shape training and recognition for superior (and easier) gamma spectroscopy results 
    • this will take a while
  • Histogram: Refinement to how isotopes are listed
    • Nearest bin match will be in center and denoted with some kind of selection / cursor
  • Histogram: Built-in calibration points with automatic linear regression for easier bin - keV calibration

Gamma Spectroscopy Study

A report by Shintaro Funabasama studied 1.5.3's new gamma spectroscopy features in depth.

Useful results were obtained with a high-quality amplifier of his own design, but using another amplifier with ringing artifacts or a noisier power supply degraded the results significantly.

With his permission, the full report is available here.  He also covers calibration.  Anyone trying to use gamma spectroscopy in Geiger Bot will find this information very useful.

In summary, gamma spectroscopy in Geiger Bot has been shown as working, but only when used with a low-noise power supply and amplifier without ringing artifacts.  In the future, better signal processing should be able to address this to some extent.

Version 1.6.0

  • Critical Bugfix
    • Fix for the custom measurement time crash bug described above
  • Updated Safecast Map Data
    • Reprojection of Safecast map data (~3 months more recent than previous).
    • Minor speedups to Safecast map data display.

  • Energy Saving Modes
    • Significantly improved potential battery life
      • Especially during long data collection periods such as gamma spectroscopy
    • Fully customizable
    • Auto-Dim
      • After a period of inactivity, the display will be set to a lower brightness value
        • This can potentially save significant amounts of energy
        • The LCD backlight is usually the #1 power draw
      • Additionally:
        • 1. This lowers the app's refresh rate to 1 Hz to save further energy by reducing CPU/GPU use
        • 2. This lowers the histogram's refresh rate even further to 0.1 Hz
      • Options:
        • 1.  Idle Time
          • This sets the time after you last pressed the screen before the LCD backlight brightness is dimmed
          • This also controls if auto-dim is enabled or disabled.
        • 2.  Battery Only
          • Disables Auto-Dim while on external (AC) power
        • 3.  Brightness Level
          • This allows you to customize the amount the LCD backlight is dimmed
      • Caveats:
        • 1.  Auto-Dim does not (yet) activate on the settings screen
    • Keep Display On
      • Existing feature to prevent the device from going into sleep mode.
      • These new options prevent it from getting out of control.
      • Options:
        • 1.  Keep Display On
          • Same as existing feature
        • 2.  AC only
          • Device will still sleep on battery as per the system "Auto Lock" time setting
        • 3.  >20% battery charge or AC
          • Will use on battery, but only if the charge remaining is non-critical (>20%).
          • This will prevent it from depleting your battery entirely if left unattended.

  • iPhone 5 / iPod 5 Native Screen Resolution Support
    • In addition to the iOS 6 crash fixes in 1.5.9, this will add actual native support for the iPhone 5's new screen resolution
    • For now, this will mostly just entail larger buttons and spacing on the keypad
    • Map / histogram will be actual full-screen, of course
  • Other Non-Fatal iOS 6 Compatibility Updates
    • Fullscreen histogram in landscape mode
    • Console show/hide animation in landscape on iPad
    • +many other misc bugfixes

Version 1.6.1 

Not only does the map display 10x faster... but what do we have here?  Атомоград Припять и «Большая медведица»?  Да!


Bugfix: Data not being logged
Map: 10x+ increase in rendering speed for all data layers
Map: A number of additional 3rd party base maps have been added. 
Map: Two new data layer visualizations have been added. 
Map: Preloaded mapping databases now use 200mb less storage 
Map: Bugfix: LUT scale is now displayed correctly in LOG scaling mode 
Map: Bugfix: Custom min/max values now scale correctly 
Map: Safecast data updated

And, a few practical notes about the new map stuff:
-  Apple base maps, in particular "Satellite", are by far the fastest
-  The best base maps for actually seeing radiological data are the dark monochrome ones.  My personal favorite is "Stamen Toner Lite (inv)" at 80% map alpha or so.

Safecast App

The official Safecast App for iOS is now available.  For those of you thinking it looks very similar to Geiger Bot, you're right.  In fact, as I developed it, they share the same codebase.

Primarily focused on mapping, the Safecast client does contain all the normal Geiger Bot functionality.  It additionally includes some new mapping changes and the ability to send data to Safecast.

And, don't worry-- Geiger Bot also has those mapping features added and they will be in the next release.

Version 1.6.5 

Major release; the two main things here are:

1.  Geoscience Australia dose rate map layer added
2.  Significant improvement of the LUTs used in applying color to data on the map.  It sounds horribly complicated below, but actually it is mostly automatic and means you shouldn't have to mess with the scaling as much.

  • Audio Engine
    • Bluetooth audio now enabled if present
  • Bugfixes
    • map query reticle visibility on iPad
    • Safecast app only: I/O settings always being overwritten by Onyx defaults
    • Periodic NaN display in the stats value
    • iPad landscape startup rotation bug fix
  • Codebase Changes
    • Many very basic parts of the codebase have been completely refactored and rewritten.  This accounted for a significant amount of development time in 1.6.5.
    • This is probably very boring from an end-user perspective, but it allows for greater possibilities and easier code changes and maintainability in the future.
  • Device Selection
    • Additional devices added
    • Device selection is now more intuitive.  If you have settings corresponding to a device, it will be selected, and remain selected.
  • Map
    • Performance increases
      • Map tile interpolation: performance improvements for both nearest neighbor and bilinear interpolation
        • Bilinear now runs in ~1ms per tile!
      • Extent checking
        • Extent is now stored in the layer's metadata, avoiding attempting to query for a non-existent tile, which took a surprisingly long time when disk I/O was maxed out transferring other tiles.
        • This makes a significant difference when using multiple layers that do not all display in one area.
      • Bitmap Indexing
        • In addition to the above a bitmap index is used to determine the availability of data.
        • Mostly, this is done by synthesizing a 256x256 world tile, which at 1 bit per pixel uses only 8KB and takes < 0.01ms to check.
         Above: Depiction of extent (green) and bitmap index (white). 

        For a dataset such as this, the extent isn't particularly useful, but the bitmap index results in significant I/O savings for only 8KB of RAM.

    • Toolbar at bottom of map now transparent
    • Updated Safecast map data
    • Geoscience Australia Layer added
      • Approximate natural background dose rate (terrestrial + cosmic)
      • Very visually stunning, high-resolution dataset
      • Overall, this is probably the best geophysical national data I've ever seen
    • Improved "LOD" tile resampling filtering
      • This is the [-1 SD HD +1 +2] thing, used to make the data render larger so it's easier to see if needed (+2 is native 1:1 resolution)
      • Bilinear interpolation and a grid effect have been added to improve the visual for that authentic 16-bit graphics look
         Above: New "LOD" Filtering

        Note that individual cells contain additional detail, and are not limited to being only one color.

  • Map Query Tool
    • Significant performance improvements
    • Continuously computed query value (up to 60 Hz) -- no need to stop moving reticle
    • Larger font with outline for improved legibility
  • LUTs
    • Preview Images
      • LUT dynamic preview now added to picker control
      • This automatically changes to reflect any options for scale type, invert, discretize, etc
    • LUT picker list now has options for:
      • Scale type: 
        • 1. LIN
          • Linear scaling.
          • This uses the LUT colors as they are without modification, but usually has poor contrast on low-range data unless the scale is set to a small range.
        • 2. LN
          • Formerly "LOG", just renamed (correctly)
          • This performs 3x iterations of a ln-based function to reindex the LUT (as it always has)
          • The result is the low-end of the scale is compressed by removing colors, enhancing contrast.  The high end of the scale has entries duplicated, lowering contrast.
        • 3. LOG10
          • [NEW DEFAULT]
          • All new, this is nearly identical to LN, only it uses a base-10 logarithm.
          • What does that mean?  It has ~3x stronger of an effect than LN.
          • When used in conjunction with the new full-range preset, it shows *all* of the data well with no clipping.
          • In testing it was significantly better at showing low-end contrast than a "traditional" GIS gamma stretch. (basically, gamma correction)
      • Scale Range
        • Presets
          • 1.  [0.03 -  1.00]
            • Default range autoselected when using "LIN" scaling.
          • 2.  [0.00 -  1.72]
            • Standard "classic" default range, autoselected with "LN" scaling.
          • 3.  [0.03 - 65.54]
            • [NEW DEFAULT]
            • New preset, "full range"
            • Autoselected with LOG10 scaling.
              • (Can only be effectively used with new LOG10 scale mode.)
      • Invert
        • Inverts/reverses the LUT order.
        • Does not invert the RGB values.
      • Discretize (3 presets)
        • Discretize reduces the color depth of a LUT, producing a banded effect.
        • This can be useful for classifying values and quickly discriminating large regions, but comes at the expense of detail.
      • New Default LUT - Cyan Halo
        • The reason for this change is simply that in combination with the new LUT changes, Cyan Halo was the consensus for the best overall palette in a small test group.  (can be seen in the iPad screenshot above)
    • LUT Control
      • This is the vertical bar on the right side of the map
      • Previously, the LUT graphic was affected by the scale mode, but the numbers were not
      • Now, the LUT graphic is always linear, but the numbers are scaled
      • This change was implemented because with LOG10 scaling, the color ramp image became so distorted it only showed mostly one color (see below)
    • "HDR" LUTs
      • The era of 16-bit graphics is here!
      • All current LUTs are 8-bit indexed color palettes  (256 colors)
        • In fact, pretty much all LUTs and indexed color palette implementations out there period are 256 colors at most.
        • This feature automatically interpolates them to 16-bit color (65,536 colors)
        • This maintains compatibility with the 256-color "standard" allowing easy LUT imports in the future, while automatically improving them all.
        • But do the results match what the original would've been?  Yes.
          • In testing, I found that this interpolation produced identical results to CIE Lab and HSV interpolation even when the original LUT was created using CIE Lab or HSV.  Creating the 16-bit LUT directly even in another color space showed the same thing.
          • Thus, 256 control points is adequate to interpolate correctly regardless of the original colorspace the LUT was created with.  The results are the same as if that LUT had been created using 64k palette entries in the first place.
      • Mitigates color banding while increasing visible detail
      • Increases maximum effective scale range that can be displayed at one time
      • Entirely automatic, universal solution with no loss of performance
        • Remains ~30ms for LUT + final rasterization, per tile, on iPad 3
        8-bit (256 colors)
        16-bit (64k colors)
        (above): Default scale range and mode for the "AIST Natural Background (Japan)" layer.  More detail is visible, and banding artifacts are mitigated. 

        High scale range: 0-20
        High scale range: 0-20
        (above)  High scale range for custom layer with a single Safecast Interpolated layer.  Significantly more low-range detail is visible without any tradeoff in other ranges.  Now if only it had Mode 7 effects...

              Comparison: new LUT discretize and interpolation features
                           (final release version is superior to this)

      • LOG10 Scale + Full Data Range

        Full range: 0.03 - 65.54
        Scale Mode: LOG10

      • The LUT scale control doesn't look like much (almost all red), but LOG10 scaling seems to fit radiological datasets almost perfectly.  Excellent contrast at background levels, while showing areas more heavily contaminated without clipping.

Custom Layer Example 

As an example of using a custom layer, consider the problem of determining the amount of change from 2011 to the present of radioactivity levels in Japan.

To solve this, we can subtract a new measurement (which will be lower) from an older measurement (which will be higher).

So, for our data sources, we can use the US DOE/NNSA Interpolation layer (date: approx 2011-06) and the Safecast interpolation layer (date: approx 2011-03 to 2013-03 with bias for newer samples).

In Settings -> Map, that translates to:
- Show in list: ON
- Primary layer: (JP) DOE/NNSA Interpolation [uSv/h]
- Sublayer #1: (JP) Safecast Interpolation [uSv/h]
- Sublayer #1 Raster Math: - Subtract
- Sublayer #2: None

Returning to the map and selecting that layer shows the following differences between the two datasets:

The OG "Safecast" LUT is used to provide value classification.  While this is only an approximation, it illustrates a potential use of the custom layer and raster math features, and helps to show that in two years radiation levels have decreased significantly. (as one would expect from Cs-134 decay and lateral dispersion)

Version 1.6.4 

1.6.4 is a smaller maintenance release to address some known issues found in 1.6.3 and provide map content updates.
  • Bugfixes
    • map query reticle alignment (off by 22 pixels vertically in 1.6.3)
    • map query reticle not adjusting to screen rotation
    • DOE/NNSA Cs-134 and Cs-137 map layers not having uCi/m^2 -> MBq/m^2 conversion properly applied if decay is disabled (only apparent with a custom map layer specifying that)
  • Map content update
    • Safecast data and interpolation layers

Version 1.6.3 

1.6.3 is a relatively large update featuring a new map raster display engine and additional Geiger counter DSP settings.

New Map Engine Features
  1. Speed
    1. This is the fastest implementation yet of mapping in Geiger Bot.  The code is almost 100% vectorized, and instead of drawing polygons, binary RGBA image data is created directly with vectorized (SIMD) code.
  2. Appearance
    1. When zooming in, bilinear interpolation is now used instead of nearest neighbor.  To my knowledge, this is the only implementation of bilinear interpolation that fully supports NODATA values that exists anywhere.  Further, it additionally has dynamic support for minimizing tile boundary artifacts.
      1. While bilinear interpolation isn't so great with photos in Photoshop, it actually produces very good results (better than bicubic, imo) with data, and this interpolation is done at a data level, not on RGB values.
    2. As the code now creates the alpha channel, dynamic alpha channel (transparency) effects are now possible that do not change data values.  For example, when combining two data layers with an overlay, they can have different alpha values, and the layer on top will cast a drop shadow effect.
  3. Customization
    1. Combinations of data layers can now be arbitrarily defined with a choice of how they are to be combined-- overlay, addition, subtraction, etc.  If they are not the same stored data type or resolution, they are converted in real-time with little impact to performance due to vectorization.
    2. In this initial release, a single custom layer is available to users, and must be enabled in settings.
  4. Data Value Query Display - "Heads-Up" Style Display
    1. Manual targeting - A reticle (crosshair) can be activated that will display the exact data value at any location.  It will automatically sort of "magnetically" snap to the nearest data value in a small radius to assist with targeting individual pixels on a retina display.
      1. This is only shown when the top toolbar is displayed on the map screen.
    2. Autotargeting - when the map is used full-screen in position tracking mode, the reticle moves to the nearest point, and its value and distance are displayed automatically.
  5. More Data
    1. New Data
      1. Natural Background Radiation (Japan)
      2. NOAA Global Radiance (aka night lights, Earth at night) (non-radiological)
        1. The units for this are arbitrary and scaled 0.0 - 10.0 in app.  Thus, for best results, change your LUT scale to 0.0 - 10.0.
        2. They are shown as N/A, but are actually a non-linear representation of watts / cm^2 / sr and based upon the calibrated 2006 F16 satellite product.  I did not have a way of reverse-mapping non-linear value encoding in this release, and sadly neglected to note the value I used for the gamma strech and min/max in ArcGIS anyway.
    2. Layers now have defined types, units, names, etc and should be much more easily added going forward
  6. Future Cross-Platform Support
    1. The map code has been refactored to use a client-server approach, essentially instantiating a class and calling a single method with some parameters and getting an image back.  I can't make any promises, but this at least has some potential for portability that did not previously exist.
New LUT Features

The LUT code has been refactored as well.  The speed improvements are likely small, but new features include invert and discretize. (UI to modify discretize/invert not implemented yet)

New Geiger Counter Features

  1. Device Selection List
    1. With preliminary support for several existing Geiger counters, this sets optimal defaults for the best performance with a line input cable
    2. For example, with a prototype Safecast/IMI Onyx (the Safecast Kickstarter Geiger counter), the default settings had less < 1% error up to 350K CPM
  2. Dead Time Correction
    1. Optional dead time correction is now available, and is specified in microseconds
  3. 44.1khz input sample rate for Geiger counters
    1. No longer just in gamma spectroscopy mode, a 44.1khz input sample rate can now be enabled under Geiger counter settings.

Background Subtracted Safecast Data for Japan

Download Safecast Background Subtracted Data (Google Earth, 1.6 MB)

(Please note: these results should be considered preliminary, and an approximation.)

One of the potential uses of the background radiation data is to perform background subtraction on actual measurements, highlighting differences from natural levels -- and helping to identify possible contamination.

In order to determine if this was a valid approach and worth including in Geiger Bot, I performed a test of background subtraction using Safecast data in ArcMap.

[Background Subtraction] = [Measurement] - [Background]

This is shown in the image to the right.
The scale used is 0.03 - 0.30 uSv/h (linear).

The results and their correlation with Cs-137 aerial survey data seem to confirm the general viability of both the technique and previously interpolated background data.

This was however sensitive to the interpolation being used, which due to the nature of the source data was absolutely necessary in constructing the terrestrial dose rate background data.  To give credit to where it is due, I would not have been able to achieve the level of precision I did without Empirical Bayesian Kriging in ESRI's ArcGIS 10.1.

I do not have any plans to create, maintain or update web maps in general, but the background subtracted map is current data as of the time of this post.

Japan Natural Background Radiation Data

UPDATE:  I have completely redone this using EBK, or Empirical Bayesian Kriging (in ArcMap 10.1), to interpolate the terrestrial dose rate data.  This produces much better results due to some rather elaborate statistical models.

I have also created a Google Earth KMZ file that contains data points which you can download here.

While Japan's AIST has previously published a very similar map it did not include cosmic radiation and was therefore only a partial representation of the natural background dose rates you could expect to measure.

In summary, the approximate average natural background dose rate in Japan able to be measured with a sensor for gamma radiation is 0.08 uSv/h; 0.05 uSv/h is from terrestrial sources, and 0.03 uSv/h is from cosmic sources

This data will be included in a future version of Geiger Bot, both as a standard data layer visible on the map, as well as adding a "background subtraction" function to other Japan data layers.

Eventually, this may help to highlight measurements that differ significantly from expected natural background levels, as well as preventing false positives if an area has a higher amount of natural background radiation.

Data Processing and Methodology

These dose rate values have been calculated primarily from two parts:
  1. Terrestrial Dose Rate
    1. Geological sample data from AIST (産総研)
    2. Credit to Azby Brown for finding this
    3. Dose rate derived from geological data using methodology published by Duval, et al
    4. Empirical Bayesian Kriging in ArcMap 10.1 was used to predict values for all of Japan
  2. Cosmic Ray Dose Rate
    1. Digital Elevation Model (DTED0) from US NGA
    2. Dose rate calculated as per Duval, et al

Wait, what?  How is it possible to calculate the dose rate from some rocks and a relief map?

During the Cold War, there was a great deal of nuclear research performed by both the US and the Soviet Union.  One of the main concerns was always the resources-- where could uranium for weapons and energy be found?

Research found the easiest way to determine this was by using aircraft with scintillation counters which were shielded from cosmic radiation, measuring the terrestrial radiation from the earth -- which ended up almost entirely being due to gamma radiation emitted from uranium, thorium, potassium and their decay products.

So by using gamma spectroscopy from an aerial survey, it was possible to determine both the presence and concentration of uranium.

Through additional research these concentrations were able to be expressed in terms of how geologists had traditionally measured them in mineral samples (ppm, %K).  This allowed data gathered by aircraft to be appraised for potential value in ways that were already known.

So with this knowledge, one can work backwards from the concentrations of uranium, thorium, and potassium to calculate the terrestrial dose rate.  The approximate cosmic radiation dose rate can be derived more simply from elevation and latitude alone.

  1. The mineral samples collected are much fewer in number than the vast quantities of data points gathered in flight lines in aerial surveys in the previous "natural background" NURE dataset.  In fact, there are only about 3000 data points in total for the terrestrial data for Japan.  This means a greater likelihood of statistical error is present.
  2. Total natural background radiation -- for an individual -- is also considered to be comprised of additional factors, such as radon inhalation and internal exposure to isotopes in food and drink.  According to MEXT, for Japan these work out to be 0.09 uSv/h.  I have not seen figures for it and suspect it to be very small, but there is also some internal exposure from the decay of C-12 and K-40 within the human body itself.
My personal opinion is that radon being concentrated by inadequate ventilation in manmade structures is not wholly a "natural" source.

Regardless, for reference these are the values from the Wikipedia article on background radiation, converted to uSv/h from mSv/a and rounded to two decimal places.  (these are *not* what you should expect to measure with a Geiger or scintillation counter)

Average "Natural" Background Dose Rates (Wikipedia)

 Inhalation, air (radon) 0.14 0.26 0.05
 Ingestion, food/drink 0.03 0.03 0.05
 Absorption, terrestrial 0.06 0.02 0.05
 Absorption, cosmic 0.05 0.04 0.03
Sum, "Natural" uSv/h 0.28 0.35 0.17

(The numbers do not appear to add up, but this only because the calculation itself was performed without rounding for greater accuracy.)

For Japan, the terrestrial and cosmic figures here approximately match the average values I found in creating the background data map -- 0.05 uSv/h terrestrial, 0.03 uSv/h cosmic, and a total of 0.08 uSv/h on average.  I was not aware of these figures prior to the data processing work I did above.

New  Gamma Spectroscopy: iOS Input Gain Clipping Issue

Update: Ok, it seems in further info from Apple this is not a bug but by design, and is on a per-device basis.

Attention Gamma Spectroscopy Users

The default system input gain on some devices can cause significant input clipping.  This has the effect of limiting the max keV in gamma spectroscopy.  (pulse counting from Geiger counters is affected to a lesser extent)

A workaround can be applied with a single setting (manual gain) once you are aware of this.


Input gain varies by device in iOS.  Some devices default to a system-level input gain of 1.0, which causes severe clipping of the input signal.  It affects older devices, and it seems the cutoff point is between the iPhone 4S and iPad 3.  Specific region, OS, hardware revision, etc details are unknown.

Defaults that ClipDefaults OK
- iPhone 4S, CDMA, US (iOS 7.1)
- iPod Touch 4G, 8GB, US (iOS 6.x)
- iPhone 4*
- iPad 2*
- iPad Air, WiFi, US (iOS 7.1)
- iPad 3, WiFi, US (iOS 7.04)
- iPad 4, iPad Mini 1/2*
- iPhone 5/5C/5S*
- iPod Touch 5G*

*not tested - inferred

This is best available information.

Differential Diagnosis

Lupus.  In all seriousness, it's possible for the hardware output voltage to also be too high and cause clipping before the system gain setting even affects the signal.  When troubleshooting, be aware there are two places it can clip: the output hardware, and the system input gain setting.


Set the input gain manually in Settings -> Scintillation Counter -> Input Gain to 0.67.  (listed at the bottom under "debug settings")

Good Input Signal
Gain: 0.67

iPod Touch 4G
Manual Corrective Setting

No apparent clipping
Bad Input Signal
Gain: 1.0

iPod Touch 4G
     iOS Default Setting    

Severe input signal clipping

Above: if the default of 1.0 is present, pulse height is effectively limited to Cs-137 until corrected by a manual gain setting.  The specific energy limit will vary depending upon the voltage range of your probe's output.


This is an issue with the default setting in iOS itself; it's simply a large variance between devices that people need to be aware of.  Eventually I will add some notification to the user if a default gain of 1.0 is detected, and perhaps automatically set it to 0.67 on new installs.

New  Version 1.7.1 (current release)

Version 1.7.1 has now been released.  This contains a very significant update to gamma spectroscopy functionality, among other things.  Even if you do not use gamma spectroscopy, it contains performance improvements, reduced memory and disk use, bugfixes, and the addition of some other new features.

Apple Maps fans:  I believe Apple has fixed the vm_pageshortage crash bug in iOS 7.1, but I cannot state that with 100% certainty.  Nonetheless, I would cautiously say that Apple Maps may be safe to use again, in the event you preferred it to the Google Maps framework due to performance or content in your area.  But you must have iOS 7.1.  I may also be wrong about this, so if it continues to crash, I recommend sticking with Google Maps.

  • App
    • Latest Framework/SDK updates:
      • iOS 7.1.0
      • Google Maps 1.7.2
    • Performance improvements, reduced power consumption, misc bugfixes.
      • Specifically, any display that was updated at a regular interval now has change detection built-in, which dramatically reduces overhead and idle CPU use and therefore power consumption.
      • Where possible, this also detects significant change of at least 1 pixel.
  • DSP
    • Gamma Spectroscopy
      • Improved accuracy and pulse recognition rate; the single largest improvement to gamma spectroscopy yet.
      • You *will* need to retrain any existing pulse shape.
      • Thanks and credit to Marek Dolleiser.
      • Expanded in app spectroscopy setup guide
      • Histogram:
        • Additional direct controls
        • Faster refresh rate and change detection
        • Oscilloscope mode: (if gamma spectroscopy mode is off)
          • How do the oscilloscope and input monitor graph differ?
            • Primarily, the amount of detail.
              • The oscilloscope displays an entire buffer of 1024 samples, resampled to whatever the display width is.  You see each individual sample as the base waveform, both positive and negative values.
              • The audio input monitor graph shows only one sample per buffer -- the one with the greatest absolute amplitude.
            • The oscilloscope also provides a more low-level display of input data.  The audio input monitor graph reflects DSP by the app and any RMS window.
          Find the "pulse height".

  • Mapping
    • Performance
      • Smoother rendering with Google Maps using async layer interface
      • Refactored bilinear interpolation code
      • Replacement of Objective C methods with inlined C functions
    • Reduced Memory Use
      • The previously noted C functions use malloc/free instead of autoreleased Objective C objects.
      • This reduces peak memory use because free is immediate, whereas autorelease has some latency to it (even in a block).
    • New update storage format:
      • The Safecast data update format has been changed:
        • New data type: IEEE 754 binary16 (half precision float)
          • Was: IEEE 754 binary32 (single precision float)
      • This means faster loads, faster updates, and less disk use without compromising dynamic range or effective precision
      • New tile pyramid z-level minimum: 0 (was 1)
        • This slightly improves startup responsiveness because it doesn't have to synthesize the z=0 tile from 4x z=1 tiles.
      • Note: previous update data versions will be purged.
        • You will need to update twice before the change detection will show anything meaningful.
    • Raster Math
      • New:
        • Added op: "Clip to Sublayer Raster"
        • This clips the results of the processing chain to the data/NODATA values of the raster in question.  This is primarily useful for removing interpolated values from water.  However, it depends on having a suitable raster to clip to.
      • Changed:
        • Changed op: "Highlight changes with alpha" 
          • Sensitivity increased by 1000x.
          • Now highlights entire tile with slight shading effect to see changes more easily.
          • This also effects the "SC change/last update" layer which uses this op.
    • Preprocessing FX
      • New:
        • Added FX: IDW interpolation.  This provides real-time IDW interpolation on the input data.
          • This is actually an IDW + Lanczos + bilinear hybrid
        • This is made possible in realtime by:
          • 1. Optimized input sample decimation
          • 2. 100% hand-coded NEON intrinsic functions for the IDW math
          • 3. Only solving 25% of the problem, and letting Lanczos do the rest
          • 4. Only operating on a single tile's worth of values at a time
          • Tile boundary artifacts are mitigated by using a tile from z-3, but not eliminated.
        • This may be extended to generate optional updates of the Safecast interpolated layer later, using a higher quality but slower method to pre-generate tiles.
        • Note: I recommend using the "Preclip to .jp" option if you're only looking at Japan, as it doesn't waste CPU cycles interpolating over the ocean.

Interpolation in 1.7.1

While probably only interesting to a subset of users, below is shown how the hybrid interpolation technique makes realtime IDW possible.  To my knowledge this is the first implementation of its kind.

Normal, full-quality interpolation using IDW alone takes anywhere from 5 minutes to an hour for a single screen, depending on the search radius.  IDW gets incredibly slow as the problem size gets larger.  And this is a large problem size.

But the IDW/Lanczos hybrid interpolation with default settings is almost instant on an iPad Air.  While this comes at the cost of some resolution, the results ended up being better than expected thanks to a few stupid math tricks.

 The moar you know...
To achieve acceptably high performance, the interpolation cheats on math in a variety of ways.  Pretty much any way it can get away with, actually.

The most novel in this implementation is the hybrid of IDW and Lanczos, which exploits a vague mathematical similarity in the slope of interpolated surface shared between the techniques.  IDW can predict unknown values from irregular surface points; Lanczos can only interpolate between known values on a grid.  IDW is slow; Lanczos is fast.  Thus, under certain conditions, they can compliment each other quite well.

Another key technical aspect of this is decomposing resampling as a method of reducing resolution (for performance) into two stages.  Compared to "normal" resampling of the output raster alone, this allows for reducing the problem set to a significantly smaller size.
  • Example: default settings use an input z-shift of 2, and an intermediate z-shift of 2.
    • What this means is the resampling is broken down into two steps; one integral to the IDW interpolation, and the other being the normal kind which simply crops and resizes the final output raster.
    • This is a total z-shift of 4, or a net reduction in resolution from 256x256 -> 16x16 pixels per tile.
    • This is a mere 0.003% of the original problem size.
  • Compare to:
    • Input z-shift of 4
    • Intermediate z-shift of 4
    • Alone, either technique produces terrible output.
  • There are several reasons for this:
    • 1. Decimation
      • Decimation is data aligned with Lanczos control points and tile boundaries
      • Decimation is most optimal in improving performance and maintaining quality when used in a moderate amount.
      • Anything above or below that will see diminishing returns of trading quality for performance, or performance for quality.
    • 2. Limits of Hybrid (Intermediate) Interpolation
      • Much like Jack Bauer, intermediate resampling can only be pushed so far.
      • A realistic upper limit is 3 levels (256x256 -> 32x32)
      • After that, the rough approximate similarity in the surface slope being exploited falls apart.
      • In other words, "intermediate z-shift" breaks after a while.
    • 3.  Limits of Normal (Input) Interpolation
      • Intermediate samples predicted by IDW used as the Lanczos control points can be influenced by additional points not part of the Lanczos raster itself.
      • This cannot happen with an ordinary naive raster resample.
      • Without the non-grid aligned control points to influence the surface, its quality degrades much more quickly.
      • In other words, "input z-shift" also breaks after a while.

Enough maths, back to the pretty pictures.

Most compelling in the examples below is probably the 5th interpolation shown. It almost matches the quality of the full IDW interpolation, while having 30x faster performance.

Note this is a generalized preprocessing effect available for all layers, not just the Safecast dataset, including local user-collected points.

Finally, props to Apple for making a very nice SIMD vectorized Lanczos implementation that works on planar floating point data, not just 8-bit RGBA.

(note: all images resampled by 50% and saved as JPGs due to space constraints)

IDW/Lanczos Hybrid

Input zS: 2
Inter. zS: 2
Lanczos 3x3
Deci: Mod.
Search: 3x3

Default Quality
Render Time: 1 sec
300x Faster*

Input zS: 0
Inter. zS: 0
Deci: None
Search: 3x3

High Quality
Render Time: 5 min
IDW/Lanczos Hybrid

Input zS: 2
Inter. zS: 2
Lanczos 3x3
Deci: Mod.
Search: 3x3

Default Quality
Render Time: 1 sec
3600x Faster*

Input zS: 0
Inter. zS: 0
Deci: None
Search: 15x15

Max Quality
Render Time: 1 hour

 IDW/Lanczos Hybrid

Input zS: 0
Inter. zS: 1
Lanczos 3x3
Deci: Mod.
Search: 3x3

Medium Quality
Render Time: 10 sec
30x Faster
IDW/Lanczos Hybrid**

Input zS: 4
Inter. zS: 0
Deci: Mod.
Search: 3x3

Low Quality
Render Time: 1 sec
300x Faster
IDW/Lanczos Hybrid**

Input zS: 0
Inter. zS: 4
Lanczos 3x3
Deci: Mod.
Search: 3x3

Low Quality
Render Time: 1 sec
300x Faster
Input Data

(* Single-threaded results, max 4.5 GFLOPS.  No input z-shift allows for multithreaded 9 GFLOPS.  So actual performance difference would be somewhat higher were my multithreaded caching better controlled.)

(** These are examples of why resampling is done in two steps.  Using a z-shift of 4 for either individual step produces very poor results.  Yet a z-shift of 2 for both steps (default settings) yields the same performance improvement with much higher quality.)

Version 1.7.0 Update (current release)

1.7.0 is available on the App Store, and should amongst other things, significantly improve stability in iOS 7.

  • iOS7ネイティブのビルド、 64-bitのサポート 
  • マップ: Googleマップの標準マップフレームワーク(アップルマップに設定することが可能) 
  • マップ:タイルエンジンのパフォーマンスが大幅に向上 
  • マップ: Safecastデータアップデート:高域でのクリッピングを防ぐためにダイナミックレンジを32ビットに増加。マルチコア·デバイス上のパフォーマンスが大幅に向上。 
  • 変更内容を強調するレイヤー"最後の更新と比較"を追加 
  • マップ:大容量なオフラインのタイルキャッシュに対応 
  • オーディオエンジン:最新のオーディオフレームワーク に基いた新しいオーディオエンジンを搭載 
  • オーディオエンジン:現ver. よりオーディオパススルーに対応(例:同時音楽再生) 
  • オーディオエンジン:トラブルシューティングおよび設定変更(モード、ゲイン)を支援するためにオーディオ回路変更時にコンソールに書き込まれる情報 を詳細化 
  • オーディオエンジン:iOS7にてマイクのアクセスが拒否された際に画面上に表示 
  • オーディオエンジン:付属機能:マップ上の特定のCPMに合わせたランダムなクリック音再生。地図の十字カーソルで示した値で再生するには[設定] -[サウンド]を参照。 
  • ガンマ分光法:ガンマ線分光ヒストグラム性能を改良 
  • ガンマ分光法:ガンマ分光ヒストグラムコントロールに[トレーニング]および[解像度変更]ボタンを追加 
  • 設定:設定画面の順序変更に伴いヘルプを改良 
  • UI : UIを部分的にiOS7のスタイルに調整。大幅な更新を予定。 
  • 重要なバグ修正:マップクラッシュバグ、ガンマ分光最小/最大ビンクラッシュバグ、 Pachubeアップロードがクラッシュするバグを解消 
  • 統計データバグ修正:非常に高い計数率とサンプル数が0にアンダーフローするバグを解消。平均二乗誤差が正しく表示されるはずである。 
  • ・その他の雑多バグを修正

  • iOS 7 native build, 64-bit support 
  • Maps: Google Maps standard map framework (Apple Maps can be optionally enabled in Settings) 
  • Maps: Tile Engine: Significant performance improvements 
  • Maps: Safecast Data Updates: dynamic range increased to 32-bits to prevent clipping at high ranges. Significant performance improvements on multicore devices. New "compare to last update" layer to highlight changes 
  • Maps: Support for optional large offline tile cache 
  • Audio Engine: New audio engine built around latest audio framework 
  • Audio Engine: Now supports audio pass-through (for example, simultaneous music playback) 
  • Audio Engine: More info written to console when audio route changes to help troubleshooting and configuration (mode, gain) 
  • Audio Engine: Visual feedback and indication of when microphone permissions are denied in iOS 7 
  • Audio Engine: Novelty feature: mapping integration with random click sound output for a specific CPM. See Settings -> Sound to enable this with the value shown by the map reticle (crosshair). 
  • Gamma Spectroscopy: Improved gamma spectroscopy histogram performance 
  • Gamma Spectroscopy: Training and change resolution buttons added to gamma spectroscopy histogram control 
  • Settings: Reorganized settings with improved in-line help 
  • UI: Partial migration of UI to iOS 7 styling. More to come. 
  • Critical bugfixes: Map crash bug, gamma spectroscopy min/max bin crash bug, Pachube upload crash bug 
  • Stats bugfixes: Very high count rates and number of samples no longer underflow to 0. Mean squared error should now be calculated and displayed correctly. 
  • Many other misc. bugfixes 

Additional notes:

This is one of the largest incremental releases there have been to Geiger Bot.  Overall, the codebase has been evolved to use current frameworks and features improved performance and less memory use.

However, with this comes some costs.  The update requires iOS 6 minimum, as the Google Maps SDK for iOS requires iOS 6 minimum.  For users of iOS 5, 1.6.9 will continue to function and the 16-bit Safecast map updates will still function.

Additionally, while I attempted to test this update extensively, I simply had no way to replicate every hardware configuration out there.  So, if you notice any anomalies, please let me know.

Specific component notes:
  • Maps
    • Choosing a framework:
      • Interfaces to both the Google Maps SDK and Apple Maps SDK are provided.
      • The code has been abstracted to work with either.
      • You may toggle between map frameworks in Settings fairly seamlessly.
      • If you like your map framework, you can keep it.
    • All frameworks
      • To view the data tiles without any basemap, set the map alpha slider to 0.
        • 3D
          • The only 3D view with extruded buildings is with the "road" / "standard" map type when zoomed in almost to max.  This is not available for all areas.
          • Apple Maps - 3D view requires iOS 7.
          • Yes, they both look like Starfox for the SNES.
    • Google Maps-specific:
      • At this time, the use of Google Maps in iOS 7 is strongly recommended for purposes of stability.
      • App-specific:
        • User points and EPA Uranium Mines:
          • No labels on Google Maps (yet).  Available as raster tile points only.
        • Indoor map floor selection:
          • iPhone: hidden unless the top toolbar is displayed, to declutter the screen.
        • LOD control:
          • The way the LOD control works has changed for Google Maps due to both the "free" GPU resize of image tiles and the performance differences.
          • I would suggest using "+" with Google Maps for performance.
          • With Apple Maps, "++" is the most performant.
    • Apple Maps-specific:
      • Stability Issues - iOS 7
        • In testing, significant numbers of memory-related (vm_pageshortage) crashes were observed and reported to Apple.  These could only be partially mitigated.
        • It is therefore recommend that Google Maps be used for iOS 7 devices until these issues can be fixed.
      • New iOS 7 features:
        • All new functionality (tilt, rotate, 3D, etc) is enabled.
        • All Apple Maps interfaces have been updated to iOS 7.
      • iOS 6:
        • Conversely, Apple Maps is relatively stable in iOS 6.
        • I found Apple Maps to offer better performance on 256 MB iOS 6 devices, and it also worked better offline.
    • Basemap caching - clearing a very large cache:
      • If you clear the cache, this can take a while to actually happen if the cache was particularly large (1GB+).  I issue a simple single delete command for the basemap cache directory, but the OS itself must delete the files individually.
    • Default map layer changes
      • The "Safecast interpolation" sublayer was outdated and has been removed from the default Safecast layer.
      • However, if you still wish to use it, you can do so by creating a custom map layer.
    • UI anomaly when minimizing / maximizing map window (iOS 7)
      • The odd delay in the map window resize is a known issue
      • It is a consequence of enabling transparency for the status bar and not having fully migrated the UI to iOS 7
      • This was done primarily to benefit iPhone users and allow more of the map to be visible
      • This will be resolved when the UI is fully migrated.
  • Gamma Spectroscopy
    • Histogram Labels - Changing Device Localization
      • The histogram isotope labels are now generated once and cached as static images for performance.
      • If you change your device's region/localization, the way the string is formatted can change.  The disk cache for histogram labels is stored in the /tmp/ directory and cleared on a device reboot, should this be an issue.
  • Audio Engine
    • Music Playback
      • If you wish to play back music while using the app, the default system music app will stop playback when an output route changes.  To resume playback, bring up the notification center and press the play icon.
      • Note I cannot make the audio output on the device's speaker when a line input cable is used.
    • Gamma Spectroscopy specific
      • An important change that may affect a small number of users performing gamma spectroscopy may be the removal of the high-pass filter.
      • Previously, the audio engine was not applying the "AGC" setting correctly, however AGC was never being applied to line input in any case.
      • What this did do however is high pass filtering.
        • In general, high pass filters are a bad thing for pulse height analysis.
        • However, for some scintillation counter amplifiers with significant ripple issues, this may have to be enabled.
        • Thus, there is a new option to force measurement mode off, which will enable high-pass filtering.  I would not recommend enabling it unless you have issues.

Safecast Map Data Update

All issues with map data updates should now be fully resolved.

1.6.9: iOS 7 Gamma Spectroscopy Crash Bug (iPad Air / iPhone 5 only?) 

I've recently found a bug in 1.6.9 causing a lockup when using the gamma spectroscopy histogram, and app startup crash thereafter on iOS 7.  So far I can only reproduce it on an iPad 5 (Air), not an iPad 3 or iPhone 4S.  It will be fixed in the next release.

The issue is related to setting a custom min/max channel.

Workaround: reset the min/max to their default values in Apple's Settings.app before starting the app:

Scintillation Counter > Min Channel: 0
Scintillation Counter > Max Channel: 32767

Note if you select the device "Bee Research GS-1100R", it will automatically set custom limits that trigger this behavior.

iOS 7 Compatibility Information - Microphone Permissions 

It would seem not everyone necessarily reads the microphone permissions dialog new to iOS 7 before tapping "no".  While in general it's a good idea to tap "no" to every annoying popup you see, sometimes there are exceptions.

Here's how to undo this and get audio input back:



New  iOS 7 Compatibility Information 

In general, 1.6.9 should work fine with iOS 7.  It contains a fair amount of IOS 7 specific code and was continuously tested with every beta release of iOS 7.

Some notes:
  • Microphone Permissions
    • If you are prompted about the microphone, tap "Yes"
    • Scope: This actually applies to all audio input -- including line input cables
    • Privacy: Geiger Bot never records audio, it only does signal processing for pulse detection and pulse height analysis
    • Performance: Performance will be slightly better if permissions are enabled in 1.6.9
      • The OS does not return an error code if audio input permission is denied 
        • Thus, this will (correctly) cause a secondary heuristics failure on the watchdog timer for the audio engine
        • The watchdog timer will then restart the audio engine every 30 seconds
        • This may have a (small) performance impact
  • Maps
    • Performance
      • Performance will appear to be worse at first primarily because your Apple basemap caches will be lost during the iOS 7 update and must be downloaded again.  After you build up an initial tile cache of the basemap, things will improve somewhat.
      • There may be performance implications beyond that -- Apple's MKMapKit behaves differently in iOS 7 and seems more aggressive about loading the basemap, causing performance issues.  It also seems to spawn too many parallel queues for tile loading, assuming incorrectly it is loading static images from a remote URL, and does stupid things like force render a lower detail image unnecessarily and overcommit with yet (another) thread.
      • Performance is slightly better in a native iOS7 SDK built build using the new MKOverlayRenderer class -- the pixel fill rate is higher than in iOS 6, in fact -- but overall it is choppy and unresponsive at times due to the issues mentioned above.
    • Memory Use
      • Additionally, in iOS7, MKMapKit retains memory caches too long and does not auto-release them correctly; this occurs even outside of loading its own tiles and is not a memory leak in any of my code.  Nor in fact will it even auto-release these caches after an OS memory warning.
      • At any rate, the workaround is that its caches are finally released when the interface to load the tiles is released.
        • Thus, in Geiger Bot, the current default behavior of releasing all layers corrects for this accidentally.  Unfortunately, this will happen more often than in iOS 6, because the caches aren't being released properly now.
        • In the Safecast app which specifically does not release the layers (which themselves occupy little to no memory and are not the problem), you'll have to do this manually, or the app will eventually crash, because Apple Maps will just not let go otherwise.
    • Future Solutions
      • Memory Use
        • This is easily addressed in the next version by forcing a release and reload of all map layers being used with a memory warning in iOS7+.  This is not ideal but will suffice.
      • Performance
        • An iOS 7 native build with the MKOverlayRenderer class in the next version will help slightly, as will the generally 2x faster performance in my data tile rendering code
        • Additionally, I have implemented some measures to help performance in iOS 7.  I now monitor for and detect the "runaway" condition caused by Apple Maps and kill it before it can grow out of control using a model based upon a cellular anti-cancer response. 
          • There are some inefficiencies in doing this, but they are greatly preferable to allowing Apple Maps to cause critical memory pressure, application failure or even system failure, all of which I have seen it do in testing.
        • tl;dr: mapping will be better in iOS 6 for some time to come.  It will probably never be as good in iOS 7 until I replace Apple Maps in its entirety.

Update  Map Data Update (Server) - "Most Recent Data" Check 

You may have noticed you could download map updates that weren't actually updates.

That should be fixed now.

Prior to this, the update map data was always "new" every 4 hours, period.  So, now the server process actually checks whether or not there is new data before generating the update file.

Other changes to the server process have included improved data filtering, and data clustering* to improve map performance in-app.

*(by "data clustering" I mean storing the tiles how they are most likely to be loaded, which is in recursive quad groups and similar to Microsoft's quadkey.

Unfortunately the server-side change only affects the highest resolution tile level in app (13), for the rest the app will need to be updated.  Until then, levels 1-12 will remain clustered by row, which isn't bad, but isn't quite as optimal.)

New  Version 1.7.0 (in development)

  • Maps: 200%+ Performance Increase (layer / data tile rendering)
    • Unexpectedly, recent developments have created a very significant speed improvement for mapping, particularly noticeable on iPads
    • The cost of this is that the alpha premultiplication step is being approximated -- meaning the sublayer alpha on custom map layers will get reduced to be 12%, 25% or 50% rather than the 10% increments now.  (x >>= y)
    • Nonetheless, it's hard to argue with massive performance improvements.
  • iOS 7 support: Improved iOS 7 support / code refactoring.
    • A lot of this is to maintain backwards compatibility with iOS 5 / 6
    • There will also be UI design changes to be more consistent with the iOS 7 UI in later versions
  • Maps: Basemap:  Improved 3rd party basemap tile speed rendering / caching / offline use
  • Maps: Safecast Data Updates:
    • I am working on porting the tilling code to the server (unfortunately, nothing tiles to 16-bit PNGs)
    • This would eliminate processing time on-device and make downloads less than half the size they are now.
    • No ETA.
  • Maps: Linked attribute layers
    • This would enable showing, for example, the most recent date of measurements at a point on the map from the Safecast data
    • This may or may not make it into 1.7.0, and depends on the time requirements of data structure changes as well as porting tiling code to the server.
  • End of IOS 4 support: 
    • Cue sad violin music.
    • 1.7.0 will be targeted to use the iOS 7 SDK, as will all versions moving forward
    • This makes testing iOS 7-built apps on iOS 4.3.1 impossible for me, meaning any new version could break on all iOS 4 devices and I would have no way of knowing or rolling back
      • (Arguably, the simulator was no guarantee of that either.)
    • Thus, the failsafe is for me to set the minimum required version to iOS 5, such that iOS 4 users are guaranteed to be left with a working app.
      • This is to protect iOS 4 users.
      • However, this also means iOS 4 users can never download a working version from the App Store again after 1.7.0 is released.
        • I strongly encourage iOS 4 users to backup version 1.6.9 with iTunes on their PC/Mac
      • Unfortunately this is a real issue -- for example, 1.6.9 contained no code that required iOS 5+ yet it still broke on iOS 4 despite 1.6.8 working.  This was due to very odd timing / object instantiation issues.  I fixed these, but if I had not, it would have broke on iOS 4 again.
    • I have expressed concerns regarding this to Apple, and encourage any users affected by this to do the same.  Realistically though, I wouldn't buy iOS 4 any green bananas.

New  Version 1.6.9 (current release)

  1. On-demand Safecast map data updates
  2. User-logged points (and EPA uranium mines) now usable in custom map layers
    1. ERRATUM:  This will be available in 1.7.0.  It would seem I neglected to actually add the new user points dynamic tile layer to the layers available in the map settings plist.  (the settings lists are static so they can be set outside of the app as a failsafe)
  3. Map tile rendering speed improvements
  4. Limited iOS 4 compatibility testing (this is a good thing, most versions didn't get any)

Live Map Data Updates - Update

On-demand map data updates (Safecast data only) are good to go for the next release; the server component is in place and testing is ongoing.  It's more or less what you'd expect and is a single-button process.  In general, expect it to take 10 minutes and download about 80mb of data.

The only caveat is that on older devices, the process takes about twice as long, and there can be memory issues, although my 256MB iPod Touch with iOS 5 survived.

Also, while it runs as an asynchronous process, I would recommend leaving it alone while it does the update.  Especially after the download while processing the data, it will be very CPU and memory intensive on some devices and they will need their full resources available.  The process itself is reasonably robust and performs data integrity checks.

Live Map Data Updates 
  • Background
    • To date, all datasets have been static
      • Only updated with new versions of app
    • Data Preprocessing
      • All large datasets must be tiled for performance
      • Geiger Bot itself has tiled all existing datasets
        • Historically, too slow to tile on device (~48 hour runtime)
        • Has always been done in the iOS Simulator (~8 hour runtime)
        • Performance bottleneck was I/O, not CPU
  • New:  Significant Performance Improvements
    • 180x faster tiling performance
    • Now practical on device
  • Possible Applications
    • On-demand updates of map data
    • Very fast caching / display of user logged point data
    • Very fast caching / display of future sources of online point data
    • Export of tile sets for use on static web maps
  • Performance Testing
    • Input details:
      • Safecast data @ 19m resolution
      • 3,757,853 XYZ point features (SQLite3 table)
    • Output details:
      • 30,684 tiles
      • Web Mercator tile levels 1 to 13
      • File format:
        • RAW, 16-bit, 1x channel, lossless compression (zlib)
      • Storage: Indexed SQLite3 database
      • Compression ratio:  122.7 : 1    (@ zlib level 9)
    • Old code:
      • iOS simulator: ~8 hours
    • New code:
      • iOS simulator: < 3 mins
      • iPad 3: 6.7 mins
  • Caveats:
    • This does not include interpolated data layers
      • Not practical speed-wise on device (yet)
    • Requires server support
    • Not as ideal as tile server
      • Even if updating takes a few minutes, that's still worse than 0 minutes.

Updates for Map Point Features (User Points, EPA Uranium Mines)
     Uranium Mines -> Data Tiles

  • Dynamic Data Tiles
    • An interface has been created which allows using point features as data tiles
    • Thus point features are now optionally available as sublayers when creating a custom map layer.
      • Does not replace existing display options for them, which are still available.
    • Allows for faster rendering, higher resolutions, and layer combinations.
      • Ex: Showing points you logged with natural background radiation subtracted.
    • For User Points, the value is the average dose rate at that point.
    • For Uranium Mines, the value is the count of the number of mines at that point.
    • Caveats
      • Attributes (names/dates) are not currently supported; this only processes numeric values.
      • Custom symbology is not currently supported.  (ie, the mine symbol)
      • Performance may be degraded for large datasets (20k+ points(?)); this uses non-pyramided data and projects the coordinate system dynamically.
      • Map tiles get cached longer, meaning you may need to reselect the layer to see "live" data being logged show up.
  • User Points
    • Performance improvements
    • Dose rate values will now be averaged again if points were aggregated/binned
  • EPA Uranium Mines
    • Performance improvements
    • LOD and point size values will now be respected
    • Labeling has been improved
      • Background removed
      • Font size increased
      • ALLCAPS -> Title Case
      • If showing mine names for a label that many points got aggregated into, it will try to find a real name if the default one was empty or "Unknown"

Version 1.6.8 (latest release)

Version 1.6.8 has been released; credit to Apple's review team for the expedited review.

This is an early release specifically to fix iOS 4 issues.

My apologies to iOS 4 users "in the zone" who inadvertently lost most ratemeter functionality in 1.6.7.
  • iOS 4 Fixes
    • Main numeric display now works again correctly 
      • (was blank in 1.6.7 in iOS4 only)
    • All map features now work in iOS 4
      • (previously, no layers, etc even worked at all)
    • Known minor cosmetic issues remain
      • Some Emoji / Unicode symbols are substituted or missing
      • Some controls are not styled / tinted
  • Causal Factor(s)
    • Display Not Updating
      • For reasons unknown, in iOS 4 only, the main UI was being initialized twice (UIViewController viewDidLoad).  I tried pretty much every suggestion on Stack Overflow and nothing worked.
      • This was originally observed with the release and upgrade to the iOS 6 SDK as a base for the app.
        • At the time, while odd/annoying, this caused no issues.
        • However, the new display control was not added with interface builder as the previous labels were, but constructed directly via code.
        • As one of the two initializations is likely coming from the Interface Builder file it is likely the combination of the two factors resulted in a partially initialized control that was never getting refreshed.
      • Because the core issue could not be positively identified, and none of the possible fixes I found worked, I had to create a workaround:
        • 1.  A mutex lock is acquired to set a unique atomic threadId on a singleton
        • 2.  This prevents the 2nd call to viewDidLoad from working
        • 3.  In testing, in every case the 1st thread hitting viewDidLoad was the one that mattered.
        • 4.  As long as this assumption holds true, I believe this workaround will be fine.
    • Maps not Working
      • The UIPickerViews which show the LUT, layer, basemap etc require a fixed width be specified in iOS 4 when overriding the "viewForRow" method.
      • As such, whenever I implemented custom labels for the UIPickerViews, mapping in iOS 4 broke.
      • However, this may not have been immediately apparent; as long as a valid selection was chosen and stored to preferences before this occurred, and no attempt was made to change it.

In addition to iOS 4 fixes, this contains some additional features that were in-progress and included as a result.
  • Map Performance
    • New bitmap indexing system is now fully implemented
    • See "Maps - More Info" if you really want to know the details
  • Map Symbology: Non-Retina Display improvements
    • Pre/post-processing FX reduced in size by half for non-Retina displays
  • Map User Points Database Export
    • As noted in Settings -> "Log File":
      • Set default log email address to "database"
      • Then use normal email log function (hold "Settings" button down)
    • Purpose: Emergency backup for your data in the log file
      • The log file can be deleted or cleared
      • The user points database currently cannot be
      • Ideally, they are both written to at the same time
    • Details
      • Format: SQLite3 database
      • Data recorded: Lat, lon, dose rate in uSv/h, year, month, day of month
    • Caveats
      • The database is intended for mapping data.
        • It won't log data that can't be mapped (ie, GPS off)
        • It stores only a few key fields relative to the full log file
      • SQLite3 format is more difficult to work with
    • Nonetheless, it's in there as a backup if you should ever need it.

HOWTO:  Export data from User Points SQLite database

Remember, this is internal app data and is only here to provide you with a failsafe backup for your data in the log file.  The app itself uses this database because it is much faster to retrieve data from than a plaintext log file.

Normally, you should just use the log file and ignore this.  The log file records many more fields and requires no special effort to use.  This is a contingency you will probably never need to use.
  • 1. Requirement:  SQLite
    • SQLite is a charming little super-efficient serverless database originally created by a defense contractor for the US Navy as part of the ongoing effort to blow stuff up with guided missiles.  Just like John Moses Browning intended.
      • Today, it does far less dramatic things like store the contents of your contact list; it is used everywhere on mobile devices.
    • OS X has SQLite built-in.
    • Other OSs: download it here. ("precompiled binaries")  (free / open source)
      • On Windows, personally I just put SQLite3.exe in the /windows/system32 directory so it will work from anywhere.
  • 2. Perform Export
    • A.  Open Command Prompt / Terminal
      • Windows:  Start -> Run -> cmd.exe
      • OS X: Applications -> Utilities -> Terminal
    • B.  Go to Location of Database
      • ndolezal$ cd /Users/ndolezal/Downloads
      • NOTE:   Of course, this varies depending on where you downloaded it to.
    • C.  Open Database
      • ndolezal$ sqlite3 userlog.sqlite
    • D.  Verify Database Opened Correctly
      • sqlite> .tables
      • RadGroup  RadLog
        • If you don't see "RadGroup  RadLog"... 
          • It probably couldn't find the file because you made a typo.
          • So, it will create a new database with that name, and a size of 0 bytes.  Whoops?
          • Verify you're in the right directory and spelled the filename correctly.
          • Those tables will exist even if you haven't logged any data.
    • E.  Configure Export
      • NOTE:  Don't forget the "." and ";" as the syntax must be exact.
      • sqlite> .headers on
      • sqlite> .separator ','
      • sqlite> .output export.csv
      • sqlite> SELECT * FROM RadLog;
      • sqlite> .quit
    • F.  Done.
      • You should now have a file named "export.csv" in that directory
      • This file can be imported into a spreadsheet or GIS program
    • G.  (OPTIONAL)   Normalize Date
      • Issue: The date is in 3 columns, which is non-standard (my bad)
      • Effect: This might make it hard to use as a date type in whatever you import it to
      • Fix: Use this in step (E) above, in place of "SELECT * FROM RadLog;":
        • sqlite> SELECT RadLogID, Lat, Lon, DER, CAST(YY AS VARCHAR(4)) || '-' || CAST(MM AS VARCHAR(2)) || '-' || CAST(DD AS VARCHAR(2)) AS MeasurementDate FROM RadLog;
      • (example of output)
        • 1,34.12,-123.21,0.084,2013-8-13

iOS 4 and Version 1.6.7

UPDATE:  This is fixed in 1.6.8.

iOS 4の内でのみ、大型数値表示は空白です。私は修正に取り組んでいます。 iOSの5、6、および7は影響を受けません。

In iOS 4 only, the large numeric display is blank.  I am working on a fix.  iOS 5, 6, and 7 are not affected.

Yes, iOS 4.  It is my intention to support older versions of iOS for as long as possible.  I believe good radiation detection equipment is something you should be able to pull out of the collapsed ruins of a wall in the wasteland in 200 years, slap batteries in, and have it be able to function.  Unfortunately, with smartphones about the best you can do is three years.

3D Map Data Visualization

                  Camera in Tokyo Harbor, facing north-ish.

Simple 3D visualization of the "Safecast Interpolation" layer from 2013-07-12.

Interpolation was created using Empirical Bayesian Kriging in ArcMap 10.1, 153m resolution, projection: Web Mercator Aux sphere. (identical to data in app v1.6.7)  EBK parameters 500/3/500, run time ~5 days on i7 3770k O/C'd @ 4ghz.

3D visualization created with ArcScene 10.1, with elevation in meters = uSv/h * 5000.0, linear scaling, full resolution.  No hillshading.  Color ramp is an approximation of the default LUT in Geiger Bot.

The combination of non-linear scaling for the color to highlight low ranges, and linear scaling as elevation helps show the relative difference logarithmic scaling can have.

Version 1.6.7 

Most development time was spent refactoring code in preparation for iOS 7 framework changes and UI redesign.

But, some new things did get added.

1.  Updated Safecast data (2013-07-12)
2.  Includes historical Safecast data (2013-04-15)
3.  Changes to make map data easier to see
4.  iOS7 compatibility updates
5.  Misc bugfixes
6.  Several new LUTs

What do I mean by "easier to see"?  Basically two new effects: 1) "smart resize" and 2) a black halo (outline).

It's probably easiest to see them in action.  Below is an example using a Safecast drive route in an area I'm sure some of you may be familiar with.

 1. Normal 1:1 Rendering

While there, the route is difficult to see.
 2. LOD "HD" Selected

Effective, but this somewhat crudely just downsamples the resolution by 16x.
 3. New Resize + Halo

Both smooth and detailed.  The black halo outline helps increase contrast with the basemap.

These effects can be defined on a per-sublayer basis with a custom layer as pre-processing (resize) and post-processing (halo/shadow) effects.  Just remember to turn them off for interpolated layers, or you'll be wasting CPU cycles for something that's not really noticeable.  (it's relatively fast, but still, it all adds up)

All predefined layers now use a 3x3 resize and 5x5 halo as appropriate.

The historical Safecast dataset includes both the data and EBK interpolation layers.  You can use these in custom layers with "subtract" to see changes over time.  The NNSA data from 2011-06-30 also allows for another point in time for comparisons.

There is also a new predefined layer, "SC New > 2013-04-15", which highlights newly surveyed areas.  Note this does not highlight updated areas, which is a question that requires more information to answer than I happened to have in time for this release.

Version 1.6.6 

Minor update release with updated content and semi-critical bugfix.

1.  Updated Safecast data (2013-05-16)
2.  Fix for pulse shape training mode bug in gamma spectroscopy