Introduction About Site Map

XML
RSS 2 Feed RSS 2 Feed
Navigation

Main Page | Blog Index

Sunday, November 21st, 2010, 12:01 pm

Grids and Tagging – Octave Code Samples

Objects collection - stethoscope

FOR a little bit of background on tagging and my current work, see my previous posts on the subject [1, 2, 3], prior to me getting data from Professor Axel. The goal is to advance existing methods that include tagging by applying to them an algorithm which I developed for non-rigid registration assessment in the brain. This time the data that I deal with is cardiac, so temporal sets are a far more complicated problem, particularly due to persistent motion. Of interest there’s the paper “Single Heartbeat Cardiac Tagging for the Evaluation of Transient Phenomena” from Daniel A. Herzka, J. Andrew Derbyshire, Peter Kellman, and Elliot R. McVeigh. It can be found in Magnetic Resonance in Medicine (Volume 54, Issue 6, pages 1455–1464, December 2005) and the full paper says in its abstract: “Many cardiac abnormalities are of a transient nature, creating a beat-to-beat variation in myocardial function. This work presents the cardiac imaging technique for the measurement of regional function during transient cardiac phenomena. All information necessary for the reconstruction of a cine loop is acquired within a single heartbeat, avoiding the temporal blurring introduced by segmented imaging due to the assumption of cardiac cycle periodicity…”

I shall assume that motion can be treated like changes that occur over time on different dates or across subjects. The part in the above paper which deals with tags is: “Images reconstructed from such data displayed tag blurring and reduced tag persistence due to motion and interheartbeat variability. Images acquired during the Valsalva maneuver demonstrated apparent beat-to-beat variability, visible both in the images and as changing strain patterns and ventricular volumes.”

Therein lies a real problem because the tags cannot be assured to exist where they are needed the most. Fortunately, the literature contains many examples of work that can reconstruct imaged objects based on spatial information other than the tags themselves. A paper which was cited a lot in the 90s comes from Young and Axel (published in 1992, but date of current version is 6th of August 2002) and it is titled “Non-rigid heart wall motion using MR tagging”. Prior to it, in 1988, E A Zerhouni, D M Parish, W J Rogers, A Yang, and E P Shapiro looked at ways of analysing myocardial motion, potentially in troubled patients. Their paper “Human heart: tagging with MR imaging–a method for noninvasive assessment of myocardial motion” is summarised thusly:

Specified regions of the myocardium can be labeled in magnetic resonance (MR) imaging to serve as markers during contraction. The technique is based on locally perturbing the magnetization of the myocardium with selective radio-frequency (RF) saturation of multiple, thin tag planes during diastole followed by conventional, orthogonal-plane imaging during systole. The technique was implemented on a 0.38-T imager and tested on phantoms and volunteers. In humans, tags could be seen 60-450 msec after RF saturation, thus permitting sampling of the entire contractile phase of the cardiac cycle. Tagged regions appear as hypointense stripes, and their patterns of displacement reflect intervening cardiac motion. In addition to simple translation and rotation, complex motions such as cardiac twist can be demonstrated. The effects of RF pulse angle, relaxation times, and heart rate on depiction of the tagged region are discussed.

The German Heart Institute Berlin published the paper “Magnetic resonance stress tagging in ischemic heart disease” many years later (2005) and they used a 1.5-Tesla scanner for probing patients with coronary artery disease (CAD) under high-dose dobutamine stress. This clinical study helped show how “quantitative myocardial tagging may become a tool that reduces the need for high-dose dobutamine stress.”

As stated in previous posts and short papers which will be uploaded at a later date, my intention is to consider stress/strain analysis applied to the imaged tags. It is the tracking of the tags and making use of them that’s very challenging around boundaries that move throughout the cardiac cycle. Identifying templates like a cross where the tags have an intersection is a computationally expensive process that may also require taking uncertainty into account. If the goal is to track tags in real-time-level speeds (like in some ultrasound packages), then a faster approach is needed, e.g. shuffle distance. This approach would involve comparing different frames (at least one prior frame, with the exception of the first which has no predecessors) and then, in the junctions of the tags, best matches will be found and recorded in a vector of {x,y} coordinates, where these coordinates are refined over time and help quickly determine the motion of objects inside the image. Calculations using mechanical models (based upon shapes that the tags form) are an area which is already well explored, so it is the tracking and recovery of tags which my code deals with first and foremost. prototyping is done in GNU Octave, which helps make a visual proof of concept on arbitrary data, either synthetic or real. The code below does not yet do much, but once it’s finalised the code will be published properly.

Octave functions of relevance (still experimental and the GPLv3-licensed BioSig project may be required, as noted here):

function [new_image] = getdicomimages(directory, threshold)
% GETDICOMIMAGES: Open and test DICOM images of the heart
%
%    Licensing
%
%      GNU GPL version 3
%
%    GENERAL
%
%      Script - experimental, for handling MRI images with biosig
%
%    INPUT/S
%
%      -Omitted
%
%    OUTPUT/S
%
%      -Omitted
%
%    PENDING WORK
%
%      -
%
%    KNOWN BUG/S
%
%      -None.
%
%    COMMENT/S
%
%      -
%
%    RELATED FUNCTION/S
%
%      
%
%    ABOUT
%
%      -Created:     November 2010
%      -Last update: November 5th, 2010
%      -Revision:    0.0.1
%      -Author:      Dr. R. S. Schestowitz
% ==============================================================

%// addpath ("/home/roy/Main/IT/Programs/get_dicom_heart")
%// addpath ("/home/roy/Main/IT/Programs/biosig4octmat-2.50/biosig/t200_FileAccess")
%// img = opendicom("~/Main/IT/Programs/MR-Cardiac/i148713.MRDC.1");  // deprecated function
%// sopen("~/Main/IT/Programs/MR-Cardiac/Full-CD/DICOM/ST000000/SE000019/MR000000");
%// img(i)=imread('sombrero.jpg')
%// plot(img.T0)   //metadata attributes
%// ~/Main/IT/Programs/dicom2/dicom2 ~/Main/IT/Programs/MR-Cardiac/Full-CD/DICOM/ST000000/SE000014/*

cd(directory);
files_list=ls('*.tga');
n_images=size(files_list,1);
% BIOSIG open function, wrapper to DICOM handler:
% img = sopen("~/Main/IT/Programs/MR-Cardiac/i148713.MRDC.1");
for i=1:1:n_images,
	% files_list
	%// img_metadata(i) = sopen(files_list(i,:))
	%a=imread(files_list(i,:));
	%imshow(a)
	figure;
	img(:,:,i)=imread(files_list(i,:));
	imshow(img(:,:,i))
end

For actual testing:

function [new_image] = loadtaggedsequence(directory, threshold, draw_grid)
% LOADTAGGEDSQUENCE: Open and test tagged images of the heart
%
%    Licensing
%
%      GNU GPL version 3
%
%    GENERAL
%
%      Script
%
%    INPUT/S
%
%      -Omitted
%
%    OUTPUT/S
%
%      -directory: location of images,
%	 -threshold: colour of tags/markers based on conrtast of image
%      -draw_grid: boolean for display of manual grid/points (drawing or not drawing)
%
%    PENDING WORK
%
%      -
%
%    KNOWN BUG/S
%
%      -None.
%
%    COMMENT/S
%
%      -
%
%    RELATED FUNCTION/S
%
%      
%
%    ABOUT
%
%      -Created:     November 2010
%      -Last update: November 10th, 2010
%      -Revision:    0.0.1
%      -Author:      Dr. R. S. Schestowitz
% ==============================================================

% common commands

	%// loadtaggedsequence('~/Main/IT/Programs/MR-Cardiac/Zhen-thesis',1,1)
	%// addpath ("/home/roy/Main/IT/Programs/get_dicom_heart")
	%// addpath (genpath("/home/roy/Main/IT/Programs/biosig4octmat-2.50/biosig/"))
	%// path
	%// img = opendicom("~/Main/IT/Programs/MR-Cardiac/i148713.MRDC.1");  // deprecated function
	%// sopen("~/Main/IT/Programs/MR-Cardiac/Full-CD/DICOM/ST000000/SE000019/MR000000");
	%// img(i)=imread('sombrero.jpg')
	%// plot(img.T0)   //metadata attributes
	%// ~/Main/IT/Programs/dicom2/dicom2 ~/Main/IT/Programs/MR-Cardiac/Full-CD/DICOM/ST000000/SE000014/*

% experimental options

draw_circles=0;

% grid parameters

x_start = 10;
y_start = 10;
step_x = 30;
step_y = 20;
x_max = 110;
y_max = 80;


frame_size=8;
shuffle_radius=3;
 
% initialisation

first_image=1;
old_boundaries=[[0,0];[0,0]];

% get data

cd(directory);
files_list=ls('*.png');
	% files_list=ls('*.gif');
	% One image: files_list=('seq-tag-1.png');

% Opening [print filenames if necessary]

files_list
n_images=size(files_list,1);

% main loop

	% img = sopen("~/Main/IT/Programs/MR-Cardiac/i148713.MRDC.1");
for i=1:1:n_images,
		%// img_metadata(i) = sopen(files_list(i,:))
		%a=imread(files_list(i,:));
		%imshow(a)
	figure;
	%img(:,:,i)=imread(files_list(i,:));
	
	if (draw_grid==1)
		for j=x_start:step_x:x_max,
	   	  img(j,:,i)=0;
		end
		for j=y_start:step_y:y_max,
	   	  img(:,j,i)=0;
		end
	end
	if (draw_circles==1)
	     % [center,radius]=sphfit([10,11,0],[5,5,0]);	
        end
	boundaries=[[x_start,y_start];[x_start,y_start+step_y]; ...
	[x_start,y_start+step_y*2]; [x_start,y_start]; ...
	[x_start+step_x,y_start];[x_start+step_x*2,y_start]; ...
	[x_start+step_x*2,y_start+step_y];[x_start+step_x*2,y_start+step_y*2]; ...
	[x_start+step_x,y_start+step_y];[x_start+step_x,y_start+step_y*2]];
	%%	boundaries_x=[;    %% deprecated - no more xy separation
        	for l=1:1:size(boundaries,1)
        	%%	for k=1:1:size(boundaries,2)
        		% debugging
        		%	boundaries_y(k,1);
        		%	boundaries_y(2,l);
                     	% img(1,3,1)=1;
                     	% boundaries_y(k,1)
                     	% boundaries_y(2,l)
                     	%i
                     	%k
                     	%l
                     	% size(boundaries_y,1)
                     		if (first_image==0)
                     			%old_boundaries
                     	    		new_dot_x=old_boundaries(l,1)+1;
                     	    		new_dot_y=old_boundaries(l,2)+1;
                     	    			%old_boundaries(l,1)-8
                     	    		search_frame_current=img(((new_dot_x-frame_size):(new_dot_x+frame_size)),((new_dot_y-frame_size):(new_dot_y+frame_size))) 
                     	    		search_frame_previous=img(((old_boundaries(l,1)-frame_size):(old_boundaries(l,1)+frame_size)),((old_boundaries(l,2)-frame_size):(old_boundaries(l,2)+frame_size))) 
                     	    		shuffle_diff=shuffle_transform(search_frame_current, search_frame_previous, shuffle_radius)
                     	    		
                     	    		img(new_dot_x,new_dot_y,i)=threshold/255;
                     	    		old_boundaries(l,1)=new_dot_x;
                     	    		old_boundaries(l,2)=new_dot_y;
                     		else
                     	    		img(boundaries(l,1),boundaries(l,2),i)=(255-threshold)/255;
                     		end
                    %% 	end	
        	end
        	%for l=1:1:size(boundaries_x,1)
        		%for k=1:1:size(boundaries_x,2)
                     	   %img(boundaries_x(k,2),boundaries_x(l,1),i)=250;
                	%end
        	%end
	imshow(img(:,:,i))
		% plot3(img(:,:,i))
        if (first_image==1)
	   old_boundaries=boundaries;
	end
        first_image=0;
end

Peripheral transform:

function [value,shuffle] = shuffle_transform(image,im2,radius)
% SHUFFLE_TRANSFORM: A shuffle transform based on an implementation by Steve Marsland
%
%    Licensing
%
%      -
%
%    GENERAL
%
%      Function
%
%    INPUT/S
%
%      -image: first image
%      -im2: second image
%      -radius: the shuffle radius
%
%    OUTPUT/S
%
%      -Omitted
%
%    PENDING WORK
%
%      -
%
%    KNOWN BUG/S
%
%      -None.
%
%    COMMENT/S
%
%      -
%
%    RELATED FUNCTION/S
%
%      
%
%    ABOUT
%
%      -Created:     November 2010
%      -Last update: November 21st, 2010
%      -Revision:    0.0.1
%      -Author:      Dr. R. S. Schestowitz
% ==============================================================

shuffle = zeros(size(image));

for i=radius+1:size(image,1)-radius
    for j=radius+1:size(image,2)-radius
        template = im2(i-radius:i+radius,j-radius:j+radius);
        diff = abs(template-image(i,j));        
        shuffle(i,j) = min(diff(:));
    end
end
value = mean(shuffle(:))

Sunday, November 21st, 2010, 12:00 pm

Fedora Wishlist Feature: Old Versions

As indicated in the previous post, sometimes it is necessary to use old versions of a particular package which is not available from the repositories. The screenshot below shows what’s available in Fedora as far as Octave is concerned.

Octave package - small

It would be extremely valuable to have links to alternative repositories or even Web sites that offer previous builds of the software, even if these are not “official” and thus less safe. It is not ideal for many different reasons, but it can prevent people from searching the Web for other RPMs that come from entirely untrusted sources.

Fedora is not the problem here, but a constructive suggestion such as this one may become a selling point to some users.

Sunday, November 21st, 2010, 11:25 am

GraphicsMagick-1.3.8: GNU Octave in Fedora and Ubuntu

I‘ve been an Octave user on several machines and everything worked perfectly well until Fedora 14, which has a newer version of the software and thus a serious conflict of incompatible libraries. For many image loaders the following type of error is shown just before Octave crashes:

octave: magick/semaphore.c:525: LockSemaphoreInfo: Assertion `semaphore_info !=
 (SemaphoreInfo *) ((void *)0)' failed.
panic: Aborted -- stopping myself...

Do not waste time trying to find a bug in the code of an Octave program. It is a known issue that GraphicsMagick and Octave are having this year.

Somebody posted debugging information and John W. Eaton responded with a link to this thread from January. The best solution is probably to escape to previous versions for the time being.

Saturday, November 20th, 2010, 1:19 am

TechBytes Special on Microsoft Aggression, Lies

TechBytes

Direct download as Ogg (1:10:22, 20.5 MB) | Direct download as MP3 (32.2 MB)

Summary: First episode of its kind discussing just one particular topic rather than general news; the show accumulates many examples where Microsoft attacks GNU/Linux

THIS is our tenth episode which is also a special one because we introduce one discussion topic rather than a news roundup. Our regular-to-be Gordon — along with Tim and Roy — speaks about this story of FUD (fear, uncertainty and doubt). They go through some past stories where Microsoft is caught spreading FUD or derailing GNU/Linux adoption. As the show is in no way scripted, the discussion is not complete, but many different areas get covered. Tim’s site, OpenBytes, will publish some overview very soon.

RSS 64x64Today’s show ends with “The Pretty Pride Of Russia” by Tom Hickox (published in SXSW 2009 Showcasing Artists). We hope you will join us for future shows and spread the word if you enjoy this show. Also consider subscribing to the show via the RSS feed. If you have an Identi.ca account, consider subscribing to TechBytes in order to keep up to date.

As embedded (HTML5):

Download:

Ogg Theora
(There is also an MP3 version)

Thursday, November 18th, 2010, 1:31 am

Gordon Sinclair Joins TechBytes

TechBytes

Direct download as Ogg (1:42:33, 30.8 MB) | Direct download as MP3 (46.9 MB)

Summary: Another show with Gordon Sinclair may be the first among many where he is a regular

THIS is our ninth episode. Gordon, Tim, and Roy speak about news from the past two days (everything that matters since the previous show). This show mostly focuses on GNU/Linux, it hardly mentions Apple at all, and Microsoft is secondary at best. Tim’s site, OpenBytes, will soon publish some show notes (we put the audio out there as soon as possible while the news covered is still fresh). We have finally found a way to structure the show such that it covers everything which needs to be covered rather exhaustively.

RSS 64x64Today’s show ends with “A Violent Yet Flammable World” by Au Revoir Simone (published in SXSW 2009 Showcasing Artists). We hope you will join us for future shows and spread the word if you enjoy this show. Also consider subscribing to the show via the RSS feed. If you have an Identi.ca account, consider subscribing to TechBytes in order to keep up to date.

As embedded (HTML5):

Download:

Ogg Theora
(There is also an MP3 version)

Wednesday, November 17th, 2010, 1:09 pm

Konqueror in KDE 4.5: Huge Step Forward

Konqueror

MY EARLIER experiences with Konqueror go back to ~2002 when I tried it at work under Mandrake, around the early versions of KDE3 or later KDE2. Konqueror had many menu options and was daunting in some ways compared to Netscape and Mozilla. In KDE 3.1 Konqueror had acceptance problems among Web sites that were simply IE-centric or IE- and Netscape-centric. This was not a problem in Konqueror itself, but it made life a little harder for Konqueror users like myself. I only moved to Firefox some time in 2004 and it is still my Web browser of choice, having tested Chromium and some other browsers for a while (they lack plugins).

Anyway, under Fedora 14 I am attempting to use Konqueror exclusively and it’s generally a pleasant experience. After over a week of use I’ve only experienced two issues; one is when opening a PDF which Okular tried to embed within the Web page/rendering frame (this is easily solvable by opening the PDFs in an external application like the excellent Okular); the second issue is repeatable and reproducible crashes under WordPress’ media management menu. It’s a Web application-specific issue and debugging would be needed.

Workarounds are quite simple to find and the general experience working with Konqueror is finally quite pleasant (I tried Konqueror exclusively for about half a week in KDE 4.3 but eventually gave up). Speed is not great and there is room for improvement, but for general-purpose light usage Konqueror would fit most people’s needs. Some time later this month I will write about KDE 4.5 as a whole.

Wednesday, November 17th, 2010, 11:40 am

Gentle Background and Introduction to MRI Tagging

Tags

TAGGING in the context of image acquisition involves getting magnetic signal by selectively sending charges to the tissue, whose atoms (usually just hydrogen is targeted by adjustment of frequencies) equipment can try to test for response in such a way that under normal conditions without noticeable change they would return a rectangular grid overlaid on top of the data. This enables better tracking of tissue motion that’s robust to spatially-similar atoms (whose returned signal is hard to discern visually). This post is a personal and informal quick survey of some resources which people may hopefully find helpful. It is not a detailed or comprehensive analysis.

Background

Tagging has many areas about or around it which ought to be explored. Back in 2003, an extension of the approach — one of complementary innovation in particular — was a goal yet to be accomplished although many extensions already exist. As Professor Leon Axel from the Department of Radiology at NYU School of Medicine (he is the inventor of tagging) put it in his paper “Tagged MRI-Based Studies of Cardiac Function” (2003), improvements in tagged MRI methods include optimisation in terms of speed and 3-D as well. To quote, “[s]ome ways in which we are seeking to improve tagged imaging include improved physiologic motion synchronization, faster imaging methods and 3D image acquisition.”

In case magnetic resonance cannot be properly applied for 3-D tagged images, other modalities can perhaps be considered at an early stage where data to work on is being sought and gradually collected starting with coarse image sequences (more on that later). However, it is tagging which probably yields the most valuable information, adding it to one of the most valuable imaging modalities. As Wikipedia explains it, Speckle Tracking Echocardiography, for example, “analyzes motion within an ultrasonic window by tracking intereference patterns and natural acoustic reflections.[1] These reflections, also described as ‘‘speckles’’, ‘‘markers’’, ‘‘patterns’’, ‘‘features’’, or ‘‘fingerprints’’ are tracked consecutively frame to frame and ultimately resolved into angle-independent two-dimensional (2D) and three-dimensional strain-based sequences (3D) [2][3][4] These sequences provide both quantitative and qualitative information regarding tissue deformation and motion.”

The connection to MRI is mentioned further down where it says: “The utilities of STE are increasingly recognized. Strain results derived from STE have been validated using sonomicrometry and tagged MRI and results correlate significantly with tissue Doppler–derived measurements.[7][8][9]”

Reference 8 is “Amundsen BH, Helle-Valle T, Edvardsen T, Torp H, Crosby J, Lyseggen E,et al. Noninvasive myocardial strain measurement by speckle tracking echocardiography: validation against sonomicrometry and tagged magnetic resonance imaging. J Am Coll Cardiol 2006;47:789-93″

Tagging seems to be explored a lot in NYU, Penn State University, and also Johns Hopkins University (there is group outside the United States which works on this area as well, but further reading will probably reveal many more such groups). N.F. Osman and J.L. Prince from Johns Hopkins University, for example, wrote about “Angle images for measuring heart motion from tagged MRI” (presented in the 1998 International Conference on Image Processing in Chicago, Illinois). The abstract says that their work “introduces a new image processing technique for rapid analysis and visualization of tagged cardiac magnetic resonance (MR) images. The method is based on the use of isolated spectral peaks in SPAMM-tagged magnetic resonance images. The authors call the phase of an image corresponding to just one of these peaks an angle image, and show that except for a phase-wrapping artifact, an angle image is linearly related to a component of the three-dimensional motion. Using one or more angle images, the authors show how to synthesize conventional tag lines, reconstruct displacement fields for small motions, calculate the optical flow between successive temporal images, and calculate two-dimensional strain. The authors demonstrate the performance of this approach on both real and simulated tagged MR images”

Ten years later, 4-D work (including temporal) was done by the group from NYU School of Medicine along with Dimitris N Metaxas and Zhen Qian [2] (from the Center for Computational Biomedicine Imaging and Modeling at Rutgers University). They published “A Segmentation and Tracking System for 4D Cardiac Tagged MR Images” (issue date of 2006, with current version from 2008). Their paper from EMBS ’06 (28th Annual International Conference of the IEEE) “present[s] a robust method for segmenting and tracking cardiac contours and tags in 4D cardiac MRI tagged images via spatio-temporal propagation. Our method is based on two main techniques: the Metamorphs segmentation for robust boundary estimation, and the tunable Gabor filter bank for tagging lines enhancement, removal and myocardium tracking.”

The Institute of Biomedical Engineeering at Bogazici University (Istanbul, Turkey) has also published [3] “Towards rapid screening of tagged MR images of the heart” and the abstract reads: “The final aim of this work is to perform rapid classification of tagged cardiac MR images as normal and abnormal. In the proposed technique, images are first analyzed using harmonic phase analysis and synthetic tags are computed over the myocardium. Cubic curves are fitted to these tags and curve parameters are compared at various regions of the myocardium. In this initial study, the ratios of curve parameters between normal and diseased hearts, such as dilated cardiomyopathy (DCM) and heart with infarcted regions, are evaluated. If the initial segmentation problems are solved, this method could be a very fast and automatic screening tool for identifying diseased locations in tagged MRI.”

Background to My Work

A while ago I began implementing an approach where I explore new methods of anatomical structures extraction based on tagging. After spending a long time trying to get my hands on some data with tagging in it (low-resolution videos is the best I have found on the Web so far [1, 2, 3]) I managed to find MRI cardiac data which the people from New York can share with us. Getting data with tagging has proven tricky unless there is direct access to the right people and I’m grateful to receive some good data as I’m eager to work on extending and complementing the work which is Axel’s breakthrough. Doing so without the required data would be hard. One possibility for working with such data is to locally work on sythesising or emulating a set of tagged image using specific software which does this quite nicely. It may be good if we need to test programs where the ground truth solution is known. Otherwise, approaching the group from New York was a reasonable option to be exploring and with enough data, both real and synthetic data can be used, one for actual work and another for validation of the method.

Why Shuffle Distance/Difference

In a later short paper I’ll explain the approach of encoding the image in terms of bytes (8 bits) or blocks of 64 bits that can be handled by particular CPUs more efficiently and thus have an image stored and processed (even in 3-D) with little burden on the hardware, yielding faster results for real-time tracking of the tags. There is an existing implementation left from my work on brain images where this is done in a vectorised fashion and works quite fast in Octave (bar JIT) or MATLAB. Whether tagging in 3-D is available at all remains to be seen. That is a subject for another day.

References:

[1] N.F. Osman, J.L. Prince, “Angle images for measuring heart motion from tagged MRI,” International Conference on Image Processing, vol. 1, pp.704, 1998.

[2] D. N. Metaxas, L. Axel, Z. Qian, and X. Huang, “A Segmentation and Tracking System for 4D Cardiac Tagged MR Images,” Engineering in Medicine and Biology Society, pp. 1541–1544, 2006.

[3] D. Goksel, M. Ozkan, and C. Ozturk, “Towards rapid screening of tagged MR images of the heart,” Engineering in Medicine and Biology Society, vol. 1, pp. 156–159, 2001.

Real-time Posts

Posts by @schestowitz

Retrieval statistics: 24 queries taking a total of 0.082 seconds • Please report low bandwidth using the feedback form
Original styles created by Ian Main (all acknowledgements) • PHP scripts and styles later modified by Roy Schestowitz • Help yourself to a GPL'd copy
|— Proudly powered by W o r d P r e s s — based on a heavily-hacked version 1.2.1 (Mingus) installation —|