From 1a546438d158a6199bc4eafe80490bd072b98283 Mon Sep 17 00:00:00 2001 From: "se.gorbunov" <se.gorbunov@gsi.de> Date: Sun, 14 Jan 2024 20:40:50 +0000 Subject: [PATCH] Ca: update of mcbm; debug output --- algo/ca/core/tracking/CaTrackFinderWindow.cxx | 9 +- algo/ca/core/tracking/CaTrackFinderWindow.h | 3 + .../ca/core/tracking/CaTripletConstructor.cxx | 187 +++++++++++++----- algo/ca/core/tracking/CaTripletConstructor.h | 5 + macro/L1/configs/ca_params_mcbm.yaml | 99 ++-------- macro/L1/configs/config_ideal_hits_mcbm.yaml | 23 ++- 6 files changed, 184 insertions(+), 142 deletions(-) diff --git a/algo/ca/core/tracking/CaTrackFinderWindow.cxx b/algo/ca/core/tracking/CaTrackFinderWindow.cxx index 73c1a6869c..d942c55333 100644 --- a/algo/ca/core/tracking/CaTrackFinderWindow.cxx +++ b/algo/ca/core/tracking/CaTrackFinderWindow.cxx @@ -135,11 +135,18 @@ void TrackFinderWindow::ReadWindowData() for (ca::HitIndex_t ih = 0; ih < frAlgo.fSliceHitIds[iS].size(); ++ih) { ca::Hit h = frAlgo.fInputData.GetHit(frAlgo.fSliceHitIds[iS][ih]); h.SetId(frAlgo.fSliceHitIds[iS][ih]); - frAlgo.fWindowHits[frAlgo.fStationHitsStartIndex[iS] + ih] = h; } } + if constexpr (fDebug) { + std::cout << "===== Sliding Window hits: " << std::endl; + for (int i = 0; i < nHits; ++i) { + std::cout << " " << frAlgo.fWindowHits[i].ToString() << std::endl; + } + std::cout << "===== " << std::endl; + } + frAlgo.fHitFirstTriplet.reset(nHits, 0); frAlgo.fHitNtriplets.reset(nHits, 0); diff --git a/algo/ca/core/tracking/CaTrackFinderWindow.h b/algo/ca/core/tracking/CaTrackFinderWindow.h index b2c0587847..a3fdc58890 100644 --- a/algo/ca/core/tracking/CaTrackFinderWindow.h +++ b/algo/ca/core/tracking/CaTrackFinderWindow.h @@ -68,6 +68,9 @@ namespace cbm::algo::ca /// Data members ca::Framework& frAlgo; ///< Reference to the main track finder algorithm class + + private: + static constexpr bool fDebug = false; // print debug info }; } // namespace cbm::algo::ca diff --git a/algo/ca/core/tracking/CaTripletConstructor.cxx b/algo/ca/core/tracking/CaTripletConstructor.cxx index 458d5519b2..4c41eee11e 100644 --- a/algo/ca/core/tracking/CaTripletConstructor.cxx +++ b/algo/ca/core/tracking/CaTripletConstructor.cxx @@ -82,6 +82,7 @@ void TripletConstructor::InitStations(int istal, int istam, int istar) fFit.SetParticleMass(constants::phys::ElectronMass); } fFit.SetMask(fmask::One()); + fFit.SetDoFitVelocity(true); fIsInitialized = true; } @@ -129,23 +130,24 @@ void TripletConstructor::CreateTripletsForHit(int istal, int istam, int istar, c T.Ty() = ty; T.Qp() = fvec(0.); T.Time() = time; - T.Vi() = fvec(0.); + T.Vi() = constants::phys::SpeedOfLightInv; fvec txErr2 = fAlgo->fMaxSlopePV * fAlgo->fMaxSlopePV / fvec(9.); fvec qpErr2 = fAlgo->fMaxInvMom * fAlgo->fMaxInvMom / fvec(9.); - T.ResetErrors(1., 1., txErr2, txErr2, qpErr2, (staL().timeInfo ? timeEr2 : 1.e6), 1.e2); + T.ResetErrors(1., 1., txErr2, txErr2, qpErr2, (staL().timeInfo ? timeEr2 : 1.e6), 1.e10); + + T.InitVelocityRange(1. / fAlgo->fpCurrentIteration->GetMaxQp()); + T.C00() = hitl.dX2(); T.C10() = hitl.dXY(); T.C11() = hitl.dY2(); T.Ndf() = (fAlgo->fpCurrentIteration->GetPrimaryFlag()) ? fvec(2.) : fvec(0.); - T.NdfTime() = (staL().timeInfo ? -1 : -2); + T.NdfTime() = (staL().timeInfo ? 0 : -1); - // TODO: iteration parameter: "Starting NDF of track parameters" // NDF = number of track parameters (6: x, y, tx, ty, qp, time) - number of measured parameters (3: x, y, time) on station or (2: x, y) on target - // field made by the left hit, the target and the station istac in-between. // is used for extrapolation to the target and to the middle hit ca::FieldRegionV fld0; @@ -256,7 +258,7 @@ void TripletConstructor::FitDoublets() fscal dz = hitClone.Z() - T2.Z()[0]; - if ((staM().timeInfo) && (T2.NdfTime()[0] > -2)) { + if ((staM().timeInfo) && (T2.NdfTime()[0] >= 0)) { fscal dt = T2.Time()[0] + tt * dz - hitClone.T(); if (fabs(dt) > sqrt(30. * T2.C55()[0]) + hitClone.RangeT()) { continue; @@ -328,25 +330,63 @@ void TripletConstructor::FindRightHit() fFit.Extrapolate(staR().fZ, fFldL); - // ---- Find the triplets(right hit). Reformat data in the portion of triplets. ---- - - if (fAlgo->kSts == fAlgo->fTrackingMode && (T2.C44()[0] < 0)) { - continue; + if constexpr (fDebugDublets) { + ca::HitIndex_t iwhit[2] = {fIhitL, fHitsM_2[i2]}; + ca::HitIndex_t ihit[2] = {fAlgo->fWindowHits[iwhit[0]].Id(), fAlgo->fWindowHits[iwhit[1]].Id()}; + + int ih0 = ihit[0]; + int ih1 = ihit[1]; + const ca::Hit& h0 = fAlgo->fInputData.GetHit(ih0); + const ca::Hit& h1 = fAlgo->fInputData.GetHit(ih1); + + std::cout << "\n====== Extrapolated Doublet : " + << " iter " << fAlgo->fCurrentIterationIndex << " hits: {" << fIstaL << "/" << ih0 << " " << fIstaM + << "/" << ih1 << " " << fIstaR << "/?} xyz: {" << h0.X() << " " << h0.Y() << " " << h0.Z() << "}, {" + << h1.X() << " " << h1.Y() << " " << h1.Z() << "} chi2 " << T2.GetChiSq()[0] << " ndf " << T2.Ndf()[0] + << " chi2time " << T2.ChiSqTime()[0] << " ndfTime " << T2.NdfTime()[0] << std::endl; + std::cout << " extr. track: " << T2.ToString(0) << std::endl; } - if (T2.C00()[0] < 0 || T2.C11()[0] < 0 || T2.C22()[0] < 0 || T2.C33()[0] < 0 || T2.C55()[0] < 0) continue; - if (fabs(T2.Tx()[0]) > fAlgo->fMaxSlope) continue; - if (fabs(T2.Ty()[0]) > fAlgo->fMaxSlope) continue; + // ---- Find the triplets(right hit). Reformat data in the portion of triplets. ---- + bool isDoubletGood = false; + int iMC = -1; + do { + if (fAlgo->kSts == fAlgo->fTrackingMode && (T2.C44()[0] < 0)) { + break; + } + if (T2.C00()[0] < 0 || T2.C11()[0] < 0 || T2.C22()[0] < 0 || T2.C33()[0] < 0 || T2.C55()[0] < 0) { + break; + } + if (fabs(T2.Tx()[0]) > fAlgo->fMaxSlope) { + break; + } + if (fabs(T2.Ty()[0]) > fAlgo->fMaxSlope) { + break; + } + if (fAlgo->fParameters.DevIsMatchTripletsViaMc()) { + int indM = fHitsM_2[i2]; + iMC = fAlgo->GetMcTrackIdForWindowHit(fIhitL); + if (iMC < 0 || iMC != fAlgo->GetMcTrackIdForWindowHit(indM)) { + break; + } + } + isDoubletGood = true; + } while (0); - int iMC = -1; - if (fAlgo->fParameters.DevIsMatchTripletsViaMc()) { - int indM = fHitsM_2[i2]; - iMC = fAlgo->GetMcTrackIdForWindowHit(fIhitL); - if (iMC < 0 || iMC != fAlgo->GetMcTrackIdForWindowHit(indM)) { - continue; + if constexpr (fDebugDublets) { + if (isDoubletGood) { + std::cout << " extrapolated doublet accepted" << std::endl; + } + else { + std::cout << " extrapolated doublet rejected" << std::endl; + std::cout << "======== end of extrapolated doublet ==== \n" << std::endl; } } + if (!isDoubletGood) { + continue; + } + Vector<ca::HitIndex_t> collectedHits; CollectHits(T2, fIstaR, fAlgo->fTripletChi2Cut, iMC, collectedHits, fAlgo->fParameters.GetMaxTripletPerDoublets()); @@ -356,23 +396,35 @@ void TripletConstructor::FindRightHit() // reject already created triplets for this doublet collectedHits.clear(); } - + if constexpr (fDebugDublets) { + std::cout << " collected " << collectedHits.size() << " hits on the right station " << std::endl; + } for (unsigned int ih = 0; ih < collectedHits.size(); ih++) { ca::HitIndex_t irh = collectedHits[ih]; - if (fAlgo->fIsWindowHitSuppressed[irh]) continue; + if constexpr (fDebugDublets) { + ca::HitIndex_t ihit = fAlgo->fWindowHits[irh].Id(); + const ca::Hit& h = fAlgo->fInputData.GetHit(ihit); + std::cout << " hit " << ihit << " " << h.ToString() << std::endl; + } + if (fAlgo->fIsWindowHitSuppressed[irh]) { + if constexpr (fDebugDublets) { + std::cout << " the hit is suppressed" << std::endl; + } + continue; + } // pack the triplet fHitsM_3.push_back(fHitsM_2[i2]); fHitsR_3.push_back(irh); - } // search area - } // i2 + if constexpr (fDebugDublets) { + std::cout << "======== end of extrapolated doublet ==== \n" << std::endl; + } + } // i2 } void TripletConstructor::FitTriplets() { - constexpr bool dumpTriplets = 0; - constexpr int nIterations = 2; Tindex n3 = fHitsM_3.size(); @@ -382,7 +434,7 @@ void TripletConstructor::FitTriplets() fTracks_3.reset(n3, TrackParamV()); /// Refit Triplets - if (dumpTriplets) { + if constexpr (fDebugTriplets) { //cbm::ca::tools::Debugger::Instance().AddNtuple( // "triplets", "ev:iter:i0:x0:y0:z0:i1:x1:y1:z1:i2:x2:y2:z2:mc:sta:p:vx:vy:vz:chi2:ndf:chi2time:ndfTime"); } @@ -492,7 +544,7 @@ void TripletConstructor::FitTriplets() T.C11() = mxy[ih0].Dy2(); T.Ndf() = -ndfTrackModel + 2; - T.NdfTime() = sta[ih0].timeInfo ? -1 : -2; + T.NdfTime() = sta[ih0].timeInfo ? 0 : -1; // add the target constraint fit.FilterWithTargetAtLine(fAlgo->fTargZ, fAlgo->TargetMeasurement, fldTarget); @@ -529,7 +581,7 @@ void TripletConstructor::FitTriplets() T.C11() = mxy[ih0].Dy2(); T.Ndf() = -ndfTrackModel + 2; - T.NdfTime() = sta[ih0].timeInfo ? -1 : -2; + T.NdfTime() = sta[ih0].timeInfo ? 0 : -1; for (int ih = NHits - 2; ih >= 0; --ih) { fit.Extrapolate(z[ih], fld); @@ -544,19 +596,25 @@ void TripletConstructor::FitTriplets() fTracks_3[i3] = T; - if (dumpTriplets) { + if constexpr (fDebugTriplets) { int ih0 = ihit[0]; int ih1 = ihit[1]; int ih2 = ihit[2]; int mc1 = fAlgo->GetMcTrackIdForCaHit(ih0); int mc2 = fAlgo->GetMcTrackIdForCaHit(ih1); int mc3 = fAlgo->GetMcTrackIdForCaHit(ih2); - if ((mc1 >= 0) && (mc1 == mc2) && (mc1 == mc3)) { + if (1 || (mc1 >= 0) && (mc1 == mc2) && (mc1 == mc3)) { + const ca::Hit& h0 = fAlgo->fInputData.GetHit(ih0); + const ca::Hit& h1 = fAlgo->fInputData.GetHit(ih1); + const ca::Hit& h2 = fAlgo->fInputData.GetHit(ih2); + //const CbmL1MCTrack& mctr = CbmL1::Instance()->GetMcTracks()[mc1]; + std::cout << "== fitted triplet: " + << " iter " << fAlgo->fCurrentIterationIndex << " hits: {" << fIstaL << "/" << ih0 << " " << fIstaM + << "/" << ih1 << " " << fIstaR << "/" << ih2 << "} xyz: {" << h0.X() << " " << h0.Y() << " " << h0.Z() + << "}, {" << h1.X() << " " << h1.Y() << " " << h1.Z() << "}, {" << h2.X() << ", " << h2.Y() << ", " + << h2.Z() << "} chi2 " << T.GetChiSq()[0] << " ndf " << T.Ndf()[0] << " chi2time " << T.ChiSqTime()[0] + << " ndfTime " << T.NdfTime()[0] << std::endl; /* - const ca::Hit& h0 = fAlgo->fInputData.GetHit(ih0); - const ca::Hit& h1 = fAlgo->fInputData.GetHit(ih1); - const ca::Hit& h2 = fAlgo->fInputData.GetHit(ih2); - const CbmL1MCTrack& mctr = CbmL1::Instance()->GetMcTracks()[mc1]; cbm::ca::tools::Debugger::Instance().FillNtuple( "triplets", mctr.iEvent, fAlgo->fCurrentIterationIndex, ih0, h0.X(), h0.Y(), h0.Z(), ih1, h1.X(), h1.Y(), h1.Z(), ih2, h2.X(), h2.Y(), h2.Z(), mc1, fIstaL, mctr.p, mctr.x, mctr.y, mctr.z, (float) T.GetChiSq()[0], @@ -646,7 +704,11 @@ void TripletConstructor::CollectHits(const TrackParamV& Tr, const int iSta, cons ca::GridArea area(grid, T.X()[0], T.Y()[0], (sqrt(Pick_m22 * T.C00()) + grid.GetMaxRangeX() + fAlgo->fMaxDZ * abs(T.Tx()))[0], (sqrt(Pick_m22 * T.C11()) + grid.GetMaxRangeY() + fAlgo->fMaxDZ * abs(T.Ty()))[0]); - + if constexpr (fDebugCollectHits) { + std::cout << "search area: " << T.X()[0] << " " << T.Y()[0] << " " + << (sqrt(Pick_m22 * T.C00()) + grid.GetMaxRangeX() + fAlgo->fMaxDZ * abs(T.Tx()))[0] << " " + << (sqrt(Pick_m22 * T.C11()) + grid.GetMaxRangeY() + fAlgo->fMaxDZ * abs(T.Ty()))[0] << std::endl; + } if (fAlgo->fParameters.DevIsIgnoreHitSearchAreas()) { area.DoLoopOverEntireGrid(); } @@ -659,23 +721,36 @@ void TripletConstructor::CollectHits(const TrackParamV& Tr, const int iSta, cons if (fAlgo->fIsWindowHitSuppressed[ih]) continue; const ca::Hit& hit = fAlgo->fWindowHits[ih]; - + if constexpr (fDebugCollectHits) { + std::cout << "hit in the search area: " << hit.ToString() << std::endl; + std::cout << " check the hit.. " << std::endl; + } if (iMC >= 0) { // match via MC if (iMC != fAlgo->GetMcTrackIdForWindowHit(ih)) { + if constexpr (fDebugCollectHits) { + std::cout << " hit mc does not match" << std::endl; + } continue; } } - // check y-boundaries + // check time-boundaries + //TODO: move hardcoded cuts to parameters - if ((sta.timeInfo) && (T.NdfTime()[0] > -2)) { - if (fabs(time - hit.T()) > 1.4 * (3.5 * sqrt(timeError2) + hit.RangeT())) continue; - if (fabs(time - hit.T()) > 30) continue; + if ((sta.timeInfo) && (T.NdfTime()[0] >= 0)) { + if (fabs(time - hit.T()) > 1.4 * (3.5 * sqrt(timeError2) + hit.RangeT())) { + if constexpr (fDebugCollectHits) { + std::cout << " hit time does not match" << std::endl; + } + continue; + } + // if (fabs(time - hit.T()) > 30) continue; } // - check whether hit belong to the window ( track position +\- errors ) - const fscal z = hit.Z(); + // check y-boundaries auto [y, C11] = fFit.ExtrapolateLineYdY2(z); fscal dy_est = sqrt(Pick_m22[0] * C11[0]) + hit.RangeY(); @@ -685,7 +760,12 @@ void TripletConstructor::CollectHits(const TrackParamV& Tr, const int iSta, cons const fscal dY = ym - y[0]; - if (fabs(dY) > dy_est) continue; + if (fabs(dY) > dy_est) { + if constexpr (fDebugCollectHits) { + std::cout << " hit Y does not match" << std::endl; + } + continue; + } // check x-boundaries auto [x, C00] = fFit.ExtrapolateLineXdX2(z); @@ -694,7 +774,12 @@ void TripletConstructor::CollectHits(const TrackParamV& Tr, const int iSta, cons const fscal dX = xm - x[0]; - if (fabs(dX) > dx_est) continue; + if (fabs(dX) > dx_est) { + if constexpr (fDebugCollectHits) { + std::cout << " hit X does not match" << std::endl; + } + continue; + } // check chi2 @@ -706,10 +791,22 @@ void TripletConstructor::CollectHits(const TrackParamV& Tr, const int iSta, cons // TODO: adjust the cut, cut on chi2x & chi2u separately if (!fAlgo->fpCurrentIteration->GetTrackFromTripletsFlag()) { - if (chi2x[0] > chi2Cut) continue; - if (chi2x[0] + chi2u[0] > chi2Cut) continue; + if (chi2x[0] > chi2Cut) { + if constexpr (fDebugCollectHits) { + std::cout << " hit chi2X is too large" << std::endl; + } + continue; + } + if (chi2x[0] + chi2u[0] > chi2Cut) { + if constexpr (fDebugCollectHits) { + std::cout << " hit chi2U is too large" << std::endl; + } + continue; + } + } + if constexpr (fDebugCollectHits) { + std::cout << " hit passed all the checks" << std::endl; } - collectedHits.push_back(ih); } // loop over the hits in the area diff --git a/algo/ca/core/tracking/CaTripletConstructor.h b/algo/ca/core/tracking/CaTripletConstructor.h index b58ac7a28e..444a20c735 100644 --- a/algo/ca/core/tracking/CaTripletConstructor.h +++ b/algo/ca/core/tracking/CaTripletConstructor.h @@ -117,6 +117,11 @@ namespace cbm::algo::ca ca::TrackFit fFit; + private: + static constexpr bool fDebugDublets = false; // print debug info for dublets + static constexpr bool fDebugTriplets = false; // print debug info for triplets + static constexpr bool fDebugCollectHits = false; // print debug info for CollectHits + } _fvecalignment; } // namespace cbm::algo::ca diff --git a/macro/L1/configs/ca_params_mcbm.yaml b/macro/L1/configs/ca_params_mcbm.yaml index e7c6069a85..3b1e82ca3f 100644 --- a/macro/L1/configs/ca_params_mcbm.yaml +++ b/macro/L1/configs/ca_params_mcbm.yaml @@ -35,7 +35,8 @@ ca: track_finder: # Iteration sequence # The iterations themselves are defined in the ca/possible_iterations branch. - iteration_sequence: ['FastPrim', 'AllPrim', 'AllPrimJump', 'AllSec'] + #iteration_sequence: ['FastPrim', 'AllPrim', 'AllPrimJump', 'AllSec'] + iteration_sequence: ['AllPrim', 'AllSec'] # Flag to suppress ghost tracks or not (true/false) is_ghost_suppression: true @@ -71,109 +72,33 @@ ca: doublet_chi2_cut: 7.56327 pick_gather: 4.0 triplet_link_chi2: 125. - max_qp: 2. # 1 / 0.5 [GeV/c]^-1 + max_qp: 10. # 1 / 10. [GeV/c]^-1 max_slope_pv: 9.5 max_slope: 2.748 max_dz: 0.1 - target_pos_sigma_x: 0. - target_pos_sigma_y: 0. - min_n_hits: 4 - min_n_hits_station_0: 4 + target_pos_sigma_x: 0.3 + target_pos_sigma_y: 0.3 + min_n_hits: 3 + min_n_hits_station_0: 3 first_station_index: 0 - is_extend_tracks: false + is_extend_tracks: true is_primary: false is_electron: false - max_station_gap: 0 + max_station_gap: 2 is_track_from_triplets: false - - - name: "FastPrim" - base_iteration: "Default" - max_qp: 3.3333333 # 1 / 0.3 - max_dz: 0. - target_pos_sigma_x: 1. - target_pos_sigma_y: 1. - is_primary: true - + - name: "AllPrim" base_iteration: "Default" - min_n_hits_station_0: 3 - max_qp: 10. target_pos_sigma_x: 1. target_pos_sigma_y: 1. is_primary: true - - - name: "FastPrim2" - base_iteration: "Default" - triplet_chi2_cut: 21.1075 - triplet_final_chi2_cut: 21.1075 - pick_gather: 3.0 - max_qp: 2. # 1 / 0.5 - max_dz: 0. - target_pos_sigma_x: 5. - target_pos_sigma_y: 5. - is_primary: true - - - name: "AllSec" - base_iteration: "Default" - triplet_chi2_cut: 18.7560 - triplet_final_chi2_cut: 18.7560 - max_qp: 3.333333 # 1 / 0.3 - target_pos_sigma_x: 10. - target_pos_sigma_y: 10. - max_slope_pv: 9.5 - is_primary: false - - name: "FastPrimJump" - base_iteration: "Default" - triplet_chi2_cut: 21.1075 - triplet_final_chi2_cut: 21.1075 - pick_gather: 3.0 - max_qp: 3.3333333 # 1 / 0.3 - max_dz: 0. - target_pos_sigma_x: 5. - target_pos_sigma_y: 5. - is_primary: true - max_station_gap: 2 - - - name: "AllPrimJump" - base_iteration: "Default" - triplet_chi2_cut: 18.7560 - triplet_final_chi2_cut: 18.7560 - max_qp: 3.3333333 # 1 / 0.3 - target_pos_sigma_x: 5. - target_pos_sigma_y: 5. - is_primary: true - max_station_gap: 2 - - - name: "AllSecJump" - base_iteration: "Default" - triplet_chi2_cut: 21.1075 - triplet_final_chi2_cut: 21.1075 - max_qp: 3.3333333 # 1 / 0.3 - max_slope_pv: 1.5 - target_pos_sigma_x: 10. - target_pos_sigma_y: 10. - is_primary: false - - - name: "AllPrimElectron" - base_iteration: "Default" - min_n_hits_station_0: 3 - max_qp: 10. # 1 / 0.05 - target_pos_sigma_x: 1. - target_pos_sigma_y: 1. - is_primary: true - is_electron: true - - - name: "AllSecElectron" + - name: "AllSec" base_iteration: "Default" - triplet_chi2_cut: 18.7560 - triplet_final_chi2_cut: 18.7560 - max_qp: 10. # 1 / 0.05 - max_slope_pv: 1.5 + is_extend_tracks: false target_pos_sigma_x: 10. target_pos_sigma_y: 10. is_primary: false - is_electron: true ... diff --git a/macro/L1/configs/config_ideal_hits_mcbm.yaml b/macro/L1/configs/config_ideal_hits_mcbm.yaml index 2d43b1dbb9..ce912740b8 100644 --- a/macro/L1/configs/config_ideal_hits_mcbm.yaml +++ b/macro/L1/configs/config_ideal_hits_mcbm.yaml @@ -17,17 +17,17 @@ ideal_hit_producer: # 4 - ideal hits are created (true values are smeared withing errors, defined in section parameters) flags: sts: - 0: 4 - 1: 4 + 0: 2 + 1: 2 trd: - 0: 4 - 1: 4 - 2: 4 + 0: 2 + 1: 2 + 2: 2 tof: - 0: 4 - 1: 4 - 2: 4 - 3: 4 + 0: 2 + 1: 2 + 2: 2 + 3: 2 # # Notes: # 1) For MVD, MuCh, TRD and TOF du corresponds to dx, and dv corresponds to dy @@ -45,3 +45,8 @@ ideal_hit_producer: 0: { du: { angle: 0, value: .50, pdf: g }, dv: { angle: 90, value: .50, pdf: g }, dt: { value: 10., pdf: g }} 1: { du: { angle: 0, value: .05, pdf: g }, dv: { angle: 90, value: 4.0, pdf: u }, dt: { value: 10., pdf: g }} 2: { du: { angle: 0, value: 4.0, pdf: u }, dv: { angle: 90, value: .05, pdf: g }, dt: { value: 10., pdf: g }} + tof: + 0: { du: { angle: 0, value: 0.45, pdf: g }, dv: { angle: 90, value: 0.25, pdf: g }, dt: { value: 0.075, pdf: g }} + 1: { du: { angle: 0, value: 0.45, pdf: g }, dv: { angle: 90, value: 0.25, pdf: g }, dt: { value: 0.075, pdf: g }} + 2: { du: { angle: 0, value: 0.45, pdf: g }, dv: { angle: 90, value: 0.25, pdf: g }, dt: { value: 0.075, pdf: g }} + 3: { du: { angle: 0, value: 0.45, pdf: g }, dv: { angle: 90, value: 0.25, pdf: g }, dt: { value: 0.075, pdf: g }} -- GitLab