public async Task <List <ProcessedLJVDatum> > ProcessRawData(List <RawLJVDatum> rawLJVData, double specCurrent, double specPhotoCurrent, List <ELSpecDatum> ELSpecData, double activeArea = 4E-6) { return(await Task.Run(async() => { Debug.WriteLine("ProcessRawData"); List <ProcessedLJVDatum> processedLJVData = new List <ProcessedLJVDatum>(); var alphaAndR2 = await AlphaFromRawData(rawLJVData).ConfigureAwait(false); double alpha = alphaAndR2.Item1; //double finalCurrent = Convert.ToDouble(rawLJVData.Select(r => r.Current).Last()); double electronsCount = specCurrent / 1.602E-19 / activeArea; //electron charge = 1.602E-19C var numPhotons = await NumberOfPhotons(ELSpecData).ConfigureAwait(false); double specEQE = numPhotons * 100 / electronsCount; //external quantum eff. definition (*100 to get value in %) double EQECF = specEQE / (activeArea *specPhotoCurrent *alpha / specCurrent); //use fact that current eff. is directly proportional to EQE to generate conversion factor //find the baseline photocurrent List <double> darkPCurrentList = new List <double>(); foreach (var datum in rawLJVData) { //assume no emission below 1V if (datum.Voltage < 1) { darkPCurrentList.Add(Convert.ToDouble(datum.PhotoCurrentA)); } } decimal averageDarkCurrent = 0; if (darkPCurrentList.Count > 0) { averageDarkCurrent = Convert.ToDecimal(darkPCurrentList.Average()); } foreach (RawLJVDatum rawDatum in rawLJVData) { ProcessedLJVDatum tempProcDatum = new ProcessedLJVDatum(); tempProcDatum.Voltage = rawDatum.Voltage; tempProcDatum.CurrentDensity = 0.1m * rawDatum.Current / Convert.ToDecimal(activeArea); //mA/cm^2: 1000 mA/A 10000 cm^2/m^2 --> 0.1 conversion factor tempProcDatum.PhotoCurrent = (rawDatum.PhotoCurrentA + rawDatum.PhotoCurrentB) / 2.0m; //interpolate to account for device instability if (tempProcDatum.PhotoCurrent < 1.8m * averageDarkCurrent) //write zeros to Luminance if photocurrent is below 2x baseline { tempProcDatum.Luminance = 0; } else { tempProcDatum.Luminance = Convert.ToDecimal(Math.Round(Convert.ToDouble(tempProcDatum.PhotoCurrent) * alpha, 1)); } if (tempProcDatum.Luminance > 10.0m && rawDatum.Voltage > 0 && rawDatum.Current > 0) //we only care about efficiency over 10 nits { tempProcDatum.CurrentEff = Math.Round(4E-6m * tempProcDatum.Luminance / rawDatum.Current, 2); //cd/A --> multiply by area in m^2 to cancel out cd/m^2 tempProcDatum.PowerEff = Math.Round(Convert.ToDecimal(Math.PI) * tempProcDatum.CurrentEff / tempProcDatum.Voltage, 2); tempProcDatum.EQE = Math.Round(Convert.ToDecimal(EQECF) * tempProcDatum.CurrentEff, 2); } processedLJVData.Add(tempProcDatum); } Debug.WriteLine("ProcessRawData completed"); return processedLJVData; }).ConfigureAwait(false)); }
private void ConstructFullLJVDataListAndCSV(string fp) { FullLJVDataList = new List <FullLJVDatum>(); foreach (RawLJVDatum rawdat in RawLJVDataList) { try { ProcessedLJVDatum procdat = ProcLJVDataList.Where(x => x.Voltage == rawdat.Voltage).First(); FullLJVDatum newDatum = new FullLJVDatum(); if (rawdat.PhotoCurrentA != 0) { newDatum = new FullLJVDatum() { Voltage = rawdat.Voltage, Current = rawdat.Current, CurrentDensity = procdat.CurrentDensity, Resistance = rawdat.Resistance, PhotoCurrentA = rawdat.PhotoCurrentA, PhotoCurrentB = rawdat.PhotoCurrentB, PhotoCurrentC = rawdat.PhotoCurrentC, CameraCIEx = rawdat.CameraCIEx, CameraCIEy = rawdat.CameraCIEy, CameraLuminance = rawdat.CameraLuminance, Luminance = procdat.Luminance, CurrentEff = procdat.CurrentEff, PowerEff = procdat.PowerEff, EQE = procdat.EQE, PCurrChangePercent = ((rawdat.PhotoCurrentC / rawdat.PhotoCurrentA) - 1) * 100, TimeStamp = rawdat.TimeStamp //generate method to find ELSpecPaths from SpectrumAtEachStep function }; } FullLJVDataList.Add(newDatum); } catch (Exception e) { Debug.WriteLine("error at LJVScanVM ConstructFullLJVDataListAndCSV: " + e.ToString()); } } DataProcessingService.WriteIENumberableToCSV(FullLJVDataList, fp); }