예제 #1
0
        private void AppendLtParams(double kapc, double lamIntr, double lamPs, double lam_diff,
                                    double sig, double taumin, Func <LTCurveParams> getCurrentParams, LTCurveParams diffsParameter)
        {
            if (sig > 0.0)
            {
                double norm = 0.39894228 / sig; //1 / Math.Math.Sqrt(2 * Math.PI) / sig;
                double mian = 0.5 / sig / sig;
                double uu   = Math.Log(1 / lamPs - taumin);

                Action <double, double> ff = (double u, double _c) =>
                {
                    if (Math.Abs(u) < 80)
                    {
                        double        lambda = 1 / (Math.Exp(u) + taumin) + lamIntr;
                        double        c      = _c * kapc / (lam_diff - lamPs) * norm * Math.Exp(-(u - uu) * (u - uu) * mian);
                        LTCurveParams ltp    = getCurrentParams();
                        ltp.tau      = 1 / lambda;
                        ltp.fraction = c;

                        diffsParameter.fraction -= c * lambda / lam_diff;
                    }
                };

                gauss_integral_4(-6 * sig + uu, -3 * sig + uu, ff);

                gauss_integral_4(-3 * sig + uu, -sig + uu, ff);

                gauss_integral_4(-sig + uu, sig + uu, ff);

                gauss_integral_4(sig + uu, 3 * sig + uu, ff);

                gauss_integral_4(3 * sig + uu, 6 * sig + uu, ff);
            }
            else
            {
                double        lamP = lamPs + lamIntr;
                double        tmpc = kapc / (lam_diff - lamP);
                LTCurveParams ltp  = getCurrentParams();
                ltp.tau                  = 1 / lamP;
                ltp.fraction             = tmpc;
                diffsParameter.fraction -= tmpc * lamP / lam_diff;
            }
        }
예제 #2
0
        public override void convert(List <ICurveParameters> curveParameters, IParameterSet parameters)
        {
            IGroup promptGroup    = parameters[3];
            IGroup constantsGroup = parameters[0];
            IGroup rangesGroup    = parameters[4];

            int        parametersId = 0;
            int        id = 0;
            int        gid, pid, cid;
            int        groupStartId         = 0;
            IParameter firstShift           = promptGroup.Components[0][2];
            IComponent firstPromptComponent = promptGroup.Components[0];

            for (gid = 0; gid < parameters.GroupCount; gid++)
            {
                if ((parameters[gid].Definition.Type & GroupType.Contributet) == GroupType.Contributet)
                {
                    //foreach (IComponent promptComp in promptGroup.Components) {

                    for (pid = 0; pid < promptGroup.Components.Size; pid++)
                    {
                        id = groupStartId;
                        //foreach (IComponent comp in parameters[gid].Components) {
                        for (cid = 0; cid < parameters[gid].Components.Size; cid++)
                        {
                            if (curveParameters.Count <= parametersId)
                            {
                                curveParameters.Add(new LTCurveParams());
                            }
                            LTCurveParams p = (LTCurveParams)curveParameters[parametersId];
                            parametersId++;
                            p.id              = id++;
                            p.component       = parameters[gid].Components[cid];
                            p.promptComponent = promptGroup.Components[pid];
                            p.fraction        = 1;

                            p.tau = parameters[gid].Components[cid][1].Value; //tau
                            if (parameters[gid].Components[cid].ContainsParameter("sigma"))
                            {
                                p.dispersion = parameters[gid].Components[cid][2].Value;
                            }
                            else
                            {
                                p.dispersion = 0;
                            }
                            p.fwhm     = promptGroup.Components[pid][1].Value; //fwhm
                            p.tauleft  = promptGroup.Components[pid][3].Value;
                            p.tauright = promptGroup.Components[pid][4].Value;

                            if (pid == 0)
                            {
                                p.shift = 0;
                            }
                            else
                            {
                                p.shift = promptGroup.Components[pid][2].Value;
                            }
                            p.zeroCorrection = firstShift.Value;


                            p.nstart  = (int)rangesGroup.Components[0][1].Value;
                            p.nstop   = (int)rangesGroup.Components[0][2].Value;
                            p.lf      = false;
                            p.rt      = false;
                            p.with_fi = true;
                            p.diff    = true;
                            p.cs      = rangesGroup.Components[0][0].Value; //zero
                            p.bs      = constantsGroup.Components[0][0].Value;
                        }
                    }
                    groupStartId += parameters[gid].Components.Size;
                }
            }
        }
예제 #3
0
        //public virtual ValuesDictionary[] convert(IParameterSet parameters) {
        //public override void convert(ref ValuesDictionary[] dictionary, IParameterSet parameters) {
        public override void convert(List <ICurveParameters> curveParameters, IParameterSet parameters)
        {
            //double inta, intb, taua, taub, taueff;
            //inta = intb = taua = taub = taueff = 0.0;
            DefectParameters dfA, dfB, dfC, dfFree;

            dfA.i = 1;
            dfA.t = 0;
            dfB   = dfC = dfFree = dfA;
            IGroup     promptGroup          = parameters[3];
            IGroup     constantsGroup       = parameters[0];
            IGroup     rangesGroup          = parameters[4];
            int        parametersId         = 0;
            int        id                   = 0;
            int        groupId              = 0;
            IParameter firstShift           = promptGroup.Components[0][2];
            IComponent firstPromptComponent = promptGroup.Components[0];

            int gid, pid, cid, fractionId;

            for (gid = 0; gid < parameters.GroupCount; gid++)
            {
                if ((parameters[gid].Definition.Type & GroupType.Contributet) == GroupType.Contributet)
                {
                    for (pid = 0; pid < promptGroup.Components.Size; pid++)
                    {
                        id = groupId;
                        for (cid = 0; cid < parameters[gid].Components.Size; cid++)
                        {
                            int fractionCount = (parameters[gid].Definition.kind == 1) ? 4 : 1;  //if sample
                            if (fractionCount == 4 && pid == 0)
                            {
                                getConversionParameters(parameters[gid].Components[cid], out dfA, out dfB, out dfC, out dfFree);
                            }
                            for (fractionId = 0; fractionId < fractionCount; fractionId++)
                            {
                                if (curveParameters.Count <= parametersId)
                                {
                                    curveParameters.Add(new LTCurveParams());
                                }
                                LTCurveParams p = (LTCurveParams)curveParameters[parametersId];
                                parametersId++;

                                p.component       = parameters[gid].Components[cid];
                                p.promptComponent = promptGroup.Components[pid];

                                if (parameters[gid].Definition.kind == 2)    //source
                                {
                                    p.fraction = 1;
                                    p.tau      = p.component[1].Value;
                                    p.id       = id++;
                                }
                                else
                                {
                                    switch (fractionId)
                                    {
                                    case 0:
                                        //p.fraction = p.component[6].Value;
                                        //p.tau = Math.Abs(p.component[1].Value);
                                        p.fraction = dfA.i; // conversion[0];
                                        p.tau      = dfA.t; //conversion[1];
                                        p.id       = id;
                                        break;

                                    case 1:
                                        //p.fraction = p.component[7].Value;
                                        //p.tau = Math.Abs(p.component[2].Value);
                                        p.fraction = dfB.i; // conversion[2];
                                        p.tau      = dfB.t; // conversion[3];
                                        p.id       = id;
                                        break;

                                    case 2:
                                        //p.fraction = 1 - p.component[6].Value - p.component[7].Value;
                                        //p.tau = 1 / (1 / Math.Abs(p.component[5].Value) + Math.Abs(p.component[3].Value) + Math.Abs(p.component[4].Value));
                                        p.fraction = dfC.i;     // conversion[4];
                                        p.tau      = dfC.t;
                                        p.id       = id;
                                        break;

                                    case 3:
                                        //p.fraction = 1 - p.component[6].Value - p.component[7].Value;
                                        //p.tau = 1 / (1 / Math.Abs(p.component[5].Value) + Math.Abs(p.component[3].Value) + Math.Abs(p.component[4].Value));
                                        p.fraction = dfFree.i;     // conversion[4];
                                        p.tau      = dfFree.t;
                                        p.id       = id++;
                                        break;
                                    }
                                }
                                p.dispersion = 0;
                                p.fwhm       = Math.Abs(p.promptComponent[1].Value);
                                p.tauleft    = Math.Abs(p.promptComponent[3].Value);
                                p.tauright   = Math.Abs(p.promptComponent[4].Value);
                                //if (promptComp == firstPromptComponent)
                                //    p.x0 = promptComp[2].Value;
                                //else
                                //    p.x0 = firstShift.Value + promptComp[2].Value;
                                if (p.promptComponent == firstPromptComponent)
                                {
                                    p.shift = 0;
                                }
                                else
                                {
                                    p.shift = p.promptComponent[2].Value;
                                }
                                p.zeroCorrection = firstShift.Value;

                                p.nstart  = (int)rangesGroup.Components[0][1].Value;
                                p.nstop   = (int)rangesGroup.Components[0][2].Value;
                                p.lf      = false;
                                p.rt      = false;
                                p.with_fi = true;
                                p.diff    = true;
                                p.cs      = rangesGroup.Components[0][0].Value;
                                p.bs      = constantsGroup.Components[0][0].Value;
                            }
                        }
                    }
                    groupId += parameters[gid].Components.Size;
                }
            }
            //return result;
        }
예제 #4
0
        //public override void convert(ref ValuesDictionary[] dictionary, IParameterSet parameters) {
        public override void convert(List <ICurveParameters> curveParameters, IParameterSet parameters)
        {
            IGroup promptGroup = parameters[3];
            IGroup constantsGroup = parameters[0];
            IGroup rangesGroup = parameters[4];
            double intD, tauD, tauEff;

            intD = tauD = tauEff = 0.0;
            //int resultId = 0;
            int        parametersId         = 0;
            int        id                   = 0;
            int        groupId              = 0;
            IParameter firstShift           = promptGroup.Components[0][2];
            IComponent firstPromptComponent = promptGroup.Components[0];
            //foreach (IGroup group in parameters) {
            int gid, pid, cid, fractionId;

            for (gid = 0; gid < parameters.GroupCount; gid++)
            {
                if ((parameters[gid].Definition.Type & GroupType.Contributet) == GroupType.Contributet)
                {
                    for (pid = 0; pid < promptGroup.Components.Size; pid++)
                    {
                        id = groupId;
                        for (cid = 0; cid < parameters[gid].Components.Size; cid++)
                        {
                            int fractionCount = (parameters[gid].Definition.kind == 1) ? 2 : 1; //if sample
                            if (fractionCount == 2)                                             //if sample
                            {
                                getConversionParameters(parameters[gid].Components[cid], out intD, out tauD, out tauEff);
                            }
                            for (fractionId = 0; fractionId < fractionCount; fractionId++)
                            {
                                if (curveParameters.Count <= parametersId)
                                {
                                    curveParameters.Add(new LTCurveParams());
                                }
                                LTCurveParams p = (LTCurveParams)curveParameters[parametersId];
                                parametersId++;

                                p.component       = parameters[gid].Components[cid];
                                p.promptComponent = promptGroup.Components[pid];

                                if (parameters[gid].Definition.kind == 2)    //source
                                {
                                    p.fraction = 1;
                                    p.tau      = p.component[1].Value;
                                    p.id       = id++;
                                }
                                else
                                {
                                    switch (fractionId)
                                    {
                                    case 0:
                                        //p.fraction = conversion[0];
                                        //p.tau = conversion[1];
                                        p.fraction = intD;
                                        p.tau      = tauD;
                                        //p.fraction = p.component[4].Value;
                                        //p.tau = Math.Abs(p.component[1].Value);
                                        p.id = id;     //nie ma ++ bo druga frakcja ma to samo id
                                        break;

                                    case 1:
                                        //p.fraction = conversion[2];
                                        //p.tau = conversion[3];
                                        p.fraction = 1 - intD;
                                        p.tau      = tauEff;
                                        //p.fraction = 1 - p.component[4].Value;
                                        //p.tau = 1 / (1 / Math.Abs(p.component[3].Value) + Math.Abs(p.component[2].Value));
                                        p.id = id++;
                                        break;
                                    }
                                }
                                p.dispersion = 0;
                                p.fwhm       = Math.Abs(p.promptComponent[1].Value);
                                p.tauleft    = p.promptComponent[3].Value;
                                p.tauright   = p.promptComponent[4].Value;
                                if (p.promptComponent == firstPromptComponent)
                                {
                                    p.shift = 0;
                                }
                                else
                                {
                                    p.shift = p.promptComponent[2].Value;
                                }
                                p.zeroCorrection = firstShift.Value;

                                p.nstart  = (int)rangesGroup.Components[0][1].Value;
                                p.nstop   = (int)rangesGroup.Components[0][2].Value;
                                p.lf      = false;
                                p.rt      = false;
                                p.with_fi = true;
                                p.diff    = true;
                                p.cs      = rangesGroup.Components[0][0].Value;
                                p.bs      = constantsGroup.Components[0][0].Value;
                            }
                        }
                    }
                    groupId += parameters[gid].Components.Size;
                }
            }
            //return result;
        }
예제 #5
0
        //public virtual ValuesDictionary[] convert(IParameterSet parameters) {
        //public override void convert(ref ValuesDictionary[] dictionary, IParameterSet parameters) {
        public override void convert(List <ICurveParameters> curveParameters, IParameterSet parameters)
        {
            double inta, intb, taua, taub, taueff;

            inta = intb = taua = taub = taueff = 0.0;
            IGroup promptGroup    = parameters[3];
            IGroup constantsGroup = parameters[0];
            IGroup rangesGroup    = parameters[4];
            //if (dictionary == null) {
            //    int resultDim = 0;
            //    foreach (IGroup group in parameters) {
            //        if ((group.Definition.Type & GroupType.Contributet) == GroupType.Contributet) {
            //            if (group.Definition.kind == 1)  //sample
            //                resultDim += promptGroup.Components.Size * 3; //2 fractions in sample. sample component count is fixed
            //            else
            //                resultDim += promptGroup.Components.Size * group.Components.Size;
            //        }
            //    }
            //    //ValuesDictionary[] result = new ValuesDictionary[resultDim];
            //    dictionary = new ValuesDictionary[resultDim];
            //}
            //int resultId = 0;
            int        parametersId         = 0;
            int        id                   = 0;
            int        groupId              = 0;
            IParameter firstShift           = promptGroup.Components[0][2];
            IComponent firstPromptComponent = promptGroup.Components[0];

            int gid, pid, cid, fractionId;

            for (gid = 0; gid < parameters.GroupCount; gid++)
            {
                if ((parameters[gid].Definition.Type & GroupType.Contributet) == GroupType.Contributet)
                {
                    for (pid = 0; pid < promptGroup.Components.Size; pid++)
                    {
                        id = groupId;
                        for (cid = 0; cid < parameters[gid].Components.Size; cid++)
                        {
                            //foreach (IGroup group in parameters) {
                            //    if ((group.Definition.Type & GroupType.Contributet) == GroupType.Contributet) {
                            //        foreach (IComponent promptComp in promptGroup.Components) {
                            //            foreach (IComponent comp in group.Components) {
                            int fractionCount = (parameters[gid].Definition.kind == 1) ? 3 : 1;  //if sample
                            if (fractionCount == 3)
                            {
                                getConversionParameters(parameters[gid].Components[cid], out inta, out taua, out intb, out taub, out taueff);
                            }
                            //setSampleConversionArray(parameters[gid].Components[cid]);
                            for (fractionId = 0; fractionId < fractionCount; fractionId++)
                            {
                                if (curveParameters.Count <= parametersId)
                                {
                                    curveParameters.Add(new LTCurveParams());
                                }
                                LTCurveParams p = (LTCurveParams)curveParameters[parametersId];
                                parametersId++;

                                p.component       = parameters[gid].Components[cid];
                                p.promptComponent = promptGroup.Components[pid];

                                if (parameters[gid].Definition.kind == 2)    //source
                                {
                                    p.fraction = 1;
                                    p.tau      = p.component[1].Value;
                                    p.id       = id++;
                                }
                                else
                                {
                                    switch (fractionId)
                                    {
                                    case 0:
                                        //p.fraction = p.component[6].Value;
                                        //p.tau = Math.Abs(p.component[1].Value);
                                        p.fraction = inta; // conversion[0];
                                        p.tau      = taua; //conversion[1];
                                        p.id       = id;
                                        break;

                                    case 1:
                                        //p.fraction = p.component[7].Value;
                                        //p.tau = Math.Abs(p.component[2].Value);
                                        p.fraction = intb; // conversion[2];
                                        p.tau      = taub; // conversion[3];
                                        p.id       = id;
                                        break;

                                    case 2:
                                        //p.fraction = 1 - p.component[6].Value - p.component[7].Value;
                                        //p.tau = 1 / (1 / Math.Abs(p.component[5].Value) + Math.Abs(p.component[3].Value) + Math.Abs(p.component[4].Value));
                                        p.fraction = 1 - inta - intb;     // conversion[4];
                                        p.tau      = taueff;
                                        p.id       = id++;
                                        break;
                                    }
                                }
                                p.dispersion = 0;
                                p.fwhm       = Math.Abs(p.promptComponent[1].Value);
                                p.tauleft    = Math.Abs(p.promptComponent[3].Value);
                                p.tauright   = Math.Abs(p.promptComponent[4].Value);
                                //if (promptComp == firstPromptComponent)
                                //    p.x0 = promptComp[2].Value;
                                //else
                                //    p.x0 = firstShift.Value + promptComp[2].Value;
                                if (p.promptComponent == firstPromptComponent)
                                {
                                    p.shift = 0;
                                }
                                else
                                {
                                    p.shift = p.promptComponent[2].Value;
                                }
                                p.zeroCorrection = firstShift.Value;

                                p.nstart  = (int)rangesGroup.Components[0][1].Value;
                                p.nstop   = (int)rangesGroup.Components[0][2].Value;
                                p.lf      = false;
                                p.rt      = false;
                                p.with_fi = true;
                                p.diff    = true;
                                p.cs      = rangesGroup.Components[0][0].Value;
                                p.bs      = constantsGroup.Components[0][0].Value;
                            }
                        }
                    }
                    groupId += parameters[gid].Components.Size;
                }
            }
            //return result;
        }
예제 #6
0
        //public virtual ValuesDictionary[] convert(IParameterSet parameters) {
        //public override void convert(ref ValuesDictionary[] dictionary, IParameterSet parameters) {
        public override void convert(List <ICurveParameters> curveParameters, IParameterSet parameters)
        {
            const double eps          = 1e-6;
            double       kappa1       = parameters[1].Components[0]["kappa1"].Value;
            double       kappa2       = parameters[1].Components[0]["kappa2"].Value;
            double       mi           = parameters[1].Components[0]["mi"].Value;
            double       sigma1       = parameters[1].Components[0]["sigmaPo1"].Value;
            double       sigma2       = parameters[1].Components[0]["sigmaPo2"].Value;
            double       sigmaTrapp   = parameters[1].Components[0]["sigmatrapp"].Value;
            double       lambdaortho1 = 1 / parameters[1].Components[0]["tauPo1"].Value;
            double       lampara1     = 1 / parameters[1].Components[0]["tauPo1"].Value;
            double       lambdaortho2 = 1 / parameters[1].Components[0]["tauPo2"].Value;
            double       lampara2     = 1 / parameters[1].Components[0]["tauPo2"].Value;
            double       lambdaTrapp  = 1 / parameters[1].Components[0]["tautrapp"].Value;
            double       lambdaFree   = 1 / parameters[1].Components[0]["taufree"].Value;
            double       lam          = lambdaFree + kappa1 + kappa2 + mi;

            int currentParamsIndex = 0;

            Func <LTCurveParams> GetCurrentParameters = () =>
            {
                LTCurveParams p;
                if (currentParamsIndex >= curveParameters.Count)
                {
                    p = new LTCurveParams();
                    curveParameters.Add(p);
                }
                else
                {
                    p = curveParameters[currentParamsIndex] as LTCurveParams;
                }

                p.id         = 0;
                p.component  = p.promptComponent = null;
                p.dispersion = p.fraction = p.fwhm = p.shift = 0;
                p.with_fi    = p.diff = false;

                currentParamsIndex++;
                return(p);
            };

            LTCurveParams diffsParameters = GetCurrentParameters();

            if (kappa1 > eps)
            {
                //ortho-Ps
                AppendLtParams(0.75 * kappa1, 1.0 / 142.0, lambdaortho1, lam, sigma1, 0.54, GetCurrentParameters, diffsParameters);

                //para-Ps
                AppendLtParams(0.25 * kappa1, 1.0 / 0.125, lampara1, lam, 0.0, 0.0, GetCurrentParameters, diffsParameters);
            }

            if (kappa2 > eps)
            {
                //ortho-Ps
                AppendLtParams(0.75 * kappa2, 1.0 / 142.0, lambdaortho2, lam, sigma2, 0.54, GetCurrentParameters, diffsParameters);

                //para-Ps
                AppendLtParams(0.25 * kappa2, 1.0 / 0.125, lampara2, lam, 0.0, 0.0, GetCurrentParameters, diffsParameters);
            }

            if (mi > eps)
            {
                AppendLtParams(mi, 0, lambdaTrapp, lam, sigmaTrapp, 0.0, GetCurrentParameters, diffsParameters);
            }

            //bulk
            {
                LTCurveParams pfree = GetCurrentParameters();
                pfree.tau      = 1 / lam;
                pfree.fraction = lambdaFree / lam;
            }

            diffsParameters.tau = 1 / lam;

            double sum = 0.0;

            for (int i = 0; i < currentParamsIndex; i++)
            {
                LTCurveParams p = curveParameters[i] as LTCurveParams;
                //sum += p.fraction;
                p.component = parameters[1].Components[0];
            }

            //for (int i = 0; i < currentParamsIndex; i++)
            //    (curveParameters[i] as LTCurveParams).fraction /= sum;

#if DEBUG
            sum = 0.0;
            for (int i = 0; i < currentParamsIndex; i++)
            {
                sum += (curveParameters[i] as LTCurveParams).fraction;
            }

            System.Diagnostics.Debug.Assert(Math.Abs(sum - 1.0) < 1e-3);
#endif

            //source components
            for (int i = 0; i < parameters[2].Components.Size; i++)
            {
                LTCurveParams p = GetCurrentParameters();
                p.tau       = Math.Abs(parameters[2].Components[i][1].Value);
                p.fraction  = 1.0;
                p.id        = 1 + i;
                p.component = parameters[2].Components[i];
            }

            IGroup promptGroup    = parameters[3];
            IGroup constantsGroup = parameters[0];
            IGroup rangesGroup    = parameters[4];
            int    baseLength     = currentParamsIndex;

            for (int p = promptGroup.Components.Size - 1; p >= 0; p--)
            {
                for (int i = 0; i < baseLength; i++)
                {
                    LTCurveParams pi0 = curveParameters[i] as LTCurveParams;
                    LTCurveParams currentParams;

                    if (p == 0)
                    {
                        currentParams = pi0;
                    }
                    else
                    {
                        currentParams          = GetCurrentParameters();
                        currentParams.tau      = pi0.tau;
                        currentParams.fraction = pi0.fraction;
                        currentParams.id       = pi0.id;
                    }

                    currentParams.promptComponent = promptGroup.Components[p];
                    currentParams.fwhm            = Math.Abs(promptGroup.Components[p][1].Value);
                    currentParams.shift           = promptGroup.Components[p][2].Value;
                    currentParams.tauleft         = Math.Abs(promptGroup.Components[p][3].Value);
                    currentParams.tauright        = Math.Abs(promptGroup.Components[p][4].Value);
                    currentParams.nstart          = (int)rangesGroup.Components[0][1].Value;
                    currentParams.nstop           = (int)rangesGroup.Components[0][2].Value;
                    currentParams.lf             = false;
                    currentParams.rt             = false;
                    currentParams.with_fi        = true;
                    currentParams.diff           = true;
                    currentParams.cs             = rangesGroup.Components[0][0].Value;
                    currentParams.bs             = constantsGroup.Components[0][0].Value;
                    currentParams.zeroCorrection = promptGroup.Components[0][2].Value;
                }
            }
        }