home79
home79

Reputation: 21

How to exclude certain images from autosave in Gatan Digital Micrograph (GMS) in DM-script

I am trying to mimic the autosave function in GMS v3 so that I can use in version 1 and 2. I would like to first acknowledge that the main bulk of the script originates from Dr Bernhard Schaffer's "How to script... Digital Micrograph Scripting Handbook". I have modified it a bit, so that any new image recorded by the camera can be autosave into the file. However, I met some problems because if I decide to click on live-view image and move the image around, or using live-fft, the live view image or the FFT image will be saved as well. One of the ideas I have is to use the taggroup information such as the "Acquisition:Parameters:Parameter Set Name" because for live view or live-FFT, this would be either in search or focus mode. Another idea is to use the document ID e.g iDocID = idoc.ImageDocumentGETID() to locate the ID of the live image. However, i am clueless then how to use this information to exclude them from autosaving. Can anyone point to me how i can proceed with this script? Below is the script

Class PeriodicAutoSave : Object
    {
    
    Number output
    PeriodicAutoSave(Object self) Result("\n Object ID"+self.ScriptObjectGetID()+" created.")
    ~PeriodicAutoSave(Object self) Result("\n Object ID"+self.ScriptObjectGetID()+" destroyed")
    
    Void Init2(Object self, Number op) 
    output=op

    
    Void AutoSave_SaveAll(Object self)
        {
        String path, name, targettype, targettype1, area, mag, mode, search, result1
        ImageDocument idoc
        Number nr_idoc, count, index_i, index, iDocID, iDocID_search
        path = "c:\\path\\"
        name = "test"
        targettype=="Gatan Format (*.dm4)"
        targettype1 = "dm4"
        If (output) Result("\n AutoSave...")
        nr_idoc = CountImageDocuments()
        For (count = 1; count<nr_idoc; count++)
            {
            idoc = GetImageDocument(count) //imagedocument
            index = 1 // user decide the index to start with
            index_i= nr_idoc - index
            If (idoc.ImageDocumentIsDirty())
                {
                idoc = getfrontimagedocument()  
                iDocID = idoc.ImageDocumentGetID()
                TagGroup tg = ImageGetTagGroup(idoc.ImageDocumentGetImage(0)) // cannot declare an 'img' for this line as it will prompt an error?
                tg.TagGroupGetTagAsString("Microscope Info:Formatted Indicated Mag", mag)
            
                        
                
            
                
                    Try{
                        
                    
                            {
                            idoc.ImageDocumentSavetoFile( "Gatan Format", path+index_i+"-"+name+"-"+mag+".dm4")
                            idoc.ImageDocumentSetName(index_i + "-"+name+"-"+mag+".dm4")
                            idoc.ImageDocumentClean()
                            
                            }
                        If (Output) Result("\n\t saving: "+idoc.ImageDocumentGetCurrentFile())
                        }
                    Catch{
                        Result("\n image cannot be saved at the moment:" + GetExceptionString())
                        Break
                        }
                    Result("\ Continue autosave...")
                }
            }
        }
    }
    



Void LaunchAutoSave()
    {
    Object obj = Alloc(PeriodicAutoSave)
    obj.Init2(2)
    Number task_id = obj.AddMainThreadPeriodicTask("AutoSave_SaveALL",6)
                                            
    //Sleep(10)
    while(!shiftdown()) 1==2
    RemoveMainThreadTask(task_id)
    }

LaunchAutoSave()

Upvotes: 1

Views: 166

Answers (2)

home79
home79

Reputation: 21

thank you very much for your pointers! I have tried and it works very well with my script. as the 'TagGroupDoesTagExist' only refers to the taggroup, I modified further to include the tags I want to filter e.g "Search" or "Focus" and it seems to work well. The script that I modified to your existing ones is as below :

If (idoc.ImageDocumentIsDirty())
                    {
                        
                        //now find out what is a filter condition and skip if it is true
                        skip = 0
                        TagGroup tg = idoc.ImageDocumentGetImage(0).ImageGetTagGroup()
                        tg.TagGroupGetTagAsString("Microscope Info:Formatted Indicated Mag", mag)
                        tg.TagGroupGetTagAsString("Acquisition:Parameters:Parameter Set Name", mode)
                        skip = tg.TagGroupDoesTagExist("Acquisition:Parameters:Parameter Set Name")
                
                        if(skip && (mode == "Search" || mode== "Focus")) continue

Upvotes: 1

BmyGuest
BmyGuest

Reputation: 2949

Your idea of filtering is a good one, but there is something strange with your for loop.

in

 nr_idoc = CountImageDocuments()
        For (count = 1; count<nr_idoc; count++)
            {
            idoc = GetImageDocument(count) //imagedocument

you iterate over all currently open imageDocuments (except the first one!?) and get them one by one, but then in

 If (idoc.ImageDocumentIsDirty())
                {
                idoc = getfrontimagedocument()     

you actually get the front-most (selected) document instead each time. Why are you doing this?

Why not go with:

number nr_idoc = CountImageDocuments()
for (number count = 0; count<nr_idoc; count++)
{
    imagedocument idoc = GetImageDocument(count)
    If (idoc.ImageDocumentIsDirty())
    {
        // now find out what is a filter condition and skip if it is true
        number skip = 0
        
        TagGroup tg = idoc.ImageDocumentGetImage(0).ImageGetTagGroup()
        skip = tg.TagGroupDoesTagExist("Microscope Info:Formatted Indicated Mag")
        if (skip) continue
        
        // do saving
    }
}

Upvotes: 0

Related Questions