private elMatrix calculateElementMatrix(Difference data1, Difference data2, scattDifference[] firstStep) { elMatrix finalResult = new elMatrix(); finalResult.pureRes = 0.0; finalResult.errorRes = 0.0; int i; int k; int c1 = -1; int c2 = -2; if (data1.first > data2.second || data2.first > data1.second) { finalResult.pureRes = 0.0; finalResult.errorRes = 0.0; } else if (data1.first == data2.second || data2.first == data1.second) { finalResult.pureRes = 0.0; finalResult.errorRes = -C.SlopeError * C.SlopeError; } else if (data1.first == data2.first && data1.second == data2.second) { for (i = 0; i < firstStep.Length; i++) { if (firstStep[i].first == data1.first) { c1 = i; } if (firstStep[i].second == data1.second) { c2 = i; } } if (c1 == c2) //vuol dire che lo step è uno solo { finalResult.pureRes = firstStep[c1].value; finalResult.errorRes = 2.0 * C.SlopeError * C.SlopeError; } else //vuol dire che c'è più di 1 cella ed io sommo i sigma delle celle intermedie { for (k = c1; k <= c2; k++) { finalResult.pureRes = finalResult.pureRes + firstStep[k].value; } finalResult.errorRes = 2 * C.SlopeError * C.SlopeError; } } else if (data1.first == data2.first) { c1 = data1.first; c2 = Math.Min(data1.second, data2.second); for (k = c1; k < c2; k++) { finalResult.pureRes = finalResult.pureRes + firstStep[k].value; } finalResult.errorRes = C.SlopeError * C.SlopeError; } else if (data1.second == data2.second) { c1 = Math.Max(data1.first, data1.first); c2 = data1.second; for (k = c1; k < c2; k++) { finalResult.pureRes = finalResult.pureRes + firstStep[k].value; } finalResult.errorRes = C.SlopeError * C.SlopeError; } else { c2 = Math.Min(data1.second, data2.second); c1 = Math.Max(data1.first, data2.first); for (k = c1; k < c2; k++) { finalResult.pureRes = finalResult.pureRes + firstStep[k].value; } finalResult.errorRes = 0; } return(finalResult); }
private ArrayList angularDifferenceL(SySal.Tracking.MIPEmulsionTrackInfo[] data, scattDifference[] firstStep, double minRL) { ArrayList dataDiff = new ArrayList(); double den = 0.0; #if _USE_MEAN_ double msx = (data[0].Slope.Y + data[data.Length - 1].Slope.Y) * 0.5; double msy = -(data[0].Slope.X + data[data.Length - 1].Slope.X) * 0.5; den = msx * msx + msy * msy; if (den <= 0.0) { msx = 0.1; msy = 0.1; den = msx * msx + msy * msy; } den = 1.0 / Math.Sqrt(den); #endif //calcoliamo le differenze int i; if (minRL <= 0.0) { double sum = 0.0; for (i = 0; i < firstStep.Length; i++) { sum += firstStep[i].value; } minRL = 0.9 * sum * 0.5; } for (i = 0; i < data.Length; i++) { double sum = 0.0; int j; for (j = i; j < firstStep.Length && sum < minRL; j++) { sum += firstStep[j].value; } // j--; // if (i + j >= data.Length) break; //if (j >= firstStep.Length) break; if (sum < minRL) { break; } Difference info = new Difference(); double zDiffTest = Math.Abs(data[i].Intercept.Z - data[j].Intercept.Z); if (zDiffTest > 1.0) //per essere sicuri di non prendere deltaZ = 0 { #if _USE_X_ info.slopeDiff = data[i].Slope.X - data[j].Slope.X; #elif _USE_Y_ info.slopeDiff = data[i].Slope.Y - data[j].Slope.Y; #elif _USE_THETA_ const double Theta = Math.PI * 0.25; info.slopeDiff = Math.Cos(Theta) * (data[i].Slope.X - data[j].Slope.X) - Math.Sin(Theta) * (data[i].Slope.Y - data[j].Slope.Y); #elif _USE_S0_ den = Math.Sqrt(data[0].Slope.X * data[0].Slope.X + data[0].Slope.Y * data[0].Slope.Y); info.slopeDiff = (((data[i].Slope.X - data[j].Slope.X) * (data[0].Slope.Y) - (data[i].Slope.Y - data[j].Slope.Y) * (data[0].Slope.X)) / den); //Console.WriteLine(" " + info.slopeDiff); #elif _USE_MEAN_ info.slopeDiff = (((data[i].Slope.X - data[j].Slope.X) * msy - (data[i].Slope.Y - data[j].Slope.Y) * msx) * den); #else den = Math.Sqrt(data[i].Slope.X * data[i].Slope.X + data[i].Slope.Y * data[i].Slope.Y); info.slopeDiff = Math.Abs(((data[i].Slope.X - data[j].Slope.X) * (data[i].Slope.Y) - (data[i].Slope.Y - data[j].Slope.Y) * (data[i].Slope.X)) / den); #endif info.first = i; info.second = j; //calcolo valore[i]-valore[(i+j)]] info.dZeta = zDiffTest; dataDiff.Add(info); } } return(dataDiff); }