News:

:) Remember, you need to be logged in to see posted attachments!

Main Menu

File Types in Probe for EPMA and CalcImage

Started by John Donovan, October 31, 2024, 02:34:32 PM

Previous topic - Next topic

John Donovan

Just to clear up any confusion we thought we should provide some brief documentation of the file types used by Probe for EPMA (quantitative point analyses) and CalcImage (quantitative maps).

This is just a preliminary outline, if people have specific questions about specific file types please ask them in this topic.

Probe for EPMA:
The main probe database is a .MDB file. This is a Jet 3.5/3.6 Microsoft Access DAO database format and Probe for EPMA should be able to open probe databases from v. 1.0 to v. 13.x!

These probe databases in Probe for EPMA have the following analytical limits:

Global Const MAXCHAN% = 72              ' maximum elements per sample
Global Const MAXCHAN1% = MAXCHAN% + 1  ' maximum elements plus 1 (stoichiometric oxygen)
Global Const MAXSTD% = 132              ' maximum standards per run (changed from 128 to 132 08-23-2017)
Global Const MAXROW% = 500              ' maximum lines per sample (changed to 500 rows 08-11-2012)
Global Const MAXVOLATILE% = 400        ' maximum volatile/alternating intensities per chan per line per sample
Global Const MAXEDG% = 9                ' maximum emission edges
Global Const MAXELM% = 100              ' maximum elements (do not change due to data restrictions in AbsorbGetMAC)
Global Const MAXEMP% = 20              ' maximum empirical MAC/APFs
Global Const MAXSAMPLE% = 19999        ' maximum samples per run
Global Const MAXINTF% = 6              ' maximum interferences per element
Global Const MAXINDEX% = 10000          ' maximum standards per standard database  (changed to 10000 as of 2-27-2007)
Global Const MAXMAN% = 112              ' maximum MAN assignments per element  (changed from 36 to 112 08-23-2017)
Global Const MAXSET% = 30              ' maximum sets for drift correction

If analog signal (SE/BSE/CL) images are acquired in Probe for EPMA there will be an additional file with the same name with a .BIM extension which stands for "binary image". All values in this file are 4 byte integers, where each image consists of a pair of the X and Y dimensions, followed by X * Y image values.

Probe Image:
Probe Image acquires x-ray (and analog signal) maps using a beam scan or stage scan. The raw data is saved to ASCII text files with the extension .PrbImg. To facilitate browsing, Probe Image also creates .TIF files, with the same name though they are not utilized in any calculations.

Note that the intensities stored in the PrbImg files are encoded using base64 to allow for fast ASCII text reading and writing and are in raw counts per second (cps) units (no dead time or beam normalization).

CalcImage:
The CalcImage application can import .PrbImg files from Probe Image for subsequent quantification of x-ray maps for dead time, beam drift, background, interference corrections, matrix corrections and time dependent intensity corrections (TDI) for beam sensitive materials.

These intensities are then stored in binary .GRD files named with a combination of the probe database and the PrbImg file names. The .GRD file is the native file format of the Surfer software from Golden Software and the file structure in documented in this and related posts:

https://smf.probesoftware.com/index.php?topic=324.msg8470#msg8470

The CalcImage project file has a .CIP extension and is a simply ASCII.  The .CIP format is documented in the CalcImage Help file (it probably needs updating!).
John J. Donovan, Pres. 
(541) 343-3400

"Not Absolutely Certain, Yet Reliable"

John Donovan

#1
For those that write their own code, here is the source code for reading or writing a CalcImage Project file (.CIP):

Sub CalcImageReadWriteProjectFile(mode As Integer)
' Read or write the project file
'  mode = 1 read project
'  mode = 2 write project

ierror = False
On Error GoTo CalcImageReadWriteProjectFileError

Dim i As Integer, tFlag As Integer, j As Integer
Dim itemp6 As Integer
Dim tfilename As String
Dim astring As String, bstring As String

' Read project
If mode% = 1 Then

' Init project
Call CalcImageInitProject(Int(0))
If ierror Then Exit Sub

' Check for version of CIP file for reading only!
CalcImageProjectVersion% = CalcImageGetProjectFileVersion()
If ierror Then Exit Sub

' If file version is zero, call special routine for backward compatibility (write project uses current version)
If CalcImageProjectVersion% = 0 Then
Call CalcImageReadVersionZeroCIPFile(mode%)
If ierror Then Exit Sub
Exit Sub
End If

' Project file contains full path, but condition and image files do not (must be in same folder as CIP and MDB file)
Open CalcImageProjectFile$ For Input As #CalcImageProjectFileNumber%

Input #CalcImageProjectFileNumber%, CalcImageProjectVersion%, CalcImageProjectTitle$

' Check that CIP file is not a newer version
If CalcImageProjectVersion% > CIP_FILE_VERSION% Then GoTo CalcImageReadWriteProjectFileNewerCIPFile

' If version 2, read CalcImageSampleNameTitle field
If CalcImageProjectVersion% >= 2 Then
Input #CalcImageProjectFileNumber%, CalcImageSampleNameTitle$
End If

' Read and load probe data file name
Input #CalcImageProjectFileNumber%, tfilename$
tfilename$ = MiscGetPathOnly$(CalcImageProjectFile$) & tfilename$

' Check for files existing
If Trim$(tfilename$) = vbNullString Then GoTo CalcImageReadWriteProjectFileBlankCondition
If Dir$(tfilename$) = vbNullString Then GoTo CalcImageReadWriteProjectFileMissingCondition

' Load Probe database file name (full path)
ProbeDataFile$ = tfilename$
Line Input #CalcImageProjectFileNumber%, astring$   ' read entire parameter line and parse each parameter (for backward compatibility)

' Read sample number
Call MiscParseStringToStringA(astring$, VbSpace, bstring$)
If ierror Then Exit Sub
CalcImageProbeDataSample% = Val(bstring$)

' Read number of images
Call MiscParseStringToStringA(astring$, VbSpace, bstring$)
If ierror Then Exit Sub
CalcImageNumberofImageFiles% = Val(bstring$)
If CalcImageNumberofImageFiles% > MAXIMAGE% Then GoTo CalcImageReadWriteProjectFileTooManyImages

' Read CalcImageCalculateTotalsImageFlag
Call MiscParseStringToStringA(astring$, VbSpace, bstring$)
If ierror Then Exit Sub
CalcImageCalculateTotalsImageFlag% = Val(bstring$)

' Read CalcImageCalculateStoichiometricOxygenImageFlag
Call MiscParseStringToStringA(astring$, VbSpace, bstring$)
If ierror Then Exit Sub
CalcImageCalculateStoichiometricOxygenImageFlag% = Val(bstring$)

Call MiscParseStringToStringA(astring$, VbSpace, bstring$)
If ierror Then Exit Sub
CalcImageCalculateExcessOxygenImageFlag% = Val(bstring$)

' Read CalcImageCalculateNetIntensitiesFlag
Call MiscParseStringToStringA(astring$, VbSpace, bstring$)
If ierror Then Exit Sub
CalcImageCalculateNetIntensitiesFlag% = Val(bstring$)

' Read CalcImageCalculateBgdIntensitiesFlag
Call MiscParseStringToStringA(astring$, VbSpace, bstring$)
If ierror Then Exit Sub
CalcImageCalculateBgdIntensitiesFlag% = Val(bstring$)

' Read CalcImageCalculateKratioIntensitiesFlag
Call MiscParseStringToStringA(astring$, VbSpace, bstring$)
If ierror Then Exit Sub
CalcImageCalculateKratioIntensitiesFlag% = Val(bstring$)

' Read CalcImageCalculateQuantPercentsFlag
Call MiscParseStringToStringA(astring$, VbSpace, bstring$)
If ierror Then Exit Sub
CalcImageCalculateQuantPercentsFlag% = Val(bstring$)

' Read CalcImageCalculateAtomicPercentsFlag
Call MiscParseStringToStringA(astring$, VbSpace, bstring$)
If ierror Then Exit Sub
CalcImageCalculateAtomicPercentsFlag% = Val(bstring$)

' Read CalcImageCalculateOxidePercentsFlag
Call MiscParseStringToStringA(astring$, VbSpace, bstring$)
If ierror Then Exit Sub
CalcImageCalculateOxidePercentsFlag% = Val(bstring$)

' Read CalcImageCalculateFormulaBasisFlag
Call MiscParseStringToStringA(astring$, VbSpace, bstring$)
If ierror Then Exit Sub
CalcImageCalculateFormulaBasisFlag% = Val(bstring$)

' Read CalcImageCalculateElementByDiffImageFlag
Call MiscParseStringToStringA(astring$, VbSpace, bstring$)
If ierror Then Exit Sub
CalcImageCalculateElementByDiffImageFlag% = Val(bstring$)

' Read CalcImageCalculateDetectionLimitsFlag
Call MiscParseStringToStringA(astring$, VbSpace, bstring$)
If ierror Then Exit Sub
CalcImageCalculateDetectionLimitsFlag% = Val(bstring$)

' Read CalcImageCalculateAnalyticalSensitivityFlag
Call MiscParseStringToStringA(astring$, VbSpace, bstring$)
If ierror Then Exit Sub
CalcImageCalculateAnalyticalSensitivityFlag% = Val(bstring$)

' Read CalcImageCalculateLogWeightPercentsFlag
Call MiscParseStringToStringA(astring$, VbSpace, bstring$)
If ierror Then Exit Sub
CalcImageCalculateLogWeightPercentsFlag% = Val(bstring$)

' Read CalcImageCalculateDetectionLimitsBlankingFlag (new)
Call MiscParseStringToStringA(astring$, VbSpace, bstring$)
If ierror Then Exit Sub
CalcImageCalculateDetectionLimitsBlankingFlag% = Val(bstring$)

' Read CalcImageCalculateAnalyticalSensitivityBlankingFlag (new)
Call MiscParseStringToStringA(astring$, VbSpace, bstring$)
If ierror Then Exit Sub
CalcImageCalculateAnalyticalSensitivityBlankingFlag% = Val(bstring$)

' Read CalcImageBlankValuesOutsideMinMaxAnalyticalTotalFlag (new)
Call MiscParseStringToStringA(astring$, VbSpace, bstring$)
If ierror Then Exit Sub
CalcImageBlankValuesOutsideMinMaxAnalyticalTotalFlag% = Val(bstring$)

' To ensure that the elemental quant flag is always set
CalcImageCalculateQuantPercentsFlag% = -1   ' always calculate elemental percents!

' Read image files (count time is no longer utilized since intensity data is in cps from PI)
For i% = 1 To CalcImageNumberofImageFiles%
If CalcImageProjectVersion% <= 9 Then
Input #CalcImageProjectFileNumber%, CalcImageImageTypes%(i%), CalcImageElementRows%(i%), CalcImageCountTimes!(i%), CalcImageBeamCurrents!(i%), CalcImageBeamCurrents2!(i%), CalcImageTimeOfAcqs#(i%), CalcImageTimeOfAcqs2#(i%), CalcImageImageFiles$(i%)
Else
Input #CalcImageProjectFileNumber%, CalcImageImageTypes%(i%), CalcImageElementRows%(i%), CalcImageCountTimes!(i%), CalcImageBeamCurrents!(i%), CalcImageBeamCurrents2!(i%), CalcImageTimeOfAcqs#(i%), CalcImageTimeOfAcqs2#(i%), CalcImageImageFiles$(i%), CalcImageImagePositions!(i%)
End If
CalcImageImageFiles$(i%) = MiscGetPathOnly$(CalcImageProjectFile$) & CalcImageImageFiles$(i%)
Next i%

' Now read CPQ files and parameters
Call CalcImageCPQReadWriteProjectFile(mode%, CalcImageProjectFileNumber%)
If ierror Then Exit Sub

' If version 3, read misc parameters array (6 integers)
If CalcImageProjectVersion% >= 3 Then
Input #CalcImageProjectFileNumber%, CalcImageTitleAppendDataFlag%, CalcImageSurferOutputTemplateFlag%, CalcImageSurferSliceTemplateFlag%, CalcImageSurferPolygonTemplateFlag%, CalcImageSurferStripTemplateFlag%, UseManualAssignmentModeFlag%, itemp6%
End If

' If version 4, read EDS spectrum image flag (not utilized yet) and filename
If CalcImageProjectVersion% >= 4 Then
Input #CalcImageProjectFileNumber%, tFlag%, IntegrateEDSSpectrumImagingFilename$
End If

' If version 5, read scan type (0 = beam scan, 1 = stage scan) and scan orientation type (0 = Cameca stage/beam or JEOL beam scan (UL/LR), 1 = JEOL stage scan (UR/LL))
If CalcImageProjectVersion% >= 5 Then
Input #CalcImageProjectFileNumber%, CalcImageScanTypeFlag%, CalcImageOrientationTypeFlag%
End If

' If version 6, read analog signal image output flags and names
If CalcImageProjectVersion% >= 6 Then
Input #CalcImageProjectFileNumber%, CalcImageAnalogSignalFlags(1), CalcImageAnalogSignalLabels(1), CalcImageAnalogSignalFlags(2), CalcImageAnalogSignalLabels(2), CalcImageAnalogSignalFlags(3), CalcImageAnalogSignalLabels(3)
End If

' If version 7, read analog signal image filenames
If CalcImageProjectVersion% >= 7 Then
Input #CalcImageProjectFileNumber%, AnalogFilenames$(1), AnalogFilenames$(2), AnalogFilenames$(3)
If Trim$(AnalogFilenames$(1)) <> vbNullString Then AnalogFilenames$(1) = MiscGetPathOnly$(CalcImageProjectFile$) & AnalogFilenames$(1)
If Trim$(AnalogFilenames$(2)) <> vbNullString Then AnalogFilenames$(2) = MiscGetPathOnly$(CalcImageProjectFile$) & AnalogFilenames$(2)
If Trim$(AnalogFilenames$(3)) <> vbNullString Then AnalogFilenames$(3) = MiscGetPathOnly$(CalcImageProjectFile$) & AnalogFilenames$(3)
End If

' If version 8, read number of TDI files and number of intervals
If CalcImageProjectVersion% >= 8 Then
Input #CalcImageProjectFileNumber%, CalcImageNumberOfTDIImageFiles%, CalcImageNumberOfTDIImageIntervals%
For i% = 1 To CalcImageNumberOfTDIImageFiles%
Input #CalcImageProjectFileNumber%, CalcImageTDIImageIntervals%(i%), CalcImageTDIElementRows%(i%), CalcImageTDICountTimes!(i%), CalcImageTDIBeamCurrents!(i%), CalcImageTDIBeamCurrents2!(i%), CalcImageTDITimeOfAcqs#(i%), CalcImageTDITimeOfAcqs2#(i%), CalcImageTDIImageFiles$(i%)
CalcImageTDIImageFiles$(i%) = MiscGetPathOnly$(CalcImageProjectFile$) & CalcImageTDIImageFiles$(i%)
Next i%
End If

' If version 9, read output matrix corrections flag and unused flags
If CalcImageProjectVersion% >= 9 Then
Input #CalcImageProjectFileNumber%, CalcImageCalculateMatrixCorrectionsFlag%, tFlag%, tFlag%, tFlag%, tFlag%, tFlag%
End If

' If version 11, read dynamic element parameters (version 10 is above for image files- spectrometer positions)
If CalcImageProjectVersion% >= 11 Then
Input #CalcImageProjectFileNumber%, DynamicSpecifiedElementByDifferenceFlag%
For j% = 1 To MAXCRITERIA%
Input #CalcImageProjectFileNumber%, DynamicSpecifiedElementByDifferenceElement%(j%), DynamicSpecifiedElementByDifferenceValue!(j%), DynamicSpecifiedElementByDifferenceGreaterLess%(j%)
Next j%
Input #CalcImageProjectFileNumber%, DynamicSpecifiedElementByDifferenceOperator1%, DynamicSpecifiedElementByDifferenceOperator2%

Input #CalcImageProjectFileNumber%, DynamicSpecifiedElementByDifferenceFormulaFlag%
For j% = 1 To MAXCRITERIA%
Input #CalcImageProjectFileNumber%, DynamicSpecifiedElementByDifferenceFormulaElement%(j%), DynamicSpecifiedElementByDifferenceFormulaValue!(j%), DynamicSpecifiedElementByDifferenceFormulaGreaterLess%(j%)
Next j%
Input #CalcImageProjectFileNumber%, DynamicSpecifiedElementByDifferenceFormulaOperator1%, DynamicSpecifiedElementByDifferenceFormulaOperator2%

Input #CalcImageProjectFileNumber%, DynamicSpecifiedElementByStoichiometryToOxygenFlag%
For j% = 1 To MAXCRITERIA%
Input #CalcImageProjectFileNumber%, DynamicSpecifiedElementByStoichiometryToOxygenElement%(j%), DynamicSpecifiedElementByStoichiometryToOxygenValue!(j%), DynamicSpecifiedElementByStoichiometryToOxygenGreaterLess%(j%)
Next j%
Input #CalcImageProjectFileNumber%, DynamicSpecifiedElementByStoichiometryToOxygenOperator1%, DynamicSpecifiedElementByStoichiometryToOxygenOperator2%

Input #CalcImageProjectFileNumber%, DynamicSpecifiedElementByStoichiometryToAnotherFlag%
For j% = 1 To MAXCRITERIA%
Input #CalcImageProjectFileNumber%, DynamicSpecifiedElementByStoichiometryToAnotherElement%(j%), DynamicSpecifiedElementByStoichiometryToAnotherValue!(j%), DynamicSpecifiedElementByStoichiometryToAnotherGreaterLess%(j%)
Next j%
Input #CalcImageProjectFileNumber%, DynamicSpecifiedElementByStoichiometryToAnotherOperator1%, DynamicSpecifiedElementByStoichiometryToAnotherOperator2%

Input #CalcImageProjectFileNumber%, DynamicSpecifiedElementExcessOxygenByDroopFlag%
For j% = 1 To MAXCRITERIA%
Input #CalcImageProjectFileNumber%, DynamicSpecifiedElementExcessOxygenByDroopElement%(j%), DynamicSpecifiedElementExcessOxygenByDroopValue!(j%), DynamicSpecifiedElementExcessOxygenByDroopGreaterLess%(j%)
Next j%
Input #CalcImageProjectFileNumber%, DynamicSpecifiedElementExcessOxygenByDroopOperator1%, DynamicSpecifiedElementExcessOxygenByDroopOperator2%
End If

Close #CalcImageProjectFileNumber%

' Check for blank title
If Trim$(CalcImageProjectTitle$) = vbNullString Then CalcImageProjectTitle$ = "CalcImage Quantitative Image Project " & Now

' Check for blank file names
For i% = 1 To CalcImageNumberofImageFiles%
If Trim$(CalcImageImageFiles$(i%)) = vbNullString Then GoTo CalcImageReadWriteProjectFileBlankImage
If Dir$(CalcImageImageFiles$(i%)) = vbNullString Then GoTo CalcImageReadWriteProjectFileMissingImage
Next i%

End If


' Write project
If mode% = 2 Then

' Update CIP project file to current version
CalcImageProjectVersion% = CIP_FILE_VERSION%

' Check for files existing
If Trim$(ProbeDataFile$) = vbNullString Then GoTo CalcImageReadWriteProjectFileBlankCondition
If Dir$(ProbeDataFile$) = vbNullString Then GoTo CalcImageReadWriteProjectFileMissingCondition

For i% = 1 To CalcImageNumberofImageFiles%
If Trim$(CalcImageImageFiles$(i%)) = vbNullString Then GoTo CalcImageReadWriteProjectFileBlankImage
If Dir$(CalcImageImageFiles$(i%)) = vbNullString Then GoTo CalcImageReadWriteProjectFileMissingImage
Next i%

' Check for blank title
If Trim$(CalcImageProjectTitle$) = vbNullString Then CalcImageProjectTitle$ = "CalcImage Quantitative Image Project " & Now

If CalcImageNumberofImageFiles% > MAXIMAGE% Then GoTo CalcImageReadWriteProjectFileTooManyImages

' Project file does not contain full path (uses current CIP folder)
Open CalcImageProjectFile$ For Output As #CalcImageProjectFileNumber%

Print #CalcImageProjectFileNumber%, CalcImageProjectVersion%, VbDquote$ & CalcImageProjectTitle$ & VbDquote$
Print #CalcImageProjectFileNumber%, VbDquote$ & CalcImageSampleNameTitle$ & VbDquote$
Print #CalcImageProjectFileNumber%, VbDquote$ & MiscGetFileNameOnly$(ProbeDataFile$) & VbDquote$
Print #CalcImageProjectFileNumber%, CalcImageProbeDataSample%, CalcImageNumberofImageFiles%, CalcImageCalculateTotalsImageFlag%, CalcImageCalculateStoichiometricOxygenImageFlag%, CalcImageCalculateExcessOxygenImageFlag%, CalcImageCalculateNetIntensitiesFlag%, CalcImageCalculateBgdIntensitiesFlag%, CalcImageCalculateKratioIntensitiesFlag%, CalcImageCalculateQuantPercentsFlag%, CalcImageCalculateAtomicPercentsFlag%, CalcImageCalculateOxidePercentsFlag%, CalcImageCalculateFormulaBasisFlag%, CalcImageCalculateElementByDiffImageFlag%, CalcImageCalculateDetectionLimitsFlag%, CalcImageCalculateAnalyticalSensitivityFlag%, CalcImageCalculateLogWeightPercentsFlag%, CalcImageCalculateDetectionLimitsBlankingFlag%, CalcImageCalculateAnalyticalSensitivityBlankingFlag%, CalcImageBlankValuesOutsideMinMaxAnalyticalTotalFlag%

' Write on and off peak image files
For i% = 1 To CalcImageNumberofImageFiles%
If CalcImageProjectVersion% <= 9 Then
Print #CalcImageProjectFileNumber%, CalcImageImageTypes%(i%), CalcImageElementRows%(i%), Format$(CalcImageCountTimes!(i%), f83$), CalcImageBeamCurrents!(i%), CalcImageBeamCurrents2!(i%), CalcImageTimeOfAcqs#(i%), CalcImageTimeOfAcqs2#(i%), VbDquote$ & MiscGetFileNameOnly$(CalcImageImageFiles$(i%)) & VbDquote$
Else
Print #CalcImageProjectFileNumber%, CalcImageImageTypes%(i%), CalcImageElementRows%(i%), Format$(CalcImageCountTimes!(i%), f83$), CalcImageBeamCurrents!(i%), CalcImageBeamCurrents2!(i%), CalcImageTimeOfAcqs#(i%), CalcImageTimeOfAcqs2#(i%), VbDquote$ & MiscGetFileNameOnly$(CalcImageImageFiles$(i%)) & VbDquote$, CalcImageImagePositions!(i%)
End If
Next i%

' Now write CPQ files and parameters
Call CalcImageCPQReadWriteProjectFile(mode%, CalcImageProjectFileNumber%)
If ierror Then Exit Sub

' Now write misc parameters
Print #CalcImageProjectFileNumber%, CalcImageTitleAppendDataFlag%, CalcImageSurferOutputTemplateFlag%, CalcImageSurferSliceTemplateFlag%, CalcImageSurferPolygonTemplateFlag%, CalcImageSurferStripTemplateFlag%, UseManualAssignmentModeFlag, itemp6%

' Now write EDS spectrum image flag (not utilized yet) and filename
Print #CalcImageProjectFileNumber%, tFlag%, VbDquote$ & IntegrateEDSSpectrumImagingFilename$ & VbDquote$

' Now write scan type (0 = beam scan, 1 = stage scan) and scan orientation type (0 = Cameca stage/beam or JEOL beam scan (UL/LR), 1 = JEOL stage scan (UR/LL))
Print #CalcImageProjectFileNumber%, CalcImageScanTypeFlag%, CalcImageOrientationTypeFlag%

' Now write analog signal image output flags and names
Print #CalcImageProjectFileNumber%, CalcImageAnalogSignalFlags(1), VbDquote$ & CalcImageAnalogSignalLabels(1) & VbDquote, CalcImageAnalogSignalFlags(2), VbDquote$ & CalcImageAnalogSignalLabels(2) & VbDquote, CalcImageAnalogSignalFlags(3), VbDquote$ & CalcImageAnalogSignalLabels(3) & VbDquote

' Now write analog signal file names
Print #CalcImageProjectFileNumber%, VbDquote$ & MiscGetFileNameOnly$(AnalogFilenames$(1)) & VbDquote$, VbDquote$ & MiscGetFileNameOnly$(AnalogFilenames$(2)) & VbDquote$, VbDquote$ & MiscGetFileNameOnly$(AnalogFilenames$(3)) & VbDquote$

' Now write number of TDI files and number of TDI intervals
Print #CalcImageProjectFileNumber%, CalcImageNumberOfTDIImageFiles%, CalcImageNumberOfTDIImageIntervals%

' Write TDI image files
For i% = 1 To CalcImageNumberOfTDIImageFiles%
Print #CalcImageProjectFileNumber%, CalcImageTDIImageIntervals%(i%), CalcImageTDIElementRows%(i%), Format$(CalcImageTDICountTimes!(i%), f83$), CalcImageTDIBeamCurrents!(i%), CalcImageTDIBeamCurrents2!(i%), CalcImageTDITimeOfAcqs#(i%), CalcImageTDITimeOfAcqs2#(i%), VbDquote & MiscGetFileNameOnly$(CalcImageTDIImageFiles$(i%)) & VbDquote
Next i%

' Write newest calculation flags
Print #CalcImageProjectFileNumber%, CalcImageCalculateMatrixCorrectionsFlag%, tFlag%, tFlag%, tFlag%, tFlag%, tFlag%

' Write dynamic element parameters
Print #CalcImageProjectFileNumber%, DynamicSpecifiedElementByDifferenceFlag%
For j% = 1 To MAXCRITERIA%
Print #CalcImageProjectFileNumber%, DynamicSpecifiedElementByDifferenceElement%(j%), DynamicSpecifiedElementByDifferenceValue!(j%), DynamicSpecifiedElementByDifferenceGreaterLess%(j%)
Next j%
Print #CalcImageProjectFileNumber%, DynamicSpecifiedElementByDifferenceOperator1%, DynamicSpecifiedElementByDifferenceOperator2%

Print #CalcImageProjectFileNumber%, DynamicSpecifiedElementByDifferenceFormulaFlag%
For j% = 1 To MAXCRITERIA%
Print #CalcImageProjectFileNumber%, DynamicSpecifiedElementByDifferenceFormulaElement%(j%), DynamicSpecifiedElementByDifferenceFormulaValue!(j%), DynamicSpecifiedElementByDifferenceFormulaGreaterLess%(j%)
Next j%
Print #CalcImageProjectFileNumber%, DynamicSpecifiedElementByDifferenceFormulaOperator1%, DynamicSpecifiedElementByDifferenceFormulaOperator2%

Print #CalcImageProjectFileNumber%, DynamicSpecifiedElementByStoichiometryToOxygenFlag%
For j% = 1 To MAXCRITERIA%
Print #CalcImageProjectFileNumber%, DynamicSpecifiedElementByStoichiometryToOxygenElement%(j%), DynamicSpecifiedElementByStoichiometryToOxygenValue!(j%), DynamicSpecifiedElementByStoichiometryToOxygenGreaterLess%(j%)
Next j%
Print #CalcImageProjectFileNumber%, DynamicSpecifiedElementByStoichiometryToOxygenOperator1%, DynamicSpecifiedElementByStoichiometryToOxygenOperator2%

Print #CalcImageProjectFileNumber%, DynamicSpecifiedElementByStoichiometryToAnotherFlag%
For j% = 1 To MAXCRITERIA%
Print #CalcImageProjectFileNumber%, DynamicSpecifiedElementByStoichiometryToAnotherElement%(j%), DynamicSpecifiedElementByStoichiometryToAnotherValue!(j%), DynamicSpecifiedElementByStoichiometryToAnotherGreaterLess%(j%)
Next j%
Print #CalcImageProjectFileNumber%, DynamicSpecifiedElementByStoichiometryToAnotherOperator1%, DynamicSpecifiedElementByStoichiometryToAnotherOperator2%

Print #CalcImageProjectFileNumber%, DynamicSpecifiedElementExcessOxygenByDroopFlag%
For j% = 1 To MAXCRITERIA%
Print #CalcImageProjectFileNumber%, DynamicSpecifiedElementExcessOxygenByDroopElement%(j%), DynamicSpecifiedElementExcessOxygenByDroopValue!(j%), DynamicSpecifiedElementExcessOxygenByDroopGreaterLess%(j%)
Next j%
Print #CalcImageProjectFileNumber%, DynamicSpecifiedElementExcessOxygenByDroopOperator1%, DynamicSpecifiedElementExcessOxygenByDroopOperator2%

Close #CalcImageProjectFileNumber%
End If

Exit Sub

' Errors
CalcImageReadWriteProjectFileError:
CalcImageProjectFile$ = vbNullString
CalcImageSampleNameTitle$ = vbNullString
MsgBox Error$, vbOKOnly + vbCritical, "CalcImageReadWriteProjectFile"
Close #CalcImageProjectFileNumber%
ierror = True
Exit Sub

CalcImageReadWriteProjectFileNewerCIPFile:
msg$ = "CalcImage CIP file (" & CalcImageProjectFile$ & ") version (" & Format$(CalcImageProjectVersion%) & ") was created by a newer version of the CalcImage application. Please update Probe for EPMA to get the most recent version of CalcImage"
MsgBox msg$, vbOKOnly + vbExclamation, "CalcImageReadWriteProjectFile"
Close #CalcImageProjectFileNumber%
ProbeDataFile$ = vbNullString
ierror = True
Exit Sub

CalcImageReadWriteProjectFileBlankCondition:
msg$ = "Probe data file name is blank in CalcImage Project File " & CalcImageProjectFile$
MsgBox msg$, vbOKOnly + vbExclamation, "CalcImageReadWriteProjectFile"
Close #CalcImageProjectFileNumber%
ProbeDataFile$ = vbNullString
ierror = True
Exit Sub

CalcImageReadWriteProjectFileMissingCondition:
msg$ = "Probe data file " & tfilename$ & " is missing"
MsgBox msg$, vbOKOnly + vbExclamation, "CalcImageReadWriteProjectFile"
Close #CalcImageProjectFileNumber%
CalcImageProjectFile$ = vbNullString
CalcImageSampleNameTitle$ = vbNullString
ierror = True
Exit Sub

CalcImageReadWriteProjectFileTooManyImages:
msg$ = "Too many image files specified in CalcImage Project File " & CalcImageProjectFile$
MsgBox msg$, vbOKOnly + vbExclamation, "CalcImageReadWriteProjectFile"
Close #CalcImageProjectFileNumber%
CalcImageProjectFile$ = vbNullString
CalcImageSampleNameTitle$ = vbNullString
ierror = True
Exit Sub

CalcImageReadWriteProjectFileBlankImage:
msg$ = "Image file number " & Str$(i%) & " name is blank in CalcImage Project File " & CalcImageProjectFile$
MsgBox msg$, vbOKOnly + vbExclamation, "CalcImageReadWriteProjectFile"
Close #CalcImageProjectFileNumber%
CalcImageProjectFile$ = vbNullString
CalcImageSampleNameTitle$ = vbNullString
ierror = True
Exit Sub

CalcImageReadWriteProjectFileMissingImage:
msg$ = "Image file " & CalcImageImageFiles$(i%) & " is missing"
MsgBox msg$, vbOKOnly + vbExclamation, "CalcImageReadWriteProjectFile"
Close #CalcImageProjectFileNumber%
CalcImageProjectFile$ = vbNullString
CalcImageSampleNameTitle$ = vbNullString
ierror = True
Exit Sub

End Sub

This latest code (v. 13.9.2 of CalcImage) contains the "dynamic elements" parameters for specifying different unanalyzed elements to specific phases in an x-ray map during quantification:

https://smf.probesoftware.com/index.php?topic=1647.0
John J. Donovan, Pres. 
(541) 343-3400

"Not Absolutely Certain, Yet Reliable"