Exemplo n.º 1
0
        public static void WriteRotateMDS(string fname, int OutputOption, double[][] param, double[][] perr)
        {
            int LocalVectorDimension = param[0].GetLength(0);

            if (LocalVectorDimension != perr[0].GetLength(0))
            {
                SALSAUtility.SALSAError("Inconsistent Dimensions Labels " + LocalVectorDimension.ToString() + " Perr " +
                                        perr[0].GetLength(0).ToString());
            }

            ManxcatSection Configuration = ManxcatCentral.Configuration;

            // set current cosmic scaling
            for (int LocalVectorIndex1 = 0; LocalVectorIndex1 < PointVectorDimension; LocalVectorIndex1++)
            {
                for (int LocalVectorIndex2 = 0; LocalVectorIndex2 < PointVectorDimension; LocalVectorIndex2++)
                {
                    CurrentCosmicScaling[LocalVectorIndex1, LocalVectorIndex2] =
                        SavedCosmicScaling[Hotsun.BestChisqLoop][LocalVectorIndex1, LocalVectorIndex2];
                }
            }

            // Write SALSA Properties File Header
            if (OutputOption == 0)
            {
                int filetype = 2;
                if ((SALSAUtility.NumberFixedPoints > 0) ||
                    (SALSAUtility.NumberVariedPoints < SALSAUtility.NumberOriginalPoints))
                {
                    filetype = 4;
                }
                RotationFileProperties.GroupName               = "MDS Run:" + Configuration.RunNumber.ToString();
                RotationFileProperties.FileGenerationType      = filetype;
                RotationFileProperties.OriginalPointStartIndex = 0;
                RotationFileProperties.LocalPointStartIndex    = 0;

                //  Rotation parameters
                RotationFileProperties.NumberRotationParameters = Hotsun.npar;
                RotationFileProperties.RotationParameters       = "";
                for (int CountRotPars = 0; CountRotPars < Hotsun.npar; CountRotPars++)
                {
                    RotationFileProperties.RotationParameters += " " + param[CountRotPars][0].ToString("E4") + ",";
                }
                for (int Cosmicdiagonals = 0; Cosmicdiagonals < PointVectorDimension; Cosmicdiagonals++)
                {
                    RotationFileProperties.RotationParameters += " " +
                                                                 CurrentCosmicScaling[Cosmicdiagonals, Cosmicdiagonals].
                                                                 ToString("E4") + ",";
                }
                // Comment should have key features of Run
                string OldComment = RotationFileProperties.Comment;
                if (OldComment != "")
                {
                    OldComment += "\n";
                }
                OldComment += "MDS ROTATION Run " + Configuration.RunNumber.ToString() + " Start Time " +
                              SALSAUtility.startTime.ToLocalTime() + " *** ";
                OldComment += "\n RotationOption " + Configuration.RotationOption + " First Scale " +
                              FirstScale.ToString("E4") + " Second Scale " + SecondScale.ToString()
                              + "\n First Mean";
                for (int PointIndex = 0; PointIndex < PointVectorDimension; PointIndex++)
                {
                    OldComment += " " + FirstMean[PointIndex].ToString("E4");
                }
                OldComment += " Second Mean";
                for (int PointIndex = 0; PointIndex < PointVectorDimension; PointIndex++)
                {
                    OldComment += " " + SecondMean[PointIndex].ToString("E4");
                }
                RotationFileProperties.Comment = OldComment;

                SALSA_Properties.WriteDataPointFile(fname, ManxcatCentral.Configuration.Write2Das3D, "all ",
                                                    RotationFileProperties,
                                                    RotationPointProperties, SALSAUtility.NumberOriginalPoints);
                return;
            }

            //  Option OutputOption = 1 -- write ROTATED Second Data
            try
            {
                StreamWriter sw = null;
                if (!string.IsNullOrEmpty(fname))
                {
                    sw = new StreamWriter(fname, false, Encoding.UTF8);
                }
                if (sw != null)
                {
                    double[] FullTranslation;
                    double[,] FullRotation;
                    SetupFinalTransforamation(param, out FullTranslation, out FullRotation);

                    for (int UsedDataPoint = 0; UsedDataPoint < SALSAUtility.PointCount_Global; UsedDataPoint++)
                    {
                        var Vector = new double[PointVectorDimension];
                        MatrixVectorProduct(Vector, FullRotation, SecondData[UsedDataPoint]);
                        VectorSum(Vector, FullTranslation, +1.0, Vector);

                        string Coordinates   = "";
                        int    SingleCluster = 1;

                        for (int LocalVectorIndex = 0; LocalVectorIndex < PointVectorDimension; LocalVectorIndex++)
                        {
                            Coordinates += Vector[LocalVectorIndex].ToString("E4") + "\t";
                        }
                        sw.WriteLine(
                            String.Format((UsedDataPoint + 1).ToString() + "\t" + Coordinates + SingleCluster.ToString()));
                    }
                }

                sw.Flush();
                sw.Close();
            }
            catch (Exception e)
            {
                Console.WriteLine("Failed writing data" + e);
                throw (e);
            }
        }
Exemplo n.º 2
0
        // End SetupHotsunforMDS

        public static void SetupRotateMDS()
        {
            if (Hotsun.InitializationLoops < 2)
            {
                Hotsun.InitializationLoops = 2;
                Hotsun.InitLoopChisq       = new double[Hotsun.InitializationLoops];
                ManxcatCentral.Configuration.InitializationLoops = Hotsun.InitializationLoops;
            }
            Hotsun.bnderrLimit = 10;

            if (SALSAUtility.NumberFixedPoints > 0)
            {
                Exception e = SALSAUtility.SALSAError(" Fixed Points not Allowed in Rotations");
                throw (e);
            }
            RotationOption = ManxcatCentral.Configuration.RotationOption; // set Rotation Option
            RotationOption_GenerateTestInput = RotationOption / 100;
            // Control special test inputs = 0 normal -- don't generate points to rotate;
            //  RotationOption_GenerateTestInput = 1 full inversion;
            //  RotationOption_GenerateTestInput = 2  invert x and y only;
            //  RotationOption_GenerateTestInput = 3 invert x only
            //  RotationOption_GenerateTestInput = 4 set new file = old file
            RotationOption        = RotationOption - 100 * RotationOption_GenerateTestInput;
            RotationOption_invert = RotationOption / 10;
            // Control how to control scaling in fit. = 0 force scaling positive so when cosmic scaling improper, one cannot fit proper rotation
            // RotationOption_invert = 1 allow scaling to be negative which can allow fit to be trapped in wring proper/improper domain for all starts.
            // If RotationOption_invert=0 then every other initialization loop is proper (0 1 ..) or improper (1 3 ...)
            //  Note initial angle values are 0 for initialization loops 0 1nd 1, they are random for later loops
            //  Angles are forced to lie between -PI  and PI
            RotationOption = RotationOption - 10 * RotationOption_invert;
            // RotationOption = 0 usual Chisq; = 1 Each term divided by magnitude of original point so one minimizes realative errors squared

            PointVectorDimension = SALSAUtility.GlobalFileProperties.LocalVectorDimension;
            if (PointVectorDimension != SALSAUtility.GlobalFileProperties.LocalVectorDimension)
            {
                Exception e =
                    SALSAUtility.SALSAError(" Inconsistent Small Dimension in Rotations " +
                                            PointVectorDimension.ToString());
                throw (e);
            }

            int InitializationFileType       = -1;
            int InitializationNumberofPoints = -1;

            //  Set Reference Points
            if (SALSA_ProcessVariedandFixed.AreValuesSet(SALSAUtility.GlobalPointProperties))
            {
                SALSAUtility.SALSAPrint(2,
                                        " Reference Points Taken from basic Labels File " +
                                        ManxcatCentral.Configuration.DataLabelsFileName);
            }
            else
            {
                // Set up Values of Used Points from Initialization File
                var InitializationFileProperties  = new SALSAFileProperties();
                var InitializationPointProperties = new SALSADataPointProperties[SALSAUtility.NumberOriginalPoints];

                string OriginalMDSFileName = ManxcatCentral.Configuration.InitializationFileName;
//                if (!OriginalMDSFileName.Contains(":") || !OriginalMDSFileName.Contains("$"))
//                    OriginalMDSFileName = ManxcatCentral.Configuration.ControlDirectoryName + "\\" + OriginalMDSFileName;
                SALSAUtility.SALSAPrint(2, " Reference Points Taken from Initialization File " + OriginalMDSFileName);

                // Begin Changes saliya 03/25/11
                // Note. I think we can agree on the zero based indices. The following should be removed then.
                if (OriginalMDSFileName.Contains("SIMPLE"))
                {
                    InitializationFileProperties.LocalPointStartIndex = 1;
                }
                // End Changes saliya 03/25/11

                SALSA_Properties.ReadDataPointFile(OriginalMDSFileName, ref InitializationFileType,
                                                   InitializationFileProperties, ref InitializationPointProperties,
                                                   ref InitializationNumberofPoints);
                if ((SALSAUtility.NumberOriginalPoints < InitializationNumberofPoints) ||
                    (InitializationFileProperties.NumberOriginalPoints != SALSAUtility.NumberOriginalPoints))
                {
                    Exception e =
                        SALSAUtility.SALSAError(" Inconsistent Initialization File Point Counts " +
                                                InitializationNumberofPoints.ToString() + " or "
                                                + InitializationFileProperties.NumberOriginalPoints.ToString() +
                                                " Expected is " + SALSAUtility.NumberOriginalPoints.ToString());
                    throw (e);
                }

                for (int InitialIndex = 0; InitialIndex < InitializationNumberofPoints; InitialIndex++)
                {
                    int OriginalIndex = InitializationPointProperties[InitialIndex].OriginalPointNumber;
                    if (!InitializationPointProperties[InitialIndex].valuesset)
                    {
                        continue;
                    }
                    SALSAUtility.GlobalPointProperties[OriginalIndex].x = InitializationPointProperties[InitialIndex].x;
                    SALSAUtility.GlobalPointProperties[OriginalIndex].y = InitializationPointProperties[InitialIndex].y;
                    SALSAUtility.GlobalPointProperties[OriginalIndex].z = InitializationPointProperties[InitialIndex].z;

                    SALSAUtility.GlobalPointProperties[OriginalIndex].valuesset =
                        InitializationPointProperties[InitialIndex].valuesset;
                }


                if (!SALSA_ProcessVariedandFixed.AreValuesSet(SALSAUtility.GlobalPointProperties))
                {
                    Exception e = SALSAUtility.SALSAError(" Reference Points Not set");
                    throw (e);
                }
            }

            // Now Read Points to be Rotated
            // Set up Values of Used Points from Rotation File
            int RotationFileType = -1;

            RotationFileProperties  = new SALSAFileProperties();
            RotationPointProperties = new SALSADataPointProperties[SALSAUtility.NumberOriginalPoints];
            if (RotationOption_GenerateTestInput == 0)
            {
                int    RotationNumberofPoints = -1;
                string RotationFileName       = ManxcatCentral.Configuration.RotationLabelsFileName;
//                if (!RotationFileName.Contains(":"))
//                    RotationFileName = ManxcatCentral.Configuration.ControlDirectoryName + "\\" + RotationFileName;
                if (RotationFileName.Contains("SIMPLE"))
                {
                    RotationFileProperties.LocalPointStartIndex = 1;
                }
                SALSAUtility.SALSAPrint(2, " Points to be rotated Taken from File " + RotationFileName);
                SALSA_Properties.ReadDataPointFile(RotationFileName, ref RotationFileType, RotationFileProperties,
                                                   ref RotationPointProperties, ref RotationNumberofPoints);
                if ((SALSAUtility.NumberOriginalPoints < RotationNumberofPoints) ||
                    (RotationFileProperties.NumberOriginalPoints != SALSAUtility.NumberOriginalPoints))
                {
                    Exception e =
                        SALSAUtility.SALSAError(" Inconsistent Rotation File Point Counts " +
                                                RotationNumberofPoints.ToString() + " or "
                                                + RotationFileProperties.NumberOriginalPoints.ToString() +
                                                " Expected is " + SALSAUtility.NumberOriginalPoints.ToString());
                    throw (e);
                }
                if (!SALSA_ProcessVariedandFixed.AreValuesSet(RotationPointProperties))
                {
                    Exception e = SALSAUtility.SALSAError(" Points to rotate Not set");
                    throw (e);
                }
            } // End normal case when we read file of points to be rotated
            else
            {
                // Generate file to be Rotated
                RotationFileType = InitializationFileType;
                for (int PointIndex = 0; PointIndex < SALSAUtility.NumberOriginalPoints; PointIndex++)
                {
                    RotationPointProperties[PointIndex] = new SALSADataPointProperties();
                }

                double fudgex = 1.0;
                double fudgey = 1.0;
                double fudgez = 1.0;
                if (RotationOption_GenerateTestInput == 1)
                {
                    SALSAUtility.SALSAPrint(2, " Points to be rotated generated as -x -y -z ");
                    fudgex = -1.0;
                    fudgey = -1.0;
                    fudgez = -1.0;
                }
                if (RotationOption_GenerateTestInput == 2)
                {
                    SALSAUtility.SALSAPrint(2, " Points to be rotated generated as -x -y +z ");
                    fudgex = -1.0;
                    fudgey = -1.0;
                }
                if (RotationOption_GenerateTestInput == 3)
                {
                    SALSAUtility.SALSAPrint(2, " Points to be rotated generated as -x +y +z ");
                    fudgex = -1.0;
                }
                if (RotationOption_GenerateTestInput >= 4)
                {
                    SALSAUtility.SALSAPrint(2, " Points to be rotated generated as +x +y +z ");
                }
                for (int GlobalPointIndex = 0; GlobalPointIndex < SALSAUtility.PointCount_Global; GlobalPointIndex++)
                {
                    int OriginalIndex = SALSAUtility.UsedPointtoOriginalPointMap[GlobalPointIndex];
                    RotationPointProperties[OriginalIndex].x = fudgex *
                                                               SALSAUtility.GlobalPointProperties[OriginalIndex].x;
                    ;
                    RotationPointProperties[OriginalIndex].y = fudgey *
                                                               SALSAUtility.GlobalPointProperties[OriginalIndex].y;
                    RotationPointProperties[OriginalIndex].z = fudgez *
                                                               SALSAUtility.GlobalPointProperties[OriginalIndex].z;
                    RotationPointProperties[OriginalIndex].valuesset =
                        SALSAUtility.GlobalPointProperties[OriginalIndex].valuesset;
                }
            }

            //  Set up operational data
            FirstData  = new double[SALSAUtility.PointCount_Global][]; // Initial point data
            SecondData = new double[SALSAUtility.PointCount_Global][];
            ;                                                          // Second point data
            FirstMean  = new double[PointVectorDimension];             // Mean of initial point data
            SecondMean = new double[PointVectorDimension];
            for (int GlobalPointIndex = 0; GlobalPointIndex < SALSAUtility.PointCount_Global; GlobalPointIndex++)
            {
                FirstData[GlobalPointIndex]  = new double[PointVectorDimension];
                SecondData[GlobalPointIndex] = new double[PointVectorDimension];
            }

            //  Process Data
            ProcessPointData(SALSAUtility.GlobalPointProperties, FirstData, FirstMean, out FirstScale);
            ProcessPointData(RotationPointProperties, SecondData, SecondMean, out SecondScale);
            ScalePosition = 6;
            if (PointVectorDimension == 2)
            {
                ScalePosition = 3;
            }

            NumberSubRotations = 3;
            if (PointVectorDimension == 2)
            {
                NumberSubRotations = 1;
            }

            // This holds the inversion transformation
            CurrentCosmicScaling = new double[PointVectorDimension, PointVectorDimension];
            SavedCosmicScaling   = new double[Hotsun.InitializationLoops][, ];
            for (int scalingindex = 0; scalingindex < Hotsun.InitializationLoops; scalingindex++)
            {
                SavedCosmicScaling[scalingindex] = new double[PointVectorDimension, PointVectorDimension];
            }

            // If ManxcatCentral.MetadataforRun.MinimumDistance  is positive, it is absolute Minimum Distance
            // If ManxcatCentral.MetadataforRun.MinimumDistance  is negative, it is - multiplier of System Average
            if (ManxcatCentral.Configuration.MinimumDistance < 0)
            {
                MinimumDistance = -ManxcatCentral.Configuration.MinimumDistance * FirstScale;
            }
            else
            {
                MinimumDistance = ManxcatCentral.Configuration.MinimumDistance;
            }

            string firstM  = "";
            string secondM = "";

            for (int LocalVectorIndex = 0; LocalVectorIndex < PointVectorDimension; LocalVectorIndex++)
            {
                firstM  += FirstMean[LocalVectorIndex].ToString("E4") + " ";
                secondM += SecondMean[LocalVectorIndex].ToString("E4") + " ";
            }
            SALSAUtility.SALSAPrint(0,
                                    " First Scale " + FirstScale.ToString("E4") + " Second Scale " +
                                    SecondScale.ToString("E4") + " First Mean " + firstM + " Second Mean " + secondM);
        }
Exemplo n.º 3
0
        // End UpdateManxcatMDS_Option12_Functions

        public static void UpdateManxcatMDS_Option12_FamilybyCuts()
        {
            String CutFileName = ManxcatCentral.Configuration.ConversionInformation;

            if (!CutFileName.Contains(":"))
            {
                CutFileName = ManxcatCentral.Configuration.ControlDirectoryName + "\\" + CutFileName;
            }

            var inputdata    = new string[SALSAUtility.PointCount_Global];
            int NumberofCuts = 0;

            string FamilyLabel  = "Family";
            int    FamilyNumber = 1;

            if (ManxcatCentral.Configuration.ConversionOption.ToLower().Contains("family2"))
            {
                FamilyNumber = 2;
            }

            ReadString_File(CutFileName, inputdata, ref NumberofCuts);

            if (NumberofCuts <= 0)
            {
                Exception e = SALSAUtility.SALSAError("Too few points "
                                                      + NumberofCuts.ToString() + " in Cut File " + CutFileName);

                throw (e);
            }

            var CutStart      = new int[NumberofCuts];
            var CutLabel      = new string[NumberofCuts];
            int CountFamilies = 0;
            int itmpold       = -2;

            for (int CutPos = 0; CutPos < NumberofCuts; CutPos++)
            {
                string[] split = inputdata[CutPos].Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
                int      itmp  = Convert.ToInt32(split[0]);

                if (itmp < 0)
                {
                    FamilyLabel = split[1];
                    continue;
                }

                if (itmp <= itmpold)
                {
                    continue;
                }
                CutStart[CountFamilies] = itmp;
                CutLabel[CountFamilies] = FamilyLabel + "-" + split[1];
                ++CountFamilies;
                itmpold = itmp;
            }

            if (FamilyNumber == 1)
            {
                SALSAUtility.GlobalFileProperties.FamilyName1 = FamilyLabel + " from " + CutFileName;
            }

            if (FamilyNumber == 2)
            {
                SALSAUtility.GlobalFileProperties.FamilyName2 = FamilyLabel + " from " + CutFileName;
            }

            int minlabel      = 1;
            int CurrentFamily = 0;
            var CategoryIndex = new int[SALSAUtility.PointCount_Global];

            for (int PointIndex = 0; PointIndex < SALSAUtility.PointCount_Global; PointIndex++)
            {
                if (CurrentFamily < CountFamilies - 1)
                {
                    if ((PointIndex + 1) >= CutStart[CurrentFamily + 1])
                    {
                        ++CurrentFamily;
                    }
                }
                CategoryIndex[PointIndex] = minlabel + CurrentFamily;
                continue;
            }

            var FamilyCounts = new int[CountFamilies];

            for (int Icount = 0; Icount < CountFamilies; Icount++)
            {
                FamilyCounts[Icount] = 0;
            }

            for (int PointIndex = 0; PointIndex < SALSAUtility.PointCount_Global; PointIndex++)
            {
                ++FamilyCounts[CategoryIndex[PointIndex] - minlabel];
            }

            for (int PointIndex = 0; PointIndex < SALSAUtility.PointCount_Global; PointIndex++)
            {
                int Icount = CategoryIndex[PointIndex];

                if (FamilyNumber == 1)
                {
                    SALSAUtility.GlobalPointProperties[PointIndex].family1      = Icount;
                    SALSAUtility.GlobalPointProperties[PointIndex].familylabel1 = CutLabel[Icount - minlabel] + " "
                                                                                  + Icount.ToString() + " out of "
                                                                                  + CountFamilies.ToString() + " Count " +
                                                                                  FamilyCounts[Icount - minlabel].
                                                                                  ToString();
                }

                if (FamilyNumber == 2)
                {
                    SALSAUtility.GlobalPointProperties[PointIndex].family2      = Icount;
                    SALSAUtility.GlobalPointProperties[PointIndex].familylabel2 = CutLabel[Icount - minlabel] + " "
                                                                                  + Icount.ToString() + " out of "
                                                                                  + CountFamilies.ToString() + " Count " +
                                                                                  FamilyCounts[Icount - minlabel].
                                                                                  ToString();
                }
            }

            string cleandate = SALSAUtility.startTime.ToLocalTime().ToString();

            cleandate = cleandate.Replace(":", ".");
            cleandate = cleandate.Replace(" ", "-");
            string OldComment = SALSAUtility.GlobalFileProperties.Comment;

            if (OldComment != "")
            {
                OldComment += "\n";
            }
            OldComment += "Family"
                          + FamilyNumber.ToString() + " " + FamilyLabel + " Information added from " + CutFileName +
                          " Time " + cleandate;
            SALSAUtility.GlobalFileProperties.Comment = OldComment;

            //  Write new label file
            string labelfilename = ManxcatCentral.Configuration.DataLabelsFileName;

            if (!labelfilename.Contains(":"))
            {
                labelfilename = ManxcatCentral.Configuration.ControlDirectoryName + "\\" + labelfilename;
            }
            SALSA_Properties.WriteDataPointFile(labelfilename, ManxcatCentral.Configuration.Write2Das3D,
                                                "colon,SameFileName ", SALSAUtility.GlobalFileProperties,
                                                SALSAUtility.GlobalPointProperties, SALSAUtility.NumberOriginalPoints);
            SALSAUtility.SALSAPrint(0, "Family"
                                    + FamilyNumber.ToString() + " " + FamilyLabel + " Info Added to " + labelfilename +
                                    " from " + CutFileName);
            ManxcatCentral.Configuration.Comment += "\nFamily"
                                                    + FamilyNumber.ToString() + " " + FamilyLabel + " Info Added to " +
                                                    labelfilename + " from " + CutFileName;
        }
Exemplo n.º 4
0
        // End UpdateManxcatMDS_Option12_FamilybyCuts

        public static void UpdateManxcatMDS_Option12_Cluster()
        {
            //  Read Cluster Information with File specified in ConversionInformation
            string ClusterFileName      = ManxcatCentral.Configuration.ConversionInformation;
            int    NumberOfClusterLines = 0;
            var    CategoryLabel        = new string[SALSAUtility.PointCount_Global];

            ReadClusterLabel_File(ClusterFileName, CategoryLabel, ref NumberOfClusterLines);

            if (NumberOfClusterLines != SALSAUtility.PointCount_Global)
            {
                Exception e = SALSAUtility.SALSAError(" Illegal Count "
                                                      + NumberOfClusterLines.ToString() + " in File " + ClusterFileName);

                throw (e);
            }

            var CategoryIndex = new int[SALSAUtility.PointCount_Global];
            int minlabel      = SALSAUtility.PointCount_Global;
            int maxlabel      = 0;

            for (int PointIndex = 0; PointIndex < SALSAUtility.PointCount_Global; PointIndex++)
            {
                CategoryIndex[PointIndex] = Convert.ToInt32(CategoryLabel[PointIndex]);

                if (minlabel > CategoryIndex[PointIndex])
                {
                    minlabel = CategoryIndex[PointIndex];
                }

                if (maxlabel < CategoryIndex[PointIndex])
                {
                    maxlabel = CategoryIndex[PointIndex];
                }
            }

            int TotalNumberClusters = maxlabel - minlabel + 1;
            var ClusterCounts       = new int[TotalNumberClusters];

            for (int Icount = 0; Icount < TotalNumberClusters; Icount++)
            {
                ClusterCounts[Icount] = 0;
            }

            for (int PointIndex = 0; PointIndex < SALSAUtility.PointCount_Global; PointIndex++)
            {
                ++ClusterCounts[CategoryIndex[PointIndex] - minlabel];
            }

            for (int PointIndex = 0; PointIndex < SALSAUtility.PointCount_Global; PointIndex++)
            {
                int Icount = CategoryIndex[PointIndex];
                SALSAUtility.GlobalPointProperties[PointIndex].cluster      = Icount;
                SALSAUtility.GlobalPointProperties[PointIndex].clusterlabel = "Cluster "
                                                                              + Icount.ToString() + " out of "
                                                                              + TotalNumberClusters.ToString() +
                                                                              " Count " +
                                                                              ClusterCounts[Icount - minlabel].ToString();
            }
            SALSAUtility.GlobalFileProperties.ClusterName       = "Clusters from " + ClusterFileName;
            SALSAUtility.GlobalFileProperties.ClusterStartIndex = minlabel;

            string cleandate = SALSAUtility.startTime.ToLocalTime().ToString();

            cleandate = cleandate.Replace(":", ".");
            cleandate = cleandate.Replace(" ", "-");
            string OldComment = SALSAUtility.GlobalFileProperties.Comment;

            if (OldComment != "")
            {
                OldComment += "\n";
            }
            OldComment += "Cluster Information added from " + ClusterFileName + " Time " + cleandate;
            SALSAUtility.GlobalFileProperties.Comment = OldComment;

            //  Write new label file
            string labelfilename = ManxcatCentral.Configuration.DataLabelsFileName;

            if (!labelfilename.Contains(":") && !labelfilename.Contains("$"))
            {
                labelfilename = ManxcatCentral.Configuration.ControlDirectoryName + "\\" + labelfilename;
            }
            SALSA_Properties.WriteDataPointFile(labelfilename, ManxcatCentral.Configuration.Write2Das3D,
                                                "colon,SameFileName ", SALSAUtility.GlobalFileProperties,
                                                SALSAUtility.GlobalPointProperties, SALSAUtility.NumberOriginalPoints);
            SALSAUtility.SALSAPrint(0, "Cluster Info Added to " + labelfilename + " from " + ClusterFileName);
            ManxcatCentral.Configuration.Comment += "\nCluster Info Added to "
                                                    + labelfilename + " from " + ClusterFileName;
        }
Exemplo n.º 5
0
        // Write label-cluster results into a file
        public static void WriteMDS(string fname, int OutputOption, double[][] param, double[][] perr)
        {
            int LocalVectorDimension = param[0].GetLength(0);

            if (LocalVectorDimension != perr[0].GetLength(0))
            {
                SALSAUtility.SALSAError("Inconsistent Dimensions Labels " + LocalVectorDimension.ToString() + " Perr " +
                                        perr[0].GetLength(0).ToString());
            }

            ManxcatSection Configuration = ManxcatCentral.Configuration;

            // Write SALSA Properties File Header
            if (OutputOption == 0)
            {
                int filetype = 2;

                if ((SALSAUtility.NumberFixedPoints > 0) ||
                    (SALSAUtility.NumberVariedPoints < SALSAUtility.NumberOriginalPoints))
                {
                    filetype = 4;
                }

                string cleandate = SALSAUtility.startTime.ToLocalTime().ToString();
                cleandate = cleandate.Replace(":", ".");
                cleandate = cleandate.Replace(" ", "-");
                SALSAUtility.GlobalFileProperties.GroupName = "MDSasChisq-" + Configuration.RunSetLabel + "-Run" +
                                                              Configuration.RunNumber.ToString() + "-Date-" + cleandate;
                SALSAUtility.GlobalFileProperties.FileGenerationType      = filetype;
                SALSAUtility.GlobalFileProperties.OriginalPointStartIndex = 0;
                SALSAUtility.GlobalFileProperties.LocalPointStartIndex    = 0;
                SALSAUtility.GlobalFileProperties.NumberOriginalPoints    = SALSAUtility.NumberOriginalPoints;
                SALSAUtility.GlobalFileProperties.NumberPointsinFile      = SALSAUtility.PointCount_Global;

                // Comment should have key features of Run
                string OldComment = SALSAUtility.GlobalFileProperties.Comment;

                if (OldComment != "")
                {
                    OldComment += "\n";
                }
                OldComment += "MDSasChisq " + Configuration.RunNumber.ToString() + " StartTime " + cleandate + " ****";
                OldComment += "\n Distance Input Option " + Configuration.DistanceProcessingOption.ToString() +
                              " Distance Formula " + Configuration.DistanceFormula.ToString() + " Weighting Option " +
                              Configuration.Chisqnorm.ToString() + " Minimum Distance Value " +
                              Configuration.MinimumDistance.ToString();
                OldComment += "\n" + Hotsun.HotsunComment;
                SALSAUtility.GlobalFileProperties.Comment = OldComment;

                for (int GlobalPointIndex = 0; GlobalPointIndex < SALSAUtility.PointCount_Global; GlobalPointIndex++)
                {
                    int    OriginalPointIndex = SALSAUtility.UsedPointtoOriginalPointMap[GlobalPointIndex];
                    int    groupnumber        = -1;
                    string grouplabel         = "Ignored";
                    SALSAUtility.GlobalPointProperties[GlobalPointIndex].FixedorVaried = 0;
                    if (ManxcatMDS.PointStatus[GlobalPointIndex] == -1)
                    {
                        groupnumber = 3;
                        grouplabel  = "Deleted";
                    }
                    else
                    {
                        if (SALSAUtility.OriginalPointDisposition[GlobalPointIndex] <= -SALSAUtility.SALSASHIFT)
                        {
                            groupnumber = 2;
                            grouplabel  = "Fixed";
                            SALSAUtility.GlobalPointProperties[GlobalPointIndex].FixedorVaried = 2;
                        }

                        if (SALSAUtility.OriginalPointDisposition[GlobalPointIndex] >= SALSAUtility.SALSASHIFT)
                        {
                            groupnumber = 1;
                            grouplabel  = "Varied";
                            SALSAUtility.GlobalPointProperties[GlobalPointIndex].source = "MDSasChisq-" +
                                                                                          Configuration.RunSetLabel +
                                                                                          "-Run" +
                                                                                          Configuration.RunNumber.
                                                                                          ToString() + "-Date-" +
                                                                                          cleandate;
                            SALSAUtility.GlobalPointProperties[GlobalPointIndex].FixedorVaried = 1;
                        }
                    }
                    SALSAUtility.GlobalPointProperties[GlobalPointIndex].group               = groupnumber;
                    SALSAUtility.GlobalPointProperties[GlobalPointIndex].grouplabel          = grouplabel;
                    SALSAUtility.GlobalPointProperties[GlobalPointIndex].OriginalPointNumber = OriginalPointIndex;
                    SALSAUtility.GlobalPointProperties[GlobalPointIndex].LocalPointNumber    = GlobalPointIndex;
                }

                for (int GlobalPointIndex = 0; GlobalPointIndex < SALSAUtility.PointCount_Global; GlobalPointIndex++)
                {
                    if (ManxcatMDS.PointStatus[GlobalPointIndex] == -1)
                    {
                        SALSAUtility.GlobalPointProperties[GlobalPointIndex].valuesset = false;
                        SALSAUtility.GlobalPointProperties[GlobalPointIndex].errorsset = false;
                        continue;
                    }
                    SALSAUtility.GlobalPointProperties[GlobalPointIndex].x = param[GlobalPointIndex][0];
                    SALSAUtility.GlobalPointProperties[GlobalPointIndex].y = param[GlobalPointIndex][1];

                    if (LocalVectorDimension > 2)
                    {
                        SALSAUtility.GlobalPointProperties[GlobalPointIndex].z = param[GlobalPointIndex][2];
                    }
                    SALSAUtility.GlobalPointProperties[GlobalPointIndex].xerr = perr[GlobalPointIndex][0];
                    SALSAUtility.GlobalPointProperties[GlobalPointIndex].yerr = perr[GlobalPointIndex][1];

                    if (LocalVectorDimension > 2)
                    {
                        SALSAUtility.GlobalPointProperties[GlobalPointIndex].zerr = perr[GlobalPointIndex][2];
                    }
                    SALSAUtility.GlobalPointProperties[GlobalPointIndex].valuesset = true;
                    SALSAUtility.GlobalPointProperties[GlobalPointIndex].errorsset = true;
                }
                if (SALSAUtility.Usedreordered)
                {
                    var NaivePointProperties = new SALSADataPointProperties[SALSAUtility.PointCount_Global];
                    for (int GlobalPointIndex = 0;
                         GlobalPointIndex < SALSAUtility.PointCount_Global;
                         GlobalPointIndex++)
                    {
                        int NaivePointIndex = SALSAUtility.ActualtoNaiveUsedOrder[GlobalPointIndex];
                        NaivePointProperties[NaivePointIndex] =
                            SALSAUtility.GlobalPointProperties[GlobalPointIndex].ShallowCopy();
                    }
                    SALSA_Properties.WriteDataPointFile(fname, ManxcatCentral.Configuration.Write2Das3D, "all ",
                                                        SALSAUtility.GlobalFileProperties,
                                                        NaivePointProperties, SALSAUtility.PointCount_Global);
                    return;
                }
                SALSA_Properties.WriteDataPointFile(fname, ManxcatCentral.Configuration.Write2Das3D, "all ",
                                                    SALSAUtility.GlobalFileProperties,
                                                    SALSAUtility.GlobalPointProperties, SALSAUtility.PointCount_Global);
                return;
            }

            //  Option OutputOption = 1
            // Simple output of Used in ORIGINAL not Loadbalanced Order
            try
            {
                StreamWriter sw = null;

                if (!string.IsNullOrEmpty(fname))
                {
                    sw = new StreamWriter(fname, false, Encoding.UTF8);
                }

                if (sw != null)
                {
                    for (int GlobalPointIndex = 0;
                         GlobalPointIndex < SALSAUtility.PointCount_Global;
                         GlobalPointIndex++)
                    {
                        if (ManxcatMDS.PointStatus[GlobalPointIndex] == -1)
                        {
                            continue;
                        }
                        string Coordinates    = "";
                        int    SingleCluster  = 1;
                        int    UsedPointIndex = SALSAUtility.NaivetoActualUsedOrder[GlobalPointIndex];
                        for (int LocalVectorIndex = 0; LocalVectorIndex < LocalVectorDimension; LocalVectorIndex++)
                        {
                            Coordinates += param[UsedPointIndex][LocalVectorIndex].ToString("E4") + "\t";
                        }

                        sw.WriteLine(
                            String.Format((GlobalPointIndex).ToString() + "\t" + Coordinates + SingleCluster.ToString()));
                    }
                }

                sw.Flush();
                sw.Close();
            }
            catch (Exception e)
            {
                Console.WriteLine("Failed writing data" + e);
                throw (e);
            }
        }