[Ifeffit] Automatically doing many fits / Scripting - Solved
Felix E. Feiten
feiten at cat.hokudai.ac.jp
Fri Jun 23 07:53:08 CDT 2017
Dear all,
as I got no reply, I did embark on this little automation quest by
myself, as announced.
I used AutoHotkey to write a script that operates on Artemis by sending
keystrokes and mousecommands. I will attach the the code to the end of
this mail so anyone interested can take a peek. I basically wrote it for
myself so some parts might not be clear or smartly designed but it does
it's job of automatically starting fit after fit while varying the
start/guess/set parameters. It is somewhat commented so anyone with a
real interest in this should be able to get it to work, otherwise just
ask me for help.
Subsequently I used MS PowerShell to grab the relevant parameters from
the log-files of the fits.
I won't attach that script, but if anyone is interested in it: just ask.
Attention, wall-of-text/code below!
Felix
Contents of "artemis_fitting.ahk":
; This is what comments look like
; 3D Parameter Scan
; Artemis Main Window:
; Using IDs for buttons and text-fields and windows would be much better
than using mouse-positioning.
; The IDs would make the whole thing independent from the resolution.
; GDS Window:
; Change Parameters
; Window unique ID: 0x30a38
; fields in GDS table don't have unique classes so mouse-positioning
will have to be used after all....
; this means there will be a calibration step before running the fitting
loop
; Log Window:
; Save Log File
^j::
{
CoordMode, Mouse , Screen
; MouseGetPos, OutputVarX, OutputVarY, OutputVarWin, OutputVarControl
; MouseGetPos, MouseXPosition, MouseYPosition, ArtemisMainWindowUID,
ArtemisMainWindowClassNN
; MsgBox Mouse Cursor x-position: %MouseXPosition%`n
; , Mouse Cursor y-position: %MouseYPosition%`n
; , Window unique ID: %ArtemisMainWindowUID%`n
; , Window Class: %ArtemisMainWindowClassNN%
; 0. calibration
;MsgBox Calibration. Position the cursor over Artemis main window's
entry field for Fit-Name and press return.
MsgBox Calibration: Name
MouseGetPos, Edit1XP, Edit1YP, ArtemisMainWindowUID
;MsgBox ArtemisMainWindowUID is %ArtemisMainWindowUID%
;MsgBox Calibration. Position the cursor over Artemis main window's
fit description entry field.
MsgBox Calibration: Fit description
MouseGetPos, FDXP, FDYP
;MsgBox Calibration. Position the cursor over the Fit Button of
Artemis' main window.
MsgBox Calibration: Fit
MouseGetPos, FitXP, FitYP
;MsgBox Calibration. Position the cursor over the "Show log" button
of the main window.
MsgBox Calibration: Show log
MouseGetPos, slogX, slogY
; A - pick the two fields that containt the guess-value for
FixedParameter1 and FixedParameter2
;MsgBox Calibration. Position the mouse cursor over the input field
for FixedParameter1 and press Return.
MsgBox Calibration: Parameter1
MouseGetPos, FixPar1MXP, FixPar1MYP
;MsgBox Position the mouse cursor over the input field for
FixedParameter2 and press Return.
MsgBox Calibration: Parameter2
MouseGetPos, FixPar2MXP, FixPar2MYP, GDSWindowUID
; B - enter the desired minimum, maximum and step-size for each of
the FixedParamteres
; for now just fixed
; minimum = 0.002,
; maxmimum = 0.012 and
; step width = 0.001
MinPar1=0.002000
MinPar2=0.002000
MaxPar1=0.012000
MaxPar2=0.012000
StepSize=0.00100
CurPar1=%MinPar1%
CurPar2=%MinPar2%
;MsgBox Calibration(finally last step though). Place mouse cursor
over Log-window's Save button.
MsgBox Calibration: Save (Log-Window)
MouseGetPos, SaveX, SaveY, LogID
;MsgBox Calibration: Plot Window
;MouseGetPos, PX, PY, PID
LV1=1
LV2=1
TFC=0
Loop , 11
{
CurPar2:=MinPar2
LV1:=LV1+1
Loop, 11
{
LV2:=LV2+1
TFC:=TFC+1
; block below is what should be executed in each run of the
loop, let's build the loop
{
; 1. Go to GDS Window
; WinActivate [, WinTitle, WinText, ExcludeTitle,
ExcludeText]
WinActivate , ahk_id %GDSWindowUID%
WinWaitActive , ahk_id %GDSWindowUID%
; 2. Set the two fixed parameters as desired !! THIS
NEEDS TO BE VARIED FROM ITERATION TO ITERATION
; should work (i.e. be varied/changed)
MouseMove, FixPar1MXP, FixPar1MYP, 0
;Sleep 500
MouseClick
;Sleep 500
MouseClick
;MsgBox Just to make sure: CurPar1=%CurPar1%
Sleep 100
SendInput %CurPar1%
Sleep 100
MouseMove, FixPar2MXP, FixPar2MYP, 0
;Sleep 500
MouseClick
;Sleep 500
MouseClick
;MsgBox Just to make sure: CurPar2=%CurPar2%
Sleep 100
SendInput %CurPar2%
Sleep 100
; 3. Go to Artemis Main Window
WinActivate , ahk_id %ArtemisMainWindowUID%
WinWaitActive , ahk_id %ArtemisMainWindowUID%
; 3. Enter the fit name !! THIS NEEDS TO BE VARIED
FROM ITERATION TO ITERATION
; should be fine now
MouseMove, Edit1XP, Edit1YP, 0
MouseClick
MouseClick
SendInput ^{a} {BS}{BS}{BS}Fit %TFC%
; 4. Enter the fit description !! THIS NEEDS TO BE
VARIED FROM ITERATION TO ITERATION
;should be fine
MouseMove, FDXP, FDYP, 0
MouseClick
MouseClick
SendInput ^{Home} {Ctrl down} +{End} {Ctrl up}
{BS}{BS}{BS}{BS}{BS}{BS}{BS}Parameter1: %CurPar1% {Enter}Parameter2:
%CurPar2%
; 5. Press "Fit" Button
MouseMove, FitXP, FitYP, 0
MouseClick
; 6. wait (how long?), oh, possibly until the log
window becomes active
; This one is a serious issue
; The fitting does not seem to be completely finished
when the plot window pops up...
; actually, until the plot window pops up
;WinWaitActive , ahk_id %PID%
;MsgBox 6
; This is really annoying, these windows keep changing
names.
; I will just add a timer here as well and maybe
improve/fix it later
; no, this timer is what causes the issues I think.
; simply have to include picking the plot window at the
beginning
Sleep 5000
; 7. Go to log window (if necessary)
WinActivate , ahk_id %ArtemisMainWindowUID%
WinWaitActive , ahk_id %ArtemisMainWindowUID%
;MsgBox 7
MouseMove, slogX, slogY, 0
MouseClick
MouseClick
;Sleep 300
; 8. Save the log file
; THERE SEEMS TO BE A PROBLEM WITH SAVING THE LOGFILES.
; I COULD PLAY AROUND WITH LONGER SLEEP TIME
WinActivate , ahk_id %LogID%
WinWaitActive , ahk_id %LogID%
;MsgBox 8
MouseMove, SaveX, SaveY, 0
MouseClick
; WinWaitActive , ahk_id 0x3028a ID doesn't work as
this one changes, so just wait some time
Sleep 1000
SendInput ^{a} {BS}{BS}{BS}Fit %TFC%
Sleep 1000
SendInput {Enter}
Sleep 500
CurPar2:=CurPar2+StepSize
}
; target #1: PtCoN NP bC
}
CurPar1:=CurPar1+StepSize
}
Sleep 1000
MsgBox A total of %TFC% fits have been performed.
Return
}
On 16/06/2017 18:59, Felix E. Feiten wrote:
> I am very sorry, in the second paragraph the sequence describing what
> I want to do could have been clearer:
>
> I want to 1. start a fit with certain parameters, 2. save the log
> file, 3. change one parameter. This should be repeated many (120 for
> now) times.
>
> Felix
>
>
> On 16/06/2017 18:39, Felix E. Feiten wrote:
>> Dear Ifeffit mailing-list,
>>
>> first of all sorry for writing another mail to the list in such a
>> short time span, I hope people will not get sick of me too quickly.
>>
>> I want to do many fits for the same data with varying
>> start-parameters. More specifically, I am doing fits to EXAFS data of
>> the Pt L3 edge of PtCo(X) nanoparticles and want to vary sigma^2 for
>> each of the two paths (Pt-Pt and Pt-Co) that I fit. I want to 1.
>> start a fit with certain parameters, 2. save the log file, 3. change
>> one parameter many (120 for now) times.
>>
>> If there is no functionality to do this in Artemis I'll have to
>> resort to using some external script that abuses Artemis. In that
>> case I will report on how it went. But obviously, it would be much
>> more comfortable if Artemis had something like this implemented.
>>
>> Any way to start a fit from the windows command line (I'm using
>> Windows 10) would also be very helpful as that would probably allow
>> me to do the scripting in PowerShell relatively easily.
>>
>> With kind regards,
>>
>> Felix
>>
>>
>> _______________________________________________
>> Ifeffit mailing list
>> Ifeffit at millenia.cars.aps.anl.gov
>> http://millenia.cars.aps.anl.gov/mailman/listinfo/ifeffit
>> Unsubscribe: http://millenia.cars.aps.anl.gov/mailman/options/ifeffit
>>
>
More information about the Ifeffit
mailing list