protected void btnRunTestNew_Click(object sender, EventArgs e)
        {
            // initialize the page sessions (needs to be done so the pages have a session handle in the subthread)
            FST.Web.frmManualEntry page = new frmManualEntry();
            var    s       = page.Session;
            string version = ConfigurationSettings.AppSettings.Get("FST_VERSION");

            ThreadPool.QueueUserWorkItem(new WaitCallback(delegate
            {
                testName        = txtTestName.Text;
                testIndividual  = chkIndividual.Checked;
                testBulk        = chkBulk.Checked;
                testManualEntry = rbManualEntry.Checked;
                deducible       = rbDeducible.Checked;
                LabKitID        = bi.GetLabKits().Rows[0]["FieldValue"].ToString();

                foreach (ListItem liComparisonType in chkComparisonTypes.Items)
                {
                    if (liComparisonType.Selected)
                    {
                        comparisonTypes.Add(Convert.ToInt32(liComparisonType.Value));
                    }
                }

                comparisonProfiles = bi.GetProfilesFromFile(this.fuComparisonProfiles, Server.MapPath("~/Admin/Upload/"), Guid.Parse(LabKitID));
                known1Profile      = bi.GetProfilesFromFile(this.fuKnown1Profile, Server.MapPath("~/Admin/Upload/"), Guid.Parse(LabKitID));
                known2Profile      = bi.GetProfilesFromFile(this.fuKnown2Profile, Server.MapPath("~/Admin/Upload/"), Guid.Parse(LabKitID));
                known3Profile      = bi.GetProfilesFromFile(this.fuKnown3Profile, Server.MapPath("~/Admin/Upload/"), Guid.Parse(LabKitID));
                evidence           = GetEvidenceFromFile(this.fuEvidence, Server.MapPath("~/Admin/Upload/"));
                saveTableEvidence  = GetSaveTableEvidence(evidence);

                Known2Alleles = new Dictionary <string, Dictionary <int, string> >();

                EvidenceAlleles = new Dictionary <string, Dictionary <int, string> >();
                ReadEvidenceAllelesNew(evidence, EvidenceAlleles);

                testID = Guid.NewGuid();

                foreach (int comparisonType in comparisonTypes)
                {
                    Session["CompareMethod"] = comparisonType.ToString();

                    if (testIndividual)
                    {
                        foreach (DataRow dr in comparisonProfiles.Rows)
                        {
                            dnaEvidenceAmount = 111;
                            subTestID         = Guid.NewGuid();
                            comparisonID      = dr["ID"].ToString();

                            ComparisonData comparisonData  = new ComparisonData(comparisonType);
                            comparisonData.Bulk            = false;
                            comparisonData.Comparison      = "\tes\t";
                            comparisonData.Deducible       = deducible;
                            comparisonData.Degradation     = FST.Common.ComparisonData.enDegradation.None;
                            comparisonData.DNAAmount       = dnaEvidenceAmount = 111;
                            comparisonData.EvidenceAlleles = EvidenceAlleles;
                            comparisonData.FB1             = subTestID.ToString();
                            comparisonData.Item            = comparisonID;
                            comparisonData.LabKitID        = Guid.Parse(LabKitID);
                            comparisonData.LabKitName      = "Indentifiler";
                            comparisonData.Processed       = 'N';
                            comparisonData.Theta           = 0.03f;
                            comparisonData.UserName        = User.Identity.Name;
                            comparisonData.Version         = version;

                            ReadComparisonNew(dr, comparisonData.ComparisonAlleles, 1);

                            if (comparisonData.NumeratorProfiles.KnownCount >= 1 || comparisonData.DenominatorProfiles.KnownCount >= 1)
                            {
                                ReadComparisonNew(known1Profile.Rows[0], comparisonData.KnownsAlleles, 1);
                            }
                            if (comparisonData.NumeratorProfiles.KnownCount >= 2 || comparisonData.DenominatorProfiles.KnownCount >= 2)
                            {
                                ReadComparisonNew(known2Profile.Rows[0], comparisonData.KnownsAlleles, 2);
                            }
                            if (comparisonData.NumeratorProfiles.KnownCount >= 3 || comparisonData.DenominatorProfiles.KnownCount >= 3)
                            {
                                ReadComparisonNew(known3Profile.Rows[0], comparisonData.KnownsAlleles, 3);
                            }

                            saveTableComparison = GetSaveTable(dr, "Suspect");

                            this.comparisonData = comparisonData;

                            WriteTest(testID, subTestID, testName, comparisonID, comparisonType, true, false, LabKitID, dnaEvidenceAmount);

                            page.btnCompare_Click(this, new EventArgs());

                            if (saveTableComparison != null && saveTableComparison.Columns.Contains("guid"))
                            {
                                saveTableComparison.Columns.Remove("guid");
                            }
                            if (comparisonProfiles.Columns.Contains("guid"))
                            {
                                comparisonProfiles.Columns.Remove("guid");
                            }
                            lastUpdated = DateTime.Now;
                        }
                    }
                    if (testBulk)
                    {
                        dnaEvidenceAmount = 111;
                        subTestID         = Guid.NewGuid();

                        ComparisonData comparisonData  = new ComparisonData(comparisonType);
                        comparisonData.Bulk            = true;
                        comparisonData.Comparison      = "\tes\t";
                        comparisonData.Deducible       = deducible;
                        comparisonData.Degradation     = FST.Common.ComparisonData.enDegradation.None;
                        comparisonData.DNAAmount       = dnaEvidenceAmount = 111;
                        comparisonData.EvidenceAlleles = EvidenceAlleles;
                        comparisonData.FB1             = subTestID.ToString();
                        comparisonData.LabKitID        = Guid.Parse(LabKitID);
                        comparisonData.LabKitName      = "Indentifiler";
                        comparisonData.Processed       = 'N';
                        comparisonData.Theta           = 0.03f;
                        comparisonData.UserName        = User.Identity.Name;
                        comparisonData.Version         = version;

                        if (comparisonData.NumeratorProfiles.KnownCount >= 1 || comparisonData.DenominatorProfiles.KnownCount >= 1)
                        {
                            ReadComparisonNew(known1Profile.Rows[0], comparisonData.KnownsAlleles, 1);
                        }
                        if (comparisonData.NumeratorProfiles.KnownCount >= 2 || comparisonData.DenominatorProfiles.KnownCount >= 2)
                        {
                            ReadComparisonNew(known2Profile.Rows[0], comparisonData.KnownsAlleles, 2);
                        }
                        if (comparisonData.NumeratorProfiles.KnownCount >= 3 || comparisonData.DenominatorProfiles.KnownCount >= 3)
                        {
                            ReadComparisonNew(known3Profile.Rows[0], comparisonData.KnownsAlleles, 3);
                        }

                        foreach (DataRow dr in comparisonProfiles.Rows)
                        {
                            WriteTest(testID, subTestID, testName, dr["ID"].ToString(), comparisonType, true, true, LabKitID, dnaEvidenceAmount);
                        }

                        this.comparisonData = comparisonData;

                        page.btnCompare_Click(this, new EventArgs());

                        if (saveTableComparison != null && saveTableComparison.Columns.Contains("guid"))
                        {
                            saveTableComparison.Columns.Remove("guid");
                        }
                        if (comparisonProfiles.Columns.Contains("guid"))
                        {
                            comparisonProfiles.Columns.Remove("guid");
                        }
                        lastUpdated = DateTime.Now;
                    }
                }
            }));
        }
        protected void btnLoadData_Click(object sender, EventArgs e)
        {
            FST.Common.Database db             = new FST.Common.Database();
            DataTable           locusSortOrder = db.getLocusSortOrder(Guid.Parse(Session["LabKitID"].ToString()));

            // clear any data we had before
            comparisonData.ComparisonAlleles.Clear();
            comparisonData.KnownsAlleles.Clear();

            // we don't read in the comparison profile for a bulk because it comes from either the 'from file' upload, or from the lab types/population database
            if (!comparisonData.Bulk && comparisonData.NumeratorProfiles.ComparisonCount >= 1)
            {
                // read our posted file to a dictionary and add it to our comparisonData class
                Dictionary <string, string> val = readKnownFileToDictionary(txtFileSuspectInput.PostedFile, locusSortOrder);
                if (val == null)
                {
                    return;
                }
                else
                {
                    comparisonData.ComparisonAlleles.Add(1, val);
                }
                // convert it to a table and set it as the source for the associated gridview
                gvSuspect.DataSource = convertKnownFromDictionaryToTable(comparisonData.ComparisonAlleles, locusSortOrder, 1);
                gvSuspect.DataBind();
                // set our client-side filename for printing in the report later
                comparisonData.Comparison1FileName = txtFileSuspectInput.PostedFile.FileName;
                // set up our name and show the grid view
                if (comparisonData.Comparison1Name.Trim() == string.Empty)
                {
                    this.lblSuspect.Text = Convert.ToString("Profile of (Comparison 1)");
                }
                else
                {
                    this.lblSuspect.Text = Convert.ToString("Profile of ") + comparisonData.Comparison1Name;
                }
                pnlSuspect.Visible = true;
            }
            if (comparisonData.NumeratorProfiles.ComparisonCount >= 2)
            {
                Dictionary <string, string> val = readKnownFileToDictionary(txtFileSuspect2Input.PostedFile, locusSortOrder);
                if (val == null)
                {
                    return;
                }
                else
                {
                    comparisonData.ComparisonAlleles.Add(2, val);
                }
                gvSuspect2.DataSource = convertKnownFromDictionaryToTable(comparisonData.ComparisonAlleles, locusSortOrder, 2);
                gvSuspect2.DataBind();
                comparisonData.Comparison2FileName = txtFileSuspect2Input.PostedFile.FileName;
                if (comparisonData.Comparison2Name.Trim() == string.Empty)
                {
                    this.lblSuspect2.Text = Convert.ToString("Profile of (Comparison 2)");
                }
                else
                {
                    this.lblSuspect2.Text = Convert.ToString("Profile of ") + comparisonData.Comparison2Name;
                }
                pnlSuspect2.Visible = true;
            }
            if (comparisonData.NumeratorProfiles.ComparisonCount >= 3)
            {
                Dictionary <string, string> val = readKnownFileToDictionary(txtFileSuspect3Input.PostedFile, locusSortOrder);
                if (val == null)
                {
                    return;
                }
                else
                {
                    comparisonData.ComparisonAlleles.Add(3, val);
                }
                gvSuspect3.DataSource = convertKnownFromDictionaryToTable(comparisonData.ComparisonAlleles, locusSortOrder, 3);
                gvSuspect3.DataBind();
                comparisonData.Comparison3FileName = txtFileSuspect3Input.PostedFile.FileName;
                if (comparisonData.Comparison3Name.Trim() == string.Empty)
                {
                    this.lblSuspect3.Text = Convert.ToString("Profile of (Comparison 3)");
                }
                else
                {
                    this.lblSuspect3.Text = Convert.ToString("Profile of ") + comparisonData.Comparison3Name;
                }
                pnlSuspect3.Visible = true;
            }
            if (comparisonData.NumeratorProfiles.ComparisonCount >= 4)
            {
                Dictionary <string, string> val = readKnownFileToDictionary(txtFileSuspect4Input.PostedFile, locusSortOrder);
                if (val == null)
                {
                    return;
                }
                else
                {
                    comparisonData.ComparisonAlleles.Add(4, val);
                }
                gvSuspect4.DataSource = convertKnownFromDictionaryToTable(comparisonData.ComparisonAlleles, locusSortOrder, 4);
                gvSuspect4.DataBind();
                comparisonData.Comparison4FileName = txtFileSuspect4Input.PostedFile.FileName;
                if (comparisonData.Comparison4Name.Trim() == string.Empty)
                {
                    this.lblSuspect4.Text = Convert.ToString("Profile of (Comparison 4)");
                }
                else
                {
                    this.lblSuspect4.Text = Convert.ToString("Profile of ") + comparisonData.Comparison4Name;
                }
                pnlSuspect4.Visible = true;
            }
            if (comparisonData.NumeratorProfiles.KnownCount >= 1 || comparisonData.DenominatorProfiles.KnownCount >= 1)
            {
                Dictionary <string, string> val = readKnownFileToDictionary(txtFileSuspect5Input.PostedFile, locusSortOrder);
                if (val == null)
                {
                    return;
                }
                else
                {
                    comparisonData.KnownsAlleles.Add(1, val);
                }
                gvSuspect5.DataSource = convertKnownFromDictionaryToTable(comparisonData.KnownsAlleles, locusSortOrder, 1);
                gvSuspect5.DataBind();
                comparisonData.Known1FileName = txtFileSuspect5Input.PostedFile.FileName;
                if (comparisonData.Known1Name.Trim() == string.Empty)
                {
                    this.lblSuspect5.Text = Convert.ToString("Profile of (Known 1)");
                }
                else
                {
                    this.lblSuspect5.Text = Convert.ToString("Profile of ") + comparisonData.Known1Name;
                }
                pnlSuspect5.Visible = true;
            }
            if (comparisonData.NumeratorProfiles.KnownCount >= 2 || comparisonData.DenominatorProfiles.KnownCount >= 2)
            {
                Dictionary <string, string> val = readKnownFileToDictionary(txtFileSuspect6Input.PostedFile, locusSortOrder);
                if (val == null)
                {
                    return;
                }
                else
                {
                    comparisonData.KnownsAlleles.Add(2, val);
                }
                gvSuspect6.DataSource = convertKnownFromDictionaryToTable(comparisonData.KnownsAlleles, locusSortOrder, 2);
                gvSuspect6.DataBind();
                comparisonData.Known2FileName = txtFileSuspect6Input.PostedFile.FileName;
                if (comparisonData.Known2Name.Trim() == string.Empty)
                {
                    this.lblSuspect6.Text = Convert.ToString("Profile of (Known 2)");
                }
                else
                {
                    this.lblSuspect6.Text = Convert.ToString("Profile of ") + comparisonData.Known2Name;
                }
                pnlSuspect6.Visible = true;
            }
            if (comparisonData.NumeratorProfiles.KnownCount >= 3 || comparisonData.DenominatorProfiles.KnownCount >= 3)
            {
                Dictionary <string, string> val = readKnownFileToDictionary(txtFileSuspect7Input.PostedFile, locusSortOrder);
                if (val == null)
                {
                    return;
                }
                else
                {
                    comparisonData.KnownsAlleles.Add(3, val);
                }
                gvSuspect7.DataSource = convertKnownFromDictionaryToTable(comparisonData.KnownsAlleles, locusSortOrder, 3);
                gvSuspect7.DataBind();
                comparisonData.Known3FileName = txtFileSuspect7Input.PostedFile.FileName;
                if (comparisonData.Known3Name.Trim() == string.Empty)
                {
                    this.lblSuspect7.Text = Convert.ToString("Profile of (Known 3)");
                }
                else
                {
                    this.lblSuspect7.Text = Convert.ToString("Profile of ") + comparisonData.Known3Name;
                }
                pnlSuspect7.Visible = true;
            }
            if (comparisonData.NumeratorProfiles.KnownCount >= 4 || comparisonData.DenominatorProfiles.KnownCount >= 4)
            {
                Dictionary <string, string> val = readKnownFileToDictionary(txtFileSuspect8Input.PostedFile, locusSortOrder);
                if (val == null)
                {
                    return;
                }
                else
                {
                    comparisonData.KnownsAlleles.Add(4, val);
                }
                gvSuspect8.DataSource = convertKnownFromDictionaryToTable(comparisonData.KnownsAlleles, locusSortOrder, 4);
                gvSuspect8.DataBind();
                comparisonData.Known4FileName = txtFileSuspect8Input.PostedFile.FileName;
                if (comparisonData.Known4Name.Trim() == string.Empty)
                {
                    this.lblSuspect8.Text = Convert.ToString("Profile of (Known 4)");
                }
                else
                {
                    this.lblSuspect8.Text = Convert.ToString("Profile of ") + comparisonData.Known4Name;
                }
                pnlSuspect8.Visible = true;
            }

            // read the evidence into a dictionary and add it to the comparisonData class
            Dictionary <string, Dictionary <int, string> > lan = readEvidenceFileToDictionary(txtFileUnknownInput.PostedFile, locusSortOrder);

            if (lan == null)
            {
                return;
            }
            else
            {
                comparisonData.EvidenceAlleles = lan;
            }
            // set our client-side filename for printing in the report later
            comparisonData.EvidenceFileName = txtFileUnknownInput.PostedFile.FileName;
            // convert it to a table and set it as the source for the associated gridview
            gvUnknown.DataSource = ConvertEvidenceFromDictionaryToDataTable(lan, locusSortOrder);
            gvUnknown.DataBind();
            // set our label text (done this way for consistency with code above) and show the gridview
            this.lblUnknown.Text = Convert.ToString("Evidence ");
            pnlUnknown.Visible   = true;

            // this checks to see that the data that was successfully loaded from the uploaded files matches the profiles in the comparisonData class
            // if it does not, we do not show the "Compare" button because it would cause the Comparison class to generate a false comparison
            if (
                (gvSuspect.Rows.Count > 0 || comparisonData.Bulk)
                &&
                (gvSuspect2.Rows.Count > 0 || comparisonData.NumeratorProfiles.ComparisonCount < 2)
                &&
                (gvSuspect3.Rows.Count > 0 || comparisonData.NumeratorProfiles.ComparisonCount < 3)
                &&
                (gvSuspect4.Rows.Count > 0 || comparisonData.NumeratorProfiles.ComparisonCount < 4)
                &&
                (gvSuspect5.Rows.Count > 0 || comparisonData.NumeratorProfiles.KnownCount < 1 || comparisonData.DenominatorProfiles.KnownCount < 1)
                &&
                (gvSuspect6.Rows.Count > 0 || comparisonData.NumeratorProfiles.KnownCount < 2 || comparisonData.DenominatorProfiles.KnownCount < 2)
                &&
                (gvSuspect7.Rows.Count > 0 || comparisonData.NumeratorProfiles.KnownCount < 3 || comparisonData.DenominatorProfiles.KnownCount < 3)
                &&
                (gvSuspect8.Rows.Count > 0 || comparisonData.NumeratorProfiles.KnownCount < 4 || comparisonData.DenominatorProfiles.KnownCount < 4)
                &&
                gvUnknown.Rows.Count > 0)
            {
                btnRead.Visible = true;
            }

            // if comparison profiles were update for a bulk search using the 'from file' upload functionaly, we process it here
            lblKnownFileName.Text = "";
            if (dlTypes.Text == "From File" && comparisonData.Bulk)
            {
                // get a datatable and store it in the session (read Business_Interface.GetProfilesFromFile() for more information on the format)
                Session["Known_FromFile"]     = bi.GetProfilesFromFile(fuPopulationUpload, Server.MapPath("~/Admin/Upload/"), comparisonData.LabKitID);
                Session["Known_FromFileName"] = fuPopulationUpload.FileName;
                // notify the user that we are running against this file so they are aware of whether this is happening or not.
                if (Session["Known_FromFile"] != null)
                {
                    lblKnownFileName.Text = "Running against population from file: " + fuPopulationUpload.FileName;
                }
                if (Session["Known_FromFile"] == null)
                {
                    btnRead.Style["visibility"] = "hidden";
                }
                else
                {
                    btnRead.Style["visibility"] = "visible";
                }
            }
            else
            {
                btnRead.Style["visibility"] = "visible";
            }
        }