9 #include <top/reconstruction_cpp/PDFConstructor.h>
10 #include <top/reconstruction_cpp/TOPRecoManager.h>
11 #include <top/reconstruction_cpp/func.h>
12 #include <top/geometry/TOPGeometryPar.h>
13 #include <framework/logging/Logger.h>
29 m_moduleID(track.getModuleID()), m_track(track), m_hypothesis(hypothesis),
30 m_inverseRaytracer(
TOPRecoManager::getInverseRaytracer(m_moduleID)),
34 m_deltaRayPDF(m_moduleID),
35 m_PDFOption(PDFOption), m_storeOption(storeOption)
37 if (not track.isValid()) {
38 B2ERROR(
"TOP::PDFConstructor: TOPTrack is not valid, cannot continue");
44 B2ERROR(
"TOP::PDFConstructor: missing reconstruction objects, cannot continue");
48 m_beta = track.getBeta(hypothesis, overrideMass);
50 m_tof = track.getTOF(hypothesis, 0, overrideMass);
65 for (
int pixelID = 1; pixelID <= numPixels; pixelID++) {
66 auto pmtType = pixelPositions.get(pixelID).pmtType;
67 const auto& tts = geo->
getTTS(pmtType);
121 double xmi = 0, xma = 0;
122 bool ok =
rangeOfX(prism.zD, xmi, xma);
124 int kmi = lround(xmi / bar.A);
125 int kma = lround(xma / bar.A);
129 for (
int k = kmi; k <= kma; k++) {
130 for (
unsigned col = 0; col < pixelPositions.getNumPixelColumns(); col++) {
131 const auto& pixel = pixelPositions.get(col + 1);
132 if (pixel.Dx == 0)
continue;
134 if (xD < xmi or xD > xma)
continue;
150 double xmi = 0, xma = 0;
151 bool ok =
rangeOfX(mirror.zb, xmi, xma);
153 int kmi = lround(xmi / bar.A);
154 int kma = lround(xma / bar.A);
158 double xE = emiPoint.X();
159 double zE = emiPoint.Z();
160 double Ah = bar.A / 2;
161 for (
int k = kmi; k <= kma; k++) {
164 double xL =
func::clip(-Ah, k, bar.A, xmi, xma);
165 double xR =
func::clip(Ah, k, bar.A, xmi, xma);
180 std::vector<double> xDs;
181 double minLen = 1e10;
184 if (xDs.size() < 2)
return;
189 std::sort(xDs.begin(), xDs.end());
190 double xmi = xDs.front();
191 double xma = xDs.back();
193 int kmi = lround(xmi / bar.A);
194 int kma = lround(xma / bar.A);
198 for (
int k = kmi; k <= kma; k++) {
199 for (
unsigned col = 0; col < pixelPositions.getNumPixelColumns(); col++) {
200 const auto& pixel = pixelPositions.get(col + 1);
201 if (pixel.Dx == 0)
continue;
203 if (xD < xmi or xD > xma)
continue;
205 setSignalPDF(reflected, col, xD, prism.zD, Nxm, xmMin, xmMax);
216 if (i0 < 0)
return false;
219 for (
unsigned i = 0; i < 2; i++) {
222 const auto& sol = solutions[i0];
223 xDs.push_back(sol.xD);
224 minLen = std::min(minLen, sol.len);
234 const double precision = 0.01;
237 double y1 =
deltaXD(x1, sol, xD);
238 if (isnan(y1))
return false;
242 double step = -dFic_dx * y1;
243 for (
int i = 1; i < 20; i++) {
244 double x2 = step * i;
245 double y2 =
deltaXD(x2, sol, xD);
246 if (isnan(y2))
return false;
252 for (
int k = 0; k < 20; k++) {
253 double x = (x2 + x3) / 2;
254 double y =
deltaXD(x, sol, xD);
255 if (isnan(y))
return false;
264 if (y2 * y1 > 0)
return false;
268 for (
int k = 0; k < 20; k++) {
269 double x = (x1 + x2) / 2;
270 double y =
deltaXD(x, sol, xD);
271 if (isnan(y))
return false;
302 double dt_dx = D.dLen_dx / speedOfLightQuartz;
312 double wid0 = (pow(dt_dx * pixel.Dx, 2) + pow(dt_dL * L, 2) + pow(dTime, 2)) / 12 + pow(sigmaScat, 2);
318 const auto& atPrismEntrance = photonStates[photonStates.size() - 2];
319 double dydz = atPrismEntrance.getKy() / atPrismEntrance.getKz();
324 double time =
m_tof + Len / speedOfLightQuartz;
335 if (RQE == 0)
continue;
338 double propLen = Len + D.dLen_de * dE;
342 peak.
t0 =
m_tof + propLen / speedOfLight;
343 peak.
wid = wid0 + dt_de * dt_de * result.sigsq;
346 signalPDF.append(peak);
353 extra.
sige = result.sigsq;
364 const auto& firstState = photonStates.front();
365 extra.
kxE = firstState.getKx();
366 extra.
kyE = firstState.getKy();
367 extra.
kzE = firstState.getKz();
368 const auto& lastState = photonStates.back();
369 extra.
kxD = lastState.getKx();
370 extra.
kyD = lastState.getKy();
371 extra.
kzD = lastState.getKz();
373 signalPDF.append(extra);
383 double p = exp(-propLen / bulk) * pow(surf, abs(nx) + abs(ny));
391 if (maxLen < 0)
return false;
399 double dz = z - emission.position.Z();
400 double cosFicLimit = (trk.cosTh * cer.cosThc - dz / maxLen) / (trk.sinTh * cer.sinThc);
401 double cosLimit = (dz > 0) ? cosFicLimit : -cosFicLimit;
402 if (cosLimit < -1)
return false;
404 std::vector<double> xmima;
405 double x0 = emission.position.X();
407 xmima.push_back(x0 - maxLen);
408 xmima.push_back(x0 + maxLen);
410 double a = trk.cosTh * cer.sinThc * cosFicLimit + trk.sinTh * cer.cosThc;
411 double b = cer.sinThc * sqrt(1 - cosFicLimit * cosFicLimit);
412 xmima.push_back(x0 + maxLen * (a * trk.cosFi - b * trk.sinFi));
413 xmima.push_back(x0 + maxLen * (a * trk.cosFi + b * trk.sinFi));
414 std::sort(xmima.begin(), xmima.end());
421 double theta = acos(trk.cosTh);
422 if (dz < 0) theta = M_PI - theta;
424 double thetaCer = acos(cer.cosThc);
425 if (theta - thetaCer >= M_PI / 2)
return false;
427 std::vector<double> dxdz;
428 double a = -cos(theta + thetaCer) * cos(theta - thetaCer);
429 double b = sin(2 * theta) * trk.cosFi;
430 double c = pow(trk.sinFi * cer.sinThc, 2) - pow(trk.cosFi, 2) * sin(theta + thetaCer) * sin(theta - thetaCer);
431 double D = b * b - 4 * a * c;
432 if (D < 0)
return true;
435 dxdz.push_back((-b - D) / 2 / a);
436 dxdz.push_back((-b + D) / 2 / a);
438 if (b == 0)
return true;
439 dxdz.push_back(-c / b);
440 dxdz.push_back(copysign(INFINITY, b));
442 std::vector<double> cosFic(2, cosLimit);
443 for (
int i = 0; i < 2; i++) {
444 if (abs(dxdz[i]) < INFINITY) {
445 double aa = (dxdz[i] * cos(theta) - trk.cosFi * sin(theta)) * cer.cosThc;
446 double bb = (dxdz[i] * sin(theta) + trk.cosFi * cos(theta)) * cer.sinThc;
447 double dd = trk.sinFi * cer.sinThc;
448 cosFic[i] = aa * bb / (bb * bb + dd * dd);
449 double kz = cos(theta) * cer.cosThc - sin(theta) * cer.sinThc * cosFic[i];
450 if (kz < 0) dxdz[i] = copysign(INFINITY, dxdz[1 - i] - dxdz[i]);
453 if (dxdz[0] > dxdz[1]) {
454 std::reverse(dxdz.begin(), dxdz.end());
455 std::reverse(cosFic.begin(), cosFic.end());
457 for (
int i = 0; i < 2; i++) {
458 if (cosFic[i] < cosLimit) xmima[i] = x0 + dxdz[i] * dz;
462 xmi = std::max(xmima[0], x0 - maxLen);
463 xma = std::min(xmima[1], x0 + maxLen);
471 double z = sqrt(1 - x * x);
472 double kx = (x - xe);
473 double kz = (z - ze);
474 double s = 2 * (kx * x + kz * z);
475 double qx = kx - s * x;
476 double qz = kz - s * z;
478 double der_z = -x / z;
479 double der_s = 2 * (kx + der_z * kz);
480 double der_qx = (1 - s) - der_s * x;
481 double der_qz = (1 - s) * der_z - der_s * z;
483 return 1 - der_z * qx / qz + (zd - z) * (der_qx * qz - der_qz * qx) / (qz * qz);
497 double xe = (xE - mirror.
xc) / mirror.
R;
498 double ze = (zE - mirror.
zc) / mirror.
R;
499 double zd = (zD - mirror.
zc) / mirror.
R;
503 double x1 = (-Ah - mirror.
xc) / mirror.
R;
505 if (y1 != y1 or abs(y1) == INFINITY)
return -Ah;
507 double x2 = (Ah - mirror.
xc) / mirror.
R;
509 if (y2 != y2 or abs(y2) == INFINITY)
return -Ah;
511 if (y1 * y2 > 0)
return -Ah;
513 for (
int i = 0; i < 50; i++) {
514 double x = (x1 + x2) / 2;
516 if (y != y or abs(y) == INFINITY)
return -Ah;
524 double x = (x1 + x2) / 2;
526 return x * mirror.
R + mirror.
xc;
538 int nxmi = (xE > 0) ? 0 : -1;
539 int nxma = (xE > 0) ? 1 : 0;
541 for (
const auto& pixel : pixelPositions.getPixels()) {
544 if (RQE == 0)
continue;
546 for (
int Nxe = nxmi; Nxe <= nxma; Nxe++) {
547 for (
size_t k = 0; k < prism.unfoldedWindows.size(); k++) {
552 if (not ok)
continue;
553 int Nye = k - prism.k0;
559 double slope = lastState.getKy() / lastState.getKz();
560 double dz = prism.zD - prism.zFlat;
561 double y2 = std::min(pixel.yc + pixel.Dy / 2, prism.yUp + slope * dz);
562 double y1 = std::max(pixel.yc - pixel.Dy / 2, prism.yDown + slope * dz);
564 if (Dy < 0)
continue;
567 for (
int i = 0; i < 4; i++) {
573 if (not ok)
continue;
577 for (
int i = 0; i < 4; i++) {
583 if (not ok)
continue;
587 for (
int i = 0; i < 4; i++) {
593 if (not ok)
continue;
596 double dx_dL = (lastState_dL.getX() - lastState.getX()) / dL;
597 double dy_dL = (lastState_dL.getY() - lastState.getY()) / dL;
598 double dx_dFic = (lastState_dFic.getX() - lastState.getX()) / dFic;
599 double dy_dFic = (lastState_dFic.getY() - lastState.getY()) / dFic;
600 double Jacobi = dx_dL * dy_dFic - dy_dL * dx_dFic;
603 double dLen_de = (lastState_de.getPropagationLen() - lastState.getPropagationLen()) / de;
604 double dLen_dL = (lastState_dL.getPropagationLen() - lastState.getPropagationLen()) / dL;
605 double dLen_dFic = (lastState_dFic.getPropagationLen() - lastState.getPropagationLen()) / dFic;
608 double dt_dL = dLen_dL / speedOfLightQuartz;
609 double dt_dFic = dLen_dFic / speedOfLightQuartz;
613 double DL = (dy_dFic * pixel.Dx - dx_dFic * pixel.Dy) / Jacobi;
614 double DFic = (dx_dL * pixel.Dy - dy_dL * pixel.Dx) / Jacobi;
615 double paralax = (pow(dt_dL * DL, 2) + pow(dt_dFic * DFic, 2)) / 12;
621 peak.
wid = chromatic + paralax + scattering;
622 peak.
nph = 1 - exp(-numPhotons);
623 peak.
fic = atan2(sol.sinFic, sol.cosFic);
624 signalPDF.append(peak);
634 extra.
xD = lastState.getXD();
635 extra.
yD = lastState.getYD();
636 extra.
zD = lastState.getZD();
637 extra.
kxE = firstState.getKx();
638 extra.
kyE = firstState.getKy();
639 extra.
kzE = firstState.getKz();
640 extra.
kxD = lastState.getKx();
641 extra.
kyD = lastState.getKy();
642 extra.
kzD = lastState.getKz();
644 signalPDF.append(extra);
665 double cosFic = sol.
cosFic * cosDFic - sol.
sinFic * sinDFic;
666 double sinFic = sol.
sinFic * cosDFic + sol.
cosFic * sinDFic;
667 double a = trk.cosTh * cer.sinThc * cosFic + trk.sinTh * cer.cosThc;
668 double b = cer.sinThc * sinFic;
669 double kx = a * trk.cosFi - b * trk.sinFi;
670 double ky = a * trk.sinFi + b * trk.cosFi;
671 double kz = trk.cosTh * cer.cosThc - trk.sinTh * cer.sinThc * cosFic;
684 double dz = abs(prism.zD - prism.zFlat);
686 pixel.
yc * win.sy + win.y0 + win.ny * dz,
687 pixel.
yc * win.sz + win.z0 + win.nz * dz);
690 for (
int iter = 0; iter < 100; iter++) {
693 if (abs(sol.L - L) < 0.01)
return sol;
696 B2DEBUG(20,
"TOP::PDFConstructor::prismSolution: iterations not converging");
707 auto r = rD - emi.position;
708 const auto& trk = emi.trackAngles;
709 double xx = r.X() * trk.cosFi + r.Y() * trk.sinFi;
710 double y = -r.X() * trk.sinFi + r.Y() * trk.cosFi;
711 double x = xx * trk.cosTh - r.Z() * trk.sinTh;
712 double z = xx * trk.sinTh + r.Z() * trk.cosTh;
716 double rho = sqrt(x * x + y * y);
720 sol.
len = rho / cer.sinThc;
721 sol.
L = L + z - sol.
len * cer.cosThc;
733 B2ERROR(
"TOP::PDFConstructor::getLogL(): object status is invalid - cannot provide log likelihood");
740 LogL LL(expectedPhot);
743 double f =
pdfValue(hit.pixelID, hit.time, hit.timeErr);
745 B2ERROR(
"TOP::PDFConstructor::getLogL(): PDF value is zero or negative"
746 <<
LogVar(
"pixelID", hit.pixelID) <<
LogVar(
"time", hit.time) <<
LogVar(
"PDFValue", f));
759 B2ERROR(
"TOP::PDFConstructor::getLogL(): object status is invalid - cannot provide log likelihood");
765 if (hit.time < minTime or hit.time > maxTime)
continue;
766 double f =
pdfValue(hit.pixelID, hit.time - t0, hit.timeErr, sigt);
768 B2ERROR(
"TOP::PDFConstructor::getLogL(): PDF value is zero or negative"
769 <<
LogVar(
"pixelID", hit.pixelID) <<
LogVar(
"time", hit.time) <<
LogVar(
"PDFValue", f));
778 const std::vector<PDFConstructor::LogL>&
782 B2ERROR(
"TOP::PDFConstructor::getPixelLogLs(): object status is invalid - cannot provide log likelihoods");
789 if (hit.time < minTime or hit.time > maxTime)
continue;
790 double f =
pdfValue(hit.pixelID, hit.time - t0, hit.timeErr, sigt);
792 B2ERROR(
"TOP::PDFConstructor::getPixelLogLs(): PDF value is zero or negative"
793 <<
LogVar(
"pixelID", hit.pixelID) <<
LogVar(
"time", hit.time) <<
LogVar(
"PDFValue", f));
796 unsigned k = hit.pixelID - 1;
809 ps += signalPDF.getIntegral(minTime, maxTime);
826 double ps = signalPDF.getIntegral(minTime, maxTime);
827 unsigned k = signalPDF.getPixelID() - 1;
847 unsigned k = hit.pixelID - 1;
853 double wid0 = hit.timeErr * hit.timeErr;
857 for (
const auto& peak : signalPDF.getPDFPeaks()) {
858 minT0 = std::min(minT0, peak.t0);
859 for (
const auto& gaus : signalPDF.getTTS()->getTTS()) {
860 double sig2 = peak.wid + gaus.sigma * gaus.sigma + wid0;
861 double x = pow(hit.time - peak.t0 - gaus.position, 2) / sig2;
862 if (x > 100)
continue;
863 double wt = signalFract * peak.nph * gaus.fraction / sqrt(2 * M_PI * sig2) * exp(-x / 2);
865 m_pulls.push_back(
Pull(hit.pixelID, hit.time, peak.t0, gaus.position, sqrt(sig2), peak.fic - M_PI, wt));
872 m_pulls.push_back(
Pull(hit.pixelID, hit.time, minT0, 0, 0, 0, bg));
874 if (sum == 0)
return;
875 for (
size_t i = i0; i <
m_pulls.size(); i++)
m_pulls[i].wt /= sum;
Provides a type-safe way to pass members of the chargedStableSet set.
static const double speedOfLight
[cm/ns]
double getPDFValue(int pixelID) const
Returns PDF value for given pixel.
const std::vector< double > & getPDF() const
Returns pixel part of PDF.
void prepare(const TOPTrack &track, const Const::ChargedStable &hypothesis)
Prepare the object.
double getNumPhotons() const
Returns number of photons.
double getIntegral(double minTime, double maxTime) const
Returns integral of PDF from minTime to maxTime.
double getPDFValue(int pixelID, double time) const
Returns PDF value at given time and pixel.
double getZD() const
Returns unfolded position in z of virtual Detector plane.
double getPropagationLen() const
Returns total propagation length since initial position.
int getNyb() const
Returns signed number of reflections in y after mirror and before prism.
int getNxm() const
Returns signed number of reflections in x before mirror.
int getNxb() const
Returns signed number of reflections in x after mirror and before prism.
void propagate(const PhotonState &photon, bool averaging=false) const
Propagate photon to photo-detector plane.
int getNym() const
Returns signed number of reflections in y before mirror.
int getNx() const
Returns signed number of reflections in x.
double getYB() const
Returns unfolded position in y at Bar-prism-connection plane.
double getYD() const
Returns unfolded position in y at virtual Detector plane.
int getNxe() const
Returns signed number of reflections in x inside prism.
bool getTotalReflStatus(double cosTotal) const
Returns total internal reflection status.
int getNy() const
Returns signed number of reflections in y.
bool getPropagationStatus() const
Returns propagation status.
double getPropagationLenDelta() const
Returns total propagation length difference between true and flipped prism.
int getNye() const
Returns signed number of reflections in y inside prism.
const std::vector< PhotonState > & getPhotonStates() const
Returns photon states (results of propagation).
double getXD() const
Returns unfolded position in x at virtual Detector plane.
int solveForReflectionPoint(double xM, int Nxm, const TOPTrack::AssumedEmission &assumedEmission, const CerenkovAngle &cer) const
Solve inverse ray-tracing for a given reflection point on the mirror.
bool getStatus() const
Returns status.
std::vector< Solution > & getSolutions(unsigned i) const
Returns the solutions of inverse ray-tracing.
void clear() const
Clear the solutions to prepare for the new round.
double m_cosTotal
cosine of total reflection angle
void setSignalPDF_prism()
Sets signal PDF for track crossing prism.
double expectedPhotons(double minTime, double maxTime) const
Returns the expected number of photons within given time window.
void setSignalPDF()
Sets signal PDF.
double m_bkgRate
estimated background hit rate
double m_beta
particle hypothesis beta
const InverseRaytracer::CerenkovAngle & cerenkovAngle(double dE=0)
Returns cosine and sine of cerenkov angle.
bool detectionPositionX(double xM, int Nxm, std::vector< double > &xDs, double &minLen)
Calculates unfolded detection position from known reflection position on the mirror and emission poin...
const YScanner * m_yScanner
PDF expander in y.
std::vector< SignalPDF > m_signalPDFs
parameterized signal PDF in pixels (index = pixelID - 1)
void setSignalPDF_reflected()
Sets signal PDF for reflected photons.
PrismSolution prismSolution(const PixelPositions::PixelData &pixel, unsigned k, int nx)
General solution of inverse raytracing in prism: iterative procedure calling basic solution.
LogL getLogL() const
Returns extended log likelihood (using the default time window)
double m_maxTime
time window upper edge
const InverseRaytracer * m_inverseRaytracer
inverse ray-tracer
double m_minTime
time window lower edge
EStoreOption m_storeOption
signal PDF storing option
double m_Fic
temporary storage for Cerenkov azimuthal angle
double derivativeOfReflectedX(double x, double xe, double ze, double zd) const
Returns the derivative of reflected position at given x.
double m_groupIndex
group refractive index at mean photon energy
double m_bkgPhotons
expected number of background photons
const std::vector< LogL > & getPixelLogLs(double t0, double sigt=0) const
Returns extended log likelihoods in pixels for PDF shifted in time.
double propagationLosses(double E, double propLen, int nx, int ny, SignalPDF::EPeakType type) const
Returns photon propagation losses (bulk absorption, surface reflectivity, mirror reflectivity)
double m_deltaPhotons
expected number of delta-ray photons
const std::vector< Pull > & getPulls() const
Returns photon pulls w.r.t PDF peaks.
double getCosCerenkovAngle(double E) const
Returns cosine of Cerenkov angle at given photon energy.
double m_signalPhotons
expected number of signal photons
std::map< SignalPDF::EPeakType, int > m_ncallsExpandPDF
number of calls to expandSignalPDF
void appendPulls(const TOPTrack::SelectedHit &hit) const
Appends pulls of a photon hit.
bool m_valid
cross-check flag, true if track is valid and all the pointers above are valid
DeltaRayPDF m_deltaRayPDF
delta-ray PDF
double deltaXD(double dFic, const InverseRaytracer::Solution &sol, double xD)
Returns the difference in xD between ray-traced solution rotated by dFic and input argument.
bool doRaytracingCorrections(const InverseRaytracer::Solution &sol, double dFic_dx, double xD)
Corrects the solution of inverse ray-tracing with fast ray-tracing.
std::vector< Pull > m_pulls
photon pulls w.r.t PDF peaks
const FastRaytracer * m_fastRaytracer
fast ray-tracer
double findReflectionExtreme(double xE, double zE, double zD, int Nxm, double A, const RaytracerBase::Mirror &mirror) const
Finds the position on the mirror of the extreme reflection.
EStoreOption
Options for storing signal PDF parameters.
@ c_Reduced
only PDF peak data
const TOPTrack & m_track
temporary reference to track at TOP
std::vector< LogL > m_pixelLLs
pixel log likelihoods (index = pixelID - 1)
EPDFOption m_PDFOption
signal PDF construction option
const BackgroundPDF * m_backgroundPDF
background PDF
bool m_deltaPDFOn
include/exclude delta-ray PDF in likelihood calculation
EPDFOption
Signal PDF construction options.
@ c_Optimal
y dependent only where necessary
@ c_Fine
y dependent everywhere
double pdfValue(int pixelID, double time, double timeErr, double sigt=0) const
Returns the value of PDF normalized to the number of expected photons.
void expandSignalPDF(unsigned col, const YScanner::Derivatives &D, SignalPDF::EPeakType type)
Expands signal PDF in y (y-scan)
bool prismRaytrace(const PrismSolution &sol, double dL=0, double dFic=0, double de=0)
Do forward raytracing of inverse raytracing solution in prism.
double m_groupIndexDerivative
derivative (dn_g/dE) of group refractive index at mean photon energy
void initializePixelLogLs(double minTime, double maxTime) const
Initializes pixel log likelihoods.
bool rangeOfX(double z, double &xmi, double &xma)
Estimates range of unfolded x coordinate of the hits on given plane perpendicular to z-axis.
std::vector< TOPTrack::SelectedHit > m_selectedHits
selected photon hits
void setSignalPDF_direct()
Sets signal PDF for direct photons.
double m_tof
time-of-flight from IP to average photon emission position
State of the Cerenkov photon in the quartz optics.
double get(int pixelID) const
Returns pixel relative efficinecy.
bool isActive(int pixelID) const
Checks if pixel is active.
unsigned getNumPixels() const
Returns number of pixels.
const PixelData & get(int pixelID) const
Returns pixel data for given pixelID.
const Mirror & getMirror() const
Returns geometry data of spherical mirror.
const std::vector< BarSegment > & getBars() const
Returns geometry data of bar segments.
const Prism & getPrism() const
Returns geometry data of prism.
Parametrization of signal PDF in a single pixel.
EPeakType
Enumerator for single PDF peak types.
@ c_Reflected
reflected photon
const TOPGeometry * getGeometry() const
Returns pointer to geometry object using basf2 units.
double getGroupIndexDerivative(double energy) const
Returns the derivative (dn_g/dE) of group refractive index of quartz at given photon energy.
static TOPGeometryPar * Instance()
Static method to obtain the pointer to its instance.
double getAbsorptionLength(double energy) const
Returns bulk absorption lenght of quartz at given photon energy.
double getGroupIndex(double energy) const
Returns group refractive index of quartz at given photon energy.
Singleton class providing pre-constructed reconstruction objects.
static double getMaxTime()
Returns time window upper edge.
static double getMinTime()
Returns time window lower edge.
Reconstructed track at TOP.
double getLengthInQuartz() const
Returns track length within quartz.
bool isScanRequired(unsigned col, double time, double wid) const
Checks if scan method of YScanner is needed to construct PDF for a given pixel column.
const TOPTrack::AssumedEmission & getEmissionPoint(double dL=0) const
Returns assumed photon emission position and track direction.
void prepare(double momentum, double beta, double length) const
Prepare for the PDF expansion in y for a given track mass hypothesis.
double getSigmaScattering() const
Returns r.m.s of multiple scattering angle in quartz converted to photon energy.
void expand(unsigned col, double yB, double dydz, const Derivatives &D, bool doScan) const
Performs the PDF expansion in y for a given pixel column using scan or merge methods.
const PixelPositions & getPixelPositions() const
Returns pixel positions and their sizes.
const std::vector< Result > & getResults() const
Returns the results of PDF expansion in y.
double getNumPhotonsPerLen() const
Returns number of photons per Cerenkov azimuthal angle per track length.
double getCosTotal() const
Returns cosine of total reflection angle.
const PixelEfficiencies & getPixelEfficiencies() const
Returns pixel relative efficiencies.
double getNumPhotons() const
Returns number of photons per Cerenkov azimuthal angle.
double getMeanEnergy() const
Returns mean photon energy.
bool isAboveThreshold() const
Returns above Cerenkov threshold flag which is set in the prepare method.
const PixelMasks & getPixelMasks() const
Returns pixel masks.
double getRMSEnergy() const
Returns r.m.s of photon energy.
Class to store variables with their name which were sent to the logging service.
const TOPNominalTTS & getTTS(unsigned type) const
Returns time transition spread of a given PMT type.
double unfold(double x, int nx, double A)
unfold a coordinate.
double clip(double x, int Nx, double A, double xmi, double xma)
Performs a clip on x w.r.t xmi and xma.
double within2PI(double angle)
Returns angle within 0 and 2PI.
Abstract base class for different kinds of events.
Solution of inverse ray-tracing.
Structure that enables defining a template function: direct photons.
Structure that enables defining a template function: reflected photons.
Useful data type for returning the results of log likelihood calculation.
unsigned numPhotons
detected number of photons
double logL
extended log likelihood
Solution of inverse raytracing in prism.
double L
emission position distance along particle trajectory
double cosFic
cosine of azimuthal Cerenkov angle
double sinFic
sine of azimuthal Cerenkov angle
double len
propagation length
Data type for storing photon pull w.r.t PDF peak.
position and size of a pixel
double yc
position of center in y
double xc
position of center in x
spherical mirror data in module local frame.
double reflectivity
mirror reflectivity
double xc
center of curvature in x
double zc
center of curvature in z
std::vector< TOPGeoPrism::UnfoldedWindow > unfoldedWindows
unfolded prism exit windows
double t0
peak position [ns]
double fic
Cerenkov azimuthal angle.
double wid
peak width squared [ns^2]
double nph
normalized number of photons in a peak
TrackAngles trackAngles
sine and cosine of track polar and azimuthal angles
TVector3 position
position
selected photon hit from TOPDigits