95 coordinates.resize(6, 0);
111 covMats[i].resize(3);
113 {covMats[i][j].resize(3, 0);}
119 derivMats[i].resize(12);
120 for(
int j=0;j<12;++j)
121 {derivMats[i][j].resize(3, 0);}
127 powSumsFirst.resize(6);
128 cenMomsFirst.resize(6);
133 powSums[i].resize(6);
134 cenMoms[i].resize(6);
136 powSumsFirst[i].resize(6);
137 cenMomsFirst[i].resize(6);
141 powSums[i][j].resize(5);
142 cenMoms[i][j].resize(5);
144 powSumsFirst[i][j].resize(5);
145 cenMomsFirst[i][j].resize(5);
147 for(
int k=0;k<=4;++k)
149 powSums[i][j][k].resize(5, 0);
150 cenMoms[i][j][k].resize(5, 0);
152 powSumsFirst[i][j][k].resize(5, 0);
153 cenMomsFirst[i][j][k].resize(5, 0);
215 bool useEmittanceFromFirstSampler)
218 {std::cout <<
" " << __METHOD_NAME__ << s->modelID <<
" " << npart << std::flush;}
221 bool nonZeroEmittanceIn = !std::all_of(emittance.begin(), emittance.end(), [](
double l) { return l==0; });
228 for (
int j = 0; j <= 4; ++j)
230 for (
int k = 0; k <= 4; ++k)
239 {printBeamCorrelationMatrix(cenMoms);}
251 optical[i][6] = cenMoms[j][j+1][1][0];
252 optical[i][7] = cenMoms[j][j+1][0][1];
253 optical[i][8] = sqrt(cenMoms[j][j+1][2][0]);
254 optical[i][9] = sqrt(cenMoms[j][j+1][0][2]);
261 optical[i][4] = (cenMoms[4][4][1][0]*cenMoms[j][4][1][1])/cenMoms[4][4][2][0];
262 optical[i][5] = (cenMoms[4][4][1][0]*cenMoms[j+1][4][1][1])/cenMoms[4][4][2][0];
265 if (!std::isfinite(
optical[i][4]))
267 if (!std::isfinite(
optical[i][5]))
271 double corrCentMom_2_0 = 0.0, corrCentMom_1_1 = 0.0;
272 double corrCentMom_0_2 = 0.0;
276 cenMoms[j][j+1][2][0] - std::pow(
optical[i][4],2)*cenMoms[4][4][2][0]/std::pow(cenMoms[4][4][1][0],2);
279 cenMoms[j][j+1][0][2] - std::pow(
optical[i][5],2)*cenMoms[4][4][2][0]/std::pow(cenMoms[4][4][1][0],2);
282 cenMoms[j][j+1][1][1] - (
optical[i][4]*
optical[i][5])*cenMoms[4][4][2][0]/std::pow(cenMoms[4][4][1][0],2);
284 if(useEmittanceFromFirstSampler && nonZeroEmittanceIn)
285 {
optical[i][0] = emittance[i];}
287 {
optical[i][0] = sqrt(corrCentMom_2_0 * corrCentMom_0_2 - std::pow(corrCentMom_1_1, 2));}
294 optical[i][11] = (double)npart;
315 for(
int j=0;j<12;++j)
327 for(
int j=0;j<12;++j)
333 varOptical[i][j] += derivMats[i][j][k]*derivMats[i][j][l]*covMats[i][k][l];
342 for(
int j=0;j<12;++j)
346 else if(j == 10 || j == 11)
350 if(useEmittanceFromFirstSampler && nonZeroEmittanceIn)
352 optical[i][j+12]=emittance[j+2];
365 double m2 = std::pow(particleMass,2);
367 optical[2][6] = std::sqrt(std::pow(meanP,2) + m2);
370 double gamma =
optical[2][6] / particleMass;
371 double beta = std::sqrt(1.0 - 1.0/std::pow(gamma,2));
373 optical[2][8] = (sigmaP/meanP)*std::pow(beta,2);
377 optical[0][24]=cenMoms[0][2][1][1]/std::sqrt(cenMoms[0][2][2][0]*cenMoms[0][2][0][2]);
380 std::vector<double> emittanceOut = {
optical[0][0],
389 long long int npartIn,
399 double npartPow1 = (double)npartIn;
403 double npartPow2 = npartPow1 * npartPow1;
404 double npartPow3 = npartPow2 * npartPow1;
405 double npartPow4 = npartPow3 * npartPow1;
407 if((m == 1 && n == 0) || (m == 0 && n == 1))
409 double s_1_0 = powSumsIn[a][b][m][n];
410 int k = m > n ? a : b;
412 moment = s_1_0/(double)npartIn+offsets[k];
415 else if((n == 2 && m == 0) || (n == 0 && m == 2))
417 double s_1_0 = 0.0, s_2_0 = 0.0;
420 s_1_0 = powSumsIn[a][b][m-1][n];
421 s_2_0 = powSumsIn[a][b][m][n];
425 s_1_0 = powSumsIn[a][b][m][n-1];
426 s_2_0 = powSumsIn[a][b][m][n];
429 moment = (npartPow1*s_2_0 - std::pow(std::abs(s_1_0),2))/(npartPow1*(npartPow1-1));
432 else if(n == 1 && m == 1)
434 double s_1_0 = 0.0, s_0_1 = 0.0, s_1_1 = 0.0;
436 s_1_0 = powSumsIn[a][b][m][n-1];
437 s_0_1 = powSumsIn[a][b][m-1][n];
438 s_1_1 = powSumsIn[a][b][m][n];
440 moment = (npartPow1*s_1_1 - s_0_1*s_1_0)/(npartPow1*(npartPow1-1));
443 else if((n == 4 && m == 0) || (n == 0 && m == 4))
445 double s_1_0 = 0.0, s_2_0 = 0.0, s_3_0 = 0.0, s_4_0 = 0.0;
448 s_1_0 = powSumsIn[a][b][m-3][n];
449 s_2_0 = powSumsIn[a][b][m-2][n];
450 s_3_0 = powSumsIn[a][b][m-1][n];
451 s_4_0 = powSumsIn[a][b][m][n];
455 s_1_0 = powSumsIn[a][b][m][n-3];
456 s_2_0 = powSumsIn[a][b][m][n-2];
457 s_3_0 = powSumsIn[a][b][m][n-1];
458 s_4_0 = powSumsIn[a][b][m][n];
461 moment = - (3*std::pow(s_1_0,4))/npartPow4 + (6*std::pow(s_1_0,2)*s_2_0)/npartPow3
462 - (4*s_1_0*s_3_0)/npartPow2 + s_4_0/npartPow1;
465 else if((m == 3 && n == 1) || (m == 1 && n ==3))
467 double s_1_0 = 0.0, s_0_1 = 0.0, s_1_1 = 0.0, s_2_0 = 0.0, s_2_1 = 0.0, s_3_0 = 0.0, s_3_1 = 0.0;
471 s_1_0 = powSumsIn[a][b][m-2][n-1];
472 s_0_1 = powSumsIn[a][b][m-3][n];
473 s_1_1 = powSumsIn[a][b][m-2][n];
474 s_2_0 = powSumsIn[a][b][m-1][n-1];
475 s_2_1 = powSumsIn[a][b][m-1][n];
476 s_3_0 = powSumsIn[a][b][m][n-1];
477 s_3_1 = powSumsIn[a][b][m][n];
481 s_1_0 = powSumsIn[a][b][m-1][n-2];
482 s_0_1 = powSumsIn[a][b][m][n-3];
483 s_1_1 = powSumsIn[a][b][m][n-2];
484 s_2_0 = powSumsIn[a][b][m-1][n-1];
485 s_2_1 = powSumsIn[a][b][m][n-1];
486 s_3_0 = powSumsIn[a][b][m-1][n];
487 s_3_1 = powSumsIn[a][b][m][n];
490 moment = - (3*s_0_1*std::pow(s_1_0,3))/npartPow4 + (3*s_1_0*s_1_0*s_1_1)/npartPow3
491 + (3*s_0_1*s_1_0*s_2_0)/npartPow3 - (3*s_1_0*s_2_1)/npartPow2
492 - (s_0_1*s_3_0)/npartPow2 + s_3_1/npartPow1;
495 else if(m == 2 && n == 2)
497 double s_1_0 = 0.0, s_0_1 = 0.0, s_1_1 = 0.0, s_2_0 = 0.0, s_0_2 = 0.0, s_1_2 = 0.0, s_2_1 = 0.0, s_2_2 = 0.0;
499 s_1_0 = powSumsIn[a][b][m-1][n-2];
500 s_0_1 = powSumsIn[a][b][m-2][n-1];
501 s_1_1 = powSumsIn[a][b][m-1][n-1];
502 s_2_0 = powSumsIn[a][b][m][n-2];
503 s_0_2 = powSumsIn[a][b][m-2][n];
504 s_1_2 = powSumsIn[a][b][m-1][n];
505 s_2_1 = powSumsIn[a][b][m][n-1];
506 s_2_2 = powSumsIn[a][b][m][n];
508 moment = - (3*std::pow(s_0_1,2)*std::pow(s_1_0,2))/npartPow4 + (s_0_2*std::pow(s_1_0,2))/npartPow3
509 + (4*s_0_1*s_1_0*s_1_1)/npartPow3 - (2*s_1_0*s_1_2)/npartPow2
510 + (std::pow(s_0_1,2)*s_2_0)/npartPow3 - (2*s_0_1*s_2_1)/npartPow2 + s_2_2/npartPow1;
517 long long int npartIn,
522 double npartInD = (double)npartIn;
529 if((i == 0 && j == 0) || (i == 1 && j == 1))
531 double m_4_0 = 0.0, m_2_0 = 0.0;
535 m_4_0 = centMoms[a][a+1][4][0];
536 m_2_0 = centMoms[a][a+1][2][0];
541 m_4_0 = centMoms[a][a+1][0][4];
542 m_2_0 = centMoms[a][a+1][0][2];
545 cov = -((npartInD-3)*std::pow(m_2_0,2))/(npartInD*(npartInD-1)) + m_4_0/npartInD;
548 else if(i == 2 && j == 2)
550 double m_1_1 = 0.0, m_2_0 = 0.0, m_0_2 = 0.0, m_2_2 = 0.0;
552 m_1_1 = centMoms[a][a+1][1][1];
553 m_2_0 = centMoms[a][a+1][2][0];
554 m_0_2 = centMoms[a][a+1][0][2];
555 m_2_2 = centMoms[a][a+1][2][2];
557 cov = -((npartInD-2)*std::pow(m_1_1,2))/(npartInD*(npartInD-1)) + (m_0_2*m_2_0)/(npartInD*(npartInD-1)) + m_2_2/npartInD;
560 else if((i == 0 && j == 2) || (i == 1 && j == 2) || (i == 2 && j == 0) || (i == 2 && j == 1))
562 double m_1_1 = 0.0, m_2_0 = 0.0, m_3_1 = 0.0;
564 if((i == 0 && j == 2) || (i == 2 && j == 0 ))
566 m_1_1 = centMoms[a][a+1][1][1];
567 m_2_0 = centMoms[a][a+1][2][0];
568 m_3_1 = centMoms[a][a+1][3][1];
570 else if((i == 1 && j == 2) || (i == 2 && j == 1))
572 m_1_1 = centMoms[a][a+1][1][1];
573 m_2_0 = centMoms[a][a+1][0][2];
574 m_3_1 = centMoms[a][a+1][1][3];
577 cov = -((npartInD-3)*m_1_1*m_2_0)/(npartInD*(npartInD-1)) + m_3_1/npartInD;
579 else if((i == 0 && j == 1) || (i == 1 && j == 0) )
581 double m_1_1 = 0.0, m_2_0 = 0.0, m_0_2 = 0.0, m_2_2 = 0.0;
583 m_1_1 = centMoms[a][a+1][1][1];
584 m_2_0 = centMoms[a][a+1][0][2];
585 m_0_2 = centMoms[a][a+1][2][0];
586 m_2_2 = centMoms[a][a+1][2][2];
588 cov = 2*std::pow(m_1_1,2)/(npartInD*(npartInD-1)) - m_2_0*m_0_2/npartInD + m_2_2/npartInD;
612 deriv = centMoms[a][a+1][0][2]/(2*sqrt(centMoms[a][a+1][2][0]*centMoms[a][a+1][0][2]-std::pow(centMoms[a][a+1][1][1],2)));
614 else if(i == 1 && k < 2)
616 deriv = centMoms[a][a+1][2][0]/(2*sqrt(centMoms[a][a+1][2][0]*centMoms[a][a+1][0][2]-std::pow(centMoms[a][a+1][1][1],2)));
618 else if(i == 2 && k < 2)
620 deriv = -centMoms[a][a+1][1][1]/(sqrt(centMoms[a][a+1][2][0]*centMoms[a][a+1][0][2]-std::pow(centMoms[a][a+1][1][1],2)));
631 deriv = centMoms[a][a+1][0][2]*centMoms[a][a+1][1][1]/(2*std::pow(centMoms[a][a+1][2][0]*centMoms[a][a+1][0][2]-std::pow(centMoms[a][a+1][1][1],2),3./2.));
633 else if(i == 1 && k < 2)
635 deriv = centMoms[a][a+1][2][0]*centMoms[a][a+1][1][1]/(2*std::pow(centMoms[a][a+1][2][0]*centMoms[a][a+1][0][2]-std::pow(centMoms[a][a+1][1][1],2),3./2.));
637 else if(i == 2 && k < 2)
639 deriv = - centMoms[a][a+1][2][0]*centMoms[a][a+1][0][2]/std::pow(centMoms[a][a+1][2][0]*centMoms[a][a+1][0][2]-std::pow(centMoms[a][a+1][1][1],2),3./2.);
650 deriv = (centMoms[a][a+1][2][0]*centMoms[a][a+1][0][2]-2*std::pow(centMoms[a][a+1][1][1],2))/(2*std::pow(centMoms[a][a+1][2][0]*centMoms[a][a+1][0][2]-std::pow(centMoms[a][a+1][1][1],2),3./2.));
652 else if(i == 1 && k < 2)
654 deriv = - std::pow(centMoms[a][a+1][2][0],2)/(2*std::pow(centMoms[a][a+1][2][0]*centMoms[a][a+1][0][2]-std::pow(centMoms[a][a+1][1][1],2),3./2.));
656 else if(i == 2 && k < 2)
658 deriv = centMoms[a][a+1][2][0]*centMoms[a][a+1][1][1]/std::pow(centMoms[a][a+1][2][0]*centMoms[a][a+1][0][2]-std::pow(centMoms[a][a+1][1][1],2),3./2.);
677 else if(i == 1 && k < 2)
679 deriv = -centMoms[a][4][1][1]/std::pow(centMoms[4][4][2][0],2);
681 else if(i == 2 && k < 2)
683 deriv = 1/centMoms[4][4][2][0];
696 else if(i == 1 && k < 2)
698 deriv = -centMoms[a+1][4][1][1]/std::pow(centMoms[4][4][2][0],2);
700 else if(i == 2 && k < 2)
702 deriv = 1/centMoms[4][4][2][0];
723 deriv = 1/(2*sqrt(centMoms[a][a+1][2][0]));
735 deriv = 1/(2*sqrt(centMoms[a][a+1][0][2]));