// $BACKGROUND$
/*
Peak tracker
		TrackP	FWHM, drift
		TrackC  Current[pA]
		TrackM  Maxmum intensity
ROI can be set to select area.

20260405 ver 2.1
Known Issues:
 - If you change the exposure time during an observation, the probe current will not be measured correctly.  
   This is because the exposure tag for the spectroscopic observation are not updated during the observation.  

*/

// function
void AlignWindowY(image img1, image img2)
{
	number winsizeX, winsizeY, winposX, winposY
	GetWindowSize(img1,winsizeX,winsizeY)
	GetWindowPosition(img1, winposX, winposY)
	SetWindowSize(img2,winsizeX, winsizeY)
	SetWindowPosition(img2, winposX, winposY+winsizeY+60)
}

/// Main  ///
// Check previous tracking
image imgOld
if(imgOld.getnamedimage("Peak Tracking")   ) Closeimage(imgOld)
if(imgOld.getnamedimage("Current Tracking")) Closeimage(imgOld)
if(imgOld.getnamedimage("Maximum Tracking")) Closeimage(imgOld)

// Customize variables 
number BYTE = 8
number TrackSize = 512		// Tracking window size
number TimelagInSec = 0.05	// Time lag
number AveSize = 3		    // Averaging pixel size		
number WindowW = 800		// Window position(x,y) and size(w,h) of first image, TrackP
number WindowH = 400
number WindowX = 1200	    
number WindowY = 50

// assign target 1D
image img1D
	img1D := GetFrontImage() 	
number scaleX,originX
string unit 
	imageGetDimensionCalibration(img1D , 0, originX, scaleX, unit, 0)
number	IntScale = imageGetIntensityScale(img1D)
string 	IntUnit  = ImageGetIntensityUnitString(img1D) 
If(IntUnit=="")	IntUnit="(Not calibrated)"
number exp
	GetNumberNote(img1D,"EELS:Acquisition:Exposure (s)",exp)
	if(exp==0) 	 exp=1
	// Note that this Exposure time is NOT updated during EELS viewing.
	// Therefore 

// 3 Trackers
// Peak  
image	TrackP	:= RealImage("Peak Tracking", BYTE, TrackSize,  2)
image	tempP 	:= RealImage("tempP",                 BYTE, TrackSize-1, 2)
String UnitP  = unit
	ImageDocument imageDocP = CreateImageDocument( "Peak" ) 
	ImageDisplay imgdspP = imageDocP.ImageDocumentAddImageDisplay( TrackP, 3 )
	imageDocP.ImageDocumentShow()
	LinePlotImageDisplaySetLegendShown(imgdspP, 1)
	imgdspP.ImageDisplaySetSliceLabelByIndex( 0, "FWHM" )
	imgdspP.ImageDisplaySetSliceLabelByIndex( 1, "Drift" )
	ImageSetIntensityUnitString(TrackP, unit)
SetWindowSize(TrackP, WindowW, WindowH)	
SetWindowPosition(trackP, 1500, 50)  

// Current  
image	TrackC	:= RealImage("Current Tracking", BYTE, TrackSize,   1)
image	tempC 	:= RealImage("tempC",    BYTE, TrackSize-1,1)
String UnitC  = "Arb.Unit"
if(IntUnit=="e-") UnitC = "pA"
	ImageDocument imageDocC = CreateImageDocument( "Current" ) 
	ImageDisplay imgdspC = imageDocC.ImageDocumentAddImageDisplay( TrackC, 3 )
	imageDocC.ImageDocumentShow()
	LinePlotImageDisplaySetLegendShown(imgdspC, 1)
	imgdspC.ImageDisplaySetSliceLabelByIndex( 0, "Current\n["+UnitC+"]" )
	ImageSetIntensityUnitString(TrackC, unitC)
AlignWindowY(trackP, trackC)

// Maximum  
image	TrackM	:= RealImage("Maximum Tracking", BYTE, TrackSize,   1)
image	tempM 	:= RealImage("tempM",    BYTE, TrackSize-1,1)
String UnitM  = "Counts"
	ImageDocument imageDocM = CreateImageDocument( "Maximum" ) 
	ImageDisplay imgdspM = imageDocM.ImageDocumentAddImageDisplay( TrackM, 3 )
	imageDocM.ImageDocumentShow()
	LinePlotImageDisplaySetLegendShown(imgdspM, 1)
	imgdspM.ImageDisplaySetSliceLabelByIndex( 0, "Peak" )
	ImageSetIntensityUnitString(TrackM, IntUnit)
	imageSetIntensityScale(TrackM, 1)
AlignWindowY(trackC, trackM)
	
SelectImage(img1D)

// Variables and constant
	// TrackP
	number FWHMpix
	number peakMax, peakX, peakY
	number PeakMax0, PeakX0, PeakY0
	PeakMax0 = Max(img1D, PeakX0, PeakY0)
	// TrackC
	number eee = 1.6022E-19  // [C]
	number totalCNT  //
	number BeamCurrentpA
	// TrackM

while(1)
{
  //Shifting
	tempP = TrackP[0, 0 ,      2, Tracksize-1]
	TrackP[0,1,2,tracksize] = tempP 
	tempC = TrackC[0, 0 ,      1, Tracksize-1]
	TrackC[0,1,1,tracksize] = tempC  
	tempM = TrackM[0, 0 ,      1, Tracksize-1]
	TrackM[0,1,1,tracksize] = tempM
	
  // TrackP
	FWHMpix = sum( tert((img1D[] - max(img1D[])/2) >0, 1, 0))
	SetPixel(TrackP, 0, 0, (FWHMpix * scaleX) )
	PeakMax = Max(img1D[], PeakX, PeakY)
	SetPixel(TrackP, 0, 1, (PeakX-PeakX0)*scaleX)
  // TrackC
	totalCNT = sum(img1D)//Sum(img1D[])
	BeamCurrentpA = 1E12 * totalCNT * IntScale * eee / Exp
	SetPixel(TrackC, 0, 0, BeamCurrentpA)	
  // TrackM
	SetPixel(TrackM, 0, 0, PeakMax*IntScale)		

  // Abort
	If(optiondown()) 		Break
	
  // Progress window and time lag                      
	OpenAndSetProgressWindow("Press 'Alt' to abort.","FWHM[" + unit+ "]: "+ average(TrackP[0,0,1,AveSize]),"Current[" + unitC +"]: "+average(TrackC[0,0,1,AveSize]))	
	Delay(60*TimelagInSec)		
	}

CloseProgressWIndow()
