TreeViewClasses.cpp
上传用户:szb0815
上传日期:2007-06-13
资源大小:338k
文件大小:38k
源码类别:

生物技术

开发平台:

C++ Builder

  1. /*
  2. Software and source code Copyright (C) 1998-2000 Stanford University
  3. Written by Michael Eisen (eisen@genome.stanford.edu)
  4. This software is copyright under the following conditions:
  5. Permission to use, copy, and modify this software and its documentation
  6. is hereby granted to all academic and not-for-profit institutions
  7. without fee, provided that the above copyright notice and this permission
  8. notice appear in all copies of the software and related documentation.
  9. Permission to distribute the software or modified or extended versions
  10. thereof on a not-for-profit basis is explicitly granted, under the above
  11. conditions. However, the right to use this software in conjunction with
  12. for profit activities, and the right to distribute the software or modified or
  13. extended versions thereof for profit are *NOT* granted except by prior
  14. arrangement and written consent of the copyright holders.
  15. Use of this source code constitutes an agreement not to criticize, in any
  16. way, the code-writing style of the author, including any statements regarding
  17. the extent of documentation and comments present.
  18. The software is provided "AS-IS" and without warranty of ank kind, express,
  19. implied or otherwise, including without limitation, any warranty of
  20. merchantability or fitness for a particular purpose.
  21. In no event shall Stanford University or the authors be liable for any special,
  22. incudental, indirect or consequential damages of any kind, or any damages
  23. whatsoever resulting from loss of use, data or profits, whether or not
  24. advised of the possibility of damage, and on any theory of liability,
  25. arising out of or in connection with the use or performance of this software.
  26. This code was written using Borland C++ Builder 4 (Inprise Inc., www.inprise.com)
  27. and may be subject to certain additional restrictions as a result.
  28. */
  29. //---------------------------------------------------------------------------
  30. #include <vcl.h>
  31. #pragma hdrstop
  32. #include <stdlib.h>
  33. #include <math.h>
  34. #include <dir.h>
  35. #include "TreeViewMain.h"
  36. #include "TreeViewClasses.h"
  37. //---------------------------------------------------------------------------
  38. #pragma package(smart_init)
  39. AnsiString NextString(AnsiString* String)
  40. {
  41.     AnsiString Field;
  42.     int delim = (*String).LastDelimiter("t");
  43.     if (delim != 0)
  44.     {
  45.         Field = (*String).SubString(delim+1,(*String).Length()-delim);
  46.         (*String) =  (*String).SubString(0,delim-1);
  47.     }
  48.     else
  49.     {
  50.         Field = (*String);
  51.         (*String) =  (*String).SubString(0,0);
  52.     }
  53.     if ((Field.Length() == 0) && (delim == 0) )
  54.     {
  55.         return AnsiString("DONE");
  56.     }
  57.     else
  58.     {
  59.         return Field;
  60.     }
  61. }
  62. /*__fastcall TMyWrapper::TMyWrapper() : TObject()
  63. {
  64. }  */
  65. __fastcall TGeneTreeNode::TGeneTreeNode() : TObject()
  66. {
  67.     IsNode = true;
  68.     Color = clBlack;
  69.     Child1 = NULL;
  70.     Child2 = NULL;
  71.     Elements = 1;
  72. }
  73. __fastcall TGeneTreeNode::~TGeneTreeNode()
  74. {
  75.     delete Data;
  76. }
  77. void __fastcall TGeneTreeNode::SetParent(TGeneTreeNode *pParent)
  78. {
  79.     Parent = pParent;
  80.     if (IsNode == true)
  81.     {
  82.         Child1->SetParent(this);
  83.         Child2->SetParent(this);
  84.     }
  85.     else
  86.     {
  87.         Child1 = NULL;
  88.         Child2 = NULL;
  89.     }
  90. }
  91. void __fastcall TGeneTreeNode::SetCoor()
  92. {
  93.     if (IsNode == true)
  94.     {
  95.         Child1->SetCoor();
  96.         Child2->SetCoor();
  97.         XCoor = 1.0 - ((1.0 - Corr)/2);
  98.         XCoor = min(XCoor, Child1->XCoor);
  99.         XCoor = min(XCoor, Child2->XCoor);
  100.         YCoor = (Child1->YCoor + Child2->YCoor)/2;
  101.         MinCoor = min(Child1->MinCoor,Child2->MinCoor);
  102.         MaxCoor = max(Child1->MaxCoor,Child2->MaxCoor);
  103.     }
  104.     else
  105.     {
  106.         XCoor = 1.0;
  107.         MinCoor = YCoor;
  108.         MaxCoor = YCoor;
  109.     }
  110. }
  111. void __fastcall TGeneTreeNode::SetResist()
  112. {
  113.     if (IsNode == true)
  114.     {
  115.         Child1->SetResist();
  116.         Child2->SetResist();
  117.         double Resist1 = max(0.0,Child1->Corr - Corr) + Child1->Resist;
  118.         double Resist2 = max(0.0,Child2->Corr - Corr) + Child2->Resist;
  119.         if ( (Resist1 > 0 ) && (Resist2 > 0) )
  120.         {
  121.             Resist = (Resist1 * Resist2) / (Resist1 + Resist2);
  122.         }
  123.         else if (Resist1 > 0)
  124.         {
  125.             Resist = Resist1;
  126.         }
  127.         else if (Resist2 > 0)
  128.         {
  129.             Resist = Resist2;
  130.         }
  131.         else
  132.         {
  133.             Resist = 0;
  134.         }
  135.     }
  136.     else
  137.     {
  138.         Resist = 0;
  139.     }
  140. }
  141. void __fastcall TGeneTreeNode::WriteList(double Cutoff)
  142. {
  143.     if ((IsNode == true) && (Corr > Cutoff))
  144.     {
  145.         AnsiString OutFileName = Data->ID + ".txt";
  146.         TStringList *IDList = new TStringList();
  147.         Child1->GetIDs(IDList);
  148.         Child2->GetIDs(IDList);
  149.         if ( (IDList->Count > 5) && (IDList->Count < 50) )
  150.         {
  151.             IDList->SaveToFile(OutFileName);
  152.         }
  153.         delete IDList;
  154.     }
  155.     if (IsNode == true)
  156.     {
  157.         Child1->WriteList(Cutoff);
  158.         Child2->WriteList(Cutoff);
  159.     }
  160. }
  161. void __fastcall TGeneTreeNode::GetIDs(TStringList *IDList)
  162. {
  163.     if (IsNode == true)
  164.     {
  165.         Child1->GetIDs(IDList);
  166.         Child2->GetIDs(IDList);
  167.     }
  168.     else
  169.     {
  170.         IDList->Add(Data->ID);
  171.     }
  172. }
  173. TGeneTreeNode* __fastcall TGeneTreeNode::FindNode(AnsiString NodeName)
  174. {
  175.     if (IsNode == true)
  176.     {
  177.         if (Data->ID == NodeName)
  178.         {
  179.             return this;
  180.         }
  181.         else
  182.         {
  183.             TGeneTreeNode *NodeMatched1 = Child1->FindNode(NodeName);
  184.             TGeneTreeNode *NodeMatched2 = Child2->FindNode(NodeName);
  185.             if (NodeMatched1 != NULL)
  186.             {
  187.                 return NodeMatched1;
  188.             }
  189.             else
  190.             {
  191.                 return NodeMatched2;
  192.             }
  193.         }
  194.     }
  195.     else
  196.     {
  197.         return NULL;
  198.     }
  199. }
  200. void __fastcall TGeneTreeNode::SetWeight(double Current)
  201. {
  202.     Weight = Current;
  203.     if (IsNode == true)
  204.     {
  205.         double Current1, Current2;
  206.         double Resist1, Resist2;
  207.         Resist1 = max(0.0,Child1->Corr - Corr) + Child1->Resist;
  208.         Resist2 = max(0.0,Child2->Corr - Corr) + Child2->Resist;
  209.         if ( (Resist1 > 0) || (Resist2 > 0) )
  210.         {
  211.             Current1 = Current * Resist2 / (Resist1 + Resist2);
  212.             Current2 = Current * Resist1 / (Resist1 + Resist2);
  213.         }
  214.         else
  215.         {
  216.             Current1 = Current/2;
  217.             Current2 = Current/2;
  218.         }
  219.         Child1->SetWeight(Current1);
  220.         Child2->SetWeight(Current2);
  221.     }
  222. }
  223. void __fastcall TGeneTreeNode::SetData()
  224. {
  225.     if (IsNode == true)
  226.     {
  227.         Child1->SetData();
  228.         Child2->SetData();
  229.         Elements = Child1->Elements + Child2->Elements;
  230.         int Count;
  231.         double Val;
  232.         int i;
  233.         for (i=0;i<Data->Columns;i++)
  234.         {
  235.             Val = 0;
  236.             Count = 0;
  237.             Data->Mask[i] = false;
  238.             if (Child1->Data->Mask[i])
  239.             {
  240.                 Val += Child1->Data->Data[i] * Child1->Elements;
  241.                 Count += Child1->Elements;
  242.             }
  243.             if (Child2->Data->Mask[i])
  244.             {
  245.                 Val += Child2->Data->Data[i] * Child2->Elements;
  246.                 Count += Child2->Elements;
  247.             }
  248.             if (Count > 0)
  249.             {
  250.                 Data->Mask[i] = true;
  251.                 Data->Data[i] = Val / Count;
  252.             }                                                       
  253.         }
  254.             
  255.     }
  256. }
  257. void __fastcall TGeneTreeNode::Draw(TImage *Image, double Scale)
  258. {
  259.     if (IsNode == true)
  260.     {
  261.         Image->Canvas->MoveTo(Child1->XCoor*Image->Width,Child1->YCoor * Scale);
  262.         Image->Canvas->LineTo(XCoor*Image->Width,Child1->YCoor * Scale);
  263.         Image->Canvas->LineTo(XCoor*Image->Width,Child2->YCoor * Scale);
  264.         Image->Canvas->LineTo(Child2->XCoor*Image->Width,Child2->YCoor * Scale);
  265.         Child1->Draw(Image, Scale);
  266.         Child2->Draw(Image, Scale);
  267.         XPoint = XCoor * Image->Width;
  268.         YPoint = YCoor * Scale;
  269.     }
  270. }
  271. /*void __fastcall TGeneTreeNode::AddNote(TStrings *NewNote)
  272. {
  273.     if (IsNode == true)
  274.     {
  275.         Child1->AddNote(NewNote);
  276.         Child2->AddNote(NewNote);
  277.     }
  278.     else
  279.     {
  280.         AnsiString Key1 = TreeViewMainForm->Cluster->UniqueID;
  281.         AnsiString Key2 = Data->ID;
  282.         TVarRec Keys[] = {Key1,Key2};
  283.         if (!TreeViewMainForm->Table1->FindKey(Keys,1))
  284.         {
  285.            TreeViewMainForm->Table1->AppendRecord(Keys,1);
  286.            TreeViewMainForm->Table1->FindKey(Keys,1);
  287.         }
  288.         TreeViewMainForm->DataSource1->Edit();
  289.         AnsiString NewString = TreeViewMainForm->DBMemo1->Field->AsString;
  290.         for (int i=0;i<NewNote->Count;i++)
  291.         {
  292.             NewString += "rn" + NewNote->Strings[i];
  293.         }
  294.         TreeViewMainForm->DBMemo1->Field->AsString = NewString;
  295.     }
  296. } */
  297. void __fastcall TGeneTreeNode::DrawPS(TStringList *PSFile, int ScaleX, int ScaleY, int StartYCoor)
  298. {
  299.     if (IsNode == true)
  300.     {
  301.         AnsiString TempString;
  302.         int X1,Y1,X2,Y2;
  303.         X1 = Child1->XCoor*ScaleX;
  304.         Y1 = (ScaleY/2) + (StartYCoor - Child1->YCoor)*ScaleY;
  305.         X2 = XCoor * ScaleX;
  306.         Y2 = (ScaleY/2)+  (StartYCoor - Child1->YCoor)*ScaleY;
  307.         TempString = AnsiString(X1) + " " + AnsiString(Y1) + " " +
  308.             AnsiString(X2) + " " + AnsiString(Y2) + " ln";
  309.         PSFile->Add(TempString);
  310.         X1 = Child2->XCoor*ScaleX;
  311.         Y1 = (ScaleY/2) + (StartYCoor - Child2->YCoor)*ScaleY;
  312.         X2 = XCoor * ScaleX;
  313.         Y2 = (ScaleY/2) + (StartYCoor - Child2->YCoor)*ScaleY;
  314.         TempString = AnsiString(X1) + " " + AnsiString(Y1) + " " +
  315.             AnsiString(X2) + " " + AnsiString(Y2) + " ln";
  316.         PSFile->Add(TempString);
  317.         X1 = XCoor * ScaleX;
  318.         Y1 = (ScaleY/2) + (StartYCoor - Child1->YCoor)*ScaleY;
  319.         X2 = XCoor * ScaleX;
  320.         Y2 = (ScaleY/2) + (StartYCoor - Child2->YCoor)*ScaleY;
  321.         TempString = AnsiString(X1) + " " + AnsiString(Y1) + " " +
  322.             AnsiString(X2) + " " + AnsiString(Y2) + " ln";
  323.         PSFile->Add(TempString);
  324.         Child1->DrawPS(PSFile, ScaleX, ScaleY, StartYCoor);
  325.         Child2->DrawPS(PSFile, ScaleX, ScaleY, StartYCoor);
  326.     }
  327. }
  328. void __fastcall TGeneTreeNode::Limits(double *mincoor, double *maxcoor)
  329. {
  330.     if (IsNode == true)
  331.     {
  332.         double mincoor1,mincoor2,maxcoor1,maxcoor2;
  333.         Child1->Limits(&mincoor1,&maxcoor1);
  334.         Child2->Limits(&mincoor2,&maxcoor2);
  335.         *mincoor = min(mincoor1,mincoor2);
  336.         *maxcoor = max(maxcoor1,maxcoor2);
  337.     }
  338.     else
  339.     {
  340.         *mincoor = YCoor;
  341.         *maxcoor = YCoor;
  342.     }
  343. }
  344. TGeneTreeNode* __fastcall TGeneTreeNode::Dist(int X, int Y, double *Dist)
  345. {
  346.         TGeneTreeNode *Best;
  347.         if (IsNode == true)
  348.         {
  349.             double Dist1, Dist2;
  350.             TGeneTreeNode *Best1,*Best2;
  351.             Best1 = Child1->Dist(X,Y,&Dist1);
  352.             Best2 = Child2->Dist(X,Y,&Dist2);
  353.             *Dist = sqrt( (X-XPoint)*(X-XPoint) + (Y-YPoint)*(Y-YPoint) );
  354.             if (*Dist < min((Dist1),(Dist2)))
  355.             {
  356.                 Best = this;
  357.             }
  358.             else
  359.             {
  360.                 if (Dist1 < Dist2)
  361.                 {
  362.                      Best = Best1;
  363.                     *Dist = Dist1;
  364.                 }
  365.                 else
  366.                 {
  367.                     Best = Best2;
  368.                     *Dist = Dist2;
  369.                 }
  370.             }
  371.         }
  372.         else
  373.         {
  374.             Best = NULL;
  375.             *Dist = 100000.0;
  376.         }
  377.         return Best;
  378. }
  379. TGeneTreeNode * __fastcall TGeneTreeNode::Include(int X, int Y, bool *Includes)
  380. {
  381.         TGeneTreeNode *Best;
  382.         Best = NULL;
  383.         if (IsNode == true)
  384.         {
  385.             bool Includes1, Includes2;
  386.             TGeneTreeNode *Best1,*Best2;
  387.             Best1 = Child1->Include(X,Y,&Includes1);
  388.             Best2 = Child2->Include(X,Y,&Includes2);
  389.             if (Best1 != NULL)
  390.             {
  391.                 Best = Best1;
  392.             }
  393.             if (Best2 != NULL)
  394.             {
  395.                 Best = Best2;
  396.             }
  397.             *Includes = (Includes1 || Includes2);
  398.             if (Includes1 && Includes2)
  399.             {
  400.                 Best = this;
  401.             }
  402.         }
  403.         else
  404.         {
  405.             Best = NULL;
  406.             *Includes = false;
  407.             if ( (X == (int) YCoor) || (Y == (int) YCoor) )
  408.             {
  409.                 *Includes = true;
  410.             }
  411.             if ( (X == (int) YCoor) && (Y == (int) YCoor) )
  412.             {
  413.                 *Includes = true;
  414.                 Best = this;
  415.             }
  416.         }
  417.         return Best;
  418. }
  419. void __fastcall TGeneTreeNode::SaveData(TStringList *FileList, double LowCut,
  420.      double HighCut, int MinElems, bool SaveChildren, bool SaveList)
  421. {
  422.      if ( (Corr >= LowCut) && (Corr <= HighCut) && (Elements > MinElems) )
  423.      {
  424.         int i,j;
  425.         AnsiString Line =
  426.                 Data->ID + "t" + Data->ID + " " + AnsiString(Corr) + " " + AnsiString(Elements);
  427.                 for (j=0;j<Data->Columns;j++)
  428.                 {
  429.                     Line += "t";
  430.                     if (Data->Mask[j])
  431.                     {
  432.                         Line += AnsiString(Data->Data[j]);
  433.                     }
  434.                 }
  435.         FileList->Add(Line);
  436.         if (SaveChildren && IsNode)
  437.         {
  438.            Child1->SaveData(FileList,LowCut,HighCut, MinElems,SaveChildren,SaveList);
  439.            Child2->SaveData(FileList,LowCut,HighCut, MinElems,SaveChildren,SaveList);
  440.         }
  441.         if (SaveList)
  442.         {
  443.            TStringList *GeneList = new TStringList();
  444.            GetList(GeneList);
  445.            AnsiString ListFileName = Data->ID + ".lst";
  446.            GeneList->SaveToFile(ListFileName);
  447.            delete GeneList;
  448.         }
  449.      }
  450.      else if (IsNode)
  451.      {
  452.         Child1->SaveData(FileList,LowCut,HighCut,MinElems,SaveChildren,SaveList);
  453.         Child2->SaveData(FileList,LowCut,HighCut,MinElems,SaveChildren,SaveList);
  454.      }
  455. }
  456. void __fastcall TGeneTreeNode::GetList(TStringList *List)
  457. {
  458.      if (IsNode)
  459.      {
  460.         Child1->GetList(List);
  461.         Child2->GetList(List);
  462.      }
  463.      else
  464.      {
  465.         List->Add(Data->ID);
  466.      }
  467. }
  468. __fastcall TGeneCluster::TGeneCluster() : TObject()
  469. {
  470.     Arrays = new TStringList();
  471.     Genes = new TStringList();
  472.     Nodes = new TStringList();
  473.     ArrayNodes = new TStringList();
  474.     GeneNames = new TStringList();
  475.     Loaded = false;
  476.     Columns = 0;
  477. }
  478. __fastcall TGeneCluster::~TGeneCluster()
  479. {
  480.     int i;
  481.     delete Bitmap;
  482.     delete Arrays;
  483.     for (i=0; i<Genes->Count;i++)
  484.     {
  485.         delete (TGeneTreeNode *)Genes->Objects[i];
  486.     }
  487.     delete Genes;
  488.     for (i=0; i<Nodes->Count;i++)
  489.     {
  490.         delete (TGeneTreeNode *)Nodes->Objects[i];
  491.     }
  492.     delete Nodes;
  493.     for (i=0; i<ArrayNodes->Count;i++)
  494.     {
  495.         delete (TArrayTreeNode *)ArrayNodes->Objects[i];
  496.     }
  497.     delete ArrayNodes;
  498. }
  499. void __fastcall TGeneCluster::Dist(int X, int Y)
  500. {
  501.     BestNode = TopNode->Dist(X,Y,&BestDist);
  502.     BestNode->Limits(&MinCoor,&MaxCoor);
  503. }
  504. void __fastcall TGeneCluster::Include(int X, int Y)
  505. {
  506.     bool Includes;
  507.     if (TopNode != NULL)
  508.     {
  509.         BestNode = TopNode->Include(X,Y,&Includes);
  510.         BestNode->Limits(&MinCoor,&MaxCoor);
  511.     }
  512.     else
  513.     {
  514.         MinCoor = X;
  515.         MaxCoor = Y;
  516.     }
  517. }
  518. double __fastcall TGeneCluster::Load
  519. (AnsiString DataFile)
  520. {
  521.     TStringList *DataFileList = new TStringList();
  522.     char Extension[5];
  523.     char FileName[256];
  524.     fnsplit(DataFile.c_str(),NULL,NULL,FileName,Extension);
  525.     DataFileList->LoadFromFile(DataFile);
  526.     bool LoadGeneTree;
  527.     AnsiString GeneTreeFile  = AnsiString(FileName) + ".gtr";
  528.     AnsiString ArrayTreeFile = AnsiString(FileName) + ".atr";
  529.     AnsiString Line;
  530.     AnsiString Field;
  531.     int i,j;
  532.     TStringList *Headers = new TStringList();
  533.     bool *IsData;
  534.     long double Sum = 0;
  535.     long double Sum2 = 0;
  536.     double DCount = 0;
  537.     // Remove Comment Lines
  538.     for (i=DataFileList->Count-1;i>=0;i--)
  539.     {
  540.         if (DataFileList->Strings[i].SubString(1,6) == "REMARK")
  541.         {
  542.             DataFileList->Delete(i);
  543.         }
  544.         if (DataFileList->Strings[i].Length() < 3)
  545.         {
  546.             DataFileList->Delete(i);
  547.         }
  548.     }
  549.     // Parse First Line
  550.     Line = DataFileList->Strings[0];
  551.     DataFileList->Delete(0);
  552.     while ((Field = NextString(&Line)) != "DONE")
  553.     {
  554.         Headers->Insert(0,Field);
  555.     }
  556.     
  557.     IsData = new bool [Headers->Count];
  558.     for (i=0;i<Headers->Count;i++)
  559.     {
  560.         IsData[i] = true;
  561.     }
  562.     int GIDIndex = Headers->IndexOf("GID");
  563.     int UniqueIDIndex;
  564.     if (GIDIndex > -1)
  565.     {
  566.         LoadGeneTree = true;
  567.         UniqueIDIndex = GIDIndex + 1;
  568.         IsData[GIDIndex] = false;
  569.     }
  570.     else
  571.     {
  572.         LoadGeneTree = false;
  573.         UniqueIDIndex = 0;
  574.     }
  575.     UniqueID = Headers->Strings[UniqueIDIndex];
  576.     IsData[UniqueIDIndex] = false;
  577.     int NameIndex = Headers->IndexOf("NAME");
  578.     if (NameIndex > -1)
  579.     {
  580.         IsData[NameIndex] = false;
  581.     }
  582.     int GeneWeightIndex = Headers->IndexOf("GWEIGHT");
  583.     if (GeneWeightIndex > -1)
  584.     {
  585.         IsData[GeneWeightIndex] = false;
  586.     }
  587.     for (i=0;i<Headers->Count;i++)
  588.     {
  589.         if (IsData[i] == true)
  590.         {
  591.             Columns++;
  592.             Arrays->Add(Headers->Strings[i]);
  593.         }
  594.     }
  595.     ListIndex = new long[DataFileList->Count * 2];
  596.     TGeneTreeNode *GeneTreeNode;
  597.     AnsiString GID, ID, Name;
  598.     int index;
  599.     int nGID;
  600.     bool LoadArrayTree = false;
  601.     AnsiString ArrayHeaderString;
  602.     AnsiString ArrayWeightString;
  603.     double Weight;
  604.     TStringList *LineList = new TStringList();
  605.     i=0;
  606.     Rows = 0;
  607.     while (DataFileList->Count > 0)
  608.     {
  609.         Line = DataFileList->Strings[0];
  610.         LineList->Clear();
  611.         while ((Field = NextString(&Line)) != "DONE")
  612.         {
  613.             LineList->Insert(0,Field);
  614.         }
  615.         if (LineList->Strings[0] == "AID")
  616.         {
  617.             LoadArrayTree = true;
  618.             ArrayHeaderString = DataFileList->Strings[0];
  619.         }
  620.         else if (LineList->Strings[0] == "EWEIGHT")
  621.         {
  622.             ArrayWeightString = DataFileList->Strings[0];
  623.         }
  624.         else
  625.         {
  626.             GID = "";
  627.             if ( (GIDIndex > -1) && (GIDIndex < LineList->Count) )
  628.             {
  629.                 GID = LineList->Strings[GIDIndex];
  630.             }
  631.             Name = "";
  632.             if ( (NameIndex > -1) && (NameIndex < LineList->Count) )
  633.             {
  634.                 Name = LineList->Strings[NameIndex];
  635.                 for (int Pos=Name.Length();Pos>=0;Pos--)
  636.                 {
  637.                     if (Name.SubString(Pos,1) == """)
  638.                     {
  639.                        Name.Delete(Pos,1);
  640.                     }
  641.                 }
  642.             }
  643.             ID = "";
  644.             if ( (UniqueIDIndex > -1) && (UniqueIDIndex < LineList->Count) )
  645.             {
  646.                 ID = LineList->Strings[UniqueIDIndex];
  647.             }
  648.             Weight = 1.0;
  649.             if ( (GeneWeightIndex > -1) && (GeneWeightIndex < LineList->Count) )
  650.             {
  651.                 try
  652.                 {
  653.                     Weight = (LineList->Strings[GeneWeightIndex]).ToDouble();
  654.                 }
  655.                 catch (EConvertError &E)
  656.                 {
  657.                     Weight = 1.0;
  658.                 }
  659.             }
  660.             index = Genes->Add(ID);
  661.             if (LoadGeneTree == true)
  662.             {
  663.                 try
  664.                 {
  665.                     nGID =  (GID.SubString(5,GID.Length()-5)).ToInt();
  666.                     ListIndex[nGID] = index;
  667.                 }
  668.                 catch (EConvertError &E)
  669.                 {
  670.                 }
  671.             }
  672.             Genes->Objects[index]    = new TGeneTreeNode();
  673.             GeneNames->Add(Name);
  674.             GeneTreeNode             = (TGeneTreeNode *) Genes->Objects[index];
  675.             GeneTreeNode->Data       = new TGeneData(Columns);
  676.             GeneTreeNode->IsNode     = false;
  677.             GeneTreeNode->Corr       = 1.0;
  678.             GeneTreeNode->Weight     = Weight;
  679.             GeneTreeNode->Data->ID   = ID;
  680.             GeneTreeNode->Data->Name = Name;
  681.             index = 0;
  682.             for (j=0;j<min(LineList->Count,Headers->Count);j++)
  683.             {
  684.                 if (IsData[j] == true)
  685.                 {
  686.                     try
  687.                     {
  688.                         double Val = LineList->Strings[j].ToDouble();
  689.                         GeneTreeNode->Data->Data[index] = Val;
  690.                         GeneTreeNode->Data->Mask[index] = true;
  691.                         Sum += Val;
  692.                         Sum2 += pow(Val,2.0);
  693.                         DCount += 1.0;
  694.                     }
  695.                     catch (EConvertError &E)
  696.                     {
  697.                         GeneTreeNode->Data->Mask[index] = false;
  698.                     }
  699.                     index++;
  700.                 }
  701.             }
  702.             /* Handle case where there are too few lines */
  703.             for (j=index; j<Columns;j++)
  704.             {
  705.                 GeneTreeNode->Data->Mask[j] = false;
  706.             }
  707.             i++;
  708.             Rows++;
  709.         }
  710.         DataFileList->Delete(0);
  711.     }
  712.     for (i=0;i<Genes->Count;i++)
  713.     {
  714.         ((TGeneTreeNode *)Genes->Objects[i])->YCoor = i;
  715.     }
  716.     if (LoadGeneTree == true)
  717.     {
  718.         TStringList *TreeFileList = new TStringList();
  719.         TreeFileList->LoadFromFile(GeneTreeFile);
  720.         if (TreeFileList->Count == 0)
  721.         {
  722.             ShowMessage("Could Not Load Gene Tree File");
  723.         }
  724.         else
  725.         {
  726.         AnsiString NodeID, Child1, Child2;
  727.         double Corr;
  728.         int nGID1,nGID2;
  729.         for (i=0;i<TreeFileList->Count;i++)
  730.         {
  731.             Line = TreeFileList->Strings[i];
  732.             LineList->Clear();
  733.             while ((Field = NextString(&Line)) != "DONE")
  734.             {
  735.                 LineList->Insert(0,Field);
  736.             }
  737.             NodeID = LineList->Strings[0];
  738.             Child1 = LineList->Strings[1];
  739.             Child2 = LineList->Strings[2];
  740.             Corr   = LineList->Strings[3].ToDouble();
  741.             nGID1 =  (Child1.SubString(5,Child1.Length()-5)).ToInt();
  742.             nGID2 =  (Child2.SubString(5,Child2.Length()-5)).ToInt();
  743.             GeneTreeNode = new TGeneTreeNode();
  744.             GeneTreeNode->IsNode = true;
  745.             if (Child1.SubString(1,4) == "NODE")
  746.             {
  747.                 GeneTreeNode->Child1 = (TGeneTreeNode *) Nodes->Objects[nGID1-1];
  748.             }
  749.             else
  750.             {
  751.                 GeneTreeNode->Child1 = (TGeneTreeNode *) Genes->Objects[ListIndex[nGID1]];
  752.             }
  753.             if (Child2.SubString(1,4) == "NODE")
  754.             {
  755.                 GeneTreeNode->Child2 = (TGeneTreeNode *) Nodes->Objects[nGID2-1];
  756.             }
  757.             else
  758.             {
  759.                 GeneTreeNode->Child2 = (TGeneTreeNode *) Genes->Objects[ListIndex[nGID2]];
  760.             }
  761.             if ( (GeneTreeNode->Child1 == NULL) || (GeneTreeNode->Child2 == NULL) )
  762.             {
  763.                 GeneTreeNode->IsNode = false;
  764.             }
  765.             GeneTreeNode->Corr = Corr;
  766.             index = Nodes->Add(NodeID);
  767.             Nodes->Objects[index]  = GeneTreeNode;
  768.             GeneTreeNode->Data     = new TGeneData(Columns);
  769.             GeneTreeNode->Data->ID = NodeID;
  770.         }
  771.         TopNode = GeneTreeNode;
  772.         TopNode->SetParent(NULL);
  773.         TopNode->SetData();
  774.         //Nodes->Clear();
  775.         }
  776.         delete TreeFileList;
  777.     }
  778.     else
  779.     {
  780.         TopNode = NULL;
  781.     }
  782.     if (LoadArrayTree == true)
  783.     {
  784.         TStringList *TreeFileList = new TStringList();
  785.         TreeFileList->LoadFromFile(ArrayTreeFile);
  786.         TArrayTreeNode *ArrayTreeNode;
  787.         long *ArrayListIndex = new long[Columns];
  788.         LineList->Clear();
  789.         while ((Field = NextString(&ArrayHeaderString)) != "DONE")
  790.         {
  791.             LineList->Insert(0,Field);
  792.         }
  793.         index = 0;
  794.         for (i=0;i<LineList->Count;i++)
  795.         {
  796.             if (IsData[i] == true)
  797.             {
  798.                 ID = LineList->Strings[i];
  799.                 Arrays->Objects[index] = new TArrayTreeNode();
  800.                 ArrayTreeNode = (TArrayTreeNode *) Arrays->Objects[index];
  801.                 nGID =  (ID.SubString(5,ID.Length()-5)).ToInt();
  802.                 ArrayListIndex[nGID] = index;
  803.                 ArrayTreeNode->Data = new TArrayData();
  804.                 ArrayTreeNode->IsNode = false;
  805.                 ArrayTreeNode->Corr = 1.0;
  806.                 ArrayTreeNode->Weight = 1.0;
  807.                 ArrayTreeNode->Data->ID = ID;
  808.                 ArrayTreeNode->Data->Name = "";
  809.                 index++;
  810.             }
  811.         }
  812.         LineList->Clear();
  813.         while ((Field = NextString(&ArrayWeightString)) != "DONE")
  814.         {
  815.             LineList->Insert(0,Field);
  816.         }
  817.         index = 0;
  818.         for (i=0;i<LineList->Count;i++)
  819.         {
  820.             if (IsData[i] == true)
  821.             {
  822.                 try
  823.                 {
  824.                     Weight = (LineList->Strings[i]).ToDouble();
  825.                     ArrayTreeNode = (TArrayTreeNode *) Arrays->Objects[index];
  826.                     ArrayTreeNode->Weight = Weight;
  827.                 }
  828.                 catch (EConvertError &E)
  829.                 {
  830.                 }
  831.                 index ++;
  832.             }
  833.         }
  834.         AnsiString NodeID, Child1, Child2;
  835.         double Corr;
  836.         int nGID1,nGID2;
  837.         for (i=0;i<TreeFileList->Count;i++)
  838.         {
  839.             Line = TreeFileList->Strings[i];
  840.             LineList->Clear();
  841.             while ((Field = NextString(&Line)) != "DONE")
  842.             {
  843.                 LineList->Insert(0,Field);
  844.             }
  845.             NodeID = LineList->Strings[0];
  846.             Child1 = LineList->Strings[1];
  847.             Child2 = LineList->Strings[2];
  848.             Corr = LineList->Strings[3].ToDouble();
  849.             nGID1 =  (Child1.SubString(5,Child1.Length()-5)).ToInt();
  850.             nGID2 =  (Child2.SubString(5,Child2.Length()-5)).ToInt();
  851.             ArrayTreeNode = new TArrayTreeNode();
  852.             ArrayTreeNode->IsNode = true;
  853.             if (Child1.SubString(1,4) == "NODE")
  854.             {
  855.                 ArrayTreeNode->Child1 = (TArrayTreeNode *) ArrayNodes->Objects[nGID1-1];
  856.             }
  857.             else
  858.             {
  859.                 ArrayTreeNode->Child1 = (TArrayTreeNode *) Arrays->Objects[ArrayListIndex[nGID1]];
  860.             }
  861.             if (Child2.SubString(1,4) == "NODE")
  862.             {
  863.                 ArrayTreeNode->Child2 = (TArrayTreeNode *) ArrayNodes->Objects[nGID2-1];
  864.             }
  865.             else
  866.             {
  867.                 ArrayTreeNode->Child2 = (TArrayTreeNode *) Arrays->Objects[ArrayListIndex[nGID2]];
  868.             }
  869.             if ( (ArrayTreeNode->Child1 == NULL) || (ArrayTreeNode->Child2 == NULL) )
  870.             {
  871.                 ArrayTreeNode->IsNode = false;
  872.             }
  873.             ArrayTreeNode->Corr = Corr;
  874.             index = ArrayNodes->Add(NodeID);
  875.             ArrayNodes->Objects[index] = ArrayTreeNode;
  876.             ArrayTreeNode->Data = new TArrayData();
  877.             ArrayTreeNode->Data->ID = NodeID;
  878.         }
  879.         TopArrayNode = ArrayTreeNode;
  880.         TopArrayNode->SetParent(NULL);
  881.         for (i=0;i<Arrays->Count;i++)
  882.         {
  883.             ((TArrayTreeNode *)Arrays->Objects[i])->XCoor = i;
  884.         }
  885.         //Nodes->Clear();
  886.         delete TreeFileList;
  887.         delete ArrayListIndex;
  888.     }
  889.     
  890.     Loaded = true;
  891.     delete ListIndex;
  892.     delete DataFileList;
  893.     delete LineList;
  894.     delete IsData;
  895.     return (sqrt(Sum2/DCount));
  896. }
  897. __fastcall TGeneData::TGeneData() : TObject()
  898. {
  899. }
  900. __fastcall TGeneData::TGeneData(int nCols) : TObject()
  901. {
  902.     Columns = nCols;
  903.     try
  904.     {
  905.         fMask = new bool[nCols];
  906.         fData = new double[nCols];
  907.     }
  908.     catch (EAccessViolation &E)
  909.     {
  910.     }
  911. }
  912. __fastcall TGeneData::~TGeneData()
  913. {
  914.     delete fMask;
  915.     delete fData;
  916. }
  917. void __fastcall TGeneCluster::MakeThumbnail(TImage *Image,
  918.             double ScaleX, double ScaleY, double Contrast, double MaskVal,
  919.             TColor PositiveColor, TColor ZeroColor, TColor NegativeColor,
  920.             TColor MissingColor)
  921. {
  922.     int i,j,k;
  923.     TRect Rect;
  924.     if (Bitmap != NULL)
  925.     {
  926.         delete Bitmap;
  927.     }
  928.     Bitmap = new Graphics::TBitmap();
  929.     Bitmap->Height = Rows;
  930.     Bitmap->Width  = Columns;
  931.     Bitmap->PixelFormat = 6;
  932.     unsigned char *ScanLine;
  933.     unsigned char *Color;
  934.     Color = new unsigned char[3];
  935.     DWORD DPositiveColor = ColorToRGB(PositiveColor);
  936.     unsigned char *Positive;
  937.     //Positive = new unsigned char[3];
  938.     Positive = (unsigned char *)&DPositiveColor;
  939.     DWORD DZeroColor = ColorToRGB(ZeroColor);
  940.     unsigned char *Zero;
  941.     //Zero = new unsigned char[3];
  942.     Zero = (unsigned char *)&DZeroColor;
  943.     DWORD DNegativeColor = ColorToRGB(NegativeColor);
  944.     unsigned char *Negative;
  945.     //Negative = new unsigned char[3];
  946.     Negative = (unsigned char *)&DNegativeColor;
  947.     DWORD DMissingColor = ColorToRGB(MissingColor);
  948.     unsigned char *Missing;
  949.     //Missing = new unsigned char[3];
  950.     Missing = (unsigned char *)&DMissingColor;
  951.     double Factor;
  952.     TGeneTreeNode *GeneTreeNode;
  953.     for (i=0;i<Genes->Count;i++)
  954.     {
  955.         ScanLine = (unsigned char *) Bitmap->ScanLine[i];
  956.         GeneTreeNode = (TGeneTreeNode *) Genes->Objects[i];
  957.         if ( (GeneTreeNode->Data->ID == "NULL") || (GeneTreeNode->Data->ID == "NONE") )
  958.         {
  959.            for (j=0;j<Columns;j++)
  960.            {
  961.                 ScanLine[3*j]   = 255;      //Blue
  962.                 ScanLine[3*j+1] = 255;    //Green
  963.                 ScanLine[3*j+2] = 255;  //Red
  964.            }
  965.         }
  966.         else
  967.         {
  968.         for (j=0;j<Columns;j++)
  969.         {
  970.             if (GeneTreeNode->Data->Mask[j] == true)
  971.             {
  972.                 if (GeneTreeNode->Data->Data[j] >= MaskVal)
  973.                 {
  974.                     Factor =  min(1.0, GeneTreeNode->Data->Data[j] / Contrast);
  975.                     for (k=0;k<3;k++)
  976.                     {
  977.                         Color[k] =  Factor * Positive[k] + (1.0 - Factor) * Zero[k];
  978.                     }
  979.                 }
  980.                 else if (GeneTreeNode->Data->Data[j] <= -MaskVal)
  981.                 {
  982.                     Factor =  min(1.0, -GeneTreeNode->Data->Data[j] / Contrast);
  983.                     for (k=0;k<3;k++)
  984.                     {
  985.                         Color[k] =  Factor * Negative[k] + (1.0 - Factor) * Zero[k];
  986.                     }
  987.                 }
  988.                 else
  989.                 {
  990.                     Color[0] = 0;
  991.                     Color[1] = 0;
  992.                     Color[2] = 0;
  993.                 }
  994.                 ScanLine[3*j] = Color[2];      //Blue
  995.                 ScanLine[3*j+1] = Color[1];    //Green
  996.                 ScanLine[3*j+2] = Color[0];  //Red
  997.             }
  998.             else
  999.             {
  1000.                 ScanLine[3*j] = Missing[2];      //Blue
  1001.                 ScanLine[3*j+1] = Missing[1];    //Green
  1002.                 ScanLine[3*j+2] = Missing[0];  //Red
  1003.             }
  1004.         }
  1005.         }
  1006.     }
  1007.     /*
  1008.     unsigned char *ScanLine;
  1009.     TGeneTreeNode *GeneTreeNode;
  1010.     for (i=0;i<Genes->Count;i++)
  1011.     {
  1012.         ScanLine = (unsigned char *) Bitmap->ScanLine[i];
  1013.         for (j=0;j<Columns;j++)
  1014.         {
  1015.             Red = 0;
  1016.             Green = 0;
  1017.             Blue = 0;
  1018.             GeneTreeNode = (TGeneTreeNode *) Genes->Objects[i];
  1019.             if (GeneTreeNode->Data->Mask[j] == true)
  1020.             {
  1021.                 if (GeneTreeNode->Data->Data[j] > 0)
  1022.                 {
  1023.                     Red = max(0,min(255,(int) (256.0 * GeneTreeNode->Data->Data[j] / Contrast)));
  1024.                 }
  1025.                 else
  1026.                 {
  1027.                     Green = max(0,min(255,(int) (-256.0 * GeneTreeNode->Data->Data[j] / Contrast)));
  1028.                 }
  1029.             }
  1030.             else
  1031.             {
  1032.                 Red = 100;
  1033.                 Green = 100;
  1034.                 Blue = 100;
  1035.             }
  1036.             ScanLine[3*j] = Blue;      //Blue
  1037.             ScanLine[3*j+1] = Green;    //Green
  1038.             ScanLine[3*j+2] = Red;  //Red
  1039.     }
  1040.     }       */
  1041.     Image->Width  = Columns * ScaleX;
  1042.     Image->Height = Rows    * ScaleY;
  1043.     Image->Picture->Bitmap = Bitmap;
  1044.     delete Color;
  1045. }
  1046. __fastcall TArrayTreeNode::TArrayTreeNode() : TObject()
  1047. {
  1048.     IsNode = true;
  1049.     Color = clBlack;
  1050.     Child1 = NULL;
  1051.     Child2 = NULL;
  1052. }
  1053. __fastcall TArrayTreeNode::~TArrayTreeNode()
  1054. {
  1055.     delete Data;
  1056. }
  1057. void __fastcall TArrayTreeNode::SetParent(TArrayTreeNode *pParent)
  1058. {
  1059.     Parent = pParent;
  1060.     if (IsNode == true)
  1061.     {
  1062.         Child1->SetParent(this);
  1063.         Child2->SetParent(this);
  1064.     }
  1065.     else
  1066.     {
  1067.         Child1 = NULL;
  1068.         Child2 = NULL;
  1069.     }
  1070. }
  1071. void __fastcall TArrayTreeNode::SetCoor()
  1072. {
  1073.     if (IsNode == true)
  1074.     {
  1075.         Child1->SetCoor();
  1076.         Child2->SetCoor();
  1077.         YCoor = 1.0 - ((1.0 - Corr)/2);
  1078.         YCoor = min(YCoor, Child1->YCoor);
  1079.         YCoor = min(YCoor, Child2->YCoor);
  1080.         XCoor = (Child1->XCoor + Child2->XCoor)/2;
  1081.         MinCoor = min(Child1->MinCoor,Child2->MinCoor);
  1082.         MaxCoor = max(Child1->MaxCoor,Child2->MaxCoor);
  1083.     }
  1084.     else
  1085.     {
  1086.         YCoor = 1.0;
  1087.         MinCoor = XCoor;
  1088.         MaxCoor = XCoor;
  1089.     }
  1090. }
  1091. void __fastcall TArrayTreeNode::Draw(TImage *Image, double Scale)
  1092. {
  1093.     if (IsNode == true)
  1094.     {
  1095.         Image->Canvas->MoveTo(Scale/2 + Child1->XCoor * Scale, Child1->YCoor*Image->Height);
  1096.         Image->Canvas->LineTo(Scale/2 + Child1->XCoor * Scale, YCoor*Image->Height);
  1097.         Image->Canvas->LineTo(Scale/2 + Child2->XCoor * Scale, YCoor*Image->Height);
  1098.         Image->Canvas->LineTo(Scale/2 + Child2->XCoor * Scale, Child2->YCoor*Image->Height);
  1099.         Child1->Draw(Image, Scale);
  1100.         Child2->Draw(Image, Scale);
  1101.         YPoint = YCoor * Image->Height;
  1102.         XPoint = XCoor * Scale;
  1103.     }
  1104. }
  1105. void __fastcall TArrayTreeNode::DrawPS(TStringList *PSFile, int XScale, int YScale, int XOrigin, int YOrigin)
  1106. {
  1107.     if (IsNode == true)
  1108.     {
  1109.         AnsiString TempString;
  1110.         int X1,Y1,X2,Y2;
  1111.         X1 = XOrigin + (XScale/2) + Child1->XCoor*XScale;
  1112.         Y1 = YOrigin + (1.0 - Child1->YCoor) * YScale;
  1113.         X2 = XOrigin + (XScale/2) + Child1->XCoor*XScale;
  1114.         Y2 = YOrigin + (1.0 - YCoor) * YScale;
  1115.         TempString = AnsiString(X1) + " " + AnsiString(Y1) + " " +
  1116.             AnsiString(X2) + " " + AnsiString(Y2) + " ln";
  1117.         PSFile->Add(TempString);
  1118.         X1 = XOrigin + (XScale/2) + Child2->XCoor*XScale;
  1119.         Y1 = YOrigin + (1.0 - Child2->YCoor) * YScale;
  1120.         X2 = XOrigin + (XScale/2) + Child2->XCoor*XScale;
  1121.         Y2 = YOrigin + (1.0 - YCoor) * YScale;
  1122.         TempString = AnsiString(X1) + " " + AnsiString(Y1) + " " +
  1123.             AnsiString(X2) + " " + AnsiString(Y2) + " ln";
  1124.         PSFile->Add(TempString);
  1125.         X1 = XOrigin + (XScale/2) + Child1->XCoor*XScale;
  1126.         Y1 = YOrigin + (1.0 - YCoor) * YScale;
  1127.         X2 = XOrigin + (XScale/2) + Child2->XCoor*XScale;
  1128.         Y2 = YOrigin + (1.0 - YCoor) * YScale;
  1129.         TempString = AnsiString(X1) + " " + AnsiString(Y1) + " " +
  1130.             AnsiString(X2) + " " + AnsiString(Y2) + " ln";
  1131.         PSFile->Add(TempString);
  1132.         Child1->DrawPS(PSFile, XScale, YScale, XOrigin, YOrigin);
  1133.         Child2->DrawPS(PSFile, XScale, YScale, XOrigin, YOrigin);
  1134.     }
  1135. }
  1136. __fastcall TArrayData::TArrayData() : TObject()
  1137. {
  1138. }
  1139. __fastcall TArrayData::~TArrayData()
  1140. {
  1141. }
  1142. void __fastcall TGeneTreeNode::MakeBarcode(TImage *Image, int ScaleX, int ScaleY,
  1143.             double Contrast, TColor PositiveColor, TColor ZeroColor, TColor NegativeColor,
  1144.             TColor MissingColor)
  1145. {
  1146.     int i,j,k;
  1147.     unsigned char *Color;
  1148.     Color = new unsigned char[3];
  1149.     DWORD DPositiveColor = ColorToRGB(PositiveColor);
  1150.     unsigned char *Positive;
  1151.     //Positive = new unsigned char[3];
  1152.     Positive = (unsigned char *)&DPositiveColor;
  1153.     DWORD DZeroColor = ColorToRGB(ZeroColor);
  1154.     unsigned char *Zero;
  1155.     //Zero = new unsigned char[3];
  1156.     Zero = (unsigned char *)&DZeroColor;
  1157.     DWORD DNegativeColor = ColorToRGB(NegativeColor);
  1158.     unsigned char *Negative;
  1159.     //Negative = new unsigned char[3];
  1160.     Negative = (unsigned char *)&DNegativeColor;
  1161.     DWORD DMissingColor = ColorToRGB(MissingColor);
  1162.     unsigned char *Missing;
  1163.     //Missing = new unsigned char[3];
  1164.     Missing = (unsigned char *)&DMissingColor;
  1165.     double Factor;
  1166.     TRect Rect;
  1167.     Rect.Top = 0;
  1168.     Rect.Bottom = ScaleY;
  1169.     Image->Canvas->Pen->Style = psClear;
  1170.     Image->Canvas->Brush->Style = bsSolid;
  1171.     for (j=0;j<Data->Columns;j++)
  1172.     {
  1173.         Color[0] = Missing[0];
  1174.         Color[1] = Missing[1];
  1175.         Color[2] = Missing[2];
  1176.         if (Data->Mask[j] == true)
  1177.         {
  1178.             if (Data->Data[j] > 0)
  1179.             {
  1180.                 Factor =  min(1.0, Data->Data[j] / Contrast);
  1181.                 for (k=0;k<3;k++)
  1182.                 {
  1183.                     Color[k] =  Factor * Positive[k] + (1.0 - Factor) * Zero[k];
  1184.                 }
  1185.             }
  1186.             else
  1187.             {
  1188.                 Factor =  min(1.0, -Data->Data[j] / Contrast);
  1189.                 for (k=0;k<3;k++)
  1190.                 {
  1191.                     Color[k] =  Factor * Negative[k] + (1.0 - Factor) * Zero[k];
  1192.                 }
  1193.             }
  1194.         }
  1195.         Image->Canvas->Brush->Color = RGB(Color[0],Color[1],Color[2]);
  1196.         Rect.Left = j * ScaleX;
  1197.         Rect.Right = (j + 1) * ScaleX;
  1198.         Image->Canvas->FillRect(Rect);
  1199.     }
  1200.     delete Color;
  1201. }