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));
        }
Пример #2
0
        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);
        }