[Insight-users] Urgenthelp with Observer class to store image sequence

Jayant Chauhan gripened@hotmail.com
Thu May 13 22:17:54 EDT 2004


<html><div style='background-color:'><DIV class=RTE>Hey Fellas,</DIV>
<DIV class=RTE>&nbsp;</DIV>
<DIV class=RTE>Seems I am a lil bit confused about the sequential flow of control in ITK.</DIV>
<DIV class=RTE>&nbsp;</DIV>
<DIV class=RTE>When I include all my image reading and filter executions in the main(), it works, but when I create a function which does all this as a member of my class, then I am not able to get the Observer to work. My code is as follows, I am using the GeodesicActiveContourLevelSetImageFilter to segment my image, and want to store all the contours, ie, the zerocrossing, so I add the observer to my zerocrossing filter,ie, m_contour.</DIV>
<DIV class=RTE>&nbsp;</DIV>
<DIV class=RTE>ALso it seems that only when I add my geodesicfilter to the observer are the contours stored and not when I add m_contour. ie.</DIV>
<DIV class=RTE>&nbsp;&nbsp;m_observer-&gt;SetCallbackFunction( this, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp; firstFilter::GetContourAfterIteration );<BR>&nbsp;<STRONG>m_geodesic</STRONG>-&gt;AddObserver(itk::IterationEvent(), m_observer); //works</DIV>
<DIV class=RTE>&nbsp;<STRONG>m_contour</STRONG>-&gt;AddObserver(itk::IterationEvent(), m_observer); //doesnt work</DIV>
<DIV class=RTE>&nbsp;</DIV>
<DIV class=RTE>&nbsp;my code:</DIV>
<DIV class=RTE>&nbsp;</DIV>
<DIV class=RTE><STRONG><U>firstFilter.h</U></STRONG></DIV>
<DIV class=RTE><STRONG><U></U></STRONG>&nbsp;</DIV>
<DIV class=RTE>#ifndef _FIRST_FILTER_H<BR>#define _FIRST_FILTER_H</DIV>
<DIV class=RTE>#include "itkImage.h"<BR>#include "itkImageFileReader.h"<BR>#include "itkImageFileWriter.h"<BR>#include "itkGeodesicActiveContourLevelSetImageFilter.h"<BR>#include "itkCurvatureAnisotropicDiffusionImageFilter.h"<BR>#include "itkGradientMagnitudeRecursiveGaussianImageFilter.h"<BR>#include "itkSigmoidImageFilter.h"<BR>#include "itkBinaryThresholdImageFilter.h"<BR>#include "itkGeodesicActiveContourLevelSetFunction.h"<BR>#include "itkSegmentationLevelSetImageFilter.h"<BR>#include "itkCastImageFilter.h"<BR>#include "itkRescaleIntensityImageFilter.h"<BR>#include "itkZeroCrossingImageFilter.h"<BR>#include "itkCommand.h"<BR>#include "itkWeightedAddImageFilter.h"</DIV>
<DIV class=RTE><BR>template &lt;class TInputImage, class TInternalImage, class TOutputImage&gt;<BR>class firstFilter{<BR>&nbsp;<BR>&nbsp;public:</DIV>
<DIV class=RTE>&nbsp;&nbsp;typedef itk::CurvatureAnisotropicDiffusionImageFilter&lt;TInputImage, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TInternalImage&gt; SmoothingFilterType;</DIV>
<DIV class=RTE>&nbsp;&nbsp;typedef itk::GradientMagnitudeRecursiveGaussianImageFilter&lt;TInternalImage,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TInternalImage&gt; GradientFilterType;</DIV>
<DIV class=RTE>&nbsp;&nbsp;typedef itk::SigmoidImageFilter&lt;TInternalImage, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TInternalImage&gt; SigmoidFilterType;</DIV>
<DIV class=RTE>&nbsp;&nbsp;typedef itk::GeodesicActiveContourLevelSetImageFilter&lt;TInternalImage,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TInternalImage&gt; GACFilterType;<BR>&nbsp;<BR>&nbsp;&nbsp;typedef itk::BinaryThresholdImageFilter&lt;TInternalImage,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TOutputImage&gt; TFilterType;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;typedef itk::ZeroCrossingImageFilter&lt;TOutputImage, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TInternalImage&gt; ZeroFilterType;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;typedef itk::WeightedAddImageFilter&lt;TInternalImage, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TInternalImage, TInternalImage&gt; WAddFilterType;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;typedef itk::SimpleMemberCommand&lt; firstFilter &gt;&nbsp; ObserverType;</DIV>
<DIV class=RTE><BR>&nbsp; &nbsp;&nbsp;SmoothingFilterType::Pointer m_smoothing;<BR>&nbsp;&nbsp;GradientFilterType::Pointer m_gradient;<BR>&nbsp;&nbsp;SigmoidFilterType::Pointer m_sigmoid;</DIV>
<DIV class=RTE>&nbsp;&nbsp;SmoothingFilterType::Pointer m_framesmoothing;<BR>&nbsp;&nbsp;GradientFilterType::Pointer m_framegradient;<BR>&nbsp;&nbsp;SigmoidFilterType::Pointer m_framesigmoid;</DIV>
<DIV class=RTE>&nbsp;&nbsp;GACFilterType::Pointer m_geodesic;<BR>&nbsp;&nbsp;TFilterType::Pointer m_threshold;<BR>&nbsp;&nbsp;ZeroFilterType::Pointer m_contour;<BR>&nbsp;&nbsp;WAddFilterType::Pointer m_wadd;<BR>&nbsp;&nbsp;ObserverType::Pointer m_observer;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;firstFilter();<BR>&nbsp;&nbsp;void ExecuteGAC(char* , char* , char* , char* , char* , char* , char*, <BR>&nbsp;&nbsp;&nbsp; int , float , float , float ,<BR>&nbsp;&nbsp;&nbsp; float , float , float );</DIV>
<DIV class=RTE>&nbsp;&nbsp;void GetContourAfterIteration();<BR>};</DIV>
<DIV class=RTE>template &lt;class TInputImage, class TInternalImage, class TOutputImage&gt;<BR>void firstFilter&lt;TInputImage, TInternalImage, TOutputImage&gt;<BR>::ExecuteGAC(char* featureimage, char* frameimage, char* initlevelset, <BR>&nbsp;&nbsp;&nbsp; char* sigmoidresult, char* framesigmoidresult, char* gacresult, char* threshresult,<BR>&nbsp;&nbsp;&nbsp; int no_iter, float sigma, float alpha, float beta,<BR>&nbsp;&nbsp;&nbsp; float ascale, float cscale, float pscale){</DIV>
<DIV class=RTE>&nbsp;typedef itk::ImageFileReader&lt;TInputImage&gt; InputImageReader;<BR>&nbsp;typedef itk::ImageFileReader&lt;TInternalImage&gt; InternalImageReader;<BR>&nbsp;<BR>&nbsp;typedef itk::ImageFileWriter&lt;TInternalImage&gt; InternalImageWriter;<BR>&nbsp;typedef itk::ImageFileWriter&lt;TOutputImage&gt; OutputImageWriter;</DIV>
<DIV class=RTE>&nbsp;std::cout&lt;&lt;"I am inside the function "&lt;&lt;std::endl;</DIV>
<DIV class=RTE>&nbsp;InputImageReader::Pointer reader1 = InputImageReader::New();<BR>&nbsp;InputImageReader::Pointer reader2 = InputImageReader::New();<BR>&nbsp;<BR>&nbsp;InternalImageReader::Pointer internalreader1 = InternalImageReader::New();<BR>&nbsp;InternalImageWriter::Pointer internalwriter1 = InternalImageWriter::New();<BR>&nbsp;<BR>&nbsp;OutputImageWriter::Pointer sigmoidwriter = OutputImageWriter::New();<BR>&nbsp;OutputImageWriter::Pointer framesigmoidwriter = OutputImageWriter::New();<BR>&nbsp;OutputImageWriter::Pointer gacwriter = OutputImageWriter::New();<BR>&nbsp;OutputImageWriter::Pointer twriter = OutputImageWriter::New();</DIV>
<DIV class=RTE>&nbsp;<BR>&nbsp;reader1-&gt;SetFileName(featureimage);<BR>&nbsp;reader2-&gt;SetFileName(frameimage);<BR>&nbsp;internalreader1-&gt;SetFileName(initlevelset);</DIV>
<DIV class=RTE>&nbsp;sigmoidwriter-&gt;SetFileName(sigmoidresult);<BR>&nbsp;framesigmoidwriter-&gt;SetFileName(framesigmoidresult);<BR>&nbsp;&nbsp;<BR>&nbsp;m_smoothing-&gt;SetInput(reader1-&gt;GetOutput());<BR>&nbsp;m_framesmoothing-&gt;SetInput(reader2-&gt;GetOutput());</DIV>
<DIV class=RTE>&nbsp;m_gradient-&gt;SetSigma(sigma);<BR>&nbsp;m_gradient-&gt;SetInput(m_smoothing-&gt;GetOutput());</DIV>
<DIV class=RTE>&nbsp;m_framegradient-&gt;SetSigma(sigma);<BR>&nbsp;m_framegradient-&gt;SetInput(m_framesmoothing-&gt;GetOutput());</DIV>
<DIV class=RTE>&nbsp;m_sigmoid-&gt;SetInput(m_gradient-&gt;GetOutput());<BR>&nbsp;m_sigmoid-&gt;SetAlpha( alpha );<BR>&nbsp;&nbsp;&nbsp; m_sigmoid-&gt;SetBeta( beta );</DIV>
<DIV class=RTE>&nbsp;m_framesigmoid-&gt;SetInput(m_framegradient-&gt;GetOutput());<BR>&nbsp;m_framesigmoid-&gt;SetAlpha( alpha );<BR>&nbsp;&nbsp;&nbsp; m_framesigmoid-&gt;SetBeta( alpha );</DIV>
<DIV class=RTE>&nbsp;m_wadd-&gt;SetInput1(m_sigmoid-&gt;GetOutput());<BR>&nbsp;m_wadd-&gt;SetInput2(m_framesigmoid-&gt;GetOutput());</DIV>
<DIV class=RTE>&nbsp;m_geodesic-&gt;SetPropagationScaling( pscale );<BR>&nbsp;m_geodesic-&gt;SetCurvatureScaling( cscale );<BR>&nbsp;&nbsp;&nbsp; m_geodesic-&gt;SetAdvectionScaling( ascale );<BR>&nbsp; <BR>&nbsp;m_geodesic-&gt;SetMaximumRMSError(0.02);<BR>&nbsp;m_geodesic-&gt;SetNumberOfIterations( no_iter );<BR>&nbsp;m_geodesic-&gt;SetReverseExpansionDirection(false);</DIV>
<DIV class=RTE>&nbsp;m_geodesic-&gt;SetInput(internalreader1-&gt;GetOutput());<BR>&nbsp;m_geodesic-&gt;SetFeatureImage(m_wadd-&gt;GetOutput());<BR>&nbsp;gacwriter-&gt;SetFileName(gacresult);<BR>&nbsp;<BR>&nbsp;twriter-&gt;SetFileName(threshresult);<BR>&nbsp;m_threshold-&gt;SetInput(m_geodesic-&gt;GetOutput());</DIV>
<DIV class=RTE>&nbsp;typedef itk::RescaleIntensityImageFilter&lt;TInternalImage,<BR>&nbsp;&nbsp;&nbsp;&nbsp;TOutputImage&gt; CastFilterType;</DIV>
<DIV class=RTE>&nbsp;CastFilterType::Pointer sigmoidcastfilter = CastFilterType::New();<BR>&nbsp;CastFilterType::Pointer gaccastfilter = CastFilterType::New();<BR>&nbsp;<BR>&nbsp;sigmoidcastfilter-&gt;SetInput(m_sigmoid-&gt;GetOutput());<BR>&nbsp;gaccastfilter-&gt;SetInput(m_geodesic-&gt;GetOutput());<BR>&nbsp;<BR>&nbsp;sigmoidcastfilter-&gt;SetOutputMinimum(0);<BR>&nbsp;sigmoidcastfilter-&gt;SetOutputMaximum(255);<BR>&nbsp;<BR>&nbsp;gaccastfilter-&gt;SetOutputMinimum(0);<BR>&nbsp;gaccastfilter-&gt;SetOutputMaximum(255);</DIV>
<DIV class=RTE>&nbsp;sigmoidwriter-&gt;SetInput(sigmoidcastfilter-&gt;GetOutput());<BR>&nbsp;gacwriter-&gt;SetInput(gaccastfilter-&gt;GetOutput());<BR>&nbsp;twriter-&gt;SetInput(m_threshold-&gt;GetOutput());</DIV>
<DIV class=RTE>&nbsp;CastFilterType::Pointer zerocastfilter = CastFilterType::New();</DIV>
<DIV class=RTE>&nbsp;zerocastfilter-&gt;SetOutputMinimum(0);<BR>&nbsp;zerocastfilter-&gt;SetOutputMaximum(255);</DIV>
<DIV class=RTE>&nbsp;OutputImageWriter::Pointer zcwriter = OutputImageWriter::New();</DIV>
<DIV class=RTE>&nbsp;m_contour-&gt;SetInput(m_threshold-&gt;GetOutput());<BR>&nbsp;zerocastfilter-&gt;SetInput(m_contour-&gt;GetOutput());</DIV>
<DIV class=RTE>&nbsp;zcwriter-&gt;SetFileName("zerocrossing.png");<BR>&nbsp;zcwriter-&gt;SetInput(zerocastfilter-&gt;GetOutput());<BR>&nbsp;<BR>&nbsp;try{<BR>&nbsp;&nbsp;gacwriter-&gt;Update();<BR>&nbsp;&nbsp;twriter-&gt;Update();<BR>&nbsp;&nbsp;sigmoidwriter-&gt;Update();<BR>&nbsp;&nbsp;zcwriter-&gt;Update();<BR>&nbsp;}<BR>&nbsp;catch (itk::ExceptionObject &amp; err)<BR>&nbsp;{<BR>&nbsp;&nbsp;std::cerr&lt;&lt;"Exception caught "&lt;&lt;std::endl;<BR>&nbsp;&nbsp;std::cerr&lt;&lt;err&lt;&lt;std::endl;<BR>&nbsp;}</DIV>
<DIV class=RTE><BR>}</DIV>
<DIV class=RTE><BR>template &lt;class TInputImage, class TInternalImage, class TOutputImage&gt;<BR>void firstFilter&lt;TInputImage, TInternalImage, TOutputImage&gt;<BR>::GetContourAfterIteration(){<BR>&nbsp;<BR>&nbsp;static unsigned int iterationCounter = 0;<BR>&nbsp;std::cout&lt;&lt;"Hey do I get a change "&lt;&lt;std::endl;<BR>&nbsp;typedef itk::ImageFileWriter&lt;TOutputImage&gt; ImageWriter;<BR>&nbsp;typedef itk::RescaleIntensityImageFilter&lt;TInternalImage,<BR>&nbsp;&nbsp;&nbsp;&nbsp;TOutputImage&gt; CastFilterType;</DIV>
<DIV class=RTE>&nbsp;ImageWriter::Pointer contour_writer = ImageWriter::New();<BR>&nbsp;CastFilterType::Pointer zccast = CastFilterType::New();<BR>&nbsp;zccast-&gt;SetOutputMinimum(0);<BR>&nbsp;zccast-&gt;SetOutputMaximum(255);</DIV>
<DIV class=RTE><BR>&nbsp;char* contourfile;<BR>&nbsp;contourfile = (char*)malloc(sizeof(char)*50);<BR>&nbsp;<BR>&nbsp;if ( (iterationCounter != 0) &amp;&amp; (iterationCounter%25 == 0) ){<BR>&nbsp;&nbsp;</DIV>
<DIV class=RTE>&nbsp;&nbsp;sprintf(contourfile,"%d%s",iterationCounter,".png");<BR>&nbsp;&nbsp;std::cout &lt;&lt; "No. elpased iterations: " &lt;&lt; m_geodesic-&gt;GetElapsedIterations() &lt;&lt; std::endl;<BR>&nbsp;&nbsp;std::cout &lt;&lt; "RMS change: " &lt;&lt; m_geodesic-&gt;GetRMSChange() &lt;&lt; std::endl;<BR>&nbsp;&nbsp;contour_writer-&gt;SetFileName(contourfile);<BR>&nbsp;&nbsp;zccast-&gt;SetInput(m_contour-&gt;GetOutput());<BR>&nbsp;&nbsp;contour_writer-&gt;SetInput(zccast-&gt;GetOutput());</DIV>
<DIV class=RTE>&nbsp;&nbsp;try{</DIV>
<DIV class=RTE>&nbsp;&nbsp;&nbsp;contour_writer-&gt;Update();<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;catch (itk::ExceptionObject &amp; err){<BR>&nbsp;&nbsp;&nbsp;std::cerr&lt;&lt;"ITK Exception caught :"&lt;&lt;err&lt;&lt;std::endl;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;<BR>&nbsp;}<BR>&nbsp;else{<BR>&nbsp;&nbsp;std::cout&lt;&lt;"Iteration counter :"&lt;&lt;iterationCounter&lt;&lt;std::endl;<BR>&nbsp;}<BR>&nbsp;iterationCounter++;<BR>}</DIV>
<DIV class=RTE><BR>template &lt;class TInputImage, class TInternalImage, class TOutputImage&gt;<BR>firstFilter&lt;TInputImage, TInternalImage, TOutputImage&gt;<BR>::firstFilter(){</DIV>
<DIV class=RTE>&nbsp;m_smoothing = SmoothingFilterType::New();<BR>&nbsp;m_framesmoothing = SmoothingFilterType::New();</DIV>
<DIV class=RTE>&nbsp;m_smoothing-&gt;SetTimeStep(0.125);<BR>&nbsp;m_smoothing-&gt;SetNumberOfIterations(5);<BR>&nbsp;&nbsp;&nbsp; m_smoothing-&gt;SetConductanceParameter(3.0);</DIV>
<DIV class=RTE>&nbsp;m_framesmoothing-&gt;SetTimeStep(0.125);<BR>&nbsp;m_framesmoothing-&gt;SetNumberOfIterations(5);<BR>&nbsp;&nbsp;&nbsp; m_framesmoothing-&gt;SetConductanceParameter(3.0);</DIV>
<DIV class=RTE>&nbsp;m_gradient = GradientFilterType::New();<BR>&nbsp;m_framegradient = GradientFilterType::New();</DIV>
<DIV class=RTE>&nbsp;&nbsp;&nbsp; m_sigmoid = SigmoidFilterType::New();<BR>&nbsp;m_framesigmoid = SigmoidFilterType::New();</DIV>
<DIV class=RTE>&nbsp;&nbsp;&nbsp; m_sigmoid-&gt;SetOutputMinimum(0.0);<BR>&nbsp;&nbsp;&nbsp; m_sigmoid-&gt;SetOutputMaximum(1.0);</DIV>
<DIV class=RTE>&nbsp;m_framesigmoid-&gt;SetOutputMinimum(0.0);<BR>&nbsp;&nbsp;&nbsp; m_framesigmoid-&gt;SetOutputMaximum(1.0);</DIV>
<DIV class=RTE>&nbsp;m_wadd = WAddFilterType::New();<BR>&nbsp;m_wadd-&gt;SetAlpha(0.5);<BR>&nbsp;<BR>&nbsp;m_geodesic = GACFilterType::New();<BR>&nbsp;m_geodesic-&gt;SetIsoSurfaceValue(127.0);</DIV>
<DIV class=RTE>&nbsp;<BR>&nbsp;m_threshold = TFilterType::New();<BR>&nbsp;<BR>&nbsp;m_threshold-&gt;SetLowerThreshold(-1000.0);<BR>&nbsp;m_threshold-&gt;SetUpperThreshold(0.0);<BR>&nbsp;<BR>&nbsp;m_threshold-&gt;SetOutsideValue(0);<BR>&nbsp;m_threshold-&gt;SetInsideValue(255);</DIV>
<DIV class=RTE>&nbsp;m_contour =&nbsp; ZeroFilterType::New();</DIV>
<DIV class=RTE>&nbsp;m_observer = ObserverType::New();</DIV>
<DIV class=RTE>&nbsp;m_observer-&gt;SetCallbackFunction( this, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp; firstFilter::GetContourAfterIteration );<BR>&nbsp;m_geodesic-&gt;AddObserver(itk::IterationEvent(), m_observer);</DIV>
<DIV class=RTE>}</DIV>
<DIV class=RTE>&nbsp;</DIV>
<DIV class=RTE>#endif</DIV>
<DIV class=RTE>&nbsp;</DIV>
<DIV class=RTE>--------------------------------------------------------------------------------------------------------------</DIV>
<DIV class=RTE>&nbsp;</DIV>
<DIV class=RTE><STRONG><U>firstFilter.cxx</U></STRONG></DIV>
<DIV class=RTE>#include "firstFilter.h"</DIV>
<DIV class=RTE>int main(int argc, char** argv){</DIV>
<DIV class=RTE>&nbsp;typedef unsigned char InputPixelType;<BR>&nbsp;typedef float InternalPixelType;<BR>&nbsp;typedef unsigned char OutputPixelType;</DIV>
<DIV class=RTE>&nbsp;typedef itk::Image&lt;InputPixelType, 2&gt; InputImageType;<BR>&nbsp;typedef itk::Image&lt;InternalPixelType, 2&gt; InternalImageType;<BR>&nbsp;typedef itk::Image&lt;OutputPixelType, 2&gt; OutputImageType;</DIV>
<DIV class=RTE>&nbsp;typedef itk::ImageFileReader&lt;InputImageType&gt; InputImageReader;<BR>&nbsp;typedef itk::ImageFileReader&lt;InternalImageType&gt; InternalImageReader;<BR>&nbsp;<BR>&nbsp;typedef itk::ImageFileWriter&lt;InternalImageType&gt; InternalImageWriter;<BR>&nbsp;typedef itk::ImageFileWriter&lt;OutputImageType&gt; OutputImageWriter;</DIV>
<DIV class=RTE>&nbsp;if (argc &lt; 15){</DIV>
<DIV class=RTE>&nbsp;&nbsp;std::cerr&lt;&lt;"Incorrect usage, Correct usage being : "&lt;&lt;std::endl;<BR>&nbsp;&nbsp;std::cerr&lt;&lt;"firstFilter.exe FeatureImage FrameImage InitialLevelSetImage ";<BR>&nbsp;&nbsp;std::cerr&lt;&lt;"sigmoidresult framesigmoidresult geodesicresult thresholdresult ";<BR>&nbsp;&nbsp;std::cerr&lt;&lt;"NoOfIterations&nbsp; sigma alpha beta pscale cscale ascale ";<BR>&nbsp;&nbsp;std::cerr&lt;&lt;"--------------"&lt;&lt;std::endl;<BR>&nbsp;&nbsp;exit(1);<BR>&nbsp;&nbsp;<BR>&nbsp;}</DIV>
<DIV class=RTE>&nbsp;firstFilter&lt;InputImageType, InternalImageType, OutputImageType&gt;&nbsp; ff;</DIV>
<DIV class=RTE>&nbsp;ff.ExecuteGAC(argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], atoi(argv[8]), <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atof(argv[9]), atof(argv[10]), atof(argv[11]), atof(argv[12]), atof(argv[13]),<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atof(argv[14])) ;</DIV>
<DIV class=RTE><BR>&nbsp;&nbsp;&nbsp; return 1;</DIV>
<DIV class=RTE>}<BR>----------------------------------------------------------------------------------------------------------</DIV>
<DIV class=RTE>&nbsp;</DIV>
<DIV class=RTE>Any suggestions please, have to finish this asap</DIV>
<DIV class=RTE>&nbsp;</DIV>
<DIV class=RTE>with regards</DIV>
<DIV class=RTE>&nbsp;</DIV>
<DIV class=RTE>Jayant</DIV></div><br clear=all><hr>Send flowers in 24 hours!  <a href="http://g.msn.com/8HMAENIN/2743??PS=47575">At MSN Shopping.</a> </html>



More information about the Insight-users mailing list