#Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Res_requestedExecutionLevel=asInvoker #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** ;;;;;;;;;;;;;;; ; ; Theremino MCA macro ; ; Quick and dirty Theremino MCA automation ; (till Theremino MCA has its own Macro) ; ; by nkom ; ; 20130628: Adapted for Theremino MVA V5.0 ; ;;;;;;;;;;;;;;; $DBG = 0 AutoItSetOption("WinTitleMatchMode", 4) AutoItSetOption("MouseCoordMode", 0) $MCA = "Theremino MCA - V" $probe = "" $ppf = "" $saveSPE = 1 Func saveimg($suffix, $MCAtxt, $pre = "") ; Save the image (entire ThereminoMCA window) WinActivate($MCA, $MCAtxt) if $suffix = "" Then $suffix = getsuffix($MCAtxt) $pn = getprobename($MCAtxt) EndIf ControlClick($MCA, $MCAtxt,"ToolStrip1", "left", 1, 55, 9) WinWait("Save As","Namespace Tree Contr") If $pre Then Send($pre) Else Send("{RIGHT}-") EndIf Send($pn & "-" & $suffix) If not $DBG Then Send("{ENTER}") sleep(200) if WinActive("Confirm Save As") Then Send("y") EndIf EndIf EndFunc Func savehist($suffix, $MCAtxt, $pre = "") ; Save histogram WinActivate($MCA, $MCAtxt) if $suffix = "" Then $suffix = getsuffix($MCAtxt) $pn = getprobename($MCAtxt) EndIf ControlClick($MCA, $MCAtxt,"ToolStrip1", "left", 1, 151, 9) ; click histogram button WinWait("Save As","Namespace Tree Contr") If $pre Then Send($pre) Else Send("{RIGHT}{BACKSPACE}{BACKSPACE}{BACKSPACE}{BACKSPACE}") Send("{RIGHT}-") EndIf Send($pn & "-" & $suffix) $hf = ControlGetText("Save As", "Namespace Tree Control", "Edit1") ; get filename if StringRight($hf, 4) <> ".txt" Then $hf = $hf & ".txt" EndIf $txt = WinGetText("Save As") $i = StringInStr($txt, @LF, 0, 8) $ii = StringInStr($txt, @LF, 0, 9) ;~ MsgBox(0,"@txt@", $i & "===" & $ii & "~~~" & $txt) $r = StringMid($txt, $i + 10, $ii - $i - 10) ; Get the path ;~ MsgBox(0,"@txt@", $r & "<<<\>>>" & $hf) If not $DBG Then Send("{ENTER}") sleep(200) if WinActive("Confirm Save As") Then Send("y") EndIf EndIf return $r & "\" & $hf ;Return full path EndFunc Func runMCA($MCAtxt) ; click run button WinActivate($MCA, $MCAtxt) ControlClick($MCA, $MCAtxt,"ToolStrip1", "left", 1, 390, 9) EndFunc Func newMCA($MCAtxt) ; Click Start new measure WinActivate($MCA, $MCAtxt) ControlClick($MCA, $MCAtxt,"ToolStrip1", "left", 1, 470, 9) Sleep(300) If WinActive("Theremino_MCA", "Warning:" ) Then Send(" ") EndIf EndFunc Func getsuffix($MCAtxt) ; Read the 1st line of the note and convert spaces into "-". Used for file name suffix $txt = WinGetText($MCA, $MCAtxt) If StringInStr(WinGetTitle($MCA), "MCA - V4") Then $i = StringInStr($txt, @LF, 0, 2) $ii = StringInStr($txt, @LF, 0, 3) Else $i = StringInStr($txt, @LF, 0, 3) $ii = StringInStr($txt, @LF, 0, 4) EndIf $r = StringMid($txt, $i + 1, $ii - $i - 2) $r = StringReplace($r, " ", "-") ;~ if $DBG Then ;~ MsgBox(0,"DBG", ">>>" & $r & "<<<") ;~ Endif return $r EndFunc Func getprobename($MCAtxt) ; Read the 2nd line of the note and take up to the 1st space as the probe name $txt = WinGetText($MCA, $MCAtxt) If StringInStr(WinGetTitle($MCA), "MCA - V4") Then $i = StringInStr($txt, @LF, 0, 3) $ii = StringInStr($txt, @LF, 0, 4) Else $i = StringInStr($txt, @LF, 0, 4) $ii = StringInStr($txt, @LF, 0, 5) EndIf $r = StringMid($txt, $i + 1, $ii - $i - 2) $ii = StringInStr($r, " ") $r = StringLeft($r, $ii - 1) ;~ if $DBG Then ;~ MsgBox(0,"DBG", ">>>" & $r & "<<<") ;~ Endif return $r EndFunc Func saveboth($probe, $pre = "") ; Save both image file and histogram, and convert into spe file WinActivate($MCA, $probe) saveimg("", $probe, $pre) $hf = savehist("", $probe, $pre) Sleep(200) ;~ MsgBox(0, "@hf@", $hf) If $saveSPE Then hist2spe($hf, $probe) ; Convert histogram file into MCA166 .spe EndIf EndFunc Func _WinWaitActivate($title, $text, $timeout = 5) WinWait($title, $text, $timeout) If Not WinActive($title, $text) Then WinActivate($title, $text) If Not WinWaitActive($title, $text, 5) Then Return 0 Else Return 1 EndIf EndFunc Func setPosition($p, $MCAtxt) WinActivate($MCA, $MCAtxt) ControlClick($MCA, $MCAtxt, "WindowsForms10.EDIT.app.0.33c0d9d4", "left", 2, 4,4) Send($p) EndFunc Func setSize($p, $MCAtxt) WinActivate($MCA, $MCAtxt) ControlClick($MCA, $MCAtxt, "WindowsForms10.EDIT.app.0.33c0d9d3", "left", 2, 4,4) Send($p) EndFunc Func setMaxSlope($p, $MCAtxt) WinActivate($MCA, $MCAtxt) ControlClick($MCA, $MCAtxt, "WindowsForms10.EDIT.app.0.33c0d9d5", "left", 2, 4,4) Send($p) EndFunc Func setMaxNoise($p, $MCAtxt) WinActivate($MCA, $MCAtxt) ControlClick($MCA, $MCAtxt, "WindowsForms10.EDIT.app.0.33c0d9d2", "left", 2, 4,4) Send($p) ;~ if $DBG Then ;~ MsgBox(0,"DBG", ">>>" & @error & "<<<") ;~ Endif EndFunc Func getRT($MCAtxt) ; Get Total seconds WinActivate($MCA, $MCAtxt) $r = ControlGetText($MCA, $MCAtxt, "WindowsForms10.STATIC.app.0.33c0d9d6") return $r EndFunc Func getcount($MCAtxt) ; get Total pulses WinActivate($MCA, $MCAtxt) $r = ControlGetText($MCA, $MCAtxt, "WindowsForms10.STATIC.app.0.33c0d9d8") return $r EndFunc Func getRate($MCAtxt) ; get Pulses per sec. WinActivate($MCA, $MCAtxt) $r = ControlGetText($MCA, $MCAtxt, "WindowsForms10.STATIC.app.0.33c0d9d7") return $r EndFunc Func hist2spe($hf, $MCAtxt) ; save spe file, too, to be examined with Identify.exe $hh = FileOpen($hf,0) $sf = StringLeft($hf, StringLen($hf) - 3) & "spe" if FileExists($sf) Then FileMove($sf, $sf & ".bak", 1) Endif FileDelete($sf) Do ; Loop the header portion and get $DATE_MEA: Date and time of measurement $ln = FileReadLine($hh) if @error Then ExitLoop EndIf if StringInStr($ln, "tarted at:") Then $DATE_MEA = StringMid($ln, 20, 16) EndIf Until $ln = " Energy(KeV) Counts " $ln = FileReadLine($hh) ;; skip spacer line $pn = getprobename($MCAtxt) FileWriteLine($sf,"$MCA_166_ID:") FileWriteLine($sf, $pn) ; Probe name FileWriteLine($sf,"$DATE_MEA:") FileWriteLine($sf, $DATE_MEA) ; Date and time of measurement $r = getRT($MCAtxt) FileWriteLine($sf,"$MEAS_TIM:") ; RT and LT FileWriteLine($sf, $r & " " & $r) $r = getRate($MCAtxt) FileWriteLine($sf,"$COUNT_RATE:") ; Rate FileWriteLine($sf, $r) FileWriteLine($sf,"TEMPER:") FileWriteLine($sf,"24") ; fake temperature ... $i = 0 dim $lnl[4096] Do ; Loop the data portion and store in the array $ln = FileReadLine($hh) if not $i Then $fln = $ln ; Keep the first line EndIf ;~ MsgBox(0,"@ 1", @error & "---" & $ln) if @error Then ExitLoop EndIf $oln = $ln ; Keep the last line $ln = StringMid($ln,17) $lnl[$i] = $ln ;~ FileWriteLine($sf, $ln) ;~ MsgBox(0,"@ 2", $ln) $i = $i + 1 Until not $ln FileWriteLine($sf,"$DATA:") FileWriteLine($sf,"0 " & $i) ; Actual channel number for $c = 0 to $i-1 ; write all data FileWriteLine($sf, $lnl[$c]) Next $ener = StringLeft($oln, StringInStr($oln, ",")) FileWriteLine($sf,"$ENER_FIT:") ;~ FileWriteLine($sf,"-40.49347 6.89400 0.00000") FileWriteLine($sf,"0 " & $i/$ener) ;~ FileWriteLine($sf,"$ENER_DATA:") ; calibration data ;~ FileWriteLine($sf,"2") ;~ FileWriteLine($sf, StringReplace($oln, ",", "") ;~ FileWriteLine($sf, StringReplace($fln, ",", "") ;~ FileWriteLine($sf,"600 1460.83") ;~ FileWriteLine($sf,"25 59.53") FileWriteLine($sf,"$IDENTIFY_PARAMETER:") FileWriteLine($sf,"""output""") ; FWHM parameter. Identify will use these for peak fitting and becqurel estimation FileWriteLine($sf,"FWHM_FWHM1:") ;~ FileWriteLine($sf,"23") FileWriteLine($sf,"22.85") FileWriteLine($sf,"FWHM_EXP1:") FileWriteLine($sf,"0.000000") FileWriteLine($sf,"FWHM_Energie1:") ;~ FileWriteLine($sf,"125.00") FileWriteLine($sf,"117.53") FileWriteLine($sf,"FWHM_FWHM2:") ;~ FileWriteLine($sf,"53") FileWriteLine($sf,"66.97") FileWriteLine($sf,"FWHM_EXP2:") FileWriteLine($sf,"0.000000") FileWriteLine($sf,"FWHM_Energie2:") ;~ FileWriteLine($sf,"662.00") FileWriteLine($sf,"778.9") FileWriteLine($sf,"Peaksuchempfindlichkeit:") ; FileWriteLine($sf,"3.1") ; Absorber and window material data, etc. See detector function menu in Identify for more detail. FileWriteLine($sf,"Absorbermaterial_Dicke:") FileWriteLine($sf,"0") FileWriteLine($sf,"Absorbermaterial_Nummer:") FileWriteLine($sf,"3") FileWriteLine($sf,"Quellenmaterial_Dicke:") FileWriteLine($sf,"0") FileWriteLine($sf,"Quellenmaterial_Nummer:") FileWriteLine($sf,"5") FileWriteLine($sf,"Absorber_Genauigkeit:") FileWriteLine($sf,".5") FileWriteLine($sf,"Detektorangaben_Genauigkeit:") FileWriteLine($sf,".1") FileWriteLine($sf,"Detektortyp:") FileWriteLine($sf,"3") FileWriteLine($sf,"Abstand_Quelle:") FileWriteLine($sf,"8") FileWriteLine($sf,"Detektorfenster_Germanium:") FileWriteLine($sf,"0") FileWriteLine($sf,"Detektorfenster_Eisen:") FileWriteLine($sf,"0") FileWriteLine($sf,"Detektorfenster_Beryllium:") FileWriteLine($sf,"0") FileWriteLine($sf,"Detektorfenster_Aluminium:") FileWriteLine($sf,"1") FileWriteLine($sf,"empfindliche_Flaeche_662keV:") FileWriteLine($sf,".1734849") FileWriteLine($sf,"relative_Efficiency:") ; relative efficiency compared to 3" x 3" NaI FileWriteLine($sf,".29") FileWriteLine($sf,"Detektordicke:") ; Detector thickness FileWriteLine($sf,"6.3") ; 6.3 cm FileWriteLine($sf,"Efficiency_Parameter:") FileWriteLine($sf,"""l""") FileWriteLine($sf,"Detektorflaeche:") ; Detector surface ;~ FileWriteLine($sf,"19.782") FileWriteLine($sf,"4.6") FileWriteLine($sf,"Temperaturschwankungen:") FileWriteLine($sf,"20") FileWriteLine($sf,"Peaksuchaufloesung:") FileWriteLine($sf,"1") FileWriteLine($sf,"Sprache_englisch:") FileWriteLine($sf,"#TRUE#") FileWriteLine($sf,"Sprache_russisch:") FileWriteLine($sf,"#FALSE#") FileWriteLine($sf,"Reportoption:") FileWriteLine($sf,"""mdapeaks""") EndFunc Func monitor() ; save both image and histogram file at predetermined interval, and start new measure. $lt = 5 * 60 ; Save and start new measure every 5 minutes, in this example For $i = 1 to 100000 newMCA($probe) sleep(($lt + 2) * 1000) ;~ $pref = $ppf & $position[$pi] & "-" & $size[$si] & "-" & $slope[$li] & "-" & $noise[$ni] & "-" saveboth($probe) Next EndFunc Func monitorall() ; save both image and histogram file at predetermined interval, and start new measure. $lt = 120 * 60 ; Save and start new measure every 5 minutes, in this example For $i = 1 to 100000 sleep(($lt + 2) * 1000) ;~ $pref = $ppf & $position[$pi] & "-" & $size[$si] & "-" & $slope[$li] & "-" & $noise[$ni] & "-" saveall() Next EndFunc Func finetune() ; Change base line testing valuse and save image and histogram, and start new measure with new values. $lt = 10 ; Manually set, for now. $repeat = 1 ; We can take multiple measurement of the same parameter set, to be sure. ;~ dim $position[100] = [50,60,70,80,90,100,110] ; Examples of position parameters to be tested ;~ dim $position[100] = [80,90,100,110] ;~ dim $position[100] = [60,70,80] ;~ dim $position[100] = [60,61,62,63,64,65,66,67,68] dim $position[100] = [69,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100] ;~ dim $size[100] = [100, 125, 150, 175, 200, 225, 250, 275, 300] ;~ dim $size[100] = [100, 125, 150, 175] ;~ dim $size[100] = [110,120,130,140,150] dim $size[100] = [220] ;~ dim $slope[100] = [1,2,4,6,8,10,15,17,20,25] ;~ dim $slope[100] = [1,5,10,15,20] dim $slope[100] = [15] ;~ dim $noise[100] = [1, 5, 7, 10, 15, 20] ;~ dim $noise[100] = [8,12,16] dim $noise[100] = [8] ;~ dim $position[100] = [71,80] ;~ dim $size[100] = [101, 120] ;~ dim $slope[100] = [7,11, 14] ;~ dim $noise[100] = [8, 10] For $pi = 0 to 99 If not $position[$pi] Then ExitLoop EndIf setPosition($position[$pi], $probe) ;~ MsgBox(0,"DBG", ">>>" & @error & "<<<") For $si = 0 to 99 If not $size[$si] Then ExitLoop EndIf setSize($size[$si], $probe) ;~ MsgBox(0,"DBG", ">>>" & @error & "<<<") For $li = 0 to 99 If not $slope[$li] Then ExitLoop EndIf setMaxSlope($slope[$li], $probe) ;~ MsgBox(0,"DBG Slope", ">>>" & @error & "<<<") For $ni = 0 to 99 If not $noise[$ni] Then ExitLoop EndIf setMaxNoise($noise[$ni], $probe) ;~ MsgBox(0,"DBG Noise", ">>>" & @error & ", $li=" & $li & ", " & $slope[$li] & ", $ni=" & $ni & ", " & $noise[$ni] & "<<<") for $c = 0 to $repeat -1 newMCA($probe) sleep(($lt + 2) * 1000) $pref = $ppf & $position[$pi] & "-" & $size[$si] & "-" & $slope[$li] & "-" & $noise[$ni] & "-" saveboth($probe, $pref) Next Next Next Next Next MsgBox(0,"Finished", "All done!") Endfunc Func newall() $probe = "RAP-47" newMCA($probe) $probe = "NaI-40mm x 40mm" newMCA($probe) $probe = "CsI-63mm x 63mm" newMCA($probe) EndFunc Func saveall() $saveSPE = 1 $probe = "RAP-47" saveboth($probe) $probe = "NaI-40mm x 40mm" saveboth($probe) $probe = "CsI-63mm x 63mm" saveboth($probe) EndFunc ; Use the 2nd line of the note to identify the probe so that we can run multiple copies of ; ThereminoMCA with different probles. $probe = "RAP-47" ;~ $probe = "NaI-40mm x 40mm" ;~ $probe = "CsI-63mm x 63mm" ;~ $probe = "" $saveSPE = 1 saveboth($probe) ;~ saveall() ;~ newall() ;~ monitor() ;~ monitorall() $ppf = "Pos-test-" ; prefix for finetune filenames ;~ finetune()