diff --git a/trimsp/TrimSPGUI/TrimSPGUI.ui b/trimsp/TrimSPGUI/TrimSPGUI.ui
new file mode 100644
index 0000000..4c91017
--- /dev/null
+++ b/trimsp/TrimSPGUI/TrimSPGUI.ui
@@ -0,0 +1,2554 @@
+
+TrimSPGUI
+
+
+ TrimSPGUI
+
+
+
+ 0
+ 0
+ 722
+ 601
+
+
+
+ TrimSP GUI
+
+
+
+ Progress
+
+
+
+ 0
+ 525
+ 715
+ 20
+
+
+
+ WinPanel
+
+
+
+
+ tabs
+
+
+
+ 0
+ 0
+ 715
+ 525
+
+
+
+
+ LayersTab
+
+
+ Layers
+
+
+
+ groupBox1
+
+
+
+ 5
+ 0
+ 445
+ 485
+
+
+
+ GroupBoxPanel
+
+
+ Sunken
+
+
+ Layers
+
+
+
+ layout27
+
+
+
+ 5
+ 20
+ 435
+ 460
+
+
+
+
+ unnamed
+
+
+ 3
+
+
+
+ layout19
+
+
+
+ unnamed
+
+
+
+ textLabel1_4
+
+
+ Number of Layers
+
+
+
+
+ NL
+
+
+ 7
+
+
+ 1
+
+
+ Select the number of the layers of your structure (maximum 7 layers).
+
+
+
+
+ spacer2
+
+
+ Horizontal
+
+
+ Expanding
+
+
+
+ 251
+ 20
+
+
+
+
+
+
+
+ layout26
+
+
+
+ unnamed
+
+
+
+ textLabel2_4
+
+
+
+ 0
+ 1
+ 0
+ 0
+
+
+
+ Composition
+
+
+ Chemical formula
+
+
+
+
+ spacer1
+
+
+ Horizontal
+
+
+ Fixed
+
+
+
+ 101
+ 20
+
+
+
+
+
+ textLabel3
+
+
+
+ 1
+ 5
+ 0
+ 0
+
+
+
+ Density [g/cm<sup>3</sup>]
+
+
+
+
+ textLabel4
+
+
+ Thickness [Å]
+
+
+
+
+
+
+ BoxL1
+
+
+ 0
+
+
+ Layer 1
+
+
+
+ L1Comp
+
+
+
+ 10
+ 20
+ 180
+ 25
+
+
+
+ SrTiO3
+
+
+ Chemical formula of L1
+
+
+ Insert the chemical formula here as you would write it.
+
+
+
+
+ L1rho
+
+
+
+ 200
+ 20
+ 111
+ 25
+
+
+
+ 5.12
+
+
+ Insert the density of the layer here.
+
+
+
+
+ L1d
+
+
+
+ 320
+ 20
+ 85
+ 25
+
+
+
+
+ 0
+ 0
+ 0
+ 0
+
+
+
+ 200
+
+
+ Insert the thickness of the layer here.
+
+
+
+
+
+ BoxL2
+
+
+ false
+
+
+ Layer 2
+
+
+
+ L2Comp
+
+
+
+ 10
+ 20
+ 180
+ 25
+
+
+
+
+
+ L2rho
+
+
+
+ 200
+ 20
+ 111
+ 25
+
+
+
+
+
+ L2d
+
+
+
+ 320
+ 20
+ 85
+ 25
+
+
+
+
+ 0
+ 0
+ 0
+ 0
+
+
+
+
+
+
+ BoxL3
+
+
+ false
+
+
+ Layer 3
+
+
+
+ L3Comp
+
+
+
+ 10
+ 20
+ 180
+ 25
+
+
+
+
+
+ L3rho
+
+
+
+ 200
+ 20
+ 111
+ 25
+
+
+
+
+
+ L3d
+
+
+
+ 320
+ 20
+ 85
+ 25
+
+
+
+
+ 0
+ 0
+ 0
+ 0
+
+
+
+
+
+
+ BoxL4
+
+
+ false
+
+
+ Layer 4
+
+
+
+ L4Comp
+
+
+
+ 10
+ 20
+ 180
+ 25
+
+
+
+
+
+ L4rho
+
+
+
+ 200
+ 20
+ 111
+ 25
+
+
+
+
+
+ L4d
+
+
+
+ 320
+ 20
+ 85
+ 25
+
+
+
+
+ 0
+ 0
+ 0
+ 0
+
+
+
+
+
+
+ BoxL5
+
+
+ false
+
+
+ Layer 5
+
+
+
+ L5Comp
+
+
+
+ 10
+ 20
+ 180
+ 25
+
+
+
+
+
+ L5rho
+
+
+
+ 200
+ 20
+ 111
+ 25
+
+
+
+
+
+ L5d
+
+
+
+ 320
+ 20
+ 85
+ 25
+
+
+
+
+ 0
+ 0
+ 0
+ 0
+
+
+
+
+
+
+ BoxL6
+
+
+ false
+
+
+ Layer 6
+
+
+
+ L6Comp
+
+
+
+ 10
+ 20
+ 180
+ 25
+
+
+
+
+
+ L6rho
+
+
+
+ 200
+ 20
+ 111
+ 25
+
+
+
+
+
+ L6d
+
+
+
+ 320
+ 20
+ 85
+ 25
+
+
+
+
+ 0
+ 0
+ 0
+ 0
+
+
+
+
+
+
+ BoxL7
+
+
+ false
+
+
+ Layer 7
+
+
+
+ L7Comp
+
+
+
+ 10
+ 20
+ 180
+ 25
+
+
+
+
+
+ L7rho
+
+
+
+ 200
+ 20
+ 111
+ 25
+
+
+
+
+
+ L7d
+
+
+
+ 320
+ 20
+ 85
+ 25
+
+
+
+
+ 0
+ 0
+ 0
+ 0
+
+
+
+
+
+
+
+
+
+ layout13
+
+
+
+ 455
+ 0
+ 250
+ 480
+
+
+
+
+ unnamed
+
+
+ 0
+
+
+ 0
+
+
+
+ ProjParam
+
+
+ Projectile parameters
+
+
+
+ layout8
+
+
+
+ 5
+ 25
+ 240
+ 260
+
+
+
+
+ unnamed
+
+
+ 0
+
+
+ 0
+
+
+
+ layout7
+
+
+
+ unnamed
+
+
+
+ textLabel1
+
+
+ Projectile
+
+
+ lineEdit3
+
+
+
+ -
+
+ Muon
+
+
+ -
+
+ Li8
+
+
+ -
+
+ B12
+
+
+ -
+
+ H
+
+
+
+ ProjType
+
+
+
+ 0
+ 0
+ 0
+ 0
+
+
+
+ Choose the projectile type.
+
+
+
+
+
+
+ layout6
+
+
+
+ unnamed
+
+
+
+ layout5
+
+
+
+ unnamed
+
+
+ 0
+
+
+ 0
+
+
+
+ NLabel
+
+
+
+ 5
+ 5
+ 0
+ 0
+
+
+
+ Number of projectiles
+
+
+ lineEdit3_4
+
+
+
+
+ z0Label
+
+
+ Starting depth [Å]
+
+
+ lineEdit3_5
+
+
+
+
+ dzLabel
+
+
+ Depth increment [Å]
+
+
+ lineEdit3_5
+
+
+
+
+ ELabel
+
+
+ Energy [eV]
+
+
+ lineEdit3_6
+
+
+
+
+ SigELabel
+
+
+ Energy sigma [eV]
+
+
+ lineEdit3_7
+
+
+
+
+ AlbleLabel
+
+
+ Angle [deg]
+
+
+ lineEdit3_8
+
+
+
+
+ SigAngleLabel
+
+
+ Angle sigma [deg]
+
+
+ lineEdit3_9
+
+
+
+
+ SeedLabel
+
+
+ Random seed
+
+
+ lineEdit3
+
+
+
+
+
+
+ layout4
+
+
+
+ unnamed
+
+
+ 0
+
+
+
+ NProj
+
+
+
+ 7
+ 0
+ 0
+ 0
+
+
+
+
+ 32767
+ 32767
+
+
+
+ 10000
+
+
+ The number of projectiles to be implanted in the sample. Larger number better statistics.
+
+
+
+
+ z0
+
+
+
+ 32767
+ 32767
+
+
+
+ 0.0
+
+
+ Consider implanted projectiles starting from this depth.
+
+
+
+
+ dz
+
+
+ 10.0
+
+
+ The steps in implantation depth at which the number of stopped projectiles will be counted. Smaller number for finer implantation histogram.
+
+
+
+
+ E
+
+
+ 2000
+
+
+ The average implantation energy of the projectile.
+
+
+
+
+ SigE
+
+
+ 450
+
+
+ The spread in implantation energy. For muons this is typically 400-450 eV. For Li8 this is practically zero.
+
+
+
+
+ Angle
+
+
+ 0
+
+
+ The average implantation angle.
+
+
+
+
+ SigAngle
+
+
+ 15
+
+
+ The spread in implantation angles.
+
+
+
+
+ Seed
+
+
+ 78741
+
+
+ The random number generator seed.
+
+
+
+
+
+
+
+
+
+
+
+ groupBox15
+
+
+ File Names
+
+
+
+ layout14
+
+
+
+ 6
+ 23
+ 240
+ 100
+
+
+
+
+ unnamed
+
+
+ 0
+
+
+ 0
+
+
+
+ textLabelFN
+
+
+ File names prefix
+
+
+
+
+ FNPre
+
+
+ SrTiO3
+
+
+ The names of the saved files will start with this prefix.
+
+
+
+
+ textLabelPath
+
+
+ Save in subdirectory
+
+
+
+
+ layout13_2
+
+
+
+ unnamed
+
+
+
+ Path
+
+
+ ./
+
+
+ This is the path were the input/output files will be stored.
+
+
+
+
+ Browse
+
+
+
+ 7
+ 0
+ 0
+ 0
+
+
+
+ Browse
+
+
+
+
+
+
+
+
+
+ layout12
+
+
+
+ unnamed
+
+
+ 4
+
+
+
+ Start
+
+
+
+ 7
+ 7
+ 0
+ 0
+
+
+
+
+
+
+ image0
+
+
+ Start
+
+
+
+
+ Quit
+
+
+
+ 7
+ 7
+ 0
+ 0
+
+
+
+
+
+
+ image1
+
+
+ Quit
+
+
+ Quit the application.
+
+
+
+
+
+
+
+
+
+ AddParTab
+
+
+ Additional Parameters
+
+
+
+ AddParam
+
+
+
+ 5
+ 0
+ 245
+ 210
+
+
+
+ Additional parameters
+
+
+
+ textLabelEF
+
+
+
+ 12
+ 26
+ 63
+ 25
+
+
+
+ EF
+
+
+
+
+ textLabelSHEATH
+
+
+
+ 12
+ 76
+ 63
+ 25
+
+
+
+ SHEATH
+
+
+
+
+ textLabelERC
+
+
+
+ 12
+ 101
+ 63
+ 26
+
+
+
+ ERC
+
+
+
+
+ textLabelRD
+
+
+
+ 12
+ 127
+ 63
+ 25
+
+
+
+ RD
+
+
+
+
+ KDEE2
+
+
+
+ 185
+ 100
+ 52
+ 26
+
+
+
+ 3
+
+
+ 1
+
+
+ 3
+
+
+
+
+ KDEE1
+
+
+
+ 185
+ 75
+ 52
+ 26
+
+
+
+ 5
+
+
+ 1
+
+
+ 4
+
+
+
+
+ textLabelIRL
+
+
+
+ 131
+ 177
+ 53
+ 25
+
+
+
+ IRL
+
+
+
+
+ textLabelIPOTR
+
+
+
+ 131
+ 152
+ 53
+ 25
+
+
+
+ IPOTR
+
+
+
+
+ textLabelIPOT
+
+
+
+ 131
+ 126
+ 53
+ 26
+
+
+
+ IPOT
+
+
+
+
+ textLabelKDEE2
+
+
+
+ 131
+ 101
+ 53
+ 25
+
+
+
+ KDEE2
+
+
+
+
+ textLabelKDEE1
+
+
+
+ 131
+ 76
+ 53
+ 25
+
+
+
+ KDEE1
+
+
+
+
+ textLabelKK0R
+
+
+
+ 131
+ 51
+ 53
+ 25
+
+
+
+ KK0R
+
+
+
+
+ textLabelCA
+
+
+
+ 12
+ 152
+ 63
+ 25
+
+
+
+ CA
+
+
+
+
+ textLabelEmpty
+
+
+ false
+
+
+
+ 12
+ 175
+ 63
+ 25
+
+
+
+
+
+
+
+
+ lineEditEmpty
+
+
+ false
+
+
+
+ 77
+ 175
+ 52
+ 25
+
+
+
+
+ 7
+ 7
+ 0
+ 0
+
+
+
+
+
+
+
+
+ KK0R
+
+
+
+ 185
+ 50
+ 52
+ 26
+
+
+
+ 4
+
+
+ 0
+
+
+ 2
+
+
+
+
+ KK0
+
+
+
+ 185
+ 25
+ 52
+ 26
+
+
+
+ 4
+
+
+ 0
+
+
+ 2
+
+
+
+
+ textLabelKK0
+
+
+
+ 131
+ 25
+ 53
+ 25
+
+
+
+ KK0
+
+
+
+
+ EF
+
+
+
+ 77
+ 26
+ 52
+ 25
+
+
+
+
+ 7
+ 7
+ 0
+ 0
+
+
+
+ 0.5
+
+
+
+
+ SHEATH
+
+
+
+ 77
+ 76
+ 52
+ 25
+
+
+
+
+ 7
+ 7
+ 0
+ 0
+
+
+
+ 0.0
+
+
+
+
+ ERC
+
+
+
+ 77
+ 101
+ 52
+ 26
+
+
+
+
+ 7
+ 7
+ 0
+ 0
+
+
+
+ 0.0
+
+
+
+
+ RD
+
+
+
+ 77
+ 127
+ 52
+ 25
+
+
+
+
+ 7
+ 7
+ 0
+ 0
+
+
+
+ 50.0
+
+
+
+
+ CA
+
+
+
+ 77
+ 152
+ 52
+ 25
+
+
+
+
+ 7
+ 7
+ 0
+ 0
+
+
+
+ 1.0
+
+
+
+
+ ESB
+
+
+
+ 77
+ 51
+ 52
+ 25
+
+
+
+
+ 7
+ 7
+ 0
+ 0
+
+
+
+ 0.0
+
+
+
+
+ IPOT
+
+
+
+ 185
+ 125
+ 52
+ 26
+
+
+
+ 3
+
+
+ 1
+
+
+ 2
+
+
+
+
+ IPOTR
+
+
+
+ 185
+ 150
+ 52
+ 26
+
+
+
+ 3
+
+
+ 1
+
+
+
+
+ IRL
+
+
+
+ 186
+ 176
+ 52
+ 26
+
+
+
+ 1
+
+
+
+
+ textLabelESB
+
+
+
+ 12
+ 51
+ 63
+ 25
+
+
+
+ ESB
+
+
+
+
+
+
+ ScansTab
+
+
+ Scans (Disbaled)
+
+
+
+ ScanSeq
+
+
+
+ 5
+ 0
+ 550
+ 250
+
+
+
+ Scan sequence
+
+
+ true
+
+
+ false
+
+
+ Select to scan a certain parameter in the simulation and produce multiple output files for each value of this parameter.
+
+
+
+ buttonGroup2
+
+
+
+ 10
+ 20
+ 216
+ 215
+
+
+
+ Scan Parameter
+
+
+ true
+
+
+
+ SigERadio
+
+
+
+ 4
+ 47
+ 211
+ 24
+
+
+
+ Energy sigma
+
+
+ Scan spread in implantation energy.
+
+
+
+
+ NProjRadio
+
+
+
+ 4
+ 72
+ 211
+ 24
+
+
+
+ Projectile number
+
+
+ Scan the number of implanted projectiles.
+
+
+
+
+ dRadio
+
+
+
+ 5
+ 99
+ 153
+ 24
+
+
+
+ Thickness of Layer
+
+
+ Scan the thickness of the selected layer.
+
+
+
+
+ ScandL
+
+
+
+ 158
+ 98
+ 56
+ 26
+
+
+
+ 7
+
+
+ 1
+
+
+ This is the layer whose thickness will be scanned
+
+
+
+
+ ERadio
+
+
+
+ 4
+ 22
+ 211
+ 24
+
+
+
+ Energy
+
+
+ true
+
+
+ Scan implantation energy.
+
+
+
+
+
+ ScanMode
+
+
+
+ 230
+ 20
+ 310
+ 215
+
+
+
+ Scan mode
+
+
+ false
+
+
+ false
+
+
+ true
+
+
+ true
+
+
+
+ layout3
+
+
+
+ 11
+ 178
+ 290
+ 27
+
+
+
+
+ unnamed
+
+
+ 0
+
+
+ 0
+
+
+
+ textLabel2
+
+
+ From
+
+
+
+
+ SFrom
+
+
+
+ 5
+ 5
+ 0
+ 0
+
+
+
+ 1000
+
+
+
+
+ textLabel2_2
+
+
+ To
+
+
+
+
+ STo
+
+
+
+ 5
+ 5
+ 0
+ 0
+
+
+
+ 28000
+
+
+
+
+ textLabel2_2_2_2
+
+
+ Step
+
+
+
+
+ SStep
+
+
+
+ 5
+ 5
+ 0
+ 0
+
+
+
+ 1000
+
+
+
+
+
+
+ ScanList
+
+
+
+ 11
+ 46
+ 290
+ 26
+
+
+
+ 1000,6000,10000
+
+
+ A list of values to scan (separated by commas).
+
+
+
+
+ dzListLabel
+
+
+
+ 13
+ 79
+ 295
+ 19
+
+
+
+ Corresponding depth increment (optional)
+
+
+
+
+ LoopRadio
+
+
+
+ 10
+ 150
+ 240
+ 22
+
+
+
+ Loop
+
+
+ true
+
+
+ The values of the scanned parameter are evenly spaced.
+
+
+
+
+ ListRadio
+
+
+
+ 10
+ 20
+ 240
+ 22
+
+
+
+ List of values
+
+
+ The values of the scanned parameter are from a list.
+
+
+
+
+ ScanListdz
+
+
+ false
+
+
+
+ 11
+ 108
+ 290
+ 26
+
+
+
+
+
+
+ A list of values to scan (separated by commas).
+
+
+
+
+
+
+
+
+
+ MenuBar
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+ fileNewAction
+
+
+ image2
+
+
+ New
+
+
+ &New
+
+
+ Ctrl+N
+
+
+
+
+ fileOpenAction
+
+
+ image3
+
+
+ Open
+
+
+ &Open...
+
+
+ Ctrl+O
+
+
+
+
+ fileSaveAction
+
+
+ image4
+
+
+ Save
+
+
+ &Save
+
+
+ Ctrl+S
+
+
+
+
+ fileSaveAsAction
+
+
+ Save As
+
+
+ Save &As...
+
+
+
+
+
+
+
+ fileChangeDirAction
+
+
+ image5
+
+
+ Change Folder
+
+
+ &Change Folder
+
+
+ Ctrl+C
+
+
+
+
+ fileQuitAction
+
+
+ image1
+
+
+ Quit
+
+
+ &Quit
+
+
+ Ctrl+Q
+
+
+
+
+ editUndoAction
+
+
+ image6
+
+
+ Undo
+
+
+ &Undo
+
+
+ Ctrl+Z
+
+
+
+
+ editRedoAction
+
+
+ image7
+
+
+ Redo
+
+
+ &Redo
+
+
+ Ctrl+Y
+
+
+
+
+ editCutAction
+
+
+ image8
+
+
+ Cut
+
+
+ Cu&t
+
+
+ Ctrl+X
+
+
+
+
+ editCopyAction
+
+
+ image9
+
+
+ Copy
+
+
+ &Copy
+
+
+ Ctrl+C
+
+
+
+
+ editPasteAction
+
+
+ image10
+
+
+ Paste
+
+
+ &Paste
+
+
+ Ctrl+V
+
+
+
+
+ editFindAction
+
+
+ image11
+
+
+ &Plot Profiles
+
+
+ &Plot Profiles
+
+
+ Ctrl+P, Ctrl+R
+
+
+
+
+ helpContentsAction
+
+
+ Contents
+
+
+ &Contents...
+
+
+
+
+
+
+
+ helpIndexAction
+
+
+ Index
+
+
+ &Index...
+
+
+
+
+
+
+
+ helpAboutAction
+
+
+ About
+
+
+ &About
+
+
+
+
+
+
+
+ plotPlot_FractionsAction
+
+
+ image12
+
+
+ Plot Fractions
+
+
+ Plot Fractions
+
+
+ Ctrl+P, Ctrl+F
+
+
+
+
+ fileStartAction
+
+
+ image0
+
+
+ &Start
+
+
+ Start
+
+
+ Ctrl+S
+
+
+
+
+
+ 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000047c49444154388d8595db6f54551487bfbdcf656e9de994164b118602318454a04e4583899760d454a289688cb7f856020f24bc10ff0025fd03d4f4e1280fbef4411e4d30627c2148086548ad8821b140a9d2ceb4d39933cce5dcf6f661da424d8b275959679fbdd7777e6b65656dc1639efc89490bf466507d689d040de8265acd59ca2d5e715ef3378a158f811e02de073d882087b0520028af818eee01934285e7f2faec25c771a2ff05e74f4cee06710ac3faa82395cc6ee9c9c8deee387b7a6a24ac88bfca1ddc292a164a2555ae369b2a6c5eb2f4832ff6ebf1cb8ee384eb82f32726778018c3ce0c0fee4af0e6c134fbb66b9ec85a18b27d54034bb590e9b980f3851617a796f09beecd982a7ff6b43e777e056efc47e9d71d99cc1b6f1fea149fbe92e0a93e839865f0cd4f15f66e8fe1871a3fd41852d09331d9b7c3a2b7cbe27651f7b82df1eca2de59181e4acc160a05bd0aee3b787c143bfdc191e7b2e2ad210bdb92f8a1c60b34efbc90e5ab1f16d9b5c5c2f3155ea0f0428dd69aad9b2cd2494bfc311b75b77c6d6de5fa85a1a1a1c068abbd764818b1d103bb33f1e1bc8594e0078a56d0866ceb89f1e2408a93df699ec90578815ede6f67b0a94352f74d664a417f29da3ed9cbcddb46fef884059c4aa7d32fbd3a98125d1de0059a56d056eb059add5be300bcf7bcc1e971c1de2dfe9afd56a0b00d9fe97965d75b616084d58b26b01918cc643a65361ee2d6e5461d08c0f8499b0fbf84a3075ca248335b8e989acbe23693d4e8908aca802b723913e843c85c4f5ad0f4154d5fa197db65c5af0fcfb0bfb7c2e4df2966dd7646982608a30fc3ce4920898ca5925640a5ae701b0acfd7b47cbdea3752fedb7c965223b9fa4d0801329610905ecddb6d59cc57254557526d4a2a4d837b95185767528f2d8b1f190841db567e809226e826ca6bccd713d4a3783b7f4023a8f9367a7dc100bc3efaf05d88761451ab2574e899683507dcab36d4ce4824d6046ae486d3e4f019089627846980041e343dd05151aafa9cb4945b0426f1caca3234f623163322d6937cf80c8022694524ad88b819619b11c25f5426ad5b597df7be79c579cd1f3a76f95ce4553fb1a2445757da5e23526980ccea7a64acc6b63408a157cfb5e7878f6a2dd513d1fc854e63a16c02e4f5d94bd7c291ef6b95d2b1feee2e62a678d86f3c049ffe769eac0dda5ea969fb8c176a662a4b28bffacb1ef9f3af40cd0028140a7a5bfee3692f60af52d18e27bb0d918c0962962666695ede97e6f3f1fbc4ccf63a6eb77dccd408026ecdb86ab15c9de88e6e8c65c53f3756c10047f2d6e2a2ce4d549be680db08fbd3498b4d6913db925cbe59c736c51ab30c58a8064c4d57992bb9139bc3eba33959b80a2c388e13ad820b85821e1e4a961775fff56ad34896aa417fad11da713314a9848929255280d6118b4b757ebfd3507fced41e542aee8fddd18db16568d1719c00d669a691911109a4a678f770283b8e2aac0129455f3a6124006acda8a522553469dd8a47f317966b3a0f5436bc411e810bc02e46fd5957e47218764e405aa0a4d0a127557d2eabefdeef3416ca400d683a8ea31e65fc0b65f3416ec3c8f69a0000000049454e44ae426082
+
+
+ 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000045749444154388da595cd4f545718c67fe79c3b7760669896f1624305044394882c2c289258a31235367161e28a85d1a50b57a64b57eaae24eac2855b13fa078864ecc684b882513a52c5548b16ac7c88c0ccbdcc1733e77471ef8cd836ddf82627e74deeb9cf79cef37e891fa125a4d4b55d8e33642965f30556ae544ab32b2b239b95ca552ba4d4b52b274f5ec8e7f3acb82e18f3d9612904524aa410a86097ffdc033f5a576797e1c24f0f1f627538ced0462ec7c2eedd247a7b3f0315d59f844085c3082110e5325208df0fbe55fd8de7cf89a6d37438ce90654969afb82e0d9d9de872f933a6d18e0eec8e0ec24d4d44120900363e7e64636989dcab57c4d6d7610b70b8bd9d522a8525a56d19c018c366368bdedc04c0aaaf67db891334f6f4fc4bc798e310731ce8eee6cf8909542a45bd312025a258440881012c8c0163286532a862113b1261e7a54bd4050c7f7bf4880fcf9e51595a221e0e63353793e8e9a17d60809d070fe2eedac5fbbb7769b22cd8dc44001883a58d411bc3eae424897dfbf8e6dc39ea120972990cbf0c0fb3fdfd7b5a62315feb6211e9bac8d7af79934ed33c344483e3a00e1f663399c4360603686390c6185f8a850542d1284e7f3f0063376ed03e3b4b63a582f13cbe3a791275f428854c063c0f7b7a9accbd7b00741e39c2bbc646c8e51081b4b29a5c4a299a4e9d02e0d7fbf789a7d358f93cc675a96f6fc7397d9ab633677c00d705cfc3a452ac8e8f0310efeb23b7b484010cf88ca510584a11efee06607674946dd92c3a9bc5b82e52a95af07428049e07ae8bf03c542a05c0f6ce4e5617176b8c2d13e8128ec789b6b501907ff9125128604a254c2804c5e2a7b42895c0f3fccb8ca19c4efb8c5b5ac8d8363baac0da1844c0b86af54aa1a4f41720b5fe94dfc660698d34c6afbc2d955a0cfc5af0300691cbe1cdcf0310d9bbd707550a2b28dbad85b3b59ced3d7b00c8be7bc7d7e53246eb207881c64a2972333300b40c0e82945801ebad8c8dd648295141efb00e1d0260656686ede130d582933ad0584989974c02b0efec59d67b7b6b7294a6a6f0e6e6587bfb96fc9327a880b17de000e1c14100e692499c0058578109800b8f1fb3383606c077d7af93efebf319e7f3642f5e64fefc790e84423e687f3ff6952b00bc1e1be3dbe9692c29315aa3ab5921c07fb6526cdcbac5c6fefd449b9be9be7993b9070f084d4c60bd79431b10eaea420c0c1039760c006f6181b9dbb7f93e164308810ea410c3b19839dad949241cae3d9d860642972fd3fac30ffc9ffd3e3acad29d3bf48642d84a218460796d8d9f2727fd74ab6a5c5bf93c6a78983fc6c791c78f93e8ea22dedaea477f7e9e959919fe4a26d9f1e2058722915adbac32d6c66055b42ee50b05bb311aada5587552c49f3e454d4d510096c36136ca651aca659a6c9b56cb426c01ad36fc0febeb54b42e596b85c2c862267341030df5f5ff391daa7b34e8b5cbd533e0377afc69b392cdf2767999b54261c4d2c65c4d2d2e125f5d1d92427cd130d5c694b2a5d28836e6eadf44cbf02c068658550000000049454e44ae426082
+
+
+ 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000007449444154388dedd5c109c0200c05d06fe936812c10b2ffdd85d25385b6a991480f053f081af0291210f828c5a9d9c4de96cd2b9ad9eb0000660e2fe0c2519839c4f70c4c446d5e6b3538cf928245e4b2f6f014acaa8fda1d4fc1a5741b22079f9d111d96ea8a912c78c10bee64e60719f57e9203ad452a04cc4e50200000000049454e44ae426082
+
+
+ 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000009949444154388ded94410e85200c445f89c7367f61bc775d2848a42860ffced9548bbe8e13043e1d928177f481a123dc2b34f6f47a3de2b865a8843f4001982a0b3d5f62c58300aa1ad70550449ab9d507a773a8a4ba4f92a2df333c64c63bebbd82e5b8addecbcc7820eb4266c639745dfa80f36faf66c66fa19c3f882fb470ec05cdc0bed07893f68e171492635f686c3eeff6ba3c8fdd366dc4c0452c8781f8080000000049454e44ae426082
+
+
+ 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000000a049444154388dd5954d0a802010859fd14668e18de662d222bc98376a21b4ac451992c66469e0b7f187f1f11c47052a218e762daddbfb9e99f6568f80b5364b8588ce35440400e80a398ce8f99034d2292cc37c8ebd530feb583a05e954341f8a027b2a7d3a1f09bf854dc5d5d953aa396e4f38cab199e2d2e108abe156f82e30977fcb4d8ff942d75dbebed2e143953a93f6caad3d6111f44b7d4f820ff9c0069bb51ecded318c5c0000000049454e44ae426082
+
+
+ 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000038249444154388db595cf6b5c5514c73fef4766d2264da631050b46a2558a229404b156ba70e142dd982c4411174a0b5d360b8566515c28d1aac5a62e142be44f502c2e249616ab062948b4859aa84d6968da24f3266f6632efcd7be7be7b5c4c7e27820573e172e072cee79efbbdf79ee3a82adb31dc6da102cebd38bffbe16821b33a92cb797d8b35e9193af9fcf8469f6505fe73c6ef9d1eed6bded134f54a7f6fdf91d70f21c68edc4b529bc6a9e10bdd439f7c7ff1dbeffed0eaa268a9946818a67ae187291d183c3fb055c6aa8aa3aa3c33f8dba61bfcf9fd03cec79f5e1a686b6f7ee7c5e79e287476b42092618cc5188bdfe472f68b1fc3bb738b3d9f9f7ee9e65a308073e8c4b8befdda7e520b92412250295598bb3ec90b4f3fc0c127bb71802c538c59051b638912e1d4f0c5afcf9de9efdf08f60bcd3e8f3cda8cd806f4d6d5dbec886679f3c85314da73a8824823e8c4c89ffc7ea34296296a15df7798fccbebe3f0378ad8905ffa762f6fe0db2511a205c3c44fd7e8d9bf87dec3bd9bb43e76f61a8b99cf076f1da41a432c5017701cf8756c868f3e1b2bacf577f6be31a6fbbadaa8046576e67dda77e5510b6a2d995534534ad5847d0f1638f6ea635cfe1bc21a9423a8d521b85964f2f204778a77e0eacbce8a14071e6ee3fcc9c711a0584ad8d39127026a066a4923b8568730822bd38d2c130395b2303d7e8b606a8ee6bc070a478f7ff52c7009c057ab08500382cca1584c6969cf315f81bb25989987b0aa04654350ce28570d335321c1d41c2ac9ead9ad0538be066c51a00e78bb734c5c5fa4a99c6376014aa1128442b164982f09f381500d6392b0066a01c88c12546350e5cbe1fefe7367967e9eaa9202b185990588fc56a66e27a402621491f5d388c55a0baad42261ae5cc7e45b604331f3330b31301d36b4cc1ca85b1729a7a4e2929886a689402a4a9629990841b18af57278ad6d0d66b601eca098143a73b04ba1c381fbee6f222cc658944e4f087d21cc0b959694a852673188616f335621cb12acb58cceae7f9ebeab4a570eba7240ebea3da4dd4d248941049204441cd2d425497622d2449208692aa4a941c4307a657da174ed1685de75c1f33c7cdfc5f3dc15ebba8db565eb79ded2ba0b763dc7e55f1a88e7392b419ee7e1baee12d4c5f39c25bb3a37827db55b935d175cd7453523953a71bd4e14c5c4f598384a88e2987a9c20598611b309ecf0d0d0ffd6f4f4c6e08ad0ce7635d37f00f4b819f9e3b0a8920000000049454e44ae426082
+
+
+ 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000007349444154388ded92c10e80200840b1ef661d1cff4d876aa888a17669f9360f283ed80060f159425f3a71f53602e08e992b098801d02854176ae47f21ce1fb5b05d38eddc9060d0f11379635b3bc92bd518e239a943ec1d5ab7785cee107be4b215af4091f894de47181ecea59ede9ec59f380062ac28b1e3d701d90000000049454e44ae426082
+
+
+ 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000007449444154388ded92c10ac02008406ddf2d3b84ffed0ea3586a26d165e0830ea53e8504487e4b910f5489f19ea5a3ca0f8a896365b306c42dd613c649bdc2598316136219f0f936c0a2ef00d75a62614d3ab22996f2a362ffa337c5ebede962aad1a2e84aaaa2f750dd12748c0fd0ab9324677800596e28b1743f46860000000049454e44ae426082
+
+
+ 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000008249444154388dcdd341128020080550e8e02ebc38ad3273503e48537fe3e48c4f2425fa28e29c6f39920bf9276cb60185358877611388c2576418cda015f520b4e6b55be109dc0622b8e22acf31056e18dfdff80606aa551cc63564c4dcf80cd0201d577a5c85a8845fdc025ea5307afccd07e23a1df283ec2b37d9ad5fb4dfefd49cfbf72fac98c8cc890000000049454e44ae426082
+
+
+ 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000000bf49444154388dd593410a83301045df488ee51dbc8c3ba98bf46a9eabd385350d266362444a3f0c4266fcf3f824f06f12402b66da8c55f3de2212cf9d92cb98c0ba2d7c4544cf9a07638bbad53c4491235ecf7cc1623697a92540c11ff4fda75275015d24a9389e7d6f53df4fe4ccab323eea0f03c0c4b2a0712ce6add89b59b7661c3be095985f261679ee4ebcc22c9788551fe6a2cbc4969a894bcb6f23ee361aab62e252c57294dfbfb610bbf2c897b8a46cc6677eaa519571fa087ea83762da9abacb20235f0000000049454e44ae426082
+
+
+ 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000000d549444154388dc5955d0a84300c8427e2a90a9e6c8b0f4b3dd982d7ca3e58d7fe4cd0ba5d7640024df265da0a057e2439c9eb8d9eaa8841a0c9aad8c82ab32f9c425be1e30e0dcf00c00308f0b3a7a07410a9d7142e00b42c5a5fab696b979b1c837fc0c316b6e4165b64f78d716359919bdc4570de47c04732dd5e5bcc35f0c97762ae787936dccf7513577e79f48c4b27aa0f1327b240f5117fcbe348aa33b6e0224b054d0746b8025e2e3b3e73cde0dd1c97f02e8ed9d0af1db381224bdf33eee698a934a0f617b45540d00bcf4ca08fc0dff406e325c1981bc418760000000049454e44ae426082
+
+
+ 789ceddd4d8f23351006e0fbfc8ad1cc6d85b283000909f113903822210e49d0080e5c603920c47f6793f94877e2b6abecaaf2dbedf75ded21bbe9b6534fca9dcfcec70ff73ffdf8c3fd878f777f7dda7ffafd787ffc6dffe7fd875ffffee38f7f7efee5fb7fef1ebe7e7abaffeaf3df6feebf7cf8e2eee1f1fe78fff874cee9e2e1ede2f3f3e9e2ee74f1f874fa73ba783c5d7c7e7ebbf2fee5e2f3f3b7e78bbbe1f2089d414df6c8a1095e6882179ae0852678a1095e6882179ae0852678a1095e6882179ae0852678a1095e6882179ae0852678a1095e6882179ae0852678a1095e6882179ae0852678a1095e6882179ae0852678a1095e6882179ae0852678a1095e6882179ae0852678a1095e6882179ae0852678a1095e6882179ae0852678a1095e6882179ae0852678a1095e6882179ae0852678a1095e6882179ae0852678a1095e6882179ae0852678a1095e6882179ae0852678a1095e6882179ae0852678a1095e504d0ee778ed9d26ba1c66f11983268a1c6ee3310c4da4498038a9d0449625110f149a4892117150a1892005126b149a145314b156a149294b047e28342924d3105e2834c9275f771f149a64532aba0b0a4d721154dc0185269988ea4d93c848ab6d8d4293c5c81bc01885264b51ac49c6cb174d16a2aa334d22a2bceb9ba2d02419f56a4413f7e8eff786283449a56229325cbd689248557d69e299ca87b6662834b949edb30d9af8a5fac860854293ebd41fac69e29496c74f46283499a7ed212d4d1c527b7cbfdebc69123499a691c4a85168324d2b894da3d0649266129b46a1c9250624268d4293f7341f4c667b69d8054dde634262d12834798b0d8945a3d0e4355624068d4293979891d0c42c7626ed283439c790842636b1246947a1c929a62434b1886d9b34a3d0c49e8426edb126697dde4813fb366955a689034963a30c6fe242d2d62834f120696b94d14d7cdaa48d7a70132f129ad4c78ba469cf639bb8b5094d6ae348d28232b2892b094daae26b528f32b08933094df4f126a97fde48133792ea118635f16f93ea46a189d3fea76328371bd52482a476109a78862615c5f225a91c664c938803fc6c1cd556839b78ec3c35906aa3214dc248ea46a2896b68e259a8c6b134db0c681275809f0fa6d8666413f33de746536c329e49689bd04455a418929ae186330926a969149a788726d20a85915c463c4e92dd623093e003fc6ccce3426e3618d5c474af0b79ad79c9e406662c93b83699943bb978e5640635b1dce96dae2a2d37796119ca248224516645a39c55686299749195269fd3bbeeb9d89a38932c97586d82ac626ae27b80cf15f866e035b3f89898edf13dd9da16465e9b8aa5891f4946e36a6cf53e7a0324b2029332887cec55b0189af890083c66a357edafb7c23c76262e077821c84ef5e230ba8a8389cdee4e917aa887c7563133b16f138dc84ef72ecae31e19c5dec4646f4911d904243b3fbfb602ab6265624ca216d1cde0f5f52e501448133dc8740a82ab5e5e8344543132f125d1cd4170d5e9ebc2782878269522aa39cc5fab4743b131b123a916d9691ae5fafd132c152c93169116132c14131323923611cd3412ef3302a95898d83c5d6c1569340142313569d949b3c84eb178a5df8f47513130b120696f92e94c8a575cf88c04080a84898d8862264b9f5bc14069376926b112d9c91b65f9b344082add4d0c452c4c10509a4dda484c45e493c97ee6ae3b4a5f135b919db851f29f83ec8dd26ad24262dc24d3e914ae56fa6c6a5f94469396a78bf622e2bb48f1f3c25d5bc5ca44bfa983c84eda28e5cf70f7446933a927f111b133e989d2c9c449443a23d1771dbaa13499d492b889ec848d22fbfe492f941e269e249626bdd6af16933a125711e1a4a4dfd3ea83126ee24c226b14f177e7baa034986092d89a7439a8d49bd43c5df41791dd5534df318d473130916f1241626e128f526dd24a5235a86a6699abe8be8b1d8d126712d224d39965aea2fc7e7c304aad491b49cd88e208a6a63e6741284a94491c89a451f4e7918844a93441267131894409310915914caee67c2b71287526d0248246a93a074e184a804938899349184a958986245e4430bfca734505a1d4981c14263d48ca8dd26ee289d26452be6a1f122f93a046a930c127294eb1fa3c7721289e26bd4476c546a93ff760048ade640d247e2611287e263d491c4d0250d4263524aa014c529865d37953dd51bc4cfa92941aa5ed5cb6de285a939590b89a78a3b898743d94bc243fcfd6733efba2284dd4249a3a9ac6d5c417c5c10482c4d9c4154567b21e92fc540dce57ef88626e0242926f148bdf100031591389bb891f8ab1090e4976b236bfb5e185a231591549a8892d8aa90990c82ebb7819fd268d138ac2a44482d424a7f89b38a1c84d0e05133492dc7dc8ecb79b5c502a4cd2ff0d47926b14bbdfd3f240119bac8f24c4c403c5c8049124336543138747c452931592641ac5d2c41ec5c4049424c8c41c4568b24a92e5597b99d8a01898c092449958a3c84c3224b822bbe5c5cbd8c418a5d5049a24ccc4164564b25692c5899b9b98a2b49980932c368abd89258ac464bd24812686282d26f8244b53f730b17b9a22305931c952a3b89898a1d49bac8224d4c40aa56cb26a9285d9bb9b34a1d49aac4324d8c408a56892bc512b699253424d6c504a268794c98a48824d4c50c426937f5b1349bacffd4c2c500a26ab2749378aa389018ade646524e126ed8f88f3261b2049b6baab49338ad6647524c946f1356945c99a6c82a4ab49158ace648522c9c5cbd9a4112567b20d9254a3789bb4a1684c564ad2c3a4092563b215922e262d287293d592240e2801260d28cb269b2149344a84493d8ad464cd249d4caa9fa62c9a6c88e476f18a31a9459199ac9be4b651824c2a51964c36450260a2419198ac9ee466f18a32a9435930d916c94da3849954a1a44d0e13932d90f433a94129986c84e47af10a34a940499a6c8ea4a7891ea560b21192ebc52bd444fd883865b24192ae265a94acc97648ae16af6013254ac2648b24578dd2cf44822233892fa179ba9ae8506e4db649325fbcc24d542812931e25b44f5f13cd6f0cdd986c95a4b78902a56cd2a5800e992e5e3d4ce428d7269b25e96f22462999742aa047ba9b4851ae4c364c02602244c99bf42a9f4b268b572f1319cadc64cb24d346e9662242c999f4ab9e4f104c66280b2a33936db7c964f1ea68226895a9c961db6d326994ae264594a4c94649504c4a281393cd935c6e61679302ca9249d7da7905c6248f7231d93ec9e5367637c93efc4a9bf4ad9c5f704c7228ef2623905c6e641f87598e8b2a2993ce85f30c90c972abbc998c418265b2d42aaf26c78b49efb2b90669f1da2fa1bc9a0c4282d628699417934b9bf4ae9977c04c922a67935156ae1ddce2b54fa19c4c8ee3b40960a3dcaa9c4d06224134b946a10944662827939148000f28e70c6d02da28fb0593ded58a09a8c9448526384998f42e5654604dde542e26bd4b15166093fda8263b5c92fd59e5dda477a14203f03e63260fff7d77f73f82f8667f
+
+
+ 789cedddd972db461606e07b3f85cab84b4d75b853aca9b9f01adb891ddb71122753730182a4177997645b9e9a771fa0fb302124126c10bd9efef9572e4e48027d9afd01844c51df7f77f4fcf1c3a3efbebf767a969fbd2a8e8a97f9a7a3ef16e76fdf5efcfb3ffffaefb5eba35eef6858fed79f0c8e06d7ff71edbac88e8aa3ac276fb2ced7f56a55d5f99baaee0ffb43aa3fca7ad29f507d4bd6793fa7fab6ace7fd39d59fab7a50dea83e95f570b0dededdaa1e4e8753aa4faa7a3419adb7ff41d6f968bdfd3bb25e8c16547fa9ea7179a3fa4cd693f1faf9afab7a9a4fd7cf7f2febe57449f5b7aa3e2e6f549fcb7a763ca3baa8ead970b61eefaaaaf3f246f52b592ff3f5f6de55f57c305ff77b43d6e58deaafb22ee605d59faaba9816ebfe9755bd582ed6dbbb90f5aa6c57d52fab7a3958aeb77f53d6e58dea17b25e2dd78f7f5bd5abc96a3d1f0b59cf56d49f98cb7ab57efdb3bb54f77b7d79ff17aa073db55eee513dec0d65fd9aea516f249fff80ea716f2cebf5f327bd897cfc1f544f7b53593fa47ad69bc9c7ff4875decbe5fdbf533defcd65fd8aea456f21ebf5e397bda5ac47549791dbfb41d5fdf2266beab73fe8ab7e4ea81ef5e5f8c5cf54972b5cd63f513dedabf1dea67ad657e37d4a752940ce6f467529403efe25d58bbe1c6fb67efeb22fc79bfdaaea727ad5fc4fa92e6ff2f977a81e0dd4f8de503d1ea8f9fd4cf56420c79bfd46f57420c79bd17c0cf2811c5ff69cea7209c9fabdaacb9753f97f4175495ed6b4fd12ac1c4ff691eaf226eb4f548f86eaf5ff93eaf1508e2fa7f9ae84cbedbda5fa78782cebaf5497c4e4f39754cf876afe683e868ba19abf3ed5cba11aff3baacbc8faa6aacbe952f347afff683a52f3d1a3fa7824f79f5d503d1fc9fde539d5e511463eff58d5e57256afcf90eab24159d37aae8e40f2f103aa8fc7aabf15d5b3b1ec4fd0fc8c8b7121ebc7542fc76afd3ea2ba8cdcfe44d5251fb57f41f570a2fc51ff93f2266b7afd278b891aff2daa9713355f37545dbe1ceaf9e754971324ef5f503d9eaa7e66549737797f41f56caafab94f7579089335adafea082b6b1a7ff972abf9fa85eaf20590f7d3eb5d4e975acfdfa89e1cabf54ceba53a22cbfa94eae258ee2fa7f9280f1f6a7ea8dfd960a65e7f5aafd5115cde4ff35dbe1caabf27542f666abec84379f851dba3e3413ec9d5fcd27a294f286a3ecea82ecf00f27e9abfea0c20efa7e3db7c3257fdd07ccda773e581fccf6773359fb43eab33867cfc07aa1773b5fe693dcdcbc8c7d3fe8b5ea1c64bc7ab6258a8d7978ee7c5a450e3a7f55bcc0a359f743c29f2421d6fc94f51dee4fdb41e8b45a1f64fc7b76259a8f544eba73cbca9e3051d0f178385ea9f7c2fc60bf5fad2f9a35c9e6a3cd45fd99eea975e8f45799335adbfea8c28eb67aa2ef9abd7937c967cd4f6e9f8552e7735df74fc5c1e2f95c731d5b3a5ea7f5dcf97ea7843c797b23db59e69bd97bb57e3a1f35175c695f793a7ea8c2befa7f361750292351d0f56fd959a1f1aff6ab052f343e7b3ea0026ef271fd50140de4fc7a3ea0c2eefa7e36d750697357959e52b757ca7f34db540644de7b755b152fd909ff20d855aef74beae1aa8ea27b49e56f4fee1c9198220bb022308d21c184190e6c0088234074610a439308220cd811104690e8c2048736004419a032308d21c184190e6c0088234a7ab119189cc770f0862335d8c543ed6f1dd0782d8cae14636854009c237871ab92c044a10ae39c4c8361f7082704d7b234d42a004e1977646f6f98012845fda18d113022508afe81bd117022508a7d83202250897e81a692b0446102ec17904419a032308d29cc37eae55afd6ff0f46108e31fb792d0841f8c5f4671a455ec5775708622e268d281f7fc7776f086222e68c5c16022d088fb8310227c83a62ee7b046d63ccc81e2150925ec45c27be47b93feece2370924ef474c422c6b51128e19cc36d846cc6e6cfb5a0249d98d7118e131bdff9002729c5a68e3094d8fb5e1428e11d1736b81bf9eb7170c22c2e75a461044a38c5bd8f348cc8474349f4b1b3b66164e3f15012715c1df9c313e2f6bb4ca124cec4f3aec84e5c7fdf2f94c495b475a8b8ff4e6c288925d0a1e2e77be3a124f4c0c6dff1f5b715a024e440c766fcfdfd11280935f0518fcfbfd10325e1053eaec6efdfb18292b0021fdbe2fb6fbd414938818fedf16d044ac2087cec8e7f2350e23f10d294108c4089cfe01a645fc2300225be0221fb138a1128f111f8d0493846a0c46d7006d14d4846a0c45de0433f611981123781903609cd0894d80f84b44b7846a0c46ee0a36d42340225f60221ed13a61128b113083924a11a8112d3818f4313ae11283199508588422cc452acc40bf152bc12afc5897823de8a77e2bdf8e07b6ceb846c044a4cc59c10f171239f3a8ce8549c8973f1597c69f8b7ccafe2427cf33d77a11b81121331790ea96de1c681e3b9296e89db0d36367347dcf53d7fa11b8192ae31fb2ecb88911f347da8dc13f7c5039f3318be1128e912d3d721568dfc287e120fb7def3c8a792188c40c9a1312dc48a919fc563f1443c15bfd0bdcfc4afe237f1fba5313ff7378b7118d9aec4fd6cc515f3420c1bf943fc297ae274eb63fa6270e91dd7d0d73cc662044adac68610834646e555c678cfe326b5bd4dfdcc634c46a0a44dec083164e458ccf49e9b89cdfd650ed6d8b6c46e044ab6c59610334632edd74cdcc8368d14aee6af9e988c40895eec093163a44db2c58691a5fdfd6d4b5c46a0647fecf9b8b2751746561b463c7d72263623b82a698e5d211e8cbca85d91bcb4bfc7ab89cf0894ec8e6d21ee8d886f3523afeceff16a623402253b66c5ba100fe791d7352327f6f778357c8c40897d211e8cbcd9d8dfcff6f7b72d711a81922d33e2408807236f37ce22efecef6f5b623502259766c389100f46de6fecefbefdfd6d4bbc467055b231138e84b836927da85d8de0dfd90f1903949cb9b956dfba2fcb46c469f671434887df7aec96b88d40895b216e8d64a7b5b388d57d35257623a92b712bc4a591ecbcf6fb56de3ef5cbd5483a4adc0a7167443ccb3e6f9c43be645f6d76d59cf88da4acc4b5105746ca2b918bdafb2cafdf8ec2c148aaefb7dc0b716524bb51137273fbef2aba0a0f23292a717d25b265af968c64b76a426e67776c77d51c2e465253e247880b23e222bbbb21e487ec9efdae9ac3c7484a4a7c09b16f24bb9f3dd810f2a3ff6fa0e36f84a7125f426c1bc97e2a55fc2de441f6d04d57cde164241525fe84d835923d12a30d2177334f9ff3bd1c5e465250e253884d23d93d7152bb567fecaeabe67033c2fdaac4af107b46b227d9d39a905f5c76d51c7e46382bf177adbe7504c68c64cfb25f6b421c7cea5e3f1c8d7055e25f881d23629cfd561322dcf6b42fe918895f897f21368c64bf67cf6b42fef0fbafea57c3d30847252108316f443ccbfeac09e985f097abeae16a849b923084983692e559bfb6c5a9fef79cba0b5f239cae4a421162d688f8549e3536cf211fb3819fae9ac3d9081725215cab6f1d4b2723d94936ac0919657bfed682aff036c243493842cc19110fb2da5f17c9a6d9b1af9ef625452371290949884123f5cfbf3fcd66fe7ada17ee466257129610534644eda7bde2c4ffe7df9bc2df48ccefb7421362c6485efbeb5462943df2dbd3bea460245e25611bc99ee6997636e67bf377a8aadf1169b1152fab2c0d23712a094fc8ae9fb1ed4f3eefbe0d5ffda762243e25a1ac90fda382919db3c5c048b84a42591f3ae382919db3159991b89484b23e74c605233b672b3a23f1bcdf0a65752055d23212871208092ba919095f0984841618094d098c8496f48c84ad0442c24b8a46c27dbf052121264d23a12a81901093aa911095e02c12666024142510126ad235129612080937291b09e9fd168c849bb48d84a20442424eea46425002216107467c2b8190d00323beafdd6124f4c088ecc59b1208093f3042dd78510221310446feeac7b91108892330b2d191632530124760a4d693432510124b60a4d693b3ab120889273072a92b274a2024a6c0c895be1c2881919802235b3ab3ac0442e20a8c6cedcda21108892d30b2a33b4b4a2024bec0c8cefeac288191f802233bfbb3705502213106461a3a34ac0442e20c8c34f668540984c41918d9d3a53125388bc41a18d9dba7112310126f6044a353034a2024dec08856af1d95e02c12736044abd74e57251012776044b3db83954048ec8111ed7e0f540223b107465a747c801208893f30d2aae7964a20844360a465d7ad94400887c048ebbeb595e02cc223307240e75a4a20844b60e4a0de3594400897c0c881ddef5182b3089fc0c8a1695202219c02238767971208e11518393cdb8d9481115681912ed135e27b9c4897c048b7e828f13d46a45b60a46bf629f13d3ea46b60a47b9a95f81e1dd235306222bb95f81e19d23d306226fa9fe242620b8c980a94700d8c9889bcf6801296811133a12b742861181831918d7f0d4940495e6c646174cbcb7c656feb870646bae7d2bfaab357b2d957fea2fbf6f297f9abfc757e92bfb93c6b26b6de3d30d2355b3e9dc55c8999559cbfcddfe5eff30ff9c71d3f39871136d9f60946de4a0c19f9b4db068c70caaecff872560223da3305238dbf29c257098c68cf148cecf99d75ae4a6c19c94ff3b3fc1c463865ffef52f15462d648fe39ff929fe75fd75b82113ed1fb6d438e4a0c19b9c8bfe537f29b76b66e32307268747fdb909f12bbab1846b8a4cdefac73530223dabd246ca4edb73af0520223dabd246ba4ad10f91c464a6044bb171869f5bd0e7c94c088762f891a394c887c26132530a2dd4b92460e17229fcd42098c68f702232d85c8e733500223dabd2468a4db5984b611bd1218d1ee2539232684c8ed44ae0446b47b49cc882921725b512b8111ed5e60a4c337ccc5ac0446b47b49ca885921728bd12a8111ed5e1232625e88dc6aa44a6044bb97648cd81122b7bc5549e84e6044bb97448c6c1362eebbae63540223dabd2461c4ae10b987e894c088762fc91a31be8fc894c088762f0918712144ee272a2530a2dd0b7b23ae84c87d45a40446b47b616ec4a510b9bf6894c088762fac8dd8bf56dfb2cf4894c088762fc91971b0d72894c088762f8c8df81142fb0e5e098c68f7c2d6884f2172ff819f4d6044bb17a6467c0b9163085a098c68f7c2d2888f6bf5ade30858098c68f7928c114f230956098c68f7c2d0483842e46802550223dabdb03312961039a22095c088762fcc8c8427448e2a402530a2dd0b2b23a15cab6f19d90e25fe9cc088762f8c8c842b448e2e302530a2dd0b1b23610ba13106a4a4b68a6fe5b7b573e7f296b63d6affd65df70b23310891e30ce66cb27b24cdc9ef9ad992eb7e61240e2172a481ac1a18d19e291646e21122471bc4ba8111ed996260242e2172c401ac1d18d19ea9e88dc472257265dcc1ac9e3492ae915885c8b14389c3a46a24662172fc01bd17e19e348dc42e84ba80122749d1080f21b213287190f48cf01122bbc17b2eeb49cd082f21d41394580d8cc42e44760525169396119e42646778cf652d2919e12b84fa83122b49c708c72b912b3de26c6221a918494188ec134a8c270d23a908a16ee1c468f81bd9ee83af10d973831238691bee46521422fb861263e16d245521d43d9c18096723690b9133002506c2d70884d03cc049c770350221b5d980930ee1690442aecc08941c1c8e462064c7bcc0c941e16664970f08a9022587849711f8d81f38691b4e4620443770d2267c8c40489b40897eb8188190f68113bdf030022187a559099ca8c46f043fc9ea1638d997d88d408889c04953e2360221a6b24f49ca4ee235021fa6b3df499a52623502217602275713a391dd3e20c444749ca424253e2310e2227a4ed290129711f87019385189c90884b88fae13ce52e231021fbea2ef84a795388ce00ce23bed9cf09212be91261f10e2326d9d709112ba11f8082deda5c46e2564233883849b94a4846a043ec2cf214e621413a291661f101256ba4989c14b6846f6f980903063424aa89a4231b2df067c841f9e4efc1bd1d3011f318597127f46746dc047ac8191f646daa8800f2e8191662387a9800f8eb165c4fe2705cd1ae96a023e528919236e3e2d68ce087c2087a6ab10bb4e8c19810fc471ae1ca52d2909c788bfb94662cc5521b69c1832021d88f3ec5262da89cff388ef3946e2ce6e236695b834e27b4e116e71a3c4f2cfb51a7a40109b09d2088204151841907df16bc477f708b23f388f2048736004419ae3db089420a1c7bf112841428e19215d8d2088efd816022348dcb12f044690b8635f088c2031c785101841e28e6d1f5560048939f685c008127b6c0b811104d917184190e6c0088234074610a439308220cd811104690e8c2048736004419a032308d21c184190e6c0088234074610a439308220cd811104690e8c204873aeffef9fd7fe0f9b1f2244
+
+
+
+
+ fileChangeDirAction
+ activated()
+ TrimSPGUI
+ DirectoryBrowse()
+
+
+ fileQuitAction
+ activated()
+ TrimSPGUI
+ ConfirmQuit()
+
+
+ helpContentsAction
+ activated()
+ TrimSPGUI
+ OpenHelpWindow()
+
+
+ ScanSeq
+ toggled(bool)
+ TrimSPGUI
+ ToggleScanSingle()
+
+
+ Start
+ clicked()
+ TrimSPGUI
+ StartSequenceOne()
+
+
+ ERadio
+ toggled(bool)
+ TrimSPGUI
+ ToggleScanSingle()
+
+
+ SigERadio
+ toggled(bool)
+ TrimSPGUI
+ ToggleScanSingle()
+
+
+ NProjRadio
+ toggled(bool)
+ TrimSPGUI
+ ToggleScanSingle()
+
+
+ ScandL
+ valueChanged(int)
+ TrimSPGUI
+ ToggleScanSingle()
+
+
+ dRadio
+ toggled(bool)
+ TrimSPGUI
+ ToggleScanSingle()
+
+
+ NL
+ valueChanged(int)
+ TrimSPGUI
+ PrepLayers()
+
+
+ ProjType
+ activated(int)
+ TrimSPGUI
+ ProjSmartDefaults()
+
+
+ Browse
+ clicked()
+ TrimSPGUI
+ DirectoryBrowse()
+
+
+ Quit
+ clicked()
+ TrimSPGUI
+ ConfirmQuit()
+
+
+ ListRadio
+ toggled(bool)
+ TrimSPGUI
+ ToggleScanSingle()
+
+
+ fileStartAction
+ activated()
+ TrimSPGUI
+ StartSequenceOne()
+
+
+
+ TrimSPGUI.ui.h
+
+
+ ToggleScanSingle()
+ PrepLayers()
+ ProjSmartDefaults()
+ OpenHelpWindow()
+ CollectValues()
+ CreateInpFile()
+ StartSequenceOne()
+ DirectoryBrowse()
+ ConfirmQuit()
+
+
+
diff --git a/trimsp/TrimSPGUI/TrimSPGUI.ui.h b/trimsp/TrimSPGUI/TrimSPGUI.ui.h
new file mode 100644
index 0000000..52e08c2
--- /dev/null
+++ b/trimsp/TrimSPGUI/TrimSPGUI.ui.h
@@ -0,0 +1,610 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you want to add, delete, or rename functions or slots, use
+** Qt Designer to update this file, preserving your code.
+**
+** You should not define a constructor or destructor in this file.
+** Instead, write your code in functions called init() and destroy().
+** These will automatically be called by the form's constructor and
+** destructor.
+*****************************************************************************/
+
+# This file is part of TrimSPGUI.
+#
+# TrimSPGUI is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# TrimSPGUI is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with TrimSPGUI. If not, see .
+#
+# Copyright 2009 by Zaher Salman and the LEM Group.
+#
+
+void TrimSPGUI::ToggleScanSingle()
+{
+# Toggle between scan/single run mode
+
+# First collect some information
+ my %All=();
+ $All{"ScanSeq"}=ScanSeq->isChecked();
+ $All{"ERadio"}=ERadio->isChecked();
+ $All{"SigERadio"}=SigERadio->isChecked();
+ $All{"NProjRadio"}=NProjRadio->isChecked();
+ $All{"dRadio"}=dRadio->isChecked();
+ $All{"ScandL"}=ScandL->text();
+ $All{"ListRadio"}=ListRadio->isChecked();
+ $All{"LoopRadio"}=LoopRadio->isChecked();
+
+# Enable everything
+ E->setDisabled(0);
+# E->setText("2000");
+ SigE->setDisabled(0);
+# SigE->setText("450");
+ NProj->setDisabled(0);
+# NProj->setText("10000");
+ for (my $i=1;$i<=7;$i++) {
+ my $LayerName = "L".$i."d";
+ my $LayerAttrib = child($LayerName);
+ $LayerAttrib->setDisabled(0);
+ }
+
+# Enable depth increment for Energy scan only
+ if ($All{"ERadio"} & $All{"ListRadio"}) {
+ dzListLabel->setHidden(0);
+ ScanListdz->setHidden(0);
+ dzListLabel->setDisabled(0);
+ ScanListdz->setDisabled(0);
+ } else {
+ dzListLabel->setHidden(1);
+ ScanListdz->setHidden(1);
+ dzListLabel->setDisabled(1);
+ ScanListdz->setDisabled(1);
+ }
+
+ if ($All{"ScanSeq"}==1) {
+# But if we are in scan mode disable the appropriate box
+ if ($All{"ERadio"}) {
+ E->setDisabled(1);
+# E->setText("");
+ } elsif ($All{"SigERadio"}) {
+ SigE->setDisabled(1);
+# SigE->setText("");
+ } elsif ($All{"NProjRadio"}) {
+ NProj->setDisabled(1);
+# NProj->setText("");
+ } elsif($All{"dRadio"}) {
+ my $LayerName = "L".$All{"ScandL"}."d";
+ my $LayerAttrib = child($LayerName);
+ $LayerAttrib->setDisabled(1);
+# $LayerAttrib->setText("");
+ }
+# and change title of tab to say enabled
+ tabs->changeTab( ScansTab, trUtf8("Scans (Enabled)") );
+ } else {
+# Otherwise the title of the tab says disabled
+ tabs->changeTab( ScansTab, trUtf8("Scans (Disabled)") );
+ }
+}
+
+
+void TrimSPGUI::PrepLayers()
+{
+ my %All=();
+ $All{"NL"}=NL->text();
+
+# Enable layers up to required and disable the rest
+ for (my $i=1;$i<=7;$i++) {
+ my $LayerName = "BoxL".$i;
+ my $LayerAttrib = child($LayerName);
+ if ($i<=$All{"NL"}) {
+ $LayerAttrib->setDisabled(0);
+ } else {
+ $LayerAttrib->setDisabled(1);
+ }
+ }
+}
+
+
+void TrimSPGUI::ProjSmartDefaults()
+{
+ my %All=();
+# Get typeof projectile
+ $All{"ProjType"}=ProjType->currentText();
+
+ if ($All{"ProjType"} eq "Muon") {
+# For a muon set Sigma E=450 eV and Sigman angle=15 degrees by default
+ SigE->setText("450");
+ SigAngle->setText("15");
+ } elsif ( $All{"ProjType"} eq "Li8") {
+# For Li8 set Sigma E=0 eV and Sigam angle=0 degrees by default
+ SigE->setText("0");
+ SigAngle->setText("0");
+ }
+}
+
+
+void TrimSPGUI::OpenHelpWindow()
+{
+ my $HelpText="
+This is a GUI that uses the Trim.SP simulation binary to calculate the
+implantation profiles if implanted projectiles in a multilayer thin film
+structures.
+
+Usage:
+
+ Initially define your multilayer structure. This can be formed of a maximum
+of 7 layers. Each layer is defined by giving its chemical formula, its
+density in units of g/cm^3, and its thickness in Ångstrom.
+
+ Next, choose the type of projectile to be implanted in the structure from
+the drop-down menu. Set the 'Number of projectiles' to be implanted, were
+a higher number will give better statistics. Finally define the rest of the pro-
+jectile parameters such as implantation energy, energy spread, etc.
+
+ In the 'File names prefix' give a string which will be used to construct the
+input/output file names of the simulation. These files will be collected and
+saved in the subdirectory provided in 'Save in subdirectory' box.
+
+ The 'Additional Parameters' tab allows you to change additional parameters
+In the simulation. Change these only if you know what you are doing, and have
+read the original documentation of the Trim.SP simulation.
+
+ The 'Scans' tabs provides the ability to change the value of a certain
+parameter in the simulation, such as implantation energy, spread in energy,
+number of implanted projectiles, and the thickness of one layer. The values of
+this parameter can be changed by a regualr step size ('Loop' checkbox and
+parameters), or following a set of values ('List of values' checkbox and the
+comma separated values).
+
+ For more details click on the question mark on the top right corner, and then
+click on the item you want to lear about.
+
+Copyright 2009 (C) by Zaher Salman and the LEM Group
+Version 14 Sep. 2009
+ ";
+ my $HelpWindow = Qt::MessageBox::information( this, "TrimSP GUI Help Window",$HelpText);
+}
+
+void TrimSPGUI::CollectValues()
+{
+# This subroutine returns a hash with all the values collected from the GUI.
+ my %All=();
+ $All{"NL"}=NL->text();
+# Collect layers parameters
+ for (my $i=1;$i<=$All{"NL"};$i++) {
+ my $LComp = "L".$i."Comp";
+ my $Lrho="L".$i."rho";
+ my $Ld="L".$i."d";
+ my $LCompAttrib = child($LComp);
+ my $LrhoAttrib=child($Lrho);
+ my $LdAttrib=child($Ld);
+ $All{"$LComp"}=$LCompAttrib->text();
+ $All{"$Lrho"}=$LrhoAttrib->text();
+ $All{"$Ld"}=$LdAttrib->text();
+ }
+
+# Collect projectile parameters
+ $All{"ProjType"}=ProjType->currentText();
+ $All{"NProj"}=NProj->text();
+ if ($All{"NProj"}==0) {
+ $All{"NProj"}=10000;
+ NProj->setText("10000");
+ }
+ $All{"z0"}=z0->text();
+ $All{"dz"}=dz->text();
+ $All{"E"}=E->text();
+ $All{"SigE"}=SigE->text();
+ $All{"Angle"}=Angle->text();
+ $All{"SigAngle"}=SigAngle->text();
+ $All{"Seed"}=Seed->text();
+# Format projectile parameters
+ $All{"NProj"}=sprintf("%8d",$All{"NProj"});
+ $All{"z0"}=sprintf("%6.2f",$All{"z0"});
+ $All{"dz"}=sprintf("%6.2f",$All{"dz"});
+ $All{"E"}=sprintf("%11.2f",$All{"E"});
+ $All{"SigE"}=sprintf("%8.2f",$All{"SigE"});
+ $All{"Angle"}=sprintf("%8.2f",$All{"Angle"});
+ $All{"SigAngle"}=sprintf("%8.2f",$All{"SigAngle"});
+ $All{"Seed"}=sprintf("%6.0f.",$All{"Seed"});
+
+
+# Collect the additional parameters
+ $All{"EF"}=EF->text();
+ $All{"ESB"}=ESB->text();
+ $All{"SHEATH"}=SHEATH->text();
+ $All{"ERC"}=ERC->text();
+ $All{"RD"}=RD->text();
+ $All{"CA"}=CA->text();
+ $All{"KK0"}=KK0->text();
+ $All{"KK0R"}=KK0R->text();
+ $All{"KDEE1"}=KDEE1->text();
+ $All{"KDEE2"}=KDEE2->text();
+ $All{"IPOT"}=IPOT->text();
+ $All{"IPOTR"}=IPOTR->text();
+ $All{"IRL"}=IRL->text();
+# format additional parameters
+ $All{"EF"}=sprintf("%8.2f",$All{"EF"});
+ $All{"ESB"}=sprintf("%8.2f",$All{"ESB"});
+ $All{"SHEATH"}=sprintf("%8.2f",$All{"SHEATH"});
+ $All{"ERC"}=sprintf("%8.2f",$All{"ERC"});
+ $All{"RD"}=sprintf("%5.0f.",$All{"RD"});
+ $All{"CA"}=sprintf("%6.2f",$All{"CA"});
+ $All{"KK0"}=sprintf("%3d",$All{"KK0"});
+ $All{"KK0R"}=sprintf("%3d",$All{"KK0R"});
+ $All{"KDEE1"}=sprintf("%3d",$All{"KDEE1"});
+ $All{"KDEE2"}=sprintf("%3d",$All{"KDEE2"});
+ $All{"IPOT"}=sprintf("%3d",$All{"IPOT"});
+ $All{"IPOTR"}=sprintf("%3d",$All{"IPOTR"});
+ $All{"IRL"}=sprintf("%2d",$All{"IRL"});
+
+# Filenames etc.
+ $All{"FNPre"}=FNPre->text();
+ $All{"Path"}=Path->text();
+
+# Scan parameters only if selected
+ $All{"ScanSeq"}=ScanSeq->isChecked();
+ if ($All{"ScanSeq"}) {
+ $All{"ERadio"}=ERadio->isChecked();
+ $All{"SigERadio"}=SigERadio->isChecked();
+ $All{"NProjRadio"}=NProjRadio->isChecked();
+ $All{"dRadio"}=dRadio->isChecked();
+ $All{"ScandL"}=ScandL->text();
+ $All{"ListRadio"}=ListRadio->isChecked();
+ $All{"LoopRadio"}=LoopRadio->isChecked();
+ $All{"ScanList"}=ScanList->text();
+ $All{"ScanListdz"}=ScanListdz->text();
+ $All{"SFrom"}=SFrom->text();
+ $All{"STo"}=STo->text();
+ $All{"SStep"}=SStep->text();
+ }
+
+# Return values to caller
+ return %All;
+}
+
+
+void TrimSPGUI::CreateInpFile()
+{
+# use lib '$ENV{HOME}/Projects/TrimSPGUI/Chem';
+# push @INC, "$ENV{HOME}/Projects/TrimSPGUI";
+ use Chem;
+# The proper way I think is not to have scan sequences implimented here
+# but rather call this multiple times to generate the scan
+# To resolve this, the function CreateInpFile will expect a unique thickness for each layer,
+# one energy value, one energy sigma and one projectile number.
+# These will be stored in keys L1/2/3/4/5/6/7d, E, SigE and NProj, respectively.
+
+# Chemical formulas will be parsed on the fly for each layer. However, we will check if
+# all the layers have inputs for composition, thickness and density. If not fail and crash :)
+
+# Values of Z,A as well as other needed parameters are obtained from Chem.pm.
+
+# This is the form of the input file:
+ my $TemplateFile=
+ " ProjZ ProjAM E SigE Angle SigAngle EF ESB SHEATH ERC
+ NProj Seed Seed Seed z0 RD dz CA KK0 KK0R KDEE1 KDEE2 IPOT IPOTR IRL
+ L1d L2d L3d L4d L5d L6d L7d L1rho L2rho L3rho L4rho L5rho L6rho L7rho L1CK L2CK L3CK L4CK L5CK L6CK L7CK
+ L1ELZ1 L1ELZ2 L1ELZ3 L1ELZ4 L1ELZ5
+ L1ELW1 L1ELW2 L1ELW3 L1ELW4 L1ELW5
+ L1ELC1 L1ELC2 L1ELC3 L1ELC4 L1ELC5
+ L1ELE1 L1ELE2 L1ELE3 L1ELE4 L1ELE5
+ L10301 L10302 L10303 L10304 L10305
+ 0.0000 0.0000 0.0000 0.0000 0.0000
+ L1ELST11 L1ELST21 L1ELST31 L1ELST41 L1ELST51
+ L1ELST12 L1ELST22 L1ELST32 L1ELST42 L1ELST52
+ L1ELST13 L1ELST23 L1ELST33 L1ELST43 L1ELST53
+ L1ELST14 L1ELST24 L1ELST34 L1ELST44 L1ELST54
+ L1ELST15 L1ELST25 L1ELST35 L1ELST45 L1ELST55
+ L2ELZ1 L2ELZ2 L2ELZ3 L2ELZ4 L2ELZ5
+ L2ELW1 L2ELW2 L2ELW3 L2ELW4 L2ELW5
+ L2ELC1 L2ELC2 L2ELC3 L2ELC4 L2ELC5
+ L2ELE1 L2ELE2 L2ELE3 L2ELE4 L2ELE5
+ L20301 L20302 L20303 L20304 L20305
+ 0.0000 0.0000 0.0000 0.0000 0.0000
+ L2ELST11 L2ELST21 L2ELST31 L2ELST41 L2ELST51
+ L2ELST12 L2ELST22 L2ELST32 L2ELST42 L2ELST52
+ L2ELST13 L2ELST23 L2ELST33 L2ELST43 L2ELST53
+ L2ELST14 L2ELST24 L2ELST34 L2ELST44 L2ELST54
+ L2ELST15 L2ELST25 L2ELST35 L2ELST45 L2ELST55
+ L3ELZ1 L3ELZ2 L3ELZ3 L3ELZ4 L3ELZ5
+ L3ELW1 L3ELW2 L3ELW3 L3ELW4 L3ELW5
+ L3ELC1 L3ELC2 L3ELC3 L3ELC4 L3ELC5
+ L3ELE1 L3ELE2 L3ELE3 L3ELE4 L3ELE5
+ L30301 L30302 L30303 L30304 L30305
+ 0.0000 0.0000 0.0000 0.0000 0.0000
+ L3ELST11 L3ELST21 L3ELST31 L3ELST41 L3ELST51
+ L3ELST12 L3ELST22 L3ELST32 L3ELST42 L3ELST52
+ L3ELST13 L3ELST23 L3ELST33 L3ELST43 L3ELST53
+ L3ELST14 L3ELST24 L3ELST34 L3ELST44 L3ELST54
+ L3ELST15 L3ELST25 L3ELST35 L3ELST45 L3ELST55
+ L4ELZ1 L4ELZ2 L4ELZ3 L4ELZ4 L4ELZ5
+ L4ELW1 L4ELW2 L4ELW3 L4ELW4 L4ELW5
+ L4ELC1 L4ELC2 L4ELC3 L4ELC4 L4ELC5
+ L4ELE1 L4ELE2 L4ELE3 L4ELE4 L4ELE5
+ L40301 L40302 L40303 L40304 L40305
+ 0.0000 0.0000 0.0000 0.0000 0.0000
+ L4ELST11 L4ELST21 L4ELST31 L4ELST41 L4ELST51
+ L4ELST12 L4ELST22 L4ELST32 L4ELST42 L4ELST52
+ L4ELST13 L4ELST23 L4ELST33 L4ELST43 L4ELST53
+ L4ELST14 L4ELST24 L4ELST34 L4ELST44 L4ELST54
+ L4ELST15 L4ELST25 L4ELST35 L4ELST45 L4ELST55
+ L5ELZ1 L5ELZ2 L5ELZ3 L5ELZ4 L5ELZ5
+ L5ELW1 L5ELW2 L5ELW3 L5ELW4 L5ELW5
+ L5ELC1 L5ELC2 L5ELC3 L5ELC4 L5ELC5
+ L5ELE1 L5ELE2 L5ELE3 L5ELE4 L5ELE5
+ L50301 L50302 L50303 L50304 L50305
+ 0.0000 0.0000 0.0000 0.0000 0.0000
+ L5ELST11 L5ELST21 L5ELST31 L5ELST41 L5ELST51
+ L5ELST12 L5ELST22 L5ELST32 L5ELST42 L5ELST52
+ L5ELST13 L5ELST23 L5ELST33 L5ELST43 L5ELST53
+ L5ELST14 L5ELST24 L5ELST34 L5ELST44 L5ELST54
+ L5ELST15 L5ELST25 L5ELST35 L5ELST45 L5ELST55
+ L6ELZ1 L6ELZ2 L6ELZ3 L6ELZ4 L6ELZ5
+ L6ELW1 L6ELW2 L6ELW3 L6ELW4 L6ELW5
+ L6ELC1 L6ELC2 L6ELC3 L6ELC4 L6ELC5
+ L6ELE1 L6ELE2 L6ELE3 L6ELE4 L6ELE5
+ L60301 L60302 L60303 L60304 L60305
+ 0.0000 0.0000 0.0000 0.0000 0.0000
+ L6ELST11 L6ELST21 L6ELST31 L6ELST41 L6ELST51
+ L6ELST12 L6ELST22 L6ELST32 L6ELST42 L6ELST52
+ L6ELST13 L6ELST23 L6ELST33 L6ELST43 L6ELST53
+ L6ELST14 L6ELST24 L6ELST34 L6ELST44 L6ELST54
+ L6ELST15 L6ELST25 L6ELST35 L6ELST45 L6ELST55
+ L7ELZ1 L7ELZ2 L7ELZ3 L7ELZ4 L7ELZ5
+ L7ELW1 L7ELW2 L7ELW3 L7ELW4 L7ELW5
+ L7ELC1 L7ELC2 L7ELC3 L7ELC4 L7ELC5
+ L7ELE1 L7ELE2 L7ELE3 L7ELE4 L7ELE5
+ L70301 L70302 L70303 L70304 L70305
+ 0.0000 0.0000 0.0000 0.0000 0.0000
+ L7ELST11 L7ELST21 L7ELST31 L7ELST41 L7ELST51
+ L7ELST12 L7ELST22 L7ELST32 L7ELST42 L7ELST52
+ L7ELST13 L7ELST23 L7ELST33 L7ELST43 L7ELST53
+ L7ELST14 L7ELST24 L7ELST34 L7ELST44 L7ELST54
+ L7ELST15 L7ELST25 L7ELST35 L7ELST45 L7ELST55
+ ";
+
+# Get values from form
+ my %All = CollectValues();
+ my $ProjType=$All{"ProjType"};
+ $All{"ProjZ"}=sprintf("%6.2f",Chem::Zof($ProjType));
+ $All{"ProjAM"}=sprintf("%6.2f",Chem::Massof($ProjType));
+
+ my $Check=0;
+# Loop over layers an create appropriate values
+ for (my $i=1;$i<=7;$i++){
+ $Check=0;
+# Composition of layers
+ my $LComp="L".$i."Comp";
+ my $LCompAttrib = child($LComp);
+ my $Comp = $LCompAttrib->text();
+ my %LElComp=Chem::parse_formula($Comp);
+ if ($Comp eq "") {$Check++;}
+
+# Densities of layers
+ my $Lrho="L".$i."rho";
+ my $LrhoAttrib = child($Lrho);
+ my $rho = $LrhoAttrib->text();
+ $All{$Lrho}=sprintf("%6.2f",$rho);
+ if ($rho eq "") {$Check++;}
+
+# Thickness of layers
+ my $Ld ="L".$i."d";
+ my $LdAttrib = child($Ld);
+ my $d = $LdAttrib->text();
+ $All{$Ld}=sprintf("%8.2f",$d);
+ if ($d eq "") {$Check++;}
+
+# Sanity check, is the layer supposed to have value? are they all there?
+ if ($Check!=0 && $i<=$All{"NL"}) {
+ my $ErrMsg="Error: Layer $i is empty. Expecting it to be defined!\n";
+ print STDERR $ErrMsg;
+ my $HelpWindow = Qt::MessageBox::information( this, "Error!",$ErrMsg);
+# my $ErrorDialog = Qt::ErrorMessage(TrimSPGUI);
+# $ErrorDialog->message($ErrMsg);
+ return "ERROR";
+ }
+
+ my $tmp = "L".$i."CK";
+ $All{$tmp}=sprintf("%6.2f",1.0);
+
+ my $Sum = 0;
+ foreach (keys %LElComp) {
+ $Sum=$Sum+$LElComp{$_};
+ }
+ if ($Sum==0) {$Sum=1;}
+
+# print STDOUT "Layer: ".$i."\n";
+# print STDOUT "Composition: ".$Comp."\n";
+
+ my @Els = keys %LElComp;
+
+ for (my $NEl=1;$NEl<=5;$NEl++) {
+ my $El = $Els[$NEl-1];
+ my $LEkey = "L".$i."EL";
+ my $ElZ = Chem::Zof($El);
+ my $ElW = Chem::Massof($El);
+ my $ElC = $LElComp{$El}/$Sum;
+ my $ElE = Chem::Elastof($El);
+ my $El030 = 30;
+ if ($El eq "") { $El030 = 0.0;}
+# print STDOUT "$El, ElC=$ElC ElZ=$ElZ ElW=$ElW ElE=$ElE\n";
+ $All{$LEkey."Z".$NEl}=sprintf("%8.4f",$ElZ);
+ $All{$LEkey."W".$NEl}=sprintf("%8.4f",$ElW);
+ $All{$LEkey."C".$NEl}=sprintf("%8.4f",$ElC);
+ $All{$LEkey."E".$NEl}=sprintf("%8.4f",$ElE);
+ $All{"L".$i."030".$NEl}=sprintf("%8.4f",$El030);
+
+ my $ElST = Chem::Stopicru($El);
+ my @ElSTs = split (/,/,$ElST);
+ my $j=1;
+ foreach (@ElSTs) {
+ $LEkey = "L".$i."ELST".$NEl.$j;
+ $j++;
+ $All{$LEkey}=sprintf("%11.6f",$_);
+ }
+ }
+ }
+
+ foreach my $key (keys %All) {
+# print $key,$All{$key},"\n";
+ if ($All{$key} ne ""){
+ $TemplateFile =~ s/$key/$All{$key}/;
+# Seed repeats three times
+ if ($key eq "Seed") { $TemplateFile =~ s/$key/$All{$key}/g;}
+ }
+ }
+ return $TemplateFile;
+}
+
+
+void TrimSPGUI::StartSequenceOne()
+{
+ my %All = CollectValues();
+ my @SValues=();
+ my @SdzValues=();
+ my $cmd="";
+
+# Cleanup from old files
+ if (-e "ausgabe1.inp") {
+ system("rm -f ausgabe*");
+ }
+
+ my $Progress=0;
+ if ($All{"ScanSeq"}) {
+# For a scan
+ $All{"ERadio"}=ERadio->isChecked();
+ $All{"SigERadio"}=SigERadio->isChecked();
+ $All{"NProjRadio"}=NProjRadio->isChecked();
+ $All{"dRadio"}=dRadio->isChecked();
+ $All{"ScandL"}=ScandL->text();
+ $All{"ListRadio"}=ListRadio->isChecked();
+ $All{"LoopRadio"}=LoopRadio->isChecked();
+ $All{"ScanList"}=ScanList->text();
+ $All{"ScanListdz"}=ScanListdz->text();
+ $All{"SFrom"}=SFrom->text();
+ $All{"STo"}=STo->text();
+ $All{"SStep"}=SStep->text();
+
+ if ($All{"ListRadio"}) {
+ @SValues=split(/,/,$All{"ScanList"});
+ @SdzValues=split(/,/,$All{"ScanListdz"});
+ if ($#SValues == $#SdzValues) {$All{"SdzFlag"}=1;}
+ } elsif ($All{"LoopRadio"}) {
+ for (my $Val=$All{"SFrom"};$Val<=$All{"STo"};$Val=$Val+$All{"SStep"}) {
+ @SValues=(@SValues,$Val);
+ }
+ }
+
+ my $ScanName = "";
+ if ($All{"ERadio"}) {
+ $ScanName = "E";
+ } elsif ($All{"SigERadio"}) {
+ $ScanName = "SigE";
+ } elsif ($All{"NProjRadio"}) {
+ $ScanName = "NProj";
+ } elsif ($All{"dRadio"}) {
+ $ScanName = "Ld".$All{"ScandL"};
+ }
+
+ my $ScanAttrib = child($ScanName);
+ my $iScan=0;
+ foreach (@SValues) {
+ $ScanAttrib->setText($_);
+ if ( $All{"SdzFlag"} == 1) {
+ dz->setText($SdzValues[$iScan]);
+ }
+ my $eingabe1=CreateInpFile();
+ if ($eingabe1 eq "ERROR") {return 0;}
+ my $FILENAME=$All{"FNPre"}."_".$ScanName.$_;
+ open (INPF,q{>}, "$FILENAME.inp" );
+ print INPF $eingabe1;
+ close(INPF);
+# Use windoz version
+# system("cp $FILENAME.inp eingabe1.inp; wine TrimSP7L.exe");
+# Use Linux version
+ $Progress=$Progress+90/$#SValues;
+ Progress->setProgress($Progress);
+ Progress->update();
+ $cmd = "cp $FILENAME.inp eingabe1.inp; ".$ENV{'TRIMBIN'};
+ system($cmd);
+
+ foreach ("err","out","rge") {
+ system("mv -f ausgabe1.$_ $FILENAME.$_");
+ }
+# Not needed if work path is changed
+# $cmd="mv -f $FILENAME.* ".$All{"Path"};
+# system($cmd);
+ $iScan++;
+ }
+ } else {
+# For a single run
+ my $eingabe1=CreateInpFile();
+ if ($eingabe1 eq "ERROR") {return 0;}
+ my $FILENAME=$All{"FNPre"};
+ open (INPF,q{>}, "$FILENAME.inp" );
+ print INPF $eingabe1;
+ close(INPF);
+ $Progress=20;
+ Progress->setProgress($Progress);
+
+# Use windoz version
+# system("cp $FILENAME.inp eingabe1.inp; wine TrimSP7L.exe");
+# Use Linux version
+ $cmd = "cp $FILENAME.inp eingabe1.inp; ".$ENV{'TRIMBIN'};
+ system($cmd);
+ foreach ("err","out","rge") {
+ system("mv -f ausgabe1.$_ $FILENAME.$_");
+ }
+ $Progress=90;
+ Progress->setProgress($Progress);
+# If we change work directory this is not needed
+# $cmd="mv -f $FILENAME.* ".$All{"Path"};
+# system($cmd);
+ }
+# Move the fort.33 file into the subdirectory and change its name
+ $cmd="rm -f eingabe1.inp; mv -f fort.33 ".$All{"Path"}."/".$All{"FNPre"}."_Seq_Results.dat";
+ system($cmd);
+ $Progress=100;
+ Progress->setProgress($Progress);
+ return 1;
+}
+
+
+void TrimSPGUI::DirectoryBrowse()
+{
+ my $FileBrowser = Qt::FileDialog::getExistingDirectory("./",this,"get existing directory","Choose a directory",1);
+ if ($FileBrowser eq "") {$FileBrowser="./";}
+ Path->setText($FileBrowser);
+
+ # Create a subdirectory where all input/output files are saved
+ my $cmd="";
+ if (-d $FileBrowser) {
+# Directory exists, do nothing
+ } else {
+ $cmd="mkdir $FileBrowser";
+ system($cmd);
+ }
+# Change work directory accordingly
+ chdir ("$FileBrowser");
+}
+
+
+void TrimSPGUI::ConfirmQuit()
+{
+ my $Ans = Qt::MessageBox::question( this, "Quit?","Are you sure you want to quit?","&Yes","&No","",0,1);
+ if ($Ans==0) {
+# Then quit
+ Qt::Application::exit( 0 );
+ }
+# Otherwize go back
+# print STDOUT $ENV{'TRIMBIN'}."\n";
+}
+