private static void runTests() { // Create test variables Console.WriteLine($"Testing with two 60s spike trains, each with one spike at 30s, and a dt of 0.05s ..."); double dt = 0.05; double startTime = 0d; double endTime = 60d; double[] emptyTrain = new double[0]; double[] spikeTrain1 = new double[1] { 30.0d }; double[] spikeTrain2 = new double[1] { 30.0d }; // Test #1 Console.WriteLine($"\nTEST #1"); Console.WriteLine($"Calculating STTC with the {nameof(Sttc)} C++/CLI class..."); double result = Sttc.Calculate(spikeTrain1, spikeTrain2, startTime, endTime, dt); Console.WriteLine($"Result: {result}"); // Test #2 Console.WriteLine($"\nTEST #2"); Console.WriteLine($"Same, but with empty first spike train..."); try { result = Sttc.Calculate(emptyTrain, spikeTrain2, startTime, endTime, dt); } catch (DivideByZeroException e) { Console.WriteLine($"Caught {nameof(DivideByZeroException)} with message: \n\t{e.Message}"); } // Test #3 Console.WriteLine($"\nTEST #3"); Console.WriteLine($"Same, but with empty second spike train..."); try { result = Sttc.Calculate(spikeTrain1, emptyTrain, startTime, endTime, dt); } catch (DivideByZeroException e) { Console.WriteLine($"Caught {nameof(DivideByZeroException)} with message: \n\t{e.Message}"); } }
// INTERFACE public static IDictionary <double, double[]> STTCvsDistance(Recording rec, double dt) { // For every unique pair of units, calculate the STTC, then // group these values by the distance between the units' channels IEnumerable <Unit> units = rec.EnumerateChannels().SelectMany(ch => ch.Units); IDictionary <double, double[]> results = units.SelectMany( (u, index) => units.Skip(index + 1), (u1, u2) => Tuple.Create(u1, u2)) .GroupBy( pair => Unit.Distance(pair.Item1, pair.Item2), pair => Sttc.Calculate(pair.Item1.SpikeTrain.ToArray(), pair.Item2.SpikeTrain.ToArray(), rec.StartTime, rec.EndTime, dt)) .OrderBy(pair => pair.Key) .ToDictionary( pair => pair.Key, pair => pair.ToArray() ); return(results); }