More servicesWindows Live
HomeHotmailSpacesOneCare
 
MSN
Sign in
 
 
Spaces home  Samb Business Intelligen...PhotosProfileFriendsBlog Tools Explore the Spaces community

Blog

June 01

Amazing Molecular Biology Animation Video

 
May 31

Gartner's Predictions and Mine

The good folks over at the Gartner Group have revealed the top 10 technologies that they believe will change the world over the next four years:

  1. Multicore and hybrid processors
  2. Virtualization and fabric computing
  3. Social networks and social software
  4. Cloud computing and cloud/Web platforms
  5. Web mashups
  6. User Interface
  7. Ubiquitous computing
  8. Contextual computing
  9. Augmented reality
  10. Semantics

Most of these, in my opinion, are obvious - in fact, many are here. One of the things that Gartner commented on deeply when revealing this list was that items 1-4 will usher in an era of no need for IT shops. I find this fascinating since IT shops have basically funded Gartner's ridiculous advice over the past two decades. "Biting the hand that feeds you" is the best way to describe this.

Software and Hardware are not getting more simplified and cloud computing does not remove the need of local support and programming talent. If Gartner ever worked a day in their life in an IT shop they would understand this. 

So, here's my prediction:

1. Gartner, Forrester, and all other IT Advice Houses lose relevance and disappear over the next 5 years.

*** This is my opinion and not the opinion of my employer ***

May 30

Metabolic Pathway Diagrams as a measure for complexity in Life Science

Prediction of metabolic networks using Fourier Transform Mass Spectrometry data (PDF, 700kB)

Every once in a while I get questions from people about how complicated Life Science is...*very* would be a good answer...if not overly simplistic.

For me, a good reminder is to scan the current representations of Metabolic Pathways which typically show fairly elementary processes.
Given the constraints on price, the stress on patents and the decreasing pool of human resources that can be brought to bear on this problem, I think technology will be front and center on this endeavor.

mbpath2

mbpathway1

mb3

mb4

May 20

The Multi-Touch Wall Killer App - Missile Command!

 

So, multitouch has some interesting applications, but all pale in comparison to playing a two-player version of Missile Command. The clone was installed by Steve Mason at the Obscura Digital production studios' massive 8'X4' multitouch wall—and as you can see in the video after the break, It looks like a good time, not to mention a decent workout.

May 12

PhotoSynth on CSI:NY

 
May 08

Big Dog from Boston Dynamics

http://www.bostondynamics.com/content/sec.php?section=BigDog

OK, this has nothing to do with visualization or Life Science, but I know great technology when I see it.

This is an amazing movie - check out the icy surface test at the middle of the movie.

bgdog

April 24

Injecting Bitmaps streams into Images in WPF from Web Service Calls

Whew, that's a big title.  Ran into a great contact at the Atlantic City HLS DevCon, who asked me to post this code.

chemvisual

OK, so, that little image of the chemical structure on the bottom comes at me as a stream from a web service call to Chemspider.

Here's the call, and the creation of the bitmap image...

try
            {
                com.chemspider.www.TradeSearch.Search search = new com.chemspider.www.TradeSearch.Search();
                int[] ids = search.SimpleSearch2IdList(ChemSpiderSearchText.Text);
                Random r = new Random();
                double ri;
                int r1;

                if (ids != null && ids.Length > 0)
                {
                    foreach (int id in ids)
                    {
                        Canvas search_result = new Canvas();

                        search_result.Width = 400;
                        search_result.Height = 500;

                        ri = r.NextDouble() * 30;
                        r1 = (int)ri;
                        r1 = r1 + 220;
                        search_result.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, (byte)r1, (byte)r1, (byte)r1));
                        search_result.Tag = "NR";
                        PinBoard.Children.Add(search_result);

                        object[] details = search.GetRecordDetails(id.ToString());

                        Label title = new Label();
                        title.Content = id.ToString();
                        search_result.Children.Add(title);

                        Label urllink = new Label();
                        Canvas.SetTop(urllink, 30);
                        urllink.Content = String.Format("http://www.chemspider.com/Chemical-Structure.{0}.html", id);
                        search_result.Children.Add(urllink);

                        TextBox CKIKey = new TextBox();
                        Canvas.SetTop(CKIKey, 50);
                        CKIKey.VerticalScrollBarVisibility = ScrollBarVisibility.Visible;
                        CKIKey.Width = 380;
                        CKIKey.Height = 90;
                        CKIKey.Text = details[1].ToString();
                        search_result.Children.Add(CKIKey);

                        TextBox CHI = new TextBox();
                        CHI.MaxLines = 5;
                        Canvas.SetTop(CHI, 100);
                        CHI.VerticalScrollBarVisibility = ScrollBarVisibility.Visible;
                        CHI.Width = 380;
                        CHI.Height = 90;
                        CHI.Text = details[2].ToString();
                        search_result.Children.Add(CHI);

                        TextBox smiles = new TextBox();
                        smiles.MaxLines = 5;
                        smiles.VerticalScrollBarVisibility = ScrollBarVisibility.Visible;
                        smiles.Width = 380;
                        smiles.Height = 90;
                        Canvas.SetTop(smiles, 200);
                        smiles.Text = details[3].ToString();
                        search_result.Children.Add(smiles);

                        // Get the image of the structure...
                        //com.chemspider.www.TradeSearch.GetRecordImageCompletedEventArgs img = new com.chemspider.www.TradeSearch.GetRecordImageCompletedEventArgs);
                        byte[] bigimg = search.GetRecordImage(id.ToString());
                        System.Windows.Controls.Image myImage = new System.Windows.Controls.Image();

                        BitmapImage bitImg = new BitmapImage();

                        bitImg.BeginInit();

                        MemoryStream ms = new MemoryStream(bigimg);

                        bitImg.StreamSource = ms;

                        bitImg.EndInit();

                        myImage.Source = bitImg;
                        bitImg = null;

                        myImage.Width = 150;
                        myImage.Height = 150;
                        Canvas.SetLeft(myImage, 10);
                        Canvas.SetTop(myImage, 300);
                        search_result.Children.Add(myImage);

                        // Position the result in an overall canvas by posx, posy (posx is incremented to give your results a staggered look)

              // I animated mine, which is why I peeled that out here...

               posx = posx + 45;

                    }
                }
                else
                {
                    MessageBox.Show("No Results Found.");
                }
            }
            catch
            {
            }

April 23

HLS DevCon in Atlantic City, NJ - Gene Expression Map Demo

I'm just about to do my presentation on WPF and Visualization in Life Sciences and wanted to post this up to my blog.

You can find my slides here (on SkyDrive).

At the end of the presentation, I built a Gene Expression map using WPF.  Here are the steps to do it yourself, if you are so inclined.

genex

First, using Visual Studio 2008, start a new Windows program and create a new WPF Application.

Here's the XAML...

<Window x:Class="GeneExpression.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Gene Expression Map" Height="300" Width="300" WindowState="Maximized" >
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="35"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Slider x:Name="Zoom" Minimum="1" Maximum="200" Width="200" Value="1" Grid.Row="0" ValueChanged="slider_ValueChanged"/>
        <ScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible" Grid.Row="1">
        <Canvas x:Name="Backgrounder" Grid.Row="1" Width="1500" Height="1500" HorizontalAlignment="Left" VerticalAlignment= "Top"/>
        </ScrollViewer>
    </Grid>
</Window>

 

In the code-behind (XAML.cs)...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace GeneExpression
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            Draw_Map();
        }

        private void Sparkle(object sender, MouseEventArgs e)
        {
            double newposx, newposy;
            ((System.Windows.FrameworkElement)(sender)).Width = 12;
            ((System.Windows.FrameworkElement)(sender)).Height = 4;
            newposx = Canvas.GetLeft(((System.Windows.FrameworkElement)(sender))) - 1;
            newposy = Canvas.GetTop(((System.Windows.FrameworkElement)(sender))) - 1;
            Canvas.SetLeft(((System.Windows.FrameworkElement)(sender)),newposx);
            Canvas.SetTop(((System.Windows.FrameworkElement)(sender)),newposy);
        }

        private void NoSparkle(object sender, MouseEventArgs e)
        {
            double newposx, newposy;
            ((System.Windows.FrameworkElement)(sender)).Width = 10;
            ((System.Windows.FrameworkElement)(sender)).Height = 2;
            newposx = Canvas.GetLeft(((System.Windows.FrameworkElement)(sender))) + 1;
            newposy = Canvas.GetTop(((System.Windows.FrameworkElement)(sender))) + 1;
            Canvas.SetLeft(((System.Windows.FrameworkElement)(sender)),newposx);
            Canvas.SetTop(((System.Windows.FrameworkElement)(sender)),newposy);
        }

        private void slider_ValueChanged(object sender, RoutedEventArgs e)
        {
            try
            {
                double ffactor;
                ffactor = ((System.Windows.Controls.Primitives.RangeBase)(sender)).Value;
                ScaleTransform myscale;
                myscale = new ScaleTransform(ffactor, ffactor);
                Backgrounder.RenderTransform = myscale;

            }
            catch (Exception)
            { }
        }
        private void Draw_Map()
        {
            double xx, yy;
            double markval;
            int markcolor;
            Random r1 = new Random();
            for (yy = 0; yy < 300; yy++)
            {
                for (xx = 0; xx < 300; xx++)
                {
                    Rectangle Gene = new Rectangle();
                    Gene.MouseEnter += new MouseEventHandler(Sparkle);
                    Gene.MouseLeave += new MouseEventHandler(NoSparkle);
                    Gene.Width = 10;
                    Gene.Height = 2;
                    Canvas.SetLeft(Gene, xx * 11);
                    Canvas.SetTop(Gene, yy * 3);
                    Backgrounder.Children.Add(Gene);
                    Gene.Fill = new SolidColorBrush(Colors.Black);
                    markval = r1.NextDouble() * 255;
                    markcolor = (int)markval;
                    Gene.ToolTip = markcolor.ToString();
                    if (markcolor < 125)
                    {
                        markcolor = markcolor * 2;
                        Gene.Fill = new SolidColorBrush(Color.FromArgb(255,(byte)markcolor,0,0));
                    }
                    else
                    {
                        Gene.Fill = new SolidColorBrush(Color.FromArgb(255, 0,(byte)markcolor, 0));
                    }
                }
            }

        }
    }

}

 

I met a lot of great folks at DevCon(my first Health Care Devcon) - and I can't wait to see you this coming year.

Thanks for coming!

April 15

Home Foreclosure Heat Map

http://hotpads.com/pages/features/foreclosures.htm

This is just plain scary!

HotPads Foreclosure Heat Maps portray the markets hit hardest by the recent housing crisis and the increased foreclosure rates. These foreclosure heat maps visually illustrate the foreclosures per capita and display color-coded foreclosure rates by county and state.

 

foreclosure heat map

April 09

Intelligence for the Masses...

Sometimes, no matter how much time you spend on visualization, the raw data should speak for itself.

correction

Hawaii, the Highest Mountain on Earth?

http://www.nsf.gov/news/special_reports/scivis/popup/hawaii.htm

I thought this was an interesting visualization. Even though a cardinal rule of baselines is broken here, they manage to pull off using the curvature of the Earth as a baseline.

Mount Everest is the highest mountain on Earth above sea level, but it’s not the world’s tallest mountain. That honor goes to the Hawaiian volcano Mauna Kea. When measured from its base on the Pacific Ocean floor, it is about 1,000 meters taller than Mount Everest. Mauna Kea is part of a 5,600-kilometer-long string of volcanoes stretching westward from the main Hawaiian island.

steph_comp_04

Credit: Nils Sparwasser, Thorsten Andresen, Stephan Reiniger; Robert Meisner, German Aerospace Center (DLR)

April 04

Rendering Live Web Pages in WPF

I got a lot of help from my friend Michael Peters, of Oculus, so pay his blog a visit for me.

In working on WPF, there are a number of reasons why someone might want to render a "live" web page on a canvas. By "live", I don't mean a dumb thumbnail - although that can have value too - I mean a fully navigable Web page that you can click and navigate.

Here's how to do it. Download the WPFInterop codeplex entry. Create a Canvas (mine is called Pinboard) and add this code to create a dynamic button:

Canvas backgrounder = new Canvas();

backgrounder.Background = new SolidColorBrush(Colors.Blue);
backgrounder.Width = 860;
backgrounder.Height = 1110;

Button pageresult = new Button();
pageresult.Width = 850;
pageresult.Height = 1100;
Canvas.SetLeft(pageresult, 5);
Canvas.SetTop(pageresult, 5);
Uri wpURL = new Uri(sourceResult.Url);
pageresult.Content = openwebFile(wpURL);
pageresult.ToolTip = "Title: " + sourceResult.Title + "\nDescription: " + sourceResult.Description + "\nSummary: " + sourceResult.Summary + "\n\nURL: " + sourceResult.Url;

PinBoard.Children.Add(backgrounder);

Canvas.SetLeft(backgrounder, posx);
Canvas.SetTop(backgrounder, posy);
backgrounder.Children.Add(pageresult);

 

The Function, openwebFile returns a grid with the web page addressable by the URL (wpURL).

private Grid openwebFile(Uri url)

{

Grid myGrid = new Grid();

System.Windows.Forms.WebBrowser sampleWB = new System.Windows.Forms.WebBrowser();

sampleWB.Size = new System.Drawing.Size(850, 1100);

sampleWB.Url = url;

WPFInterop.InteropInfoMesa2.Win32HostRenderer sampleRender = new WPFInterop.InteropInfoMesa2.Win32HostRenderer();

sampleRender.ContentControl = sampleWB;

myGrid.Children.Add(sampleRender);

return myGrid;

}

Here's the net effect of many web pages from a search coming back from Microsoft Live Web Service:

webpages

It doesn't work perfectly (yet), so keep an eye out for new releases.                 

Ray Tracing Molecules using the IBM BlueGene SuperComputer

http://arxiv.org/PS_cache/arxiv/pdf/0801/0801.1500v1.pdf

Michael McGuigan of the Brookhaven National Laboratory is using a BlueGene Supercomputer to perform Ray Tracing in real time against exceptionally complex objects. Instead of lighting each polygon and calculating impinging light on its surface, Ray Tracing, on the other hand, scans an imaginary particle of light through each pixel, bouncing and refracting in the way real light performs. This enables images of amazing realism. Intel is also talking more and more about this.

tacyon

Image of the 1e79 Atp phosphorylase molecule rendered with ambient
occlusion lighting on a Blue Gene/L with the parallel tachyon raytracer.

March 31

Lamborghini Reventon Dashboard

http://en.wikipedia.org/wiki/Lamborghini_Revent%C3%B3n

lambo

$1,000,000.00 buys you a new look for your car's dashboard -
                                                                  or, you can print this out and glue it onto your Pinto.

March 29

Zygote Dataset Gallery

I posted a few days ago about the Zygote/3D Science Dataset that arrived the other day. The quality of their data is quite amazing.
Here's a small sample of their offering rendered in Windows Presentation Foundation (WPF).

zygote_gallery 

Muscular System      Skull   Female Organs    Lymphatic System    Circulatory System    Male Skeleton

March 26

1969 Moon Landing Transcript

I thought this was a good example of context (overview) and detail with text.

moonlanding

moonlandingdetail

 

http://www.fibredesign.co.uk/index.php?/case_study/motorola_75th_anniversary_poster/

March 23

3D Annotations of *.3DS models using the ScreenSpaceLines3D Class

As people who follow this blog know, I've been working on an overall idea that marries 3D models and 2D images, documents, data visualizations, etc. into one big thing.  A major part of this is is factoring things like tagging and annotation across the *overall* capability, instead of just doing it in all the individual tools (like it's done now)...
Here's an example of using a ScreenSpaceLine3d class instance with the 3dsreader...next up: tying the right side of the annotation to a point that can anchor linkages to any kind of element.

ScreenSpaceLines3D mline = new ScreenSpaceLines3D();

mline.Color = Colors.Black;

mline.Thickness = 1.5;

Point3D onjectCenter;

onjectCenter = _mainReader3ds.Transformer.GetObjectCenter(_mainModel3DGroup);

Point3D start = new Point3D(onjectCenter.X, onjectCenter.Y, onjectCenter.Z);

Point3D ender = new Point3D(100,100,40);

mline.Points.Add(start);

mline.Points.Add(ender);

Viewport1.Children.Add(mline);

skull_annotation

March 20

Rendering 3D objects (3ds) with WPF

Here are some images I built today using the great library available from WPF Graphics. It renders 3ds files in WPF 3D viewports. The source data is from www.zygote.com, specifically, the Male/Female Premier Anatomy Collection, which we recently purchased. The quality of the datasets and the texture maps really speak for themselves.

skull1skullsideview