% % % Find Spots Close to Filament for Imaris % % Copyright Bitplane AG 2006 % % % Installation: % % - Copy this file into the XTensions folder in the Imaris installation directory % - You will find this function in the Image Processing menu % % % % % % Matlab::BPSpotsCloseToFilament(%i) % % % % % % % Matlab::BPSpotsCloseToFilament(%i) % % % % % Matlab::BPSpotsCloseToFilament(%i) % % % % % % % Description: % % The user has to create a Spots and a Filament component. % This XTension segments the spots into two groups: Spots which are % close to the filamentous structure will be colored red, the others % blue. % This might help to count spines. % % Usage Example: % - Load "C2CZOSmall.ims". % - Create Spots (ch1, 0.5um, on, 0.5um, thresh.10) % - Create Filament (default values, ratio branch / trunk = 3) % - Select tools tab from spots component % - Start "Find Spots close to a Filament" % - Ratio = 0.7 % % function BPSpotsCloseToFilament(aImarisApplicationID) if isa(aImarisApplicationID, 'COM.Imaris_Application') vImarisApplication = aImarisApplicationID; else % connect to Imaris Com interface vImarisServer = actxserver('ImarisServer.Server'); vImarisApplication = vImarisServer.GetObject(aImarisApplicationID); end % % GUI - user interactions % % the user has to create a scene with a filament and some spots if isequal(vImarisApplication.mSurpassScene, []) msgbox('Please create a Filament and some Spots!'); return; end % THE filament and THE spot object vFilament = vImarisApplication.mFactory.ToFilament(vImarisApplication.mSurpassSelection); vSpots = vImarisApplication.mFactory.ToSpots(vImarisApplication.mSurpassSelection); % find a filament and some spots from the surpass scene vSurpassScene = vImarisApplication.mSurpassScene; for vChildIndex = 1:vSurpassScene.GetNumberOfChildren vDataItem = vSurpassScene.GetChild(vChildIndex - 1); if isequal(vSpots, []) if vImarisApplication.mFactory.IsSpots(vDataItem) vSpots = vDataItem; end end if isequal(vFilament, []) if vImarisApplication.mFactory.IsFilament(vDataItem) vFilament = vDataItem; end end end % did we find the filament? if isequal(vFilament, []) msgbox('Please create a Filament!'); return; end % did we find the spots? if isequal(vSpots, []) msgbox('Please create some Spots!'); return; end % ask user for a distance vAnswer = inputdlg({sprintf('"%s" - "%s"\nRatio of distance (Spot - FilamentCenter) to Filament diameter', vFilament.mName, vSpots.mName)}, 'Find Spots close to Filament', 1, {'0.9'}); if isempty(vAnswer) return; end vDistanceLimit = str2double(vAnswer); % % ALGORITHM - get spot coordinates and filament vertex coordinates from % imaris and compute the distance between each pair. if the shortest % distance of a spot to a filament vertex is shorter than our limit, the % spot is close. % % get the spot coordinates vSpotsPosXYZ = vSpots.GetPositionsXYZ; vSpotsRadius = vSpots.GetRadii'; vSpotsPosT = vSpots.GetIndicesT'; % get the filament vertices vFilamantPosXYZ = vFilament.GetPositionsXYZ; vFilamantRadius = vFilament.GetRadii'; % empty matrices for resulting spots (A is close, B is far) vSpotsAPosXYZ = []; vSpotsAPosT = []; vSpotsARadius = []; vSpotsBPosXYZ = []; vSpotsBPosT = []; vSpotsBRadius = []; % find close and far spots vProgressDisplay = waitbar(0, 'Finding close Spots ...'); for vSpotsIndex = 1:size(vSpotsPosXYZ,1) vDistanceMin = inf; vFilamantRadiusMin = inf; for vFilamantIndex = 1:length(vFilamantPosXYZ) vDistance = sqrt(sum((vSpotsPosXYZ(vSpotsIndex,:) - vFilamantPosXYZ(vFilamantIndex,:)).^2)); if vDistance < vDistanceMin vDistanceMin = vDistance; vFilamantRadiusMin = vFilamantRadius(vFilamantIndex); end end if (vDistanceMin / vFilamantRadiusMin) < vDistanceLimit % close spot vSpotsAPosXYZ(size(vSpotsAPosXYZ,1)+1,:) = vSpotsPosXYZ(vSpotsIndex,:); vSpotsAPosT(size(vSpotsAPosT,1)+1,:) = vSpotsPosT(vSpotsIndex,:); vSpotsARadius(size(vSpotsARadius,1)+1,:) = vSpotsRadius(vSpotsIndex,:); else % far spot vSpotsBPosXYZ(size(vSpotsBPosXYZ,1)+1,:) = vSpotsPosXYZ(vSpotsIndex,:); vSpotsBPosT(size(vSpotsBPosT,1)+1,:) = vSpotsPosT(vSpotsIndex,:); vSpotsBRadius(size(vSpotsBRadius,1)+1,:) = vSpotsRadius(vSpotsIndex,:); end waitbar(vSpotsIndex / size(vSpotsPosXYZ,1)); end close(vProgressDisplay); % hide original spots vSpots.mVisible = false; % add new spots (close) vSpotsA = vImarisApplication.mFactory.CreateSpots; vSpotsA.Set(vSpotsAPosXYZ, vSpotsAPosT, vSpotsARadius); vSpotsA.mName = sprintf('%s closer than %0.3f', vSpots.mName, vDistanceLimit); vSpotsA.SetColor(1.0, 0.0, 0.0, 0.0); vImarisApplication.mSurpassScene.AddChild(vSpotsA); % add new spots (far) vSpotsB = vImarisApplication.mFactory.CreateSpots; vSpotsB.Set(vSpotsBPosXYZ, vSpotsBPosT, vSpotsBRadius); vSpotsB.mName = sprintf('%s farer than %0.3f', vSpots.mName, vDistanceLimit); vSpotsB.SetColor(0.0, 0.0, 1.0, 0.0); vImarisApplication.mSurpassScene.AddChild(vSpotsB);