From 881242c8ed0753cdd33b96483b0cad25235b71de Mon Sep 17 00:00:00 2001 From: Qi Gong Date: Fri, 19 May 2017 14:32:23 -0400 Subject: [PATCH] Add imagescope arrow annotation file --- src/exportXML_arrow.m | 205 +++++++++++++++++++++ src/tasks/task_slider_imagescope.m | 283 +++++++++++++++++++++++++++++ 2 files changed, 488 insertions(+) create mode 100644 src/exportXML_arrow.m create mode 100644 src/tasks/task_slider_imagescope.m diff --git a/src/exportXML_arrow.m b/src/exportXML_arrow.m new file mode 100644 index 00000000..51148797 --- /dev/null +++ b/src/exportXML_arrow.m @@ -0,0 +1,205 @@ +function success = exportXML_arrow(fullname,scan_scale, task_id,workdir,Left, Top, roi_w, roi_h) +%EXPORTXML Summary of this function goes here +% process data +try + success = 0; + length = 2*(roi_w + roi_h); + lengthM = length*scan_scale; + area= roi_w* roi_h; + areaM= area * scan_scale *scan_scale; + x1 = Left; + y1 = Top; + x2 = Left + roi_w; + y2 = Top; + x3 = Left + roi_w; + y3 = Top + roi_h; + x4 = Left; + y4 = Top + roi_h; + + lengthArrow = 100; + lengthArrowM = lengthArrow*scan_scale; + xArrow1 = Left + ceil(roi_w/2)-30; + xArrow2 = xArrow1 - lengthArrow; + yArrow = Top + ceil(roi_h/2); + + indexdot = findstr(fullname, '.'); + imageDir = fullname(1:(indexdot(end)-1)); + filename = [imageDir,'.xml']; + + % generate xml + % annotation information + docNode = com.mathworks.xml.XMLUtils.createDocument('Annotations'); + docRootNode = docNode.getDocumentElement; + docRootNode.setAttribute('MicronsPerPixel','0.2279'); + + + % image information + entry_level_info = docNode.createElement('Image_information'); + entry_level_info.setAttribute('Full_path',fullname); + docNode.getDocumentElement.appendChild(entry_level_info); + + entry_level1 = docNode.createElement('Annotation'); + entry_level1.setAttribute('MacroName',''); + entry_level1.setAttribute('MarkupImagePath',''); + entry_level1.setAttribute('Selected','1'); + entry_level1.setAttribute('Visible','1'); + entry_level1.setAttribute('LineColor','65280'); + entry_level1.setAttribute('Type','4'); + entry_level1.setAttribute('Incremental','0'); + entry_level1.setAttribute('LineColorReadOnly','0'); + entry_level1.setAttribute('NameReadOnly','0'); + entry_level1.setAttribute('ReadOnly','0'); + entry_level1.setAttribute('Name',''); + entry_level1.setAttribute('Id','1'); + docNode.getDocumentElement.appendChild(entry_level1); + + entry_level1_1 = docNode.createElement('Attributes'); + entry_level1.appendChild(entry_level1_1); + + entry_level1_1_1 = docNode.createElement('Attribute'); + entry_level1_1_1.setAttribute('Name','Description'); + entry_level1_1_1.setAttribute('Id','0'); + entry_level1_1_1.setAttribute('Value',''); + entry_level1_1.appendChild(entry_level1_1_1); + + + entry_level1_2 = docNode.createElement('Regions'); + entry_level1.appendChild(entry_level1_2); + entry_level1_2_1 = docNode.createElement('RegionAttributeHeaders'); + entry_level1_2.appendChild(entry_level1_2_1); + entry_level1_2_1_1 = docNode.createElement('AttributeHeaders'); + entry_level1_2_1_1.setAttribute('Name','Region'); + entry_level1_2_1_1.setAttribute('Id','9999'); + entry_level1_2_1_1.setAttribute('ColumunWidth','-1'); + entry_level1_2_1.appendChild(entry_level1_2_1_1); + + entry_level1_2_1_2 = docNode.createElement('AttributeHeaders'); + entry_level1_2_1_2.setAttribute('Name','Length'); + entry_level1_2_1_2.setAttribute('Id','9997'); + entry_level1_2_1_2.setAttribute('ColumunWidth','-1'); + entry_level1_2_1.appendChild(entry_level1_2_1_2); + + entry_level1_2_1_3 = docNode.createElement('AttributeHeaders'); + entry_level1_2_1_3.setAttribute('Name','Area'); + entry_level1_2_1_3.setAttribute('Id','9996'); + entry_level1_2_1_3.setAttribute('ColumunWidth','-1'); + entry_level1_2_1.appendChild(entry_level1_2_1_3); + + entry_level1_2_1_4 = docNode.createElement('AttributeHeaders'); + entry_level1_2_1_4.setAttribute('Name','Text'); + entry_level1_2_1_4.setAttribute('Id','9998'); + entry_level1_2_1_4.setAttribute('ColumunWidth','-1'); + entry_level1_2_1.appendChild(entry_level1_2_1_4); + + entry_level1_2_1_5 = docNode.createElement('AttributeHeaders'); + entry_level1_2_1_5.setAttribute('Name','Description'); + entry_level1_2_1_5.setAttribute('Id','1'); + entry_level1_2_1_5.setAttribute('ColumunWidth','-1'); + entry_level1_2_1.appendChild(entry_level1_2_1_5); + + % boundary + entry_level1_2_2 = docNode.createElement('Region'); + entry_level1_2.appendChild(entry_level1_2_2); + entry_level1_2_2.setAttribute('Selected','1'); + entry_level1_2_2.setAttribute('Type','1'); + entry_level1_2_2.setAttribute('Id','1'); + entry_level1_2_2.setAttribute('DisplayId','1'); + entry_level1_2_2.setAttribute('Analyze','1'); + entry_level1_2_2.setAttribute('InputRegionId','0'); + entry_level1_2_2.setAttribute('NegativeROA','0'); + entry_level1_2_2.setAttribute('Text',''); + entry_level1_2_2.setAttribute('AreaMicrons',num2str(areaM)); + entry_level1_2_2.setAttribute('LengthMicrons',num2str(lengthM)); + entry_level1_2_2.setAttribute('Area',num2str(area)); + entry_level1_2_2.setAttribute('Length',num2str(length)); + entry_level1_2_2.setAttribute('ImageFocus','0'); + entry_level1_2_2.setAttribute('ImageLocation',''); + entry_level1_2_2.setAttribute('Zoom','0.022562'); + + entry_level1_2_2_1 = docNode.createElement('Attributes'); + entry_level1_2_2.appendChild(entry_level1_2_2_1); + + entry_level1_2_2_2 = docNode.createElement('Vertices'); + entry_level1_2_2.appendChild(entry_level1_2_2_2); + + entry_level1_2_2_2_1 = docNode.createElement('Vertex'); + entry_level1_2_2_2.appendChild(entry_level1_2_2_2_1); + entry_level1_2_2_2_1.setAttribute('Y',num2str(y1)); + entry_level1_2_2_2_1.setAttribute('X',num2str(x1)); + + entry_level1_2_2_2_2 = docNode.createElement('Vertex'); + entry_level1_2_2_2.appendChild(entry_level1_2_2_2_2); + entry_level1_2_2_2_2.setAttribute('Y',num2str(y2)); + entry_level1_2_2_2_2.setAttribute('X',num2str(x2)); + + entry_level1_2_2_2_3 = docNode.createElement('Vertex'); + entry_level1_2_2_2.appendChild(entry_level1_2_2_2_3); + entry_level1_2_2_2_3.setAttribute('Y',num2str(y3)); + entry_level1_2_2_2_3.setAttribute('X',num2str(x3)); + + entry_level1_2_2_2_4 = docNode.createElement('Vertex'); + entry_level1_2_2_2.appendChild(entry_level1_2_2_2_4); + entry_level1_2_2_2_4.setAttribute('Y',num2str(y4)); + entry_level1_2_2_2_4.setAttribute('X',num2str(x4)); + + % arrow + + entry_level1_2_3 = docNode.createElement('Region'); + entry_level1_2.appendChild(entry_level1_2_3); + entry_level1_2_3.setAttribute('Selected','1'); + entry_level1_2_3.setAttribute('Type','3'); + entry_level1_2_3.setAttribute('Id','1'); + entry_level1_2_3.setAttribute('DisplayId','1'); + entry_level1_2_3.setAttribute('Analyze','1'); + entry_level1_2_3.setAttribute('InputRegionId','0'); + entry_level1_2_3.setAttribute('NegativeROA','0'); + entry_level1_2_3.setAttribute('Text',''); + entry_level1_2_3.setAttribute('AreaMicrons','0.0'); + entry_level1_2_3.setAttribute('LengthMicrons',num2str(lengthArrowM)); + entry_level1_2_3.setAttribute('Area','0.0'); + entry_level1_2_3.setAttribute('Length',num2str(lengthArrow)); + entry_level1_2_3.setAttribute('ImageFocus','0'); + entry_level1_2_3.setAttribute('ImageLocation',''); + entry_level1_2_3.setAttribute('Zoom','0.022562'); + + entry_level1_2_3_1 = docNode.createElement('Attributes'); + entry_level1_2_3.appendChild(entry_level1_2_3_1); + + entry_level1_2_3_2 = docNode.createElement('Vertices'); + entry_level1_2_3.appendChild(entry_level1_2_3_2); + + entry_level1_2_3_2_1 = docNode.createElement('Vertex'); + entry_level1_2_3_2.appendChild(entry_level1_2_3_2_1); + entry_level1_2_3_2_1.setAttribute('Y',num2str(yArrow)); + entry_level1_2_3_2_1.setAttribute('X',num2str(xArrow1)); + + entry_level1_2_3_2_2 = docNode.createElement('Vertex'); + entry_level1_2_3_2.appendChild(entry_level1_2_3_2_2); + entry_level1_2_3_2_2.setAttribute('Y',num2str(yArrow)); + entry_level1_2_3_2_2.setAttribute('X',num2str(xArrow2)); + + entry_level1_2_4 = docNode.createElement('plots'); + entry_level1_2.appendChild(entry_level1_2_4); + + xmlwrite(filename,docNode); + + % delete the first line from XML file + fid = fopen(filename, 'r') ; % Open source file. + fgetl(fid) ; % Read/discard line. + buffer = fread(fid, Inf) ; % Read rest of the file. + fclose(fid); + fid = fopen(filename, 'w') ; % Open destination file. + fwrite(fid, buffer) ; % Save to file. + fclose(fid) ; + + winopen(fullname); + % [status2,cmdout2]=system(fullname); + %[status2,cmdout2]=system(fullname,'-echo'); + success = 1; + +catch ME + error_show(ME) +end + +end + diff --git a/src/tasks/task_slider_imagescope.m b/src/tasks/task_slider_imagescope.m new file mode 100644 index 00000000..577fd519 --- /dev/null +++ b/src/tasks/task_slider_imagescope.m @@ -0,0 +1,283 @@ +function task_slider(hObj) +try + + handles = guidata(hObj); + myData = handles.myData; + taskinfo = myData.taskinfo; + calling_function = handles.myData.taskinfo.calling_function; + + display([taskinfo.task, ' called from ', calling_function]) + + switch calling_function + + case 'Load_Input_File' % Read in the taskinfo + + taskinfo_default(hObj, taskinfo) + handles = guidata(hObj); + taskinfo = handles.myData.taskinfo; + taskinfo.rotateback = 0; + case {'Update_GUI_Elements', ... + 'ResumeButtonPressed'} % Initialize task elements + + %generate WSI file and openimage scope + if strcmp(handles.myData.mode_desc,'Digital') + wsi_info = handles.myData.wsi_files{taskinfo.slot}; + wsi_scan_scale = handles.myData.settings.scan_scale; + Left = taskinfo.roi_x-(taskinfo.roi_w/2); + Top = taskinfo.roi_y-(taskinfo.roi_h/2); + exportXML_arrow(wsi_info.fullname,wsi_scan_scale, taskinfo.id,handles.myData.workdir,... + Left, Top, taskinfo.roi_w, taskinfo.roi_h); + taskinfo.rotateback = 1; + myData.taskinfo = taskinfo; + handles.myData = myData; + guidata(hObj, handles); + end + + % Load the image + taskimage_load(hObj); + handles = guidata(hObj); + + % Show management buttons + taskmgt_default(handles, 'on'); + handles = guidata(hObj); + + initvalue = 50; + slider_x = .1; + slider_y = .3; + slider_w = .6; + slider_h = .2; + position = [slider_x, slider_y, slider_w, slider_h]; + handles.slider = uicontrol(... + 'Parent', handles.task_panel, ... + 'FontSize', handles.myData.settings.FontSize, ... + 'Units', 'normalized', ... + 'HorizontalAlignment', 'center', ... + 'ForegroundColor', handles.myData.settings.FG_color, ... + 'BackgroundColor', [.95, .95, .95], ... + 'Position', position, ... + 'Style', 'slider', ... + 'Tag', 'slider', ... + 'String', 'slider_string', ... + 'Min', 0, ... + 'Max', 100, ... + 'SliderStep', [1.0/100.0, .1], ... + 'Value', initvalue, ... + 'Callback', @slider_Callback); + + position = [slider_x+slider_w+.05, slider_y, .1, .2]; + handles.editvalue = uicontrol(... + 'Parent', handles.task_panel, ... + 'FontSize', handles.myData.settings.FontSize, ... + 'Units', 'normalized', ... + 'HorizontalAlignment', 'center', ... + 'ForegroundColor', handles.myData.settings.FG_color, ... + 'BackgroundColor', [.95, .95, .95], ... + 'Position', position, ... + 'Style', 'edit', ... + 'Tag', 'editvalue', ... + 'String', num2str(initvalue), ... + 'KeyPressFcn', @editvalue_KeyPressFcn, ... + 'Callback', @editvalue_Callback); + + position = [slider_x, slider_y+slider_h, .1, .1]; + handles.textleft = uicontrol(... + 'Parent', handles.task_panel, ... + 'FontSize', handles.myData.settings.FontSize, ... + 'Units', 'normalized', ... + 'HorizontalAlignment', 'center', ... + 'ForegroundColor', handles.myData.settings.FG_color, ... + 'BackgroundColor', handles.myData.settings.BG_color, ... + 'Position', position, ... + 'Style', 'text', ... + 'Tag', 'textleft', ... + 'String', '0'); + + position = [slider_x+slider_w/2-.05, slider_y+slider_h, .1, .1]; + handles.textcenter = uicontrol(... + 'Parent', handles.task_panel, ... + 'FontSize', handles.myData.settings.FontSize, ... + 'Units', 'normalized', ... + 'HorizontalAlignment', 'center', ... + 'ForegroundColor', handles.myData.settings.FG_color, ... + 'BackgroundColor', handles.myData.settings.BG_color, ... + 'Position', position, ... + 'Style', 'text', ... + 'Tag', 'textcenter', ... + 'String', '50'); + + position = [slider_x+slider_w-.1, slider_y+slider_h, .1, .1]; + handles.textright = uicontrol(... + 'Parent', handles.task_panel, ... + 'FontSize', handles.myData.settings.FontSize, ... + 'Units', 'normalized', ... + 'HorizontalAlignment', 'center', ... + 'ForegroundColor', handles.myData.settings.FG_color, ... + 'BackgroundColor', handles.myData.settings.BG_color, ... + 'Position', position, ... + 'Style', 'text', ... + 'Tag', 'textright', ... + 'String', '100'); + + position = [slider_x+slider_w+.05, slider_y+slider_h, .1, .1]; + handles.textscore = uicontrol(... + 'Parent', handles.task_panel, ... + 'FontSize', handles.myData.settings.FontSize, ... + 'Units', 'normalized', ... + 'HorizontalAlignment', 'center', ... + 'ForegroundColor', handles.myData.settings.FG_color, ... + 'BackgroundColor', handles.myData.settings.BG_color, ... + 'Position', position, ... + 'Style', 'text', ... + 'Tag', 'textright', ... + 'String', 'Score'); + + uicontrol(handles.editvalue); + + case {'NextButtonPressed', ... + 'PauseButtonPressed',... + 'Backbutton_Callback'} % Clean up the task elements + + % Hide image and management buttons + taskmgt_default(handles, 'off'); + handles = guidata(hObj); + set(handles.iH,'visible','off'); + set(handles.ImageAxes,'visible','off'); + delete(handles.slider); + delete(handles.editvalue); + delete(handles.textleft); + delete(handles.textcenter); + delete(handles.textright); + delete(handles.textscore); + handles = rmfield(handles, 'slider'); + handles = rmfield(handles, 'editvalue'); + handles = rmfield(handles, 'textleft'); + handles = rmfield(handles, 'textcenter'); + handles = rmfield(handles, 'textright'); + handles = rmfield(handles, 'textscore'); + + taskimage_archive(handles); + + case 'Save_Results' % Save the results for this task + + fprintf(taskinfo.fid, [... + taskinfo.task, ',', ... + taskinfo.id, ',', ... + num2str(taskinfo.order), ',', ... + num2str(taskinfo.slot), ',',... + num2str(taskinfo.roi_x), ',',... + num2str(taskinfo.roi_y), ',', ... + num2str(taskinfo.roi_w), ',', ... + num2str(taskinfo.roi_h), ',', ... + num2str(taskinfo.img_w), ',', ... + num2str(taskinfo.img_h), ',', ... + taskinfo.text, ',', ... + num2str(taskinfo.moveflag), ',', ... + num2str(taskinfo.zoomflag), ',', ... + taskinfo.q_op1, ',', ... + taskinfo.q_op2, ',', ... + taskinfo.q_op3, ',', ... + taskinfo.q_op4, ',', ... + num2str(taskinfo.duration), ',', ... + num2str(taskinfo.score)]); + fprintf(taskinfo.fid,'\r\n'); + + end + + % Update handles.myData.taskinfo and pack + myData.taskinfo = taskinfo; + handles.myData = myData; + guidata(hObj, handles); + +catch ME + error_show(ME) +end +end + +function slider_Callback(hObj, eventdata) +try + + handles = guidata(findobj('Tag','GUI')); + taskinfo = handles.myData.tasks_out{handles.myData.iter}; + + set(handles.slider, 'BackgroundColor', [.95, .95, .95]); + + score = round(get(hObj, 'Value')); + set(handles.editvalue, 'String', num2str(score)); + set(handles.NextButton, 'Enable', 'on'); + uicontrol(handles.NextButton); + + taskinfo.score = score; + handles.myData.tasks_out{handles.myData.iter} = taskinfo; + guidata(handles.GUI, handles); + +catch ME + error_show(ME) +end + +end + +function editvalue_KeyPressFcn(hObj, eventdata) +try + %-------------------------------------------------------------------------- + % When the text box is non-empty, the user can continue + %-------------------------------------------------------------------------- + handles = guidata(findobj('Tag','GUI')); + editvalue_string = eventdata.Key; + + set(handles.slider, ... + 'BackgroundColor', handles.myData.settings.BG_color); + + desc_digits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ... + 'delete', 'return', 'backspace'}; + test = max(strcmp(editvalue_string, desc_digits)); + if test + set(handles.NextButton,'Enable','on'); + + else + desc = 'Input should be an integer'; + h_errordlg = errordlg(desc,'Application error','modal'); + uiwait(h_errordlg) + + score = round(get(hObj, 'Value')); + set(handles.editvalue, 'String', num2str(score)); + set(handles.NextButton, 'Enable', 'off'); + uicontrol(handles.editvalue); + + return + end + +catch ME + error_show(ME) +end + +end + +function editvalue_Callback(hObj, eventdata) + handles = guidata(findobj('Tag','GUI')); + taskinfo = handles.myData.tasks_out{handles.myData.iter}; + + score = str2double(get(handles.editvalue, 'String')); + + if score > 100 + score = 100; + set(handles.editvalue, 'String', '100'); + set(handles.slider, 'Value', 100); + elseif score < 0 + score = 0; + set(handles.editvalue, 'String', '0'); + set(handles.slider, 'Value', 0); + end + + set(handles.slider, ... + 'BackgroundColor', [.95, .95, .95], ... + 'Value', score); + set(handles.NextButton,'Enable','on'); + uicontrol(handles.NextButton); + + % Pack the results + taskinfo.score = score; + handles.myData.tasks_out{handles.myData.iter} = taskinfo; + guidata(handles.GUI, handles); + +end +