Page 1 of 1

How to unlink a MapAnnotation from an Dataset with Gateway?

PostPosted: Tue Jan 29, 2019 11:13 am
by Kouichi_C_Nakamura
Hello again,

I've made a MapAnnotation and attached it to a wrong dataset using Java Gateway, ``DataManagerFacility.attachAnnotation()``.

I think I can delete that MapAnnotation using ``DataManagerFacility.delete()`` and create a new one to be attached to the right dataset.

But if I want to keep the MapAnnotationI object, while de-attaching or unlinking it from the wrong dataset, how could I do that?

In the session-client approach, ``unlinkAnnotations()`` can be used. But I cannot find the equivalent in Gateway tools.

Best,
Kouichi

Re: How to unlink a MapAnnotation from an Dataset with Gatew

PostPosted: Wed Jan 30, 2019 3:59 pm
by Dominik
Unfortunately that's not possible with the Java gateway at the moment. A workaround (quite cumbersome unfortunately) would be using an HQL query to get the annotation link, deleting it via a 'Delete2' command and then creating another annotation link again.

Here's an example moving a MapAnnotation from one image to another:

Code: Select all
        BrowseFacility bf = gw.getFacility(BrowseFacility.class);
        MetadataFacility mf = gw.getFacility(MetadataFacility.class);
        DataManagerFacility df = gw.getFacility(DataManagerFacility.class);

        ImageData fromImg = bf.getImage(userCtx, 1);
        ImageData toImg = bf.getImage(userCtx, 2);

        MapAnnotationData mad = (MapAnnotationData) mf
                .getAnnotations(userCtx, fromImg).iterator().next();

        String query = "select link from ImageAnnotationLink link where link.child.id = :annoId and link.parent.id = :imgId";
        ParametersI params = new ParametersI();
        params.add("annoId", omero.rtypes.rlong(mad.getId()));
        params.add("imgId", omero.rtypes.rlong(fromImg.getId()));
        ImageAnnotationLinkI link = (ImageAnnotationLinkI) gw
                .getQueryService(userCtx).findByQuery(query, params);

        ChildOption opt = Requests.option().excludeType("Annotation").build();
        Delete2 cmd = Requests.delete().target(link).option(opt).build();
        try {
            CmdCallbackI cb = gw.submit(userCtx, cmd);
            cb.loop(10, 500);
        } catch (Throwable e) {
            e.printStackTrace();
        }
       
        link = new ImageAnnotationLinkI();
        link.setChild(mad.asAnnotation());
        link.setParent(toImg.asImage());
        df.saveAndReturnObject(userCtx, link);


Regards,
Dominik

Re: How to unlink a MapAnnotation from an Dataset with Gatew

PostPosted: Wed Jan 30, 2019 4:43 pm
by Dominik
In fact, there's actually a slightly shorter way: You don't have to delete the link, you can just change the parent of the link (in that case you have to load the link together with its nodes, see modified query):

Code: Select all
        String query = "select link from ImageAnnotationLink link join fetch link.child as c join fetch link.parent as p where c.id = :annoId and p.id = :imgId";
        ParametersI params = new ParametersI();
        params.add("annoId", omero.rtypes.rlong(mad.getId()));
        params.add("imgId", omero.rtypes.rlong(fromImg.getId()));
        ImageAnnotationLinkI link = (ImageAnnotationLinkI) gw
                .getQueryService(userCtx).findByQuery(query, params);
        link.setParent(toImg.asImage());
        df.saveAndReturnObject(userCtx, link);


Regards,
Dominik

Re: How to unlink a MapAnnotation from an Dataset with Gatew

PostPosted: Wed Jan 30, 2019 5:04 pm
by Kouichi_C_Nakamura
Wow, I was expecting a simpler solution. Nevertheless, thank you for the detailed answer.

Best,
Kouichi