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; } }
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; } } }
//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; }
//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; }
//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; }
//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; } } }