diff --git a/src/Flowcytometer_matlab _code/flowcytometergui.fig b/src/Flowcytometer_matlab _code/flowcytometergui.fig new file mode 100644 index 0000000..d449117 Binary files /dev/null and b/src/Flowcytometer_matlab _code/flowcytometergui.fig differ diff --git a/src/Flowcytometer_matlab _code/flowcytometergui.m b/src/Flowcytometer_matlab _code/flowcytometergui.m new file mode 100644 index 0000000..c9ae7ec --- /dev/null +++ b/src/Flowcytometer_matlab _code/flowcytometergui.m @@ -0,0 +1,217 @@ +function varargout = flowcytometergui(varargin) +% FLOWCYTOMETERGUI MATLAB code for flowcytometergui.fig +% FLOWCYTOMETERGUI, by itself, creates a new FLOWCYTOMETERGUI or raises the existing +% singleton*. +% +% H = FLOWCYTOMETERGUI returns the handle to a new FLOWCYTOMETERGUI or the handle to +% the existing singleton*. +% +% FLOWCYTOMETERGUI('CALLBACK',hObject,eventData,handles,...) calls the local +% function named CALLBACK in FLOWCYTOMETERGUI.M with the given input arguments. +% +% FLOWCYTOMETERGUI('Property','Value',...) creates a new FLOWCYTOMETERGUI or raises the +% existing singleton*. Starting from the left, property value pairs are +% applied to the GUI before flowcytometergui_OpeningFcn gets called. An +% unrecognized property name or invalid value makes property application +% stop. All inputs are passed to flowcytometergui_OpeningFcn via varargin. +% +% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one +% instance to run (singleton)". +% +% See also: GUIDE, GUIDATA, GUIHANDLES + +% Edit the above text to modify the response to help flowcytometergui + +% Last Modified by GUIDE v2.5 09-Jul-2018 11:27:06 + +% Begin initialization code - DO NOT EDIT +gui_Singleton = 1; +gui_State = struct('gui_Name', mfilename, ... + 'gui_Singleton', gui_Singleton, ... + 'gui_OpeningFcn', @flowcytometergui_OpeningFcn, ... + 'gui_OutputFcn', @flowcytometergui_OutputFcn, ... + 'gui_LayoutFcn', [] , ... + 'gui_Callback', []); +if nargin && ischar(varargin{1}) + gui_State.gui_Callback = str2func(varargin{1}); +end + +if nargout + [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); +else + gui_mainfcn(gui_State, varargin{:}); +end +% End initialization code - DO NOT EDIT + + +% --- Executes just before flowcytometergui is made visible. +function flowcytometergui_OpeningFcn(hObject, eventdata, handles, varargin) +% This function has no output args, see OutputFcn. +% hObject handle to figure +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +% varargin command line arguments to flowcytometergui (see VARARGIN) + +% Choose default command line output for flowcytometergui +handles.output = hObject; +s = serial('COM12'); +set(s,'BaudRate',57600); set(s,'Terminator','#'); +set(s,'Timeout',30); % s.RecordName = 'CytoSerialTxnLog.txt'; +fopen(s); % record(s); +handles.s = s; + +msg=strcat(datestr(clock,'yyyy-mm-dd-HHMM'),'m',datestr(clock,'ss'),'s'); +fid = fopen(strcat(msg,'.txt'),'w'); +handles.fid = fid; +if (fid == -1) + disp('could not open logging file. You probably need to change working directory to the one where the MATLAB file is located.'); + return; +end +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Start cam +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +tic +fprintf(fid, '\r\nStarting camera...'); +% choose which webcam (winvideo-1) and which mode (YUY2_176x144) +%vid = videoinput('winvideo', 1, 'RGB32_744x480'); +vid = videoinput('winvideo', 2, 'RGB24_640x480'); +% Configure the object for manual trigger mode. +triggerconfig(vid, 'manual'); +% only capture one frame per trigger, we are not recording a video +vid.FramesPerTrigger = 1; +% output would image in RGB color space +vid.ReturnedColorspace = 'rgb'; +% tell matlab to start the webcam on user request, not automatically +triggerconfig(vid, 'manual'); +% we need this to know the image height and width +vidRes = get(vid, 'VideoResolution'); +% image width +imWidth = vidRes(1); +% image height +imHeight = vidRes(2); +% number of bands of our image (should be 3 because it's RGB) +nBands = get(vid, 'NumberOfBands'); +% create an empty image container and show it on axPreview +hImage = image(zeros(imHeight, imWidth, nBands), 'parent', handles.axPreview); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% do auto white balance +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +src = getselectedsource(vid); +% src.BalanceWhiteAuto = 'Continuous'; +% begin the webcam preview +currzpos = 0; +preview(vid, hImage); +% expose the objects so we can handle them in other functions +handles.vid = vid; +handles.src = src; +handles.currz = currzpos; +guidata(hObject,handles); +%start(vid); +drawnow; + +% % set and display the exposure +% src.ExposureTime = 360; +%set(handles.expDisp,'string', src.ExposureTime ); +Time_to_init_cam = toc + +% Update handles structure +guidata(hObject, handles); + +% UIWAIT makes flowcytometergui wait for user response (see UIRESUME) +% uiwait(handles.figure1) + +% --- Outputs from this function are returned to the command line. +function varargout = flowcytometergui_OutputFcn(hObject, eventdata, handles) +% varargout cell array for returning output args (see VARARGOUT); +% hObject handle to figure +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Get default command line output from handles structure +varargout{1} = handles.output; + + +% --- Executes on button press in autofocus. +function autofocus_Callback(hObject, eventdata, handles) +% hObject handle to autofocus (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +s = handles.s; vid = handles.vid; currzpos = handles.currz; +[~, ~, ~] = focusstack_1(s,vid,currzpos);pause(2) + + + + +% --- Executes on button press in moveleft. +function moveleft_Callback(hObject, eventdata, handles) +% hObject handle to moveleft (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +s = handles.s; fprintf(s,'A') + + +% --- Executes on button press in moveright. +function moveright_Callback(hObject, eventdata, handles) +% hObject handle to moveright (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +s = handles.s; fprintf(s,'D') + + +% --- Executes on button press in snapshot. +function snapshot_Callback(hObject, eventdata, handles) +% hObject handle to snapshot (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +vid = handles.vid; +snapshot = getsnapshot(vid); +imwrite(snapshot,'snap.jpg') + +function figure1_DeleteFcn(hObject, eventdata, handles) +% hObject handle to figure1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +if ~isempty(instrfind) + fclose(instrfind); + delete(instrfind); +end + +try + fid=handles.fid; fclose(fid); + vid = handles.vid; stoppreview(vid); delete(vid); +catch + clear all; + clc; +end + +%s=handles.s; fclose(s); delete(s); +disp('Killed all before exiting'); + + +% --- Executes on button press in startvid. +function startvid_Callback(hObject, eventdata, handles) +% hObject handle to startvid (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +vid = handles.vid; +vid_trigger = 1; handles.vid_trigger = vid_trigger; +for x=1:1000 + snap = getsnapshot(vid) + imwrite(strcat('Image_',num2str(x),'.jpg'),snap) +end +% aviObject = VideoWriter('newfile.avi','Motion JPEG AVI'); handles.aviObject = aviObject; +% open(aviObject); +% while(vid_trigger == 1) +% snap = getsnapshot(vid); +% writeVideo(aviObject,snap); +% end + +% --- Executes on button press in stopvid. +function stopvid_Callback(hObject, eventdata, handles) +% hObject handle to stopvid (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +aviObject = handles.aviObject; +handles.vid_trigger = 0; +close(aviObject); diff --git a/src/Flowcytometer_matlab _code/focusplane_4.m b/src/Flowcytometer_matlab _code/focusplane_4.m new file mode 100644 index 0000000..fb9151c --- /dev/null +++ b/src/Flowcytometer_matlab _code/focusplane_4.m @@ -0,0 +1,263 @@ +clear;clc; +disp('Scan Inializing........') +tic; +t1 = toc; +s = serial('COM3'); +set(s,'BaudRate',57600); set(s,'Terminator','#'); +set(s,'Timeout',30); %s.RecordName = 'CytoSerialTxnLog.txt'; +fopen(s); %recweblistord(s); +msg=strcat(datestr(clock,'yyyy-mm-dd-HHMM'),'m',datestr(clock,'ss'),'s'); +fid = fopen(strcat(msg,'.txt'),'w'); +if (fid == -1) + disp('could not open logging file. You probably need to change working directory to the one where the MATLAB file is located.'); + return; +end +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Start cam +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +tic +disp('\r\nStarting camera...') +fprintf(fid, '\r\nStarting camera...'); +% choose which webcam (winvideo-1) and which mode (YUY2_176x144) +%vid = videoinput('winvideo', 1, 'RGB32_744x480'); +vid = videoinput('gentl', 1, 'BGRA8Packed'); +% Configure the object for manual trigger mode. +triggerconfig(vid, 'manual'); +% only capture one frame per trigger, we are not recording a video +vid.FramesPerTrigger = 1; +% output would image in RGB color space +vid.ReturnedColorspace = 'rgb'; +% tell matlab to start the webcam on user request, not automatically +triggerconfig(vid, 'manual'); +% we need this to know the image height and width +vidRes = get(vid, 'VideoResolution'); +% image width +imWidth = vidRes(1); +% image height +imHeight = vidRes(2); +% number of bands of our image (should be 3 because it's RGB) +nBands = get(vid, 'NumberOfBands'); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% do auto white balance +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +src = getselectedsource(vid); +src.BalanceWhiteAuto = 'Continuous'; + +src.ExposureTime = 800; +start(vid); +Time_to_init_cam = toc + +% this is the slide name +setslidename = 'Slide'; + + +fprintf(s,'J');currxpos = 0; +fprintf(s,'K');currypos = 0; +fprintf(s,'L');currzpos = 0; +pause(0.1); +disp('Origin is set'); + +xFoV = round(1280*5.3/(34*0.159));yFoV = round(1024*5.3/(34*0.159)); +xFoV_mm = 0.1995;yFoV_mm = 0.1596; + +XPulseRate = 38400; YPulseRate = 38400 ; +Xzadjustdelay = 0.002; +autoContrTime = 0.1; +XImDelay = (xFoV / XPulseRate) ; +YImDelay = (yFoV / YPulseRate) ; +%at y = 12.5mm line +Ypos = strcat('+',sprintf('%06d',abs(41359))); +fprintf(s,'N'); fprintf(s,Ypos);pause(41359/YPulseRate);currypos=41359; +param_y0 =[];Zval=[]; +xpos1 = 0; xpos2 = 200000; +[currzpos, temp_var] = focusstack_1(s,vid,currzpos);pause(2) +tf1 = toc; +for xpos = xpos1:17986:xpos2 + Xpos = strcat('+',sprintf('%06d',abs(xpos ))); + fprintf(s,'B'); fprintf(s,Xpos);pause(17986/XPulseRate) + [currzpos, temp_var] = focusstack_2(s,vid,currzpos); + Zval = [Zval currzpos]; + snapshot=getsnapshot(vid); + disp('saving best focussed snapshot..') + imwrite(snapshot,strcat('images/finding_best_region/t7/t7_x_',Xpos,'_',sprintf('%06d',abs(currzpos)),'.bmp')); + param_y0 = [param_y0 parameter(snapshot)]; currxpos = xpos; +end +disp(toc-tf1) +xpos = xpos1:17986:xpos2; +[max_param_y0, Index] = max(param_y0); +xbest1 = abs(xpos(Index)); +Xbest1 = strcat('+',sprintf('%06d',xbest1)); +fprintf(s,'B'); fprintf(s,Xpos);pause(abs(currxpos-xbest1)/XPulseRate) +Zfoc1 = Zval(Index);gotoZ(s,Zfoc1,currzpos);currzpos=Zfoc1;param_y1 = []; Zval=[]; +tf2 =toc; +if(xbest1 <= 17986) + for xpos = (xbest1):7194:(xbest1+17986*2) + Xpos = strcat('+',sprintf('%06d',abs(xpos ))); + fprintf(s,'B'); fprintf(s,Xpos);pause(17986/XPulseRate) + [currzpos, temp_var] = focusstack_2(s,vid,currzpos); + Zval = [Zval currzpos]; + snapshot=getsnapshot(vid); + disp('saving best focussed snapshot..') + imwrite(snapshot,strcat('images/finding_best_region/t7/t7_x_',Xpos,'_',sprintf('%06d',abs(currzpos)),'.bmp')); + param_y1 = [param_y1 parameter(snapshot)]; currxpos = xpos; + end +elseif(xbest1>=200000) + for xpos = (xbest1-17986*2):7194:(xbest1) + Xpos = strcat('+',sprintf('%06d',abs(xpos ))); + fprintf(s,'B'); fprintf(s,Xpos);pause(17986/XPulseRate) + [currzpos, temp_var] = focusstack_2(s,vid,currzpos); + Zval = [Zval currzpos]; + snapshot=getsnapshot(vid); + disp('saving best focussed snapshot..') + imwrite(snapshot,strcat('images/finding_best_region/t7/t7_x_',Xpos,'_',sprintf('%06d',abs(currzpos)),'.bmp')); + param_y1 = [param_y1 parameter(snapshot)]; currxpos = xpos; + end +else + for xpos = (xbest1-17986):7194:(xbest1+17986) + Xpos = strcat('+',sprintf('%06d',abs(xpos ))); + fprintf(s,'B'); fprintf(s,Xpos);pause(17986/XPulseRate) + [currzpos, temp_var] = focusstack_2(s,vid,currzpos); + Zval = [Zval currzpos]; + snapshot=getsnapshot(vid); + disp('saving best focussed snapshot..') + imwrite(snapshot,strcat('images/finding_best_region/t7/t7_x_',Xpos,'_',sprintf('%06d',abs(currzpos)),'.bmp')); + param_y1 = [param_y1 parameter(snapshot)]; currxpos = xpos; + end +end +disp(toc-tf2) +xpos = (xbest1-17896):7194:(xbest1+17896); +param_y1 = (param_y1>0.0999);disp(param_y1) +target1 = sum(param_y1(1:3)); target2 = sum(param_y1(3:5)); +fprintf(s,'N'); fprintf(s,'0000000');pause(abs(41359)/YPulseRate); +tf3=toc; +if((sum(param_y1(2:4))==3)) + xbest2 = xpos(2);xbest1 = xpos(4); + Xbest2 = strcat('+',sprintf('%06d',xbest2)); + Xbest1 = strcat('+',sprintf('%06d',xbest1)); + fprintf(s,'B'); fprintf(s,Xbest1);pause((abs(currxpos-xbest1))/XPulseRate);gotoZ(s,Zval(4),currzpos);currzpos=Zval(4);fprintf(s,'R'); + fprintf(s,'B'); fprintf(s,Xbest2);pause((abs(17986))/XPulseRate);gotoZ(s,Zval(2),currzpos);currzpos=Zval(2);fprintf(s,'E');currxpos = xbest2; + fprintf(s,'N'); fprintf(s,'0078719');pause(abs(78719)/YPulseRate);currypos = 78719; + [currzpos, temp_var] = focusstack_2(s,vid,currzpos);fprintf(s,'Y'); + fprintf(s,'Z'); + xA = xbest2; xB = xbest1; + yC = 78719; yB =0; + numofX = (xB - xA) / xFoV; + numofY = (yC - yB) / yFoV; + while fscanf(s) ~= 'S' + end; + % NOW TAKING PICTURES + rowcount = 0; + filecount = 0; + + msg = '\r\n Starting image capture ...'; + fprintf(fid, msg); + + % Dircn = false; %We believe we start from top + while(rowcount <= numofY) + while(filecount <= numofX) + %pause(XImDelay*2); + snapshot=getsnapshot(vid); + %enh_snapshot=autocontrast(snapshot); + filename = strcat(setslidename,'_',num2str(rowcount),'-',num2str(filecount), '.bmp'); + %imwrite(enh_snapshot,filename); + imwrite(snapshot,strcat('images/',filename)); + filecount = filecount + 1; + end + % wait for shift by one FoV in Y direction + filecount = 0; + %pause(YImDelay*2); + rowcount = rowcount + 1; + end +elseif(target1>target2) + xbest2 = xpos(1);xbest1 = xpos(3); + Xbest2 = strcat('+',sprintf('%06d',xbest2)); + Xbest1 = strcat('+',sprintf('%06d',xbest1)); + fprintf(s,'B'); fprintf(s,Xbest1);pause((abs(currxpos-xbest1))/XPulseRate);gotoZ(s,Zval(3),currzpos);currzpos=Zval(3);fprintf(s,'R'); + fprintf(s,'B'); fprintf(s,Xbest2);pause((abs(17986))/XPulseRate);gotoZ(s,Zval(1),currzpos);currzpos=Zval(1);fprintf(s,'E');currxpos = xbest2; + fprintf(s,'N'); fprintf(s,'0078719');pause(abs(78719)/YPulseRate);currypos = 78719; + [currzpos, temp_var] = focusstack_2(s,vid,currzpos);fprintf(s,'Y'); + fprintf(s,'Z'); + xA = xbest2; xB = xbest1; + yC = 78719; yB =0; + numofX = (xB - xA) / xFoV; + numofY = (yC - yB) / yFoV; + while fscanf(s) ~= 'S' + end; + % NOW TAKING PICTURES + rowcount = 0; + filecount = 0; + + msg = '\r\n Starting image capture ...'; + fprintf(fid, msg); + + % Dircn = false; %We believe we start from top + while(rowcount <= numofY) + while(filecount <= numofX) + %pause(XImDelay*2); + snapshot=getsnapshot(vid); + %enh_snapshot=autocontrast(snapshot); + filename = strcat(setslidename,'_',num2str(rowcount),'-',num2str(filecount), '.bmp'); + %imwrite(enh_snapshot,filename); + imwrite(snapshot,strcat('images/',filename)); + filecount = filecount + 1; + end + % wait for shift by one FoV in Y direction + filecount = 0; + %pause(YImDelay*2); + rowcount = rowcount + 1; + end +elseif(target1 crude_max_var) + crude_max_var = crude_curr_var; + crude_loc_max_var = crude_curr_loc; + end + % update loc + crude_curr_loc = crude_curr_loc + crude_step_count ; + fprintf(s,'G');pause(0.1) + %gotoZ(s,crude_curr_loc,currzpos); + currzpos=crude_curr_loc; + end + disp(currzpos) + disp(crude_loc_max_var) + crude_pulse_count = round(abs(crude_loc_max_var - currzpos)/200); + for i=1: crude_pulse_count + if(currzpos>crude_loc_max_var) + fprintf(s,'T');pause(0.1) + currzpos = currzpos - 200; + elseif(currzpos crude_max_var) + crude_max_var = crude_curr_var; + crude_loc_max_var = crude_curr_loc; + end + % update loc + crude_curr_loc = crude_curr_loc + crude_step_count ; + gotoZ(s,crude_curr_loc,currzpos); currzpos=crude_curr_loc; + end + gotoZ(s,crude_loc_max_var,currzpos);currzpos=crude_loc_max_var; + + % fINECRUDE AF. + Z_travel_for_crude = 500; crude_step_count = 50; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + crude_pulse_count = Z_travel_for_crude / crude_step_count; + crude_max_var=0; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % go to starting Z loc (we've hit limit switch via arduino already so its z=0) + crude_start_loc = currzpos- (Z_travel_for_crude/2); + gotoZ(s,crude_start_loc,currzpos);currzpos=crude_start_loc; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % now keep going up and taking var + crude_curr_loc = crude_start_loc; + + for i=1: crude_pulse_count + % variance + crude_img = double(getsnapshot(vid)); crude_curr_var=var(crude_img(:)); + + if (crude_curr_var > crude_max_var) + crude_max_var = crude_curr_var; + crude_loc_max_var = crude_curr_loc; + end + % update loc + crude_curr_loc = crude_curr_loc + crude_step_count ; + gotoZ(s,crude_curr_loc,currzpos);currzpos=crude_curr_loc; + end + gotoZ(s,crude_loc_max_var,currzpos);currzpos=crude_loc_max_var; + + % The fine AF begins here + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + Ztotaltravel = 100; final_go_backpulses = 0 ; + currZ = crude_loc_max_var; + + % first go above + start_above_loc = currZ- (Ztotaltravel/2); + gotoZ(s,start_above_loc,currzpos);currzpos=start_above_loc; + + % now build the var array + localAF_loc_array = zeros(1,Ztotaltravel); localAF_var_array = zeros(1,Ztotaltravel); + localAF_curr_loc = start_above_loc; + for q=1:(Ztotaltravel/5) + % location + localAF_loc_array(q) = localAF_curr_loc; + % variance + localAF_img = double(getsnapshot(vid)); localAF_var_array(q)=var(localAF_img(:)); + + % move and update loc + localAF_curr_loc = localAF_curr_loc + 5; gotoZ(s,localAF_curr_loc,currzpos); + currzpos=localAF_curr_loc; + end + + % Finally go to the max var location + index_of_max_var = localAF_var_array == max(localAF_var_array); + loc_of_max_var = localAF_loc_array(index_of_max_var) - final_go_backpulses ; + gotoZ(s,loc_of_max_var,currzpos); currzpos=loc_of_max_var; + Zval = loc_of_max_var; + Variance = max(localAF_var_array); + t2 = toc; + disp(t2-t1) +end \ No newline at end of file diff --git a/src/Flowcytometer_matlab _code/focusstack_3.m b/src/Flowcytometer_matlab _code/focusstack_3.m new file mode 100644 index 0000000..88cc9e5 --- /dev/null +++ b/src/Flowcytometer_matlab _code/focusstack_3.m @@ -0,0 +1,60 @@ +function [Zval, Variance] = focusstack_3(s,vid,z) + t1 = toc;currzpos=z; + % fINECRUDE AF. + Z_travel_for_crude = 1000; crude_step_count = 50; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + crude_pulse_count = Z_travel_for_crude / crude_step_count; + crude_max_var=0; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % go to starting Z loc (we've hit limit switch via arduino already so its z=0) + crude_start_loc = z - (Z_travel_for_crude/2); + gotoZ(s,crude_start_loc,currzpos); currzpos=crude_start_loc; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % now keep going up and taking var + crude_curr_loc = crude_start_loc; + + for i=1: crude_pulse_count + % variance + crude_img = double(getsnapshot(vid)); crude_curr_var=var(crude_img(:)); + + if (crude_curr_var > crude_max_var) + crude_max_var = crude_curr_var; + crude_loc_max_var = crude_curr_loc; + end + % update loc + crude_curr_loc = crude_curr_loc + crude_step_count ; + gotoZ(s,crude_curr_loc,currzpos); currzpos=crude_curr_loc; + end + gotoZ(s,crude_loc_max_var,currzpos);currzpos=crude_loc_max_var; + + % The fine AF begins here + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + Ztotaltravel = 100; final_go_backpulses = 0 ; + currZ = crude_loc_max_var; + + % first go above + start_above_loc = currZ - (Ztotaltravel/2); + gotoZ(s,start_above_loc,currzpos);currzpos=start_above_loc; + % now build the var array + localAF_loc_array = zeros(1,Ztotaltravel); localAF_var_array = zeros(1,Ztotaltravel); + localAF_curr_loc = start_above_loc; + for q=1:(Ztotaltravel/5) + % location + localAF_loc_array(q) = localAF_curr_loc; + % variance + localAF_img = double(getsnapshot(vid)); localAF_var_array(q)=var(localAF_img(:)); + + % move and update loc + localAF_curr_loc = localAF_curr_loc + 5; gotoZ(s,localAF_curr_loc,currzpos); + currzpos=localAF_curr_loc; + end + + % Finally go to the max var location + index_of_max_var = localAF_var_array == max(localAF_var_array); + loc_of_max_var = localAF_loc_array(index_of_max_var) - final_go_backpulses ; + gotoZ(s,loc_of_max_var,currzpos);currzpos=loc_of_max_var; + Zval = loc_of_max_var; + Variance = max(localAF_var_array); + t2 = toc; + disp(t2-t1) +end \ No newline at end of file diff --git a/src/Flowcytometer_matlab _code/gotoZ.m b/src/Flowcytometer_matlab _code/gotoZ.m new file mode 100644 index 0000000..104851f --- /dev/null +++ b/src/Flowcytometer_matlab _code/gotoZ.m @@ -0,0 +1,14 @@ +function gotoZ(s,check,currzpos) + ZPulseRate = 38400; + if(check<200000 && check>-200000) + str = sprintf('%06d',abs(round(check))); % abs needed so that no +&- in neg numbers + if((check) < 0) + newstr = strcat('-',str); + else + newstr = strcat('+',str); + end + disp(strcat('moving to position:',newstr)) + % end formatting ---------- -------------------------------------------- + fprintf(s,'M'); fprintf(s, newstr ); pause(0.035); + end +end \ No newline at end of file diff --git a/src/Flowcytometer_matlab _code/parameter.m b/src/Flowcytometer_matlab _code/parameter.m new file mode 100644 index 0000000..775c194 --- /dev/null +++ b/src/Flowcytometer_matlab _code/parameter.m @@ -0,0 +1,21 @@ +function param = parameter(image) + t1 = toc; + bw = rgb2gray(image); + [Gx, Gy] = imgradientxy(bw); + %[Gmag, Gdir] = imgradient(Gx, Gy); + gradImage = rgb2gray(imfuse(Gx,Gy)); + %temp = histeq(gradImage); + threshImage = im2bw(gradImage,graythresh(gradImage)); + [~, radii] = imfindcircles(threshImage,[10 60]); + cell_area = round(sum(3.14*(radii.^2))); + bg = rgb2gray(imread('bg.jpg')); + a = histeq(bw)-bg; + level2 = graythresh(a); + bgImg = bwareaopen(im2bw(a,level2),800); + bg_pixels = sum(sum(bgImg == 1)); + fg_pixels = (1280 * 1024) - bg_pixels; + fg_pixels = fg_pixels - round(0.1*fg_pixels); + param = cell_area/fg_pixels; + t2 = toc; + disp(t2-t1) +end \ No newline at end of file diff --git a/src/Time chart .xlsx b/src/Time chart .xlsx new file mode 100644 index 0000000..6cc1f93 Binary files /dev/null and b/src/Time chart .xlsx differ diff --git a/src/cloud_codeorganization.pptx b/src/cloud_codeorganization.pptx new file mode 100644 index 0000000..76febc6 Binary files /dev/null and b/src/cloud_codeorganization.pptx differ diff --git a/src/current_GUIcode.py b/src/current_GUIcode.py new file mode 100644 index 0000000..d924327 --- /dev/null +++ b/src/current_GUIcode.py @@ -0,0 +1,744 @@ + # 1. Name of the test is always Malaria + # 2. Close button to be checked as abort button + # 3. Exceptions for network connection, camera. + + + + + #Things to be worked on: + # 1. On window closed by clicking x at top right corner, the application should terminate + + # 2. On abort button Clicked, the C++ API should be killed + + # 1. Progressbar speed increased with iterations + + # (SOLVED) 5. Setting user defined resolutions for image capture in pylon programs + + # (SOLVED) 9. Auto focus code for variance calculation + + # (SOLVED)2. Stopping/killing threads on abort + + # (SOLVED)8. Adjust time for sending data through FTP that should be by stopping or killing threads while they are sleeping .... (Same as 2) + + # (SOLVED)3. Focusing window pulse + + # (SOLVED)4. sending data for analysis in progress bar + + # (SOLVED)6. On abort, stop progress bar. + + # (SOLVED)7. Run focussing only on start up.. Ask jayesh about it.. + + # (SOLVED)1.Command line executions in os.system for basler camera acquisition +global ip1 +global ip2 +global ip3 +global batches +global numframes +batches=2 +numframes=5000 +ip1="54.191.132.121" +ip2="54.191.13.206" +ip3="52.38.126.238" +#!/usr/bin/python +import numpy +#import cv2 +#from pyfirmata import Arduino, util +from gi.repository import Gtk, GObject +import time +from time import sleep +import os +import threading +import sys +import thread +from time import sleep +global count +global x +from threading import Thread +from locale import gettext as _ +import subprocess +import ftplib +from ftplib import FTP +#import gpio +import datetime +#global Thread1 +#global Thread2 +global Acquire +Acquire = False +global ExitVLCThread +ExitVLCThread = False +global Kill +Kill=False +global SendCellDataThread +SendCellDataThread = False +import Queue +global error1 +global error2 +global error3 +global test +global f +global filename +global compress +global st +error1=0 +error2=0 +error3=0 +q=Queue.Queue(1) + +#Create a directory to acquire images. +#os.mkdir('/home/odroid/BloodAnalyser/AcquiredData/PatientInformation') +if os.path.isdir("/home/odroid/BloodAnalyser/AcquiredData/"): + os.system("rm -r /home/odroid/BloodAnalyser/AcquiredData/") +os.mkdir('/home/odroid/BloodAnalyser/AcquiredData/') +os.mkdir('/home/odroid/BloodAnalyser/AcquiredData/PatientInformation') + + +class patientID(Gtk.Window): + def __init__(self): + self.builder = Gtk.Builder() + global name + global age + #Get objects from patient ID Glade file + self.builder.add_from_file('./patientID.glade') + self.window = self.builder.get_object('entrywindow') + self.nextbutton = self.builder.get_object('button1') + self.okbutton=self.builder.get_object('okbutton') + self.name = self.builder.get_object('name') + self.age = self.builder.get_object('age') + self.entryname=self.builder.get_object('entryname') + self.entryage=self.builder.get_object('entryage') + self.entrypatientID=self.builder.get_object('entrypatientID') + #self.check_editable = Gtk.CheckButton("entryname") + + #self.entryname = Gtk.Entry() + + self.patientID = self.builder.get_object('patientID') + self.builder.connect_signals(self) + #self.entryname = Gtk.Entry() + #self.entryage = Gtk.Entry() + #self.entrypatientID = Gtk.Entry() + + #print(self.entryname.get_text()) + print('rashmi') + + self.window.show() + def on_okbutton_clicked(self,button): + global name + global age + global patientID + global st + ts=time.time() + #blood=BloodAnalyser() + st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H_%M_%S') + name=self.entryname.get_text() + age=self.entryage.get_text() + patientID=self.entrypatientID.get_text() + self.window.hide() + #filename=folder.append(st) + #filename=filename.append(".txt") + global test + test="malaria" + global filename + filename=folder+st+".txt" + + #return + + +class splashScreen(Gtk.Window): + def __init__(self): + + self.builder = Gtk.Builder() + self.builder.add_from_file('./splash.glade') + self.builder.connect_signals(self) + self.window = self.builder.get_object('applicationwindow1') + self.image1=self.builder.get_object("image1") + self.window.show() + #self.done=True + #GObject.timeout_add(5000,) + + self.window.show +class AutoFocus(Gtk.Window): + def __init__(self): + self.builder = Gtk.Builder() + self.builder.add_from_file('./AutoFocus.glade') + self.builder.connect_signals(self) + self.window = self.builder.get_object('AutoFocus_window') + self.image1=self.builder.get_object("image1") + self.autofocus_pulse=self.builder.get_object("autofocus_pulse") + + self.autofocus_start=False + #threading.Thread(target=self.UpdateImages).start() + + def pulse_invoke(self): + #self.window.show() + + try: + os.system('v4l2-ctl -c exposure_absolute=1') + os.system('mplayer tv:// driver=v4l2:device=/dev/video0') + + + blood_analyser.vlc_invoke() + #return + except: + error2=True + return error2 + + def variance(self): + try: + os.chdir('/home/odroid/BloodAnalyser/AutoFocus') + #os.system("make clean") + #os.system("source /opt/pylon4/bin/pylon-setup-env.sh /opt/pylon4") + #os.system("make") + #os.system("chmod 777 autofocus") + #os.system("ls") + + #itime=time.time() + board=Arduino('/dev/ttyACM0') + + #cap = cv2.VideoCapture(0) + n=1 + mylistForward=[] + while(n < 50): + board.digital[5].write(1) + board.digital[6].write(1) + # Capture frame-by-frame + os.system("mplayer tv:// -tv driver=v4l2:device=/dev/video0:fps=20 --frames=2 -vo png") + + # Our operations on the frame come here + + frame=cv2.imread('/home/odroid/BloodAnalyser/AutoFocus/00000002.png') + #image_file = '/home/rbccps/BloodAnalyser/AutoFocus/focus%d.png'%n + self.window.show() + + self.image1.set_from_file('/home/odroid/BloodAnalyser/AutoFocus/00000002.png') + a=numpy.var(frame) + print(a) + mylistForward.append(a) + sleep(0.1) + n=n+1 + maxMeasure=max(mylistForward) + maxMeasure = maxMeasure - 40 + cMeas=0 + n=0 + print '**************Motor Moving Backwards*******************' + while(n<50): + print("While loop entered") + if cMeas > maxMeasure: + board.digital[5].write(0) + break + board.digital[5].write(1) + board.digital[6].write(0) + + os.system("mplayer tv:// -tv driver=v4l2:device=/dev/video0:fps=20 --frames=2 -vo png") + self.image1.set_from_file('/home/odroid/BloodAnalyser/AutoFocus/00000002.png') + frame1=cv2.imread('/home/odroid/BloodAnalyser/AutoFocus/00000002.png') + cMeas=numpy.var(frame1) + print(cMeas) + n=n+1 + sleep(0.1) + board.digital[5].write(0) + + + #cv2.destroyAllWindows() + + #n=cap.release() + self.window.hide() + print(n) + # When everything done, release the capture + print("Capture released") + maxMeasure= max(mylistForward) + blood_analyser.vlc_invoke() + + #cv2.destroyAllWindows() + + except: + global error1 + print("HARDWARE MISSING") + error1=1 + return error1 + + + + def on_timeout(self, user_data): + + if self.activity_mode: + self.autofocus_pulse.pulse() + else: + new_value = self.autofocus_pulse.get_fraction() + 0.01 + + if new_value > 1: + new_value = 0 + + self.progressbar.set_fraction(new_value) + + # As this is a timeout function, return True so that it + # continues to get called + return True + + +class quit_window(Gtk.Window): + def __init__(self): + self.builder = Gtk.Builder() + os.chdir('/home/odroid/BloodAnalyser') + self.builder.add_from_file('./quit_window.glade') + self.builder.connect_signals(self) + self.window = self.builder.get_object('quit_window') + self.finishbutton = self.builder.get_object('finishbutton') + self.another_testbutton = self.builder.get_object('another_testbutton') + + + + def show_screen(self): + self.window.show() + + + def on_finishbutton_activate(self, widget): + os.system('rm ./celldata.zip') + os.system('rm -r ./AcquiredData') + os.system('mkdir ./AcquiredData') + Gtk.main_quit() + + + def on_another_testbutton_activate(self,widget): + #os.system('rm ./celldata.zip') + #os.system('rm -r ./AcquiredData') + #os.system('mkdir ./AcquiredData') + print "ANother test selected" + self.progressbar.set_fraction(0.0) + self.timeout_id = GObject.timeout_add(False, self.on_timeout,None) + + blood_analyser.start.set_label("START TEST") + blood_analyser = BloodAnalyser() + #splScr = splashScreen() + patient_ID=patientID() + Gtk.main() + + + + + +class BloodAnalyser(Gtk.Window): + + def __init__(self): + global count + count=0 + global x + x=0 + self.builder = Gtk.Builder() + self.builder.add_from_file('./bloodAnalyser.glade') + self.builder.connect_signals(self) + self.window = self.builder.get_object('window1') + self.window.show() + + + self.infectious_disease = self.builder.get_object("infectious_disease") + self.hamatological_disorder =self.builder.get_object("hematological") + self.completebloodcount = self.builder.get_object("completebloodcount") + self.malaria = self.builder.get_object("malaria") + self.dengue = self.builder.get_object("dengue") + self.tuberculosis = self.builder.get_object("tuberculosis") + self.spherocytosis = self.builder.get_object("spherocytosis") + self.sicklecellanemia=self.builder.get_object("sicklecellanemia") + self.hereditaryelliptocytosis=self.builder.get_object("hereditaryelliptocytosis") + self.start = self.builder.get_object("start") + self.progressbar = self.builder.get_object("progressbar") + self.image1=self.builder.get_object("image1") + self.image2=self.builder.get_object("image2") + + self.malaria.set_sensitive(True) + self.dengue.set_sensitive(True) + self.tuberculosis.set_sensitive(True) + self.spherocytosis.set_sensitive(False) + self.sicklecellanemia.set_sensitive(False) + self.hereditaryelliptocytosis.set_sensitive(False) + + + def on_infectiousdisease_toggled(self, button): + if button.get_active(): + print "infectious" + self.malaria.set_sensitive(True) + self.dengue.set_sensitive(True) + self.tuberculosis.set_sensitive(True) + self.spherocytosis.set_sensitive(False) + self.sicklecellanemia.set_sensitive(False) + self.hereditaryelliptocytosis.set_sensitive(False) + + + #print "infectious" + + def on_hematological_toggled(self, button): + if button.get_active(): + print "hematology" + self.spherocytosis.set_sensitive(True) + self.sicklecellanemia.set_sensitive(True) + self.hereditaryelliptocytosis.set_sensitive(True) + self.malaria.set_sensitive(False) + self.dengue.set_sensitive(False) + self.tuberculosis.set_sensitive(False) + + + def on_completebloodcount_toggled(self, button): + global test + test="Complete Blood Count" + print "blood count" + self.spherocytosis.set_sensitive(False) + self.sicklecellanemia.set_sensitive(False) + self.hereditaryelliptocytosis.set_sensitive(False) + self.malaria.set_sensitive(False) + self.dengue.set_sensitive(False) + self.tuberculosis.set_sensitive(False) + self.hereditaryelliptocytosis.set_sensitive(False) + + def on_malaria_toggled(self, widget): + + if malaria.get_active(): + global test + test="Malaria" + print "on" + #else: + # print "off" + def on_hereditaryelliptocytosis_toggled(self, widget): + if hereditaryelliptocytosis.get_active(): + print "hereditaryelliptocytosis" + global test + test="hereditaryelliptocytosis" + + def on_timeout_thread_end(self, user_data): + global error1 + global error2 + global error3 + global filename + # Error handling if the Motor pulse giving Arduino board is missing + if error1==1: + dialog = Gtk.MessageDialog(None, 0, Gtk.MessageType.WARNING, Gtk.ButtonsType.OK, "Error!") + dialog.format_secondary_text("Required hardware missing!.. Cannot run application") + response = dialog.run() + + self.progressbar.set_fraction(0.0) + self.timeout_id = GObject.timeout_add(False, self.on_timeout,None) + if response == Gtk.ResponseType.OK: + self.window.close() + dialog.destroy() + self.window.hide() + Gtk.main_quit() + # Error handling if the camera is not operating properly + elif error2==1: + dialog = Gtk.MessageDialog(None, 0, Gtk.MessageType.WARNING, Gtk.ButtonsType.OK, "Error!") + dialog.format_secondary_text("Camera interface not found!.. Cannot run application") + response = dialog.run() + + self.progressbar.set_fraction(0.0) + self.timeout_id = GObject.timeout_add(False, self.on_timeout,None) + if response == Gtk.ResponseType.OK: + self.window.close() + dialog.destroy() + self.window.hide() + Gtk.main_quit() + + elif error3==1: + dialog = Gtk.MessageDialog(None, 0, Gtk.MessageType.WARNING, Gtk.ButtonsType.OK, "Sending Data Error!") + dialog.format_secondary_text("Cannot send data.") + response = dialog.run() + + self.progressbar.set_fraction(0.0) + self.timeout_id = GObject.timeout_add(False, self.on_timeout,None) + if response == Gtk.ResponseType.OK: + self.window.close() + dialog.destroy() + self.window.hide() + Gtk.main_quit() + sys.exit() + + else: + if self.Thread1.is_alive(): + test_ended = False + + else: + test_ended = True + text="Finished Sending Data !" + + # text="Data Sent for Analysis" + self.progressbar.set_text(text) + self.activity=False + #print("send_data status=%s",SendCellDataThread) + self.progressbar.set_fraction(0.0) + self.timeout_id = GObject.timeout_add(1, self.on_timeout,None) + + + + #self.progressbar.set_fraction(0.0) + GObject.source_remove(self.timeout_id) + dialog = Gtk.MessageDialog(None, 0, Gtk.MessageType.WARNING, Gtk.ButtonsType.YES_NO, "Test Complete !") + dialog.format_secondary_text("Do you want to run another test?") + response = dialog.run() + if response == Gtk.ResponseType.YES: + dialog.destroy() + self.window.hide() + Gtk.main_quit() + + + + dialog.destroy() + if response == Gtk.ResponseType.NO: + dialog.destroy() + #os.system('rm ./celldata.zip') + + dialog.destroy() + self.window.hide() + Gtk.main_quit() + sys.exit() + + + return False + return True + + + #print("Button", "was turned", state) + def on_start_clicked(self, widget): + global count + global ExitVLCThread + global Acquire + global Kill + global SendCellDataThread + global test + global st + global name + global age + global patientID + global filename + folder=("/home/odroid/BloodAnalyser/AcquiredData/") + #filename=folder.append(st) + #filename=filename.append(".txt") + filename=folder+'PatientInformation'+".txt" + f = open(filename,"w") #opens file with name of "test.txt" + + + #f.write("Name:\t") + f.write(name) + f.write("\n") + print(f) + + #f.write("Age:\t") + f.write(age) + f.write("\n") + + #f.write("PatientID:\t") + f.write(patientID) + f.write("\n") + + #f.write("Test Selected:\t") + f.write(test) + f.write("\n") + f.close() + #os.system('7z a /home/odroid/BloodAnalyser/AcquiredData/celldata.7z /home/odroid/BloodAnalyser/AcquiredData/PatientInformation') + #self.activity= False + #self.ftp_invoke() + + count=count+1 + print(count) + if (count ==1): + + print("Hello World!") + dialog = Gtk.MessageDialog(None, 0, Gtk.MessageType.WARNING, Gtk.ButtonsType.YES_NO, "Reminder! Suitable Cartridge had to be loaded before starting the test.") + dialog.format_secondary_text("Do you want to continue?") + response = dialog.run() + if response == Gtk.ResponseType.YES: + dialog.destroy() + self.start.set_label("ABORT TEST") + print("WARN dialog closed by clicking OK button") + + Acquire = True + print (Acquire) + #Kill = True + #print(Kill) + #global Thread1 + #global Thread2 + + + auto_focus=AutoFocus() + + #auto_focus.window.show() + #blood_analyser = BloodAnalyser() + + self.timeout_id_thread_end = GObject.timeout_add(500, self.on_timeout_thread_end, None) + + self.Thread1=threading.Thread(target=auto_focus.pulse_invoke) + #self.Thread1.start() + + #self.Thread1=threading.Thread(target=self.vlc_invoke) + self.Thread1.daemon=True + self.Thread1.start() + + + + elif response == Gtk.ResponseType.NO: + dialog.destroy() + print("WARN dialog closed by clicking CANCEL button") + count=0 + + else: + print(count) + dialog = Gtk.MessageDialog(None, 0, Gtk.MessageType.WARNING,Gtk.ButtonsType.YES_NO, "Test in progress!.. Do you still want to abort test?") + dialog.format_secondary_text("Click Yes to continue") + response = dialog.run() + if response == Gtk.ResponseType.YES: + + dialog.destroy() + self.window.hide() + Gtk.main_quit() + os.system('exit()') + print("Thread2=") + print(SendCellDataThread) + os.system("killall vlc") + + self.start.set_label("START TEST") + text2 = " " + count = 0 + self.progressbar.set_text(text2) + + self.progressbar.set_show_text(text2) + + self.progressbar.set_fraction(0.0) + self.activity= False +# self.timeout_id = GObject.timeout_add(0, self.on_timeout,None) + + + self.start.set_label("START TEST") + #os.system('rm ./celldata.zip') + os.system('rm -r ./AcquiredData') + os.system('mkdir ./AcquiredData') + print("WARN dialog closed by clicking OK button") + elif response == Gtk.ResponseType.NO: + count = 0 + dialog.destroy() + + def on_timeout(self, user_data): + if self.activity: + + new_value = self.progressbar.get_fraction() + 0.01 + + if new_value > 1: + new_value = 0 + + self.progressbar.set_fraction(new_value) + + return True + + + + + + def vlc_invoke(self): + #gobject.threads_init() + #os.system("v4l2-ctl -c exposure_absolute=1") + print ("Vlc invoked") + #similar to time.sleep() + #sleep(10) + n = 0 + global error2 + start_time=time.time() + + while (True): + + sleep(0.5) + print Acquire + if Acquire: + #print ('while acquire') + self.activity= 1 + + self.timeout_id = GObject.timeout_add(400, self.on_timeout,None) + + os.chdir('/home/odroid/BloodAnalyser/AcquiredData') + + + itime=time.time() + i=1 + + print("Time taken to capture =") + print(time.time()-itime) + + + + os.chdir('/home/odroid/BloodAnalyser/AcquiredData') + while(i" + print "Example: python server_script_threads.py 3" + sys.exit() + +instance_id = int(sys.argv[1]) +num_instances = int(sys.argv[2]) +print 'Starting instance id: %d, num_batches:%d'%(instance_id, num_instances) + + +class servercheck(): + + i=0 + path=("/home/ubuntu/") + print(path) + path_to_watch =os.path.join("/home/ubuntu/") + before = dict ([(f, None) for f in os.listdir (path_to_watch)]) + dir=os.chdir(os.path.join("/home/ubuntu/")) + it=time.time() + + while 1: + print "Checking for zip file..." + time.sleep (1) + after = dict ([(f, None) for f in os.listdir (path_to_watch)]) + added = [f for f in after if not f in before] + removed = [f for f in before if not f in after] + #print(removed) + if removed: + print "removed: ", ", ".join (removed) + + if added: + + added_file=", ".join (added) + print "added: ", ", ".join (added) + i=i+1 + if i<4: + file_name=("celldata.7z") + added_file=", ".join (added) + if added_file == file_name: + + time.sleep(130) + print "Removing celldata folder" + os.system("rm -rf celldata") + + print "Unzipping celldata.7z" + os.system("7z x celldata.7z") + + print "Removing zip file - celldata.7z" + os.system("rm celldata.7z") + + if os.path.isdir("./images"): + os.system("cp -r celldata/* images/") + else: + os.mkdir("./images/") + os.system("cp -r celldata/* images/") + + global ProcessThreads + ProcessThreads = [] + print os.getcwd() + '/celldata' + numImages = len(os.listdir(os.getcwd() + '/celldata')) + print "Number of images in the folder: %d"%numImages + numThreads = 5 + numImagesPerThread = numImages/numThreads + print "Starting %d threads- Total images: %d, Images per thread:%d"%(numThreads, numImages, numImagesPerThread) + + image_num_min = 2 # Starting from image 2 as image 1 is always black! + 39,5 28% + image_num_max = 0 + + for i in range (1, numThreads+1): + + image_num_max = image_num_min + numImagesPerThread + if image_num_max > 10000: + image_num_max=10000 + t = threading.Thread(target=process,args=(i, image_num_min, image_num_max)) + t.start() + ProcessThreads.append(t) + print 'Started thread %d for images %d to %d'%(i, image_num_min, image_num_max) + image_num_min = image_num_max + 1 + + for t in ProcessThreads: + t.join() + + totalCount = 0 + + for i in range (1, numThreads+1): + result_file = 'count' + str(i) + '.txt' + f = open(result_file, 'r') + count_str = f.readline() + count = int(count_str.split("=")[1]) + totalCount = totalCount + count + print "Thread:%d, Count:%d, Total Count:%d"%(i, count, totalCount) + os.system("rm -f " + result_file) + + print totalCount + + print totalCount + + writefile(totalCount) + #checkcountfiles() + + before=after + + def process(threadId, frame_no_min, frame_no_max): + result_file = 'count' + str(threadId) + '.txt' + cmd = 'sudo ./run_malariaExecutableArgs.sh /usr/local/MATLAB/MATLAB_Compiler_Runtime/v83/ %d %d %s'%(frame_no_min, frame_no_max, result_file) + print "ThreadId: %d, cmd =%s"%(threadId, cmd) + os.system(cmd) + return + + + def writefile(count): + #testsite_array = [] + #with open('PatientInformation.txt','r') as my_file: + # testsite_array = my_file.readlines() + #count=numpy.sum(testsite_array) + file_name = 'Instance' + str(instance_id) + '.txt' + f = open(file_name,'w') + f.write('%d'%count) + f.flush() + f.close() + cmd = 'sudo scp -i "jayesh1.pem" ' + file_name + ' ubuntu@ec2-54-200-214-228.us-west-2.compute.amazonaws.com:' + print cmd + os.system(cmd) + def checkcountfiles(): + path = '/home/ubuntu/' + files = [] + countFiles=1 + iteration=0 + totalCount=0 + cellcount=0 + textf1='Instance'+str(countFiles)+'.txt' + textf2='Instance'+str(countFiles+1)+'.txt' + textf3='Instance'+str(countFiles+2)+'.txt' + while True: + print "Checking for count files from Instances" + time.sleep(1) + if os.path.isfile(textf1) and os.path.isfile(textf2) and os.path.isfile(textf3): + + #print i + iteration=iteration+1 + print countFiles + textf='Instance'+str(iteration)+'.txt' + + f = open(textf,'r') + count_str = f.readline() + cellcount = int(count_str) + print 'The count of instance %d =%d'%(iteration,cellcount) + totalCount = totalCount + cellcount + + if iteration == num_instances: + print 'condition met' + print 'total count =%d'%totalCount + file_name="totalCount.txt" + f = open(file_name,'w') + f.write('%d'%totalCount) + f.flush() + f.close() + return + else: + print "Count files have not arrived" + 85% +