Ejemplo n.º 1
0
        public void LogProcessingBoxNet(ProcessingOptionsBoxNet options, int nparticles)
        {
            if (!AllowCollection)
            {
                return;
            }

            Task.Run(() =>
            {
                try
                {
                    new WarpAnalyticsClient().LogProcessingBoxNet(Secret,
                                                                  DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"),
                                                                  2,
                                                                  (int)options.ExpectedDiameter,
                                                                  (float)options.MinimumScore,
                                                                  (float)options.MinimumMaskDistance,
                                                                  options.ExportParticles,
                                                                  options.ExportBoxSize,
                                                                  options.ExportInvert,
                                                                  options.ExportNormalize,
                                                                  options.ModelName.ToLower().Contains("mask"),
                                                                  nparticles);
                }
                catch
                {
                }
            });
        }
Ejemplo n.º 2
0
        private void UpdateTracker()
        {
            if (ActiveItem != null && RowItems.Count > 0 && AllItems != null && RowItems.IndexOf(ActiveItem) >= 0)
            {
                if (!IsMinimized)
                {
                    PathPosition.Visibility         = Visibility.Visible;
                    PathPositionInverted.Visibility = Visibility.Collapsed;
                    CheckCurrentName.Visibility     = Visibility.Visible;
                    TextCurrentName.Visibility      = Visibility.Visible;
                }
                else
                {
                    PathPosition.Visibility         = Visibility.Collapsed;
                    PathPositionInverted.Visibility = Visibility.Visible;
                    CheckCurrentName.Visibility     = Visibility.Collapsed;
                    TextCurrentName.Visibility      = Visibility.Collapsed;
                }

                int PositionIndex = RowItems.IndexOf(ActiveItem);

                double IdealOffset = (PositionIndex + 0.5) * ItemWidth;
                PathPosition.Margin =
                    new Thickness(Math.Max(0, Math.Min(IdealOffset - PathPosition.ActualWidth / 2, ActualWidth - PathPosition.ActualWidth)),
                                  0, 0, 0);
                PathPositionInverted.Margin =
                    new Thickness(Math.Max(0, Math.Min(IdealOffset - PathPosition.ActualWidth / 2, ActualWidth - PathPosition.ActualWidth)),
                                  0, 0, 0);

                string TextString = $"{ActiveItem.RootName} ({AllItems.IndexOf(ActiveItem) + 1}/{AllItems.Count})";
                Size   TextSize   = MeasureString(TextString);
                CheckCurrentName.Margin =
                    new Thickness(Math.Max(0, Math.Min(IdealOffset - TextSize.Width / 2, ActualWidth - TextSize.Width) - 24),
                                  6, 0, 7);
                TextCurrentName.Text = TextString;

                ProcessingOptionsMovieCTF      OptionsCTF      = MainWindow.Options.GetProcessingMovieCTF();
                ProcessingOptionsMovieMovement OptionsMovement = MainWindow.Options.GetProcessingMovieMovement();
                ProcessingOptionsBoxNet        OptionsBoxNet   = MainWindow.Options.GetProcessingBoxNet();
                ProcessingOptionsMovieExport   OptionsExport   = MainWindow.Options.GetProcessingMovieExport();

                PenCurrentName.Brush = StatusBar.StatusToBrush(StatusBar.GetMovieProcessingStatus(ActiveItem, OptionsCTF, OptionsMovement, OptionsBoxNet, OptionsExport, MainWindow.Options));
                //PenCurrentName.Brush.Opacity = 0.3;
            }
            else
            {
                PathPosition.Visibility         = Visibility.Collapsed;
                PathPositionInverted.Visibility = Visibility.Collapsed;
                CheckCurrentName.Visibility     = Visibility.Collapsed;
                TextCurrentName.Visibility      = Visibility.Collapsed;
            }
        }
Ejemplo n.º 3
0
        public void ApplyFilter()
        {
            if (!IsFilterEnabled)
            {
                FilteredItems = Items.ToList();
            }
            else
            {
                List <Movie> Result = Items.ToList();

                if (!string.IsNullOrEmpty(FilterSearchPattern))
                {
                    try
                    {
                        Regex Expression = new Regex(FilterSearchPattern);
                        Result = Result.Where(m => Expression.IsMatch(m.Name)).ToList();
                    }
                    catch { }
                }

                if (!FilterIncludeProcessed || !FilterIncludeOutdated || !FilterIncludeUnprocessed || !FilterIncludeFilteredOut || !FilterIncludeDeselected)
                {
                    ProcessingOptionsMovieCTF      OptionsCTF      = MainWindow.Options.GetProcessingMovieCTF();
                    ProcessingOptionsMovieMovement OptionsMovement = MainWindow.Options.GetProcessingMovieMovement();
                    ProcessingOptionsBoxNet        OptionsBoxNet   = MainWindow.Options.GetProcessingBoxNet();
                    ProcessingOptionsMovieExport   OptionsExport   = MainWindow.Options.GetProcessingMovieExport();

                    List <Tuple <Movie, ProcessingStatus> > WithStatus = new List <Tuple <Movie, ProcessingStatus> >(Items.Count);
                    foreach (var item in Result)
                    {
                        WithStatus.Add(new Tuple <Movie, ProcessingStatus>(item, GetMovieProcessingStatus(item, OptionsCTF, OptionsMovement, OptionsBoxNet, OptionsExport, MainWindow.Options)));
                    }

                    Result = WithStatus.Where(t =>
                    {
                        return((t.Item2 == ProcessingStatus.Processed && FilterIncludeProcessed) ||
                               (t.Item2 == ProcessingStatus.Outdated && FilterIncludeOutdated) ||
                               (t.Item2 == ProcessingStatus.Unprocessed && FilterIncludeUnprocessed) ||
                               (t.Item2 == ProcessingStatus.FilteredOut && FilterIncludeFilteredOut) ||
                               (t.Item2 == ProcessingStatus.LeaveOut && FilterIncludeDeselected));
                    }).Select(t => t.Item1).ToList();
                }

                FilteredItems = Result;
            }
        }
Ejemplo n.º 4
0
        private void UpdateTracker()
        {
            if (ActiveItem != null && Items.Count > 0)
            {
                PathPosition.Visibility     = Visibility.Visible;
                CheckCurrentName.Visibility = Visibility.Visible;
                TextCurrentName.Visibility  = Visibility.Visible;

                double StepLength = ActualWidth / Items.Count;

                int PositionIndex = Items.IndexOf(ActiveItem);
                if (PositionIndex < 0)  // Can't find it in Items, hide everything
                {
                    PathPosition.Visibility     = Visibility.Hidden;
                    CheckCurrentName.Visibility = Visibility.Hidden;
                    TextCurrentName.Visibility  = Visibility.Hidden;
                    return;
                }

                double IdealOffset = (PositionIndex + 0.5) * StepLength;
                PathPosition.Margin =
                    new Thickness(Math.Max(0, Math.Min(IdealOffset - PathPosition.ActualWidth / 2, ActualWidth - PathPosition.ActualWidth)),
                                  0, 0, 0);

                string TextString = $"{ActiveItem.RootName} ({PositionIndex + 1}/{Items.Count})";
                Size   TextSize   = MeasureString(TextString);
                CheckCurrentName.Margin =
                    new Thickness(Math.Max(0, Math.Min(IdealOffset - TextSize.Width / 2, ActualWidth - TextSize.Width) - 24),
                                  0, 0, 0);
                TextCurrentName.Text = TextString;

                ProcessingOptionsMovieCTF      OptionsCTF      = MainWindow.Options.GetProcessingMovieCTF();
                ProcessingOptionsMovieMovement OptionsMovement = MainWindow.Options.GetProcessingMovieMovement();
                ProcessingOptionsBoxNet        OptionsBoxNet   = MainWindow.Options.GetProcessingBoxNet();
                ProcessingOptionsMovieExport   OptionsExport   = MainWindow.Options.GetProcessingMovieExport();

                PenCurrentName.Brush = StatusToBrush(GetMovieProcessingStatus(ActiveItem, OptionsCTF, OptionsMovement, OptionsBoxNet, OptionsExport, MainWindow.Options));
                //PenCurrentName.Brush.Opacity = 0.3;
            }
            else
            {
                PathPosition.Visibility     = Visibility.Hidden;
                CheckCurrentName.Visibility = Visibility.Hidden;
                TextCurrentName.Visibility  = Visibility.Hidden;
            }
        }
Ejemplo n.º 5
0
        public static ProcessingStatus GetMovieProcessingStatus(Movie movie, ProcessingOptionsMovieCTF optionsCTF, ProcessingOptionsMovieMovement optionsMovement, ProcessingOptionsBoxNet optionsBoxNet, ProcessingOptionsMovieExport optionsExport, Options options, bool considerFilter = true)
        {
            bool DoCTF      = options.ProcessCTF;
            bool DoMovement = options.ProcessMovement && movie.GetType() == typeof(Movie);
            bool DoBoxNet   = options.ProcessPicking && movie.GetType() == typeof(Movie);
            bool DoExport   = (optionsExport.DoAverage || optionsExport.DoStack || optionsExport.DoDeconv) && movie.GetType() == typeof(Movie);

            ProcessingStatus Status = ProcessingStatus.Processed;

            if (movie.UnselectManual != null && (bool)movie.UnselectManual)
            {
                Status = ProcessingStatus.LeaveOut;
            }
            else if (movie.OptionsCTF == null && movie.OptionsMovement == null && movie.OptionsMovieExport == null)
            {
                Status = ProcessingStatus.Unprocessed;
            }
            else
            {
                if (DoCTF && (movie.OptionsCTF == null || movie.OptionsCTF != optionsCTF))
                {
                    Status = ProcessingStatus.Outdated;
                }
                else if (DoMovement && (movie.OptionsMovement == null || movie.OptionsMovement != optionsMovement))
                {
                    Status = ProcessingStatus.Outdated;
                }
                else if (DoBoxNet && (movie.OptionsBoxNet == null || movie.OptionsBoxNet != optionsBoxNet))
                {
                    Status = ProcessingStatus.Outdated;
                }
                else if (DoExport && (movie.OptionsMovieExport == null || movie.OptionsMovieExport != optionsExport))
                {
                    Status = ProcessingStatus.Outdated;
                }
            }

            if (Status == ProcessingStatus.Processed && movie.UnselectFilter && movie.UnselectManual == null && considerFilter)
            {
                Status = ProcessingStatus.FilteredOut;
            }

            return(Status);
        }
Ejemplo n.º 6
0
        public void UpdateElements()
        {
            PanelRows.Children.Clear();

            foreach (var row in RowControls)
            {
                row.ActiveItemStatusChanged -= RowActiveItemStatusChanged;
                row.ActiveItemChanged       -= RowActiveItemChanged;
                row.HighlightItemChanged    -= RowHighlightItemChanged;
            }
            RowControls.Clear();

            ProcessingOptionsMovieCTF      OptionsCTF      = MainWindow.Options.GetProcessingMovieCTF();
            ProcessingOptionsMovieMovement OptionsMovement = MainWindow.Options.GetProcessingMovieMovement();
            ProcessingOptionsBoxNet        OptionsBoxNet   = MainWindow.Options.GetProcessingBoxNet();
            ProcessingOptionsMovieExport   OptionsExport   = MainWindow.Options.GetProcessingMovieExport();

            List <Tuple <Movie, ProcessingStatus> > WithStatus = new List <Tuple <Movie, ProcessingStatus> >(FilteredItems.Count);

            foreach (var item in FilteredItems)
            {
                WithStatus.Add(new Tuple <Movie, ProcessingStatus>(item, GetMovieProcessingStatus(item, OptionsCTF, OptionsMovement, OptionsBoxNet, OptionsExport, MainWindow.Options)));
            }

            // Update number of processed movies.
            int NProcessed   = WithStatus.Sum(m => m.Item2 == ProcessingStatus.Processed || m.Item2 == ProcessingStatus.FilteredOut ? 1 : 0);
            int NProcessable = WithStatus.Sum(m => m.Item2 != ProcessingStatus.LeaveOut ? 1 : 0);

            TextNumberProcessed.Text = $"Processed {NProcessed}/{NProcessable}.";

            if (FilteredItems.Count == 0 || ActualWidth == 0) // Hide unnecessary elements.
            {
                HideElements();
            }
            else
            {
                ShowElements();

                // Create colored navigation bar.
                double StepLength  = Math.Max(2, ActualWidth / FilteredItems.Count);
                int    ItemsPerRow = (int)(ActualWidth / StepLength + 1e-3);
                int    NRows       = (FilteredItems.Count + ItemsPerRow - 1) / ItemsPerRow;

                for (int r = 0; r < NRows; r++)
                {
                    List <Movie> RowSubset = FilteredItems.Skip(r * ItemsPerRow).Take(ItemsPerRow).ToList();
                    StatusBarRow Row       = new StatusBarRow();
                    Row.HorizontalAlignment      = HorizontalAlignment.Stretch;
                    Row.ItemWidth                = StepLength;
                    Row.AllItems                 = FilteredItems;
                    Row.RowItems                 = RowSubset;
                    Row.ActiveItem               = ActiveItem;
                    Row.ActiveItemStatusChanged += RowActiveItemStatusChanged;
                    Row.ActiveItemChanged       += RowActiveItemChanged;
                    Row.HighlightItemChanged    += RowHighlightItemChanged;

                    PanelRows.Children.Add(Row);
                    RowControls.Add(Row);
                }
            }
        }
Ejemplo n.º 7
0
        private async void ButtonAddLocal_OnClick(object sender, RoutedEventArgs e)
        {
            System.Windows.Forms.OpenFileDialog OpenDialog = new System.Windows.Forms.OpenFileDialog();
            OpenDialog.Filter = "Warp Folder Settings|*.settings|Warp Data Source|*.source";
            System.Windows.Forms.DialogResult OpenResult = OpenDialog.ShowDialog();

            if (OpenResult.ToString() == "OK")
            {
                FileInfo Info = new FileInfo(OpenDialog.FileName);

                #region Check if user wants to use an existing source file instead

                //if (Info.Extension.ToLower() == ".settings" &&
                //    File.Exists(OpenDialog.FileName.Substring(0, OpenDialog.FileName.LastIndexOf(".")) + ".source"))
                //{
                //    var Result = await ((MainWindow)Application.Current.MainWindow).ShowMessageAsync("Similar source file found",
                //                                                                                     $"Would you like to use {Helper.PathToName(Info.Name) + ".source"} instead?",
                //                                                                                     MessageDialogStyle.AffirmativeAndNegativeAndSingleAuxiliary,
                //                                                                                     new MetroDialogSettings
                //                                                                                     {
                //                                                                                         AffirmativeButtonText = "Use existing source",
                //                                                                                         NegativeButtonText = "Replace with new source from settings",
                //                                                                                         FirstAuxiliaryButtonText = "Cancel"
                //                                                                                     });

                //    if (Result == MessageDialogResult.FirstAuxiliary)   // Cancel
                //    {
                //        return;
                //    }
                //    else if (Result == MessageDialogResult.Affirmative) // Use existing .source
                //    {
                //        OpenDialog.FileName = OpenDialog.FileName.Substring(0, OpenDialog.FileName.LastIndexOf(".")) + ".source";
                //        Info = new FileInfo(OpenDialog.FileName);
                //    }
                //}

                #endregion

                if (Info.Extension.ToLower() == ".settings")
                {
                    #region Load preprocessing options

                    Warp.Options Options = new Warp.Options();
                    try
                    {
                        Options.Load(OpenDialog.FileName);
                    }
                    catch
                    {
                        await((MainWindow)Application.Current.MainWindow).ShowMessageAsync("Oopsie",
                                                                                           $"An error was encountered when reading {Info.Name}.",
                                                                                           MessageDialogStyle.Affirmative);
                        return;
                    }

                    #endregion

                    #region Load items with metadata

                    string FileExtension  = Options.Import.Extension;
                    var    AvailableFiles = Directory.EnumerateFiles(Info.DirectoryName, FileExtension).ToArray();

                    Movie[] Items = new Movie[AvailableFiles.Length];

                    string[] MatchingStarNames = null;
                    if (FileExtension != "*.tomostar" && AvailableFiles.Length > 0)
                    {
                        Movie First = new Movie(AvailableFiles[0]);
                        MatchingStarNames = Directory.EnumerateFiles(First.MatchingDir, "*.star").ToArray();
                    }

                    {
                        var ProgressDialog = await((MainWindow)Application.Current.MainWindow).ShowProgressAsync("Loading metadata...", "");
                        ProgressDialog.Maximum = AvailableFiles.Count();

                        await Task.Run(() =>
                        {
                            int Done = 0;
                            Parallel.For(0, AvailableFiles.Length, i =>
                            {
                                string file    = AvailableFiles[i];
                                string XmlPath = file.Substring(0, file.LastIndexOf(".")) + ".xml";
                                if (File.Exists(XmlPath))
                                {
                                    Items[i] = (FileExtension == "*.tomostar" ? new TiltSeries(file) : new Movie(file, MatchingStarNames));
                                }

                                lock (Items)
                                    ProgressDialog.SetProgress(++Done);
                            });
                        });

                        await ProgressDialog.CloseAsync();
                    }

                    if (Items.Length == 0)
                    {
                        await((MainWindow)Application.Current.MainWindow).ShowMessageAsync("Oopsie",
                                                                                           $"No micrographs or tilt series found to match these settings.",
                                                                                           MessageDialogStyle.Affirmative);
                        return;
                    }

                    #endregion

                    #region Figure out filtering status

                    #region Astigmatism statistics

                    Movie[]       ItemsWithCTF      = Items.Where(v => v.OptionsCTF != null && v.CTF != null).ToArray();
                    List <float2> AstigmatismPoints = new List <float2>(ItemsWithCTF.Length);
                    foreach (var item in ItemsWithCTF)
                    {
                        AstigmatismPoints.Add(new float2((float)Math.Cos((float)item.CTF.DefocusAngle * 2 * Helper.ToRad) * (float)item.CTF.DefocusDelta,
                                                         (float)Math.Sin((float)item.CTF.DefocusAngle * 2 * Helper.ToRad) * (float)item.CTF.DefocusDelta));
                    }

                    float2 AstigmatismMean = new float2();
                    float  AstigmatismStd  = 0.1f;

                    if (AstigmatismPoints.Count > 0)
                    {
                        AstigmatismMean = new float2();
                        foreach (var point in AstigmatismPoints)
                        {
                            AstigmatismMean += point;
                        }
                        AstigmatismMean /= AstigmatismPoints.Count;

                        AstigmatismStd = 0;
                        foreach (var point in AstigmatismPoints)
                        {
                            AstigmatismStd += (point - AstigmatismMean).LengthSq();
                        }
                        AstigmatismStd = (float)Math.Max(1e-4, Math.Sqrt(AstigmatismStd / AstigmatismPoints.Count));
                    }

                    #endregion

                    int[] ParticleCounts = Items.Select(item => item.GetParticleCount(Options.Filter.ParticlesSuffix)).ToArray();
                    bool  HaveParticles  = ParticleCounts.Any(v => v > 0);

                    foreach (var item in Items)
                    {
                        bool FilterStatus = true;

                        if (item.OptionsCTF != null)
                        {
                            FilterStatus &= item.CTF.Defocus >= Options.Filter.DefocusMin && item.CTF.Defocus <= Options.Filter.DefocusMax;
                            float AstigmatismDeviation = (new float2((float)Math.Cos((float)item.CTF.DefocusAngle * 2 * Helper.ToRad) * (float)item.CTF.DefocusDelta,
                                                                     (float)Math.Sin((float)item.CTF.DefocusAngle * 2 * Helper.ToRad) * (float)item.CTF.DefocusDelta) - AstigmatismMean).Length() / AstigmatismStd;
                            FilterStatus &= AstigmatismDeviation <= (float)Options.Filter.AstigmatismMax;

                            FilterStatus &= item.CTFResolutionEstimate <= Options.Filter.ResolutionMax;

                            FilterStatus &= item.CTF.PhaseShift >= Options.Filter.PhaseMin && item.CTF.PhaseShift <= Options.Filter.PhaseMax;

                            FilterStatus &= item.GetParticleCount(Options.Filter.ParticlesSuffix) >= Options.Filter.ParticlesMin;
                        }

                        if (item.OptionsMovement != null)
                        {
                            FilterStatus &= item.MeanFrameMovement <= Options.Filter.MotionMax;
                        }

                        item.UnselectFilter = !FilterStatus;
                    }

                    ProcessingOptionsMovieCTF      OptionsCTF      = Options.GetProcessingMovieCTF();
                    ProcessingOptionsMovieMovement OptionsMovement = Options.GetProcessingMovieMovement();
                    ProcessingOptionsBoxNet        OptionsBoxNet   = Options.GetProcessingBoxNet();
                    ProcessingOptionsMovieExport   OptionsExport   = Options.GetProcessingMovieExport();

                    List <Movie> ItemsProcessed   = new List <Movie>();
                    List <Movie> ItemsFilteredOut = new List <Movie>();
                    List <Movie> ItemsUnselected  = new List <Movie>();

                    foreach (Movie item in Items)
                    {
                        ProcessingStatus Status = GetMovieProcessingStatus(item, OptionsCTF, OptionsMovement, OptionsBoxNet, OptionsExport, Options);

                        if (Status == ProcessingStatus.Processed || (Status == ProcessingStatus.Outdated && !item.UnselectFilter))
                        {
                            ItemsProcessed.Add(item);
                        }
                        else if (Status == ProcessingStatus.FilteredOut || (Status == ProcessingStatus.Outdated && item.UnselectFilter))
                        {
                            ItemsFilteredOut.Add(item);
                        }
                        else if (Status == ProcessingStatus.LeaveOut)
                        {
                            ItemsUnselected.Add(item);
                        }
                    }

                    #endregion

                    #region Figure out how many frames/tilts there are to use

                    int UsableFrames = 1;
                    if (Items[0].GetType() == typeof(Movie))
                    {
                        UsableFrames = MapHeader.ReadFromFile(Items[0].Path).Dimensions.Z;
                    }
                    else
                    {
                        UsableFrames = ((TiltSeries)Items[0]).NTilts;
                    }

                    #endregion

                    #region Show dialog

                    CustomDialog Dialog = new CustomDialog();
                    Dialog.HorizontalContentAlignment = HorizontalAlignment.Center;

                    DialogCreateSourceFromSettings DialogContent = new DialogCreateSourceFromSettings();
                    DialogContent.TextTitle.Text = $"Create data source from\n{Info.Name}";
                    DialogContent.StatsSeriesStatusProcessed.Values = new ChartValues <ObservableValue> {
                        new ObservableValue(ItemsProcessed.Count)
                    };
                    DialogContent.StatsSeriesStatusUnfiltered.Values = new ChartValues <ObservableValue> {
                        new ObservableValue(ItemsFilteredOut.Count)
                    };
                    DialogContent.StatsSeriesStatusUnselected.Values = new ChartValues <ObservableValue> {
                        new ObservableValue(ItemsUnselected.Count)
                    };
                    DialogContent.SliderFrames.Value    = UsableFrames;
                    DialogContent.SliderFrames.MaxValue = UsableFrames;

                    DialogContent.Close += () =>
                    {
                        ((MainWindow)Application.Current.MainWindow).HideMetroDialogAsync(Dialog);
                    };

                    DialogContent.Create += async() =>
                    {
                        #region Create source metadata and check if one with the same path already exists

                        DataSource NewSource = new DataSource
                        {
                            PixelSizeX     = Options.PixelSizeX,
                            PixelSizeY     = Options.PixelSizeY,
                            PixelSizeAngle = Options.PixelSizeAngle,

                            DimensionsX = Options.Tomo.DimensionsX,
                            DimensionsY = Options.Tomo.DimensionsY,
                            DimensionsZ = Options.Tomo.DimensionsZ,
                            FrameLimit  = (int)DialogContent.SliderFrames.Value,

                            GainPath      = Options.Import.CorrectGain ? Options.Import.GainPath : "",
                            GainFlipX     = Options.Import.GainFlipX,
                            GainFlipY     = Options.Import.GainFlipY,
                            GainTranspose = Options.Import.GainTranspose,

                            DosePerAngstromFrame = Options.Import.DosePerAngstromFrame,

                            Name = DialogContent.TextSourceName.Text,
                            Path = Info.DirectoryName + "\\" + Helper.RemoveInvalidChars(DialogContent.TextSourceName.Text) + ".source"
                        };

                        if (Population.Sources.Any(s => s.Path == NewSource.Path))
                        {
                            await((MainWindow)Application.Current.MainWindow).ShowMessageAsync("Oopsie",
                                                                                               $"{Helper.PathToNameWithExtension(NewSource.Path)} already exists in this population. Please choose a different name.",
                                                                                               MessageDialogStyle.Affirmative);
                            return;
                        }

                        await((MainWindow)Application.Current.MainWindow).HideMetroDialogAsync(Dialog);

                        #endregion

                        #region Add all items and their data hashes

                        List <Movie> AllItems = new List <Movie>(ItemsProcessed);
                        if ((bool)DialogContent.CheckFilter.IsChecked)
                        {
                            AllItems.AddRange(ItemsFilteredOut);
                        }
                        if ((bool)DialogContent.CheckManual.IsChecked)
                        {
                            AllItems.AddRange(ItemsUnselected);
                        }

                        if (AllItems.Count == 0)
                        {
                            await((MainWindow)Application.Current.MainWindow).ShowMessageAsync("Oopsie",
                                                                                               $"No micrographs or tilt series found to match these settings.",
                                                                                               MessageDialogStyle.Affirmative);
                            return;
                        }

                        {
                            var ProgressDialog = await((MainWindow)Application.Current.MainWindow).ShowProgressAsync("Calculating data hashes...", "");
                            ProgressDialog.Maximum = AllItems.Count;

                            await Task.Run(() =>
                            {
                                int Done = 0;
                                foreach (var item in AllItems)
                                {
                                    NewSource.Files.Add(item.GetDataHash(), item.Name);

                                    ProgressDialog.SetProgress(++Done);
                                }
                            });

                            await ProgressDialog.CloseAsync();
                        }

                        #endregion

                        #region Check for overlapping hashes

                        string[] Overlapping = Helper.Combine(Population.Sources.Select(s => s.Files.Where(f => NewSource.Files.ContainsKey(f.Key)).Select(f => f.Value).ToArray()));
                        if (Overlapping.Length > 0)
                        {
                            string Offenders = "";
                            for (int o = 0; o < Math.Min(5, Overlapping.Length); o++)
                            {
                                Offenders += "\n" + Overlapping[o];
                            }
                            if (Overlapping.Length > 5)
                            {
                                Offenders += $"\n... and {Overlapping.Length - 5} more.";
                            }

                            await((MainWindow)Application.Current.MainWindow).ShowMessageAsync("Oopsie",
                                                                                               "The new source contains files that are already used in this population:" + Offenders,
                                                                                               MessageDialogStyle.Affirmative);
                            return;
                        }

                        #endregion

                        {
                            var ProgressDialog = await((MainWindow)Application.Current.MainWindow).ShowProgressAsync("Committing initial version...", "");
                            ProgressDialog.Maximum = AllItems.Count;

                            await Task.Run(() =>
                            {
                                NewSource.Commit();
                            });

                            await ProgressDialog.CloseAsync();
                        }

                        Population.Sources.Add(NewSource);

                        UpdateGridItems();
                    };

                    Dialog.Content = DialogContent;
                    await((MainWindow)Application.Current.MainWindow).ShowMetroDialogAsync(Dialog, new MetroDialogSettings()
                    {
                    });

                    #endregion
                }
                else
                {
                    try
                    {
                        if (Population.Sources.Any(s => s.Path == OpenDialog.FileName))
                        {
                            await((MainWindow)Application.Current.MainWindow).ShowMessageAsync("Oopsie",
                                                                                               "This data source is already part of this population.",
                                                                                               MessageDialogStyle.Affirmative);
                            return;
                        }

                        DataSource NewSource = DataSource.FromFile(OpenDialog.FileName);
                        Population.Sources.Add(NewSource);

                        UpdateGridItems();
                    }
                    catch
                    {
                        await((MainWindow)Application.Current.MainWindow).ShowMessageAsync("Oopsie",
                                                                                           $"An error was encountered when reading {Info.Name}.",
                                                                                           MessageDialogStyle.Affirmative);
                        return;
                    }
                }
            }
        }
Ejemplo n.º 8
0
        private void UpdateHighlightTracker()
        {
            if (HighlightItem != null && Items.Count > 0)
            {
                PathPosition.Opacity     = 0.3;
                CheckCurrentName.Opacity = 0.5;
                BlurCurrentName.Radius   = 6;

                PathHighlightPosition.Visibility     = Visibility.Visible;
                CheckHighlightCurrentName.Visibility = Visibility.Visible;

                double StepLength = ActualWidth / Items.Count;

                int PositionIndex = Items.IndexOf(HighlightItem);
                if (PositionIndex < 0)  // Can't find it in Items, hide everything
                {
                    PathHighlightPosition.Visibility     = Visibility.Hidden;
                    CheckHighlightCurrentName.Visibility = Visibility.Hidden;
                    return;
                }

                double IdealOffset = (PositionIndex + 0.5) * StepLength;
                PathHighlightPosition.Margin = new Thickness(Math.Max(0, Math.Min(IdealOffset - PathPosition.ActualWidth / 2, ActualWidth - PathPosition.ActualWidth)),
                                                             0, 0, 0);

                string TextString = $"{HighlightItem.RootName} ({PositionIndex + 1}/{Items.Count})";
                Size   TextSize   = MeasureString(TextString);
                CheckHighlightCurrentName.Margin = new Thickness(Math.Max(0, Math.Min(IdealOffset - TextSize.Width / 2, ActualWidth - TextSize.Width) - 24),
                                                                 0, 0, 0);
                TextHighlightCurrentName.Text       = TextString;
                CheckHighlightCurrentName.IsChecked = HighlightItem.UnselectManual != null ? !(bool)HighlightItem.UnselectManual : (bool?)null;

                ProcessingOptionsMovieCTF      OptionsCTF      = MainWindow.Options.GetProcessingMovieCTF();
                ProcessingOptionsMovieMovement OptionsMovement = MainWindow.Options.GetProcessingMovieMovement();
                ProcessingOptionsBoxNet        OptionsBoxNet   = MainWindow.Options.GetProcessingBoxNet();
                ProcessingOptionsMovieExport   OptionsExport   = MainWindow.Options.GetProcessingMovieExport();

                PenHighlightCurrentName.Brush = StatusToBrush(GetMovieProcessingStatus(HighlightItem, OptionsCTF, OptionsMovement, OptionsBoxNet, OptionsExport, MainWindow.Options));

                PanelSegmentHighlight.Children.Clear();
                Rectangle Segment = new Rectangle
                {
                    Width               = StepLength,
                    Height              = 12,
                    Fill                = new SolidColorBrush(Colors.Transparent),
                    Stroke              = PathHighlightPosition.Fill,
                    StrokeThickness     = 1,
                    SnapsToDevicePixels = false
                };
                PanelSegmentHighlight.Children.Add(Segment);
                Canvas.SetLeft(Segment, PositionIndex * StepLength);

                if (File.Exists(HighlightItem.ThumbnailsPath))
                {
                    ImageSource Image = new BitmapImage(new Uri(HighlightItem.ThumbnailsPath));
                    ImageThumbnail.Source = Image;

                    PopupThumbnail.HorizontalOffset = Mouse.GetPosition(PanelSegments).X - Image.Width / 2;
                    ImageThumbnail.Visibility       = Visibility.Visible;
                }
                else
                {
                    PopupThumbnail.HorizontalOffset = Mouse.GetPosition(PanelSegments).X;
                    ImageThumbnail.Visibility       = Visibility.Collapsed;
                }

                #region Figure out processing status

                bool DoCTF      = MainWindow.Options.ProcessCTF;
                bool DoMovement = MainWindow.Options.ProcessMovement;
                bool DoPicking  = MainWindow.Options.ProcessPicking;
                bool DoExport   = OptionsExport.DoAverage || OptionsExport.DoStack || OptionsExport.DoDeconv || DoPicking;

                bool NeedsNewCTF     = OptionsCTF != HighlightItem.OptionsCTF;
                bool NeedsNewMotion  = OptionsMovement != HighlightItem.OptionsMovement;
                bool NeedsNewPicking = (OptionsBoxNet != HighlightItem.OptionsBoxNet ||
                                        NeedsNewMotion);
                bool NeedsNewExport = (DoMovement && NeedsNewMotion) ||
                                      OptionsExport != HighlightItem.OptionsMovieExport ||
                                      (OptionsExport.DoDeconv && NeedsNewCTF && DoCTF);

                if (HighlightItem.OptionsCTF != null)
                {
                    IndicatorCTF.Foreground = NeedsNewCTF ? (DoCTF ? BrushOutdatedOpaque : BrushDeselected) : BrushProcessedOpaque;
                }
                else if (DoCTF)
                {
                    IndicatorCTF.Foreground = BrushUnprocessedOpaque;
                }
                else
                {
                    IndicatorCTF.Foreground = BrushDeselected;
                }

                if (HighlightItem.OptionsMovement != null)
                {
                    IndicatorMotion.Foreground = NeedsNewMotion ? (DoMovement ? BrushOutdatedOpaque : BrushDeselected) : BrushProcessedOpaque;
                }
                else if (DoMovement)
                {
                    IndicatorMotion.Foreground = BrushUnprocessedOpaque;
                }
                else
                {
                    IndicatorMotion.Foreground = BrushDeselected;
                }

                if (HighlightItem.OptionsBoxNet != null)
                {
                    IndicatorPicking.Foreground = NeedsNewPicking ? (DoPicking ? BrushOutdatedOpaque : BrushDeselected) : BrushProcessedOpaque;
                }
                else if (DoPicking)
                {
                    IndicatorPicking.Foreground = BrushUnprocessedOpaque;
                }
                else
                {
                    IndicatorPicking.Foreground = BrushDeselected;
                }

                if (HighlightItem.OptionsMovieExport != null)
                {
                    IndicatorExport.Foreground = NeedsNewExport ? (DoExport ? BrushOutdatedOpaque : BrushDeselected) : BrushProcessedOpaque;
                }
                else if (DoExport)
                {
                    IndicatorExport.Foreground = BrushUnprocessedOpaque;
                }
                else
                {
                    IndicatorExport.Foreground = BrushDeselected;
                }

                #endregion

                PopupThumbnail.PlacementTarget = PanelSegments;
                PopupThumbnail.VerticalOffset  = -12;
                PopupThumbnail.IsOpen          = true;
            }
            else
            {
                PathPosition.Opacity     = 1;
                CheckCurrentName.Opacity = 1;
                BlurCurrentName.Radius   = 0;

                PathHighlightPosition.Visibility     = Visibility.Hidden;
                CheckHighlightCurrentName.Visibility = Visibility.Hidden;

                PanelSegmentHighlight.Children.Clear();

                PopupThumbnail.IsOpen = false;
            }
        }
Ejemplo n.º 9
0
        public void UpdateElements()
        {
            PanelSegments.Children.Clear();

            ProcessingOptionsMovieCTF      OptionsCTF      = MainWindow.Options.GetProcessingMovieCTF();
            ProcessingOptionsMovieMovement OptionsMovement = MainWindow.Options.GetProcessingMovieMovement();
            ProcessingOptionsBoxNet        OptionsBoxNet   = MainWindow.Options.GetProcessingBoxNet();
            ProcessingOptionsMovieExport   OptionsExport   = MainWindow.Options.GetProcessingMovieExport();

            List <Tuple <Movie, ProcessingStatus> > WithStatus = new List <Tuple <Movie, ProcessingStatus> >(Items.Count);

            foreach (var item in Items)
            {
                WithStatus.Add(new Tuple <Movie, ProcessingStatus>(item, GetMovieProcessingStatus(item, OptionsCTF, OptionsMovement, OptionsBoxNet, OptionsExport, MainWindow.Options)));
            }

            // Update number of processed movies.
            int NProcessed   = WithStatus.Sum(m => m.Item2 == ProcessingStatus.Processed || m.Item2 == ProcessingStatus.FilteredOut ? 1 : 0);
            int NProcessable = WithStatus.Sum(m => m.Item2 != ProcessingStatus.LeaveOut ? 1 : 0);

            TextNumberProcessed.Text = $"Processed {NProcessed}/{NProcessable}.";

            if (Items.Count == 0) // Hide unnecessary elements.
            {
                HideElements();
            }
            else
            {
                ShowElements();

                // Create colored navigation bar.
                double           StepLength    = ActualWidth / Items.Count;
                ProcessingStatus CurrentStatus = WithStatus[0].Item2;
                int    CurrentSteps            = 0;
                double OverallOffset           = 0;
                foreach (var movie in WithStatus)
                {
                    if (movie.Item2 != CurrentStatus)
                    {
                        Rectangle Segment = new Rectangle
                        {
                            Width  = CurrentSteps * StepLength + 0.3,
                            Height = 12,
                            Fill   = StatusToBrush(CurrentStatus),
                            SnapsToDevicePixels = false
                        };
                        PanelSegments.Children.Add(Segment);
                        Canvas.SetLeft(Segment, OverallOffset);

                        CurrentStatus  = movie.Item2;
                        OverallOffset += CurrentSteps * StepLength;
                        CurrentSteps   = 0;
                    }

                    CurrentSteps++;
                }
                if (CurrentSteps > 0)
                {
                    Rectangle Segment = new Rectangle
                    {
                        Width  = CurrentSteps * StepLength,
                        Height = 12,
                        Fill   = StatusToBrush(CurrentStatus),
                        SnapsToDevicePixels = false
                    };
                    PanelSegments.Children.Add(Segment);
                    Canvas.SetLeft(Segment, OverallOffset);
                }

                UpdateTracker();
            }
        }
Ejemplo n.º 10
0
        public void UpdateElements()
        {
            PanelSegments.Children.Clear();

            ProcessingOptionsMovieCTF      OptionsCTF      = MainWindow.Options.GetProcessingMovieCTF();
            ProcessingOptionsMovieMovement OptionsMovement = MainWindow.Options.GetProcessingMovieMovement();
            ProcessingOptionsBoxNet        OptionsBoxNet   = MainWindow.Options.GetProcessingBoxNet();
            ProcessingOptionsMovieExport   OptionsExport   = MainWindow.Options.GetProcessingMovieExport();

            List <Tuple <Movie, ProcessingStatus> > WithStatus = new List <Tuple <Movie, ProcessingStatus> >(RowItems.Count);

            foreach (var item in RowItems)
            {
                WithStatus.Add(new Tuple <Movie, ProcessingStatus>(item, StatusBar.GetMovieProcessingStatus(item, OptionsCTF, OptionsMovement, OptionsBoxNet, OptionsExport, MainWindow.Options)));
            }


            if (RowItems.Count == 0 || AllItems == null || ActualWidth == 0 || ItemWidth == 0) // Hide unnecessary elements.
            {
                HideElements();
            }
            else
            {
                ShowElements();

                // Create colored navigation bar.

                ProcessingStatus CurrentStatus = WithStatus[0].Item2;
                int    CurrentSteps            = 0;
                double OverallOffsetX          = 0;

                foreach (var movie in WithStatus)
                {
                    if (movie.Item2 != CurrentStatus)
                    {
                        Rectangle Segment = new Rectangle
                        {
                            Width  = CurrentSteps * ItemWidth + 0.3,
                            Height = 12,
                            Fill   = StatusBar.StatusToBrush(CurrentStatus),
                            SnapsToDevicePixels = false
                        };
                        PanelSegments.Children.Add(Segment);
                        Canvas.SetLeft(Segment, OverallOffsetX);

                        CurrentStatus   = movie.Item2;
                        OverallOffsetX += CurrentSteps * ItemWidth;
                        CurrentSteps    = 0;
                    }

                    CurrentSteps++;
                }
                if (CurrentSteps > 0)
                {
                    Rectangle Segment = new Rectangle
                    {
                        Width  = CurrentSteps * ItemWidth,
                        Height = 12,
                        Fill   = StatusBar.StatusToBrush(CurrentStatus),
                        SnapsToDevicePixels = false
                    };
                    PanelSegments.Children.Add(Segment);
                    Canvas.SetLeft(Segment, OverallOffsetX);
                }

                UpdateTracker();
            }
        }