Skip to content

Commit 77d637e

Browse files
authored
Merge 319d2cf into sapling-pr-archive-ktf
2 parents bf46d59 + 319d2cf commit 77d637e

40 files changed

+2416
-914
lines changed

Common/DCAFitter/README.md

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
\page refDetectorsVertexing DCAFitter
33
/doxy -->
44

5-
## DCAFitterN
5+
# DCAFitterN
66

77
Templated class to fit the Point of Closest Approach (PCA) of secondary vertex with N prongs. Allows minimization of either absolute or weighted Distances of Closest Approach (DCA) of N tracks to their common PCA.
88

@@ -74,7 +74,22 @@ Extra method `setWeightedFinalPCA(bool)` is provided for the "mixed" mode: if `s
7474
but the final V0 position will be calculated using weighted average. One can also recalculate the V0 position by the weighted average method by calling explicitly
7575
`ft.recalculatePCAWithErrors(int icand=0)`, w/o prior call of `setWeightedFinalPCA(true)`: this will update the position returned by the `getPCACandidate(int cand = 0)`.
7676

77-
The covariance matrix of the V0 position is calculated as an inversed sum of tracks inversed covariances at respective `X_dca` points.
77+
The covariance matrix of the V0 position is calculated as an inverted sum of tracks inversed covariances at respective `X_dca` points.
7878

7979
See ``O2/Common/DCAFitter/test/testDCAFitterN.cxx`` for more extended example.
8080
Currently only 2 and 3 prongs permitted, thought this can be changed by modifying ``DCAFitterN::NMax`` constant.
81+
82+
## Error handling
83+
84+
It may happen that the track propagation to the the proximity of the PCA fails at the various stage of the fit. In this case the fit is abandoned and the failure flag is set, it can be checked using
85+
isPropagationFailure(int cand = 0)` method.
86+
87+
Also, due to the linearization errors the covariance matrix of the track propagated to some point may become non-positive defined.
88+
In this case the relevant correlation coefficient of the cov.matrix is redefined to cure the position part of the cov.matrix and further program flow depends on the user settings for `DCAFitterN::setBadCovPolicy(v)`:
89+
90+
`DCAFitterN::setBadCovPolicy(DCAFitterN::Discard);` : abandon fit (default)
91+
92+
`DCAFitterN::setBadCovPolicy(DCAFitterN::Override);` : continue fit with overridden cov.matrix
93+
94+
`DCAFitterN::setBadCovPolicy(DCAFitterN::OverrideAnFlag);` continue fit with overridden cov.matrix but set the propagation failure flag (can be checked using the same `isPropagationFailure(int cand = 0)` method).
95+

Common/DCAFitter/include/DCAFitter/DCAFitterN.h

Lines changed: 105 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -26,34 +26,32 @@ namespace o2
2626
{
2727
namespace vertexing
2828
{
29+
2930
///__________________________________________________________________________________
3031
///< Inverse cov matrix (augmented by a dummy X error) of the point defined by the track
3132
struct TrackCovI {
3233
float sxx, syy, syz, szz;
3334

34-
GPUd() TrackCovI(const o2::track::TrackParCov& trc, float xerrFactor = 1.) { set(trc, xerrFactor); }
35-
3635
GPUdDefault() TrackCovI() = default;
3736

38-
GPUd() void set(const o2::track::TrackParCov& trc, float xerrFactor = 1)
37+
GPUd() bool set(const o2::track::TrackParCov& trc, float xerrFactor = 1.f)
3938
{
4039
// we assign Y error to X for DCA calculation
4140
// (otherwise for quazi-collinear tracks the X will not be constrained)
4241
float cyy = trc.getSigmaY2(), czz = trc.getSigmaZ2(), cyz = trc.getSigmaZY(), cxx = cyy * xerrFactor;
4342
float detYZ = cyy * czz - cyz * cyz;
44-
if (detYZ > 0.) {
45-
auto detYZI = 1. / detYZ;
46-
sxx = 1. / cxx;
47-
syy = czz * detYZI;
48-
syz = -cyz * detYZI;
49-
szz = cyy * detYZI;
50-
} else {
51-
#ifndef GPUCA_GPUCODE
52-
throw std::runtime_error("invalid track covariance");
53-
#else
54-
printf("invalid track covariance\n");
55-
#endif
43+
bool res = true;
44+
if (detYZ <= 0.) {
45+
cyz = o2::gpu::GPUCommonMath::Sqrt(cyy * czz) * (cyz > 0 ? 0.98f : -0.98f);
46+
detYZ = cyy * czz - cyz * cyz;
47+
res = false;
5648
}
49+
auto detYZI = 1. / detYZ;
50+
sxx = 1. / cxx;
51+
syy = czz * detYZI;
52+
syz = -cyz * detYZI;
53+
szz = cyy * detYZI;
54+
return res;
5755
}
5856
};
5957

@@ -73,6 +71,27 @@ struct TrackDeriv {
7371
}
7472
};
7573

74+
///__________________________________________________________________________
75+
///< Log log-throttling helper
76+
struct LogLogThrottler {
77+
size_t evCount{0};
78+
size_t evCountPrev{0};
79+
size_t logCount{0};
80+
81+
GPUdi() bool needToLog()
82+
{
83+
if (size_t(o2::gpu::GPUCommonMath::Log(++evCount)) + 1 > logCount) {
84+
logCount++;
85+
return true;
86+
}
87+
return false;
88+
}
89+
90+
GPUdi() size_t getNMuted() const { return evCount - evCountPrev - 1; }
91+
92+
GPUdi() void clear() { evCount = evCountPrev = logCount = 0; }
93+
};
94+
7695
template <int N, typename... Args>
7796
class DCAFitterN
7897
{
@@ -99,6 +118,12 @@ class DCAFitterN
99118
using ArrTrPos = o2::gpu::gpustd::array<Vec3D, N>; // container of Track positions
100119

101120
public:
121+
enum BadCovPolicy { // if encountering non-positive defined cov. matrix, the choice is:
122+
Discard = 0, // stop evaluation
123+
Override = 1, // override correlation coef. to have cov.matrix pos.def and continue
124+
OverrideAndFlag = 2 // override correlation coef. to have cov.matrix pos.def, set mPropFailed flag of corresponding candidate to true and continue (up to the user to check the flag)
125+
};
126+
102127
static constexpr int getNProngs() { return N; }
103128

104129
DCAFitterN() = default;
@@ -299,6 +324,9 @@ class DCAFitterN
299324
pnt[2] = tr.getZ();
300325
}
301326

327+
void setBadCovPolicy(BadCovPolicy v) { mBadCovPolicy = v; }
328+
BadCovPolicy getBadCovPolicy() const { return mBadCovPolicy; }
329+
302330
private:
303331
// vectors of 1st derivatives of track local residuals over X parameters
304332
o2::gpu::gpustd::array<o2::gpu::gpustd::array<Vec3D, N>, N> mDResidDx;
@@ -324,11 +352,15 @@ class DCAFitterN
324352
o2::gpu::gpustd::array<int, MAXHYP> mNIters; // number of iterations for each seed
325353
o2::gpu::gpustd::array<bool, MAXHYP> mTrPropDone{}; // Flag that the tracks are fully propagated to PCA
326354
o2::gpu::gpustd::array<bool, MAXHYP> mPropFailed{}; // Flag that some propagation failed for this PCA candidate
355+
LogLogThrottler mLoggerBadCov{};
356+
LogLogThrottler mLoggerBadInv{};
357+
LogLogThrottler mLoggerBadProp{};
327358
MatSym3D mWeightInv; // inverse weight of single track, [sum{M^T E M}]^-1 in EQ.T
328359
o2::gpu::gpustd::array<int, MAXHYP> mOrder{0};
329360
int mCurHyp = 0;
330361
int mCrossIDCur = 0;
331362
int mCrossIDAlt = -1;
363+
BadCovPolicy mBadCovPolicy{BadCovPolicy::Discard}; // what to do in case of non-pos-def. cov. matrix, see BadCovPolicy enum
332364
bool mAllowAltPreference = true; // if the fit converges to alternative PCA seed, abandon the current one
333365
bool mUseAbsDCA = false; // use abs. distance minimization rather than chi2
334366
bool mWeightedFinalPCA = false; // recalculate PCA as a cov-matrix weighted mean, even if absDCA method was used
@@ -677,7 +709,23 @@ GPUd() bool DCAFitterN<N, Args...>::recalculatePCAWithErrors(int cand)
677709
mCurHyp = mOrder[cand];
678710
if (mUseAbsDCA) {
679711
for (int i = N; i--;) {
680-
mTrcEInv[mCurHyp][i].set(mCandTr[mCurHyp][i], XerrFactor); // prepare inverse cov.matrices at starting point
712+
if (!mTrcEInv[mCurHyp][i].set(mCandTr[mCurHyp][i], XerrFactor)) { // prepare inverse cov.matrices at starting point
713+
if (mLoggerBadCov.needToLog()) {
714+
#ifndef GPUCA_GPUCODE
715+
printf("fitter %d: error (%ld muted): overrode invalid track covariance from %s\n",
716+
mFitterID, mLoggerBadCov.getNMuted(), mCandTr[mCurHyp][i].asString().c_str());
717+
#else
718+
printf("fitter %d: error (%ld muted): overrode invalid track covariance cyy:%e czz:%e cyz:%e\n",
719+
mFitterID, mLoggerBadCov.getNMuted(), mCandTr[mCurHyp][i].getSigmaY2(), mCandTr[mCurHyp][i].getSigmaZ2(), mCandTr[mCurHyp][i].getSigmaZY());
720+
#endif
721+
mLoggerBadCov.evCountPrev = mLoggerBadCov.evCount;
722+
}
723+
if (mBadCovPolicy == Discard) {
724+
return false;
725+
} else if (mBadCovPolicy == OverrideAndFlag) {
726+
mPropFailed[mCurHyp] = true;
727+
} // otherwise, just use overridden errors w/o flagging
728+
}
681729
}
682730
if (!calcPCACoefs()) {
683731
mCurHyp = saveCurHyp;
@@ -884,7 +932,23 @@ GPUd() bool DCAFitterN<N, Args...>::minimizeChi2()
884932
return false;
885933
}
886934
setTrackPos(mTrPos[mCurHyp][i], mCandTr[mCurHyp][i]); // prepare positions
887-
mTrcEInv[mCurHyp][i].set(mCandTr[mCurHyp][i], XerrFactor); // prepare inverse cov.matrices at starting point
935+
if (!mTrcEInv[mCurHyp][i].set(mCandTr[mCurHyp][i], XerrFactor)) { // prepare inverse cov.matrices at starting point
936+
if (mLoggerBadCov.needToLog()) {
937+
#ifndef GPUCA_GPUCODE
938+
printf("fitter %d: error (%ld muted): overrode invalid track covariance from %s\n",
939+
mFitterID, mLoggerBadCov.getNMuted(), mCandTr[mCurHyp][i].asString().c_str());
940+
#else
941+
printf("fitter %d: error (%ld muted): overrode invalid track covariance cyy:%e czz:%e cyz:%e\n",
942+
mFitterID, mLoggerBadCov.getNMuted(), mCandTr[mCurHyp][i].getSigmaY2(), mCandTr[mCurHyp][i].getSigmaZ2(), mCandTr[mCurHyp][i].getSigmaZY());
943+
#endif
944+
mLoggerBadCov.evCountPrev = mLoggerBadCov.evCount;
945+
}
946+
if (mBadCovPolicy == Discard) {
947+
return false;
948+
} else if (mBadCovPolicy == OverrideAndFlag) {
949+
mPropFailed[mCurHyp] = true;
950+
} // otherwise, just use overridden errors w/o flagging
951+
}
888952
}
889953

890954
if (mMaxDZIni > 0 && !roughDZCut()) { // apply rough cut on tracks Z difference
@@ -904,11 +968,10 @@ GPUd() bool DCAFitterN<N, Args...>::minimizeChi2()
904968

905969
// do Newton-Rapson iteration with corrections = - dchi2/d{x0..xN} * [ d^2chi2/d{x0..xN}^2 ]^-1
906970
if (!mD2Chi2Dx2.Invert()) {
907-
#ifndef GPUCA_GPUCODE_DEVICE
908-
LOG(error) << "InversionFailed";
909-
#else
910-
printf("InversionFailed\n");
911-
#endif
971+
if (mLoggerBadInv.needToLog()) {
972+
printf("fitter %d: error (%ld muted): Inversion failed\n", mFitterID, mLoggerBadCov.getNMuted());
973+
mLoggerBadInv.evCountPrev = mLoggerBadInv.evCount;
974+
}
912975
return false;
913976
}
914977
VecND dx = mD2Chi2Dx2 * mDChi2Dx;
@@ -961,11 +1024,10 @@ GPUd() bool DCAFitterN<N, Args...>::minimizeChi2NoErr()
9611024

9621025
// do Newton-Rapson iteration with corrections = - dchi2/d{x0..xN} * [ d^2chi2/d{x0..xN}^2 ]^-1
9631026
if (!mD2Chi2Dx2.Invert()) {
964-
#ifndef GPUCA_GPUCODE_DEVICE
965-
LOG(error) << "InversionFailed";
966-
#else
967-
printf("InversionFailed\n");
968-
#endif
1027+
if (mLoggerBadInv.needToLog()) {
1028+
printf("itter %d: error (%ld muted): Inversion failed\n", mFitterID, mLoggerBadCov.getNMuted());
1029+
mLoggerBadInv.evCountPrev = mLoggerBadInv.evCount;
1030+
}
9691031
return false;
9701032
}
9711033
VecND dx = mD2Chi2Dx2 * mDChi2Dx;
@@ -1108,6 +1170,14 @@ GPUdi() bool DCAFitterN<N, Args...>::propagateParamToX(o2::track::TrackPar& t, f
11081170
}
11091171
if (!res) {
11101172
mPropFailed[mCurHyp] = true;
1173+
if (mLoggerBadProp.needToLog()) {
1174+
#ifndef GPUCA_GPUCODE
1175+
printf("fitter %d: error (%ld muted): propagation failed for %s\n", mFitterID, mLoggerBadProp.getNMuted(), t.asString().c_str());
1176+
#else
1177+
printf("fitter %d: error (%ld muted): propagation failed\n", mFitterID, mLoggerBadProp.getNMuted());
1178+
#endif
1179+
mLoggerBadProp.evCountPrev = mLoggerBadProp.evCount;
1180+
}
11111181
}
11121182
return res;
11131183
}
@@ -1126,6 +1196,14 @@ GPUdi() bool DCAFitterN<N, Args...>::propagateToX(o2::track::TrackParCov& t, flo
11261196
}
11271197
if (!res) {
11281198
mPropFailed[mCurHyp] = true;
1199+
if (mLoggerBadProp.needToLog()) {
1200+
#ifndef GPUCA_GPUCODE
1201+
printf("fitter %d: error (%ld muted): propagation failed for %s\n", mFitterID, mLoggerBadProp.getNMuted(), t.asString().c_str());
1202+
#else
1203+
printf("fitter %d: error (%ld muted): propagation failed\n", mFitterID, mLoggerBadProp.getNMuted());
1204+
#endif
1205+
mLoggerBadProp.evCountPrev = mLoggerBadProp.evCount;
1206+
}
11291207
}
11301208
return res;
11311209
}

Detectors/AOD/include/AODProducerWorkflow/AODProducerWorkflowSpec.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ class AODProducerWorkflowDPL : public Task
251251
std::unordered_set<GIndex> mGIDUsedBySVtx;
252252
std::unordered_set<GIndex> mGIDUsedByStr;
253253

254-
AODProducerStreamerMask mStreamerMask;
254+
AODProducerStreamerMask mStreamerMask{0};
255255
std::shared_ptr<o2::utils::TreeStreamRedirector> mStreamer;
256256

257257
int mNThreads = 1;
@@ -433,6 +433,8 @@ class AODProducerWorkflowDPL : public Task
433433
int8_t dRefGloSnp{std::numeric_limits<int8_t>::min()};
434434
int8_t dRefGloTgl{std::numeric_limits<int8_t>::min()};
435435
int8_t dRefGloQ2Pt{std::numeric_limits<int8_t>::min()};
436+
int8_t dTofdX{std::numeric_limits<int8_t>::min()};
437+
int8_t dTofdZ{std::numeric_limits<int8_t>::min()};
436438
};
437439

438440
// helper struct for addToFwdTracksTable()

Detectors/AOD/src/AODProducerWorkflowSpec.cxx

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ void AODProducerWorkflowDPL::addToTracksExtraTable(TracksExtraCursorType& tracks
337337
extraInfoHolder.itsClusterSizes,
338338
extraInfoHolder.tpcNClsFindable,
339339
extraInfoHolder.tpcNClsFindableMinusFound,
340-
// extraInfoHolder.tpcNClsFindableMinusPID,
340+
extraInfoHolder.tpcNClsFindableMinusPID,
341341
extraInfoHolder.tpcNClsFindableMinusCrossedRows,
342342
extraInfoHolder.tpcNClsShared,
343343
extraInfoHolder.trdPattern,
@@ -381,7 +381,9 @@ void AODProducerWorkflowDPL::addToTracksQATable(TracksQACursorType& tracksQACurs
381381
trackQAInfoHolder.dRefGloZ,
382382
trackQAInfoHolder.dRefGloSnp,
383383
trackQAInfoHolder.dRefGloTgl,
384-
trackQAInfoHolder.dRefGloQ2Pt);
384+
trackQAInfoHolder.dRefGloQ2Pt,
385+
trackQAInfoHolder.dTofdX,
386+
trackQAInfoHolder.dTofdZ);
385387
}
386388

387389
template <typename mftTracksCursorType, typename AmbigMFTTracksCursorType>
@@ -2567,6 +2569,12 @@ AODProducerWorkflowDPL::TrackQA AODProducerWorkflowDPL::processBarrelTrackQA(int
25672569
trackQAHolder.tpcdcaR = 100. * dcaInfo[0] / sqrt(1. + trackPar.getQ2Pt() * trackPar.getQ2Pt());
25682570
trackQAHolder.tpcdcaZ = 100. * dcaInfo[1] / sqrt(1. + trackPar.getQ2Pt() * trackPar.getQ2Pt());
25692571
}
2572+
// This allows to safely clamp any float to one byte, using the
2573+
// minmal/maximum values as under-/overflow borders and rounding to the nearest integer
2574+
auto safeInt8Clamp = [](auto value) -> int8_t {
2575+
using ValType = decltype(value);
2576+
return static_cast<int8_t>(TMath::Nint(std::clamp(value, static_cast<ValType>(std::numeric_limits<int8_t>::min()), static_cast<ValType>(std::numeric_limits<int8_t>::max()))));
2577+
};
25702578
/// get tracklet byteMask
25712579
uint8_t clusterCounters[8] = {0};
25722580
{
@@ -2597,6 +2605,16 @@ AODProducerWorkflowDPL::TrackQA AODProducerWorkflowDPL::processBarrelTrackQA(int
25972605
trackQAHolder.tpcdEdxTot1R = uint8_t(tpcOrig.getdEdx().dEdxTotOROC1 * dEdxNorm);
25982606
trackQAHolder.tpcdEdxTot2R = uint8_t(tpcOrig.getdEdx().dEdxTotOROC2 * dEdxNorm);
25992607
trackQAHolder.tpcdEdxTot3R = uint8_t(tpcOrig.getdEdx().dEdxTotOROC3 * dEdxNorm);
2608+
///
2609+
float scaleTOF{0};
2610+
auto contributorsGIDA = data.getSingleDetectorRefs(trackIndex);
2611+
if (contributorsGIDA[GIndex::Source::TOF].isIndexSet()) { // ITS-TPC-TRD-TOF, ITS-TPC-TOF, TPC-TRD-TOF, TPC-TOF
2612+
const auto& tofMatch = data.getTOFMatch(trackIndex);
2613+
const float qpt = trackPar.getQ2Pt();
2614+
scaleTOF = std::sqrt(o2::aod::track::trackQAScaledTOF[0] * o2::aod::track::trackQAScaledTOF[0] + qpt * qpt * o2::aod::track::trackQAScaledTOF[1] * o2::aod::track::trackQAScaledTOF[1]) / (2. * o2::aod::track::trackQAScaleBins);
2615+
trackQAHolder.dTofdX = safeInt8Clamp(tofMatch.getDXatTOF() / scaleTOF);
2616+
trackQAHolder.dTofdZ = safeInt8Clamp(tofMatch.getDZatTOF() / scaleTOF);
2617+
}
26002618

26012619
// Add matching information at a reference point (defined by
26022620
// o2::aod::track::trackQARefRadius) in the same frame as the global track
@@ -2622,13 +2640,6 @@ AODProducerWorkflowDPL::TrackQA AODProducerWorkflowDPL::processBarrelTrackQA(int
26222640
return o2::aod::track::trackQAScaleBins / std::sqrt(o2::aod::track::trackQAScaleGloP0[i] * o2::aod::track::trackQAScaleGloP0[i] + (o2::aod::track::trackQAScaleGloP1[i] * x) * (o2::aod::track::trackQAScaleGloP1[i] * x));
26232641
};
26242642

2625-
// This allows to safely clamp any float to one byte, using the
2626-
// minmal/maximum values as under-/overflow borders and rounding to the nearest integer
2627-
auto safeInt8Clamp = [](auto value) -> int8_t {
2628-
using ValType = decltype(value);
2629-
return static_cast<int8_t>(TMath::Nint(std::clamp(value, static_cast<ValType>(std::numeric_limits<int8_t>::min()), static_cast<ValType>(std::numeric_limits<int8_t>::max()))));
2630-
};
2631-
26322643
// Calculate deltas for contributors
26332644
trackQAHolder.dRefContY = safeInt8Clamp((itsCopy.getY() - tpcCopy.getY()) * scaleCont(0));
26342645
trackQAHolder.dRefContZ = safeInt8Clamp((itsCopy.getZ() - tpcCopy.getZ()) * scaleCont(1));
@@ -2641,6 +2652,7 @@ AODProducerWorkflowDPL::TrackQA AODProducerWorkflowDPL::processBarrelTrackQA(int
26412652
trackQAHolder.dRefGloSnp = safeInt8Clamp(((itsCopy.getSnp() + tpcCopy.getSnp()) * 0.5f - gloCopy.getSnp()) * scaleGlo(2));
26422653
trackQAHolder.dRefGloTgl = safeInt8Clamp(((itsCopy.getTgl() + tpcCopy.getTgl()) * 0.5f - gloCopy.getTgl()) * scaleGlo(3));
26432654
trackQAHolder.dRefGloQ2Pt = safeInt8Clamp(((itsCopy.getQ2Pt() + tpcCopy.getQ2Pt()) * 0.5f - gloCopy.getQ2Pt()) * scaleGlo(4));
2655+
//
26442656

26452657
if (O2_ENUM_TEST_BIT(mStreamerMask, AODProducerStreamerMask::TrackQA)) {
26462658
(*mStreamer) << "trackQA"
@@ -2684,6 +2696,9 @@ AODProducerWorkflowDPL::TrackQA AODProducerWorkflowDPL::processBarrelTrackQA(int
26842696
<< "trackQAHolder.dRefGloSnp=" << trackQAHolder.dRefGloSnp
26852697
<< "trackQAHolder.dRefGloTgl=" << trackQAHolder.dRefGloTgl
26862698
<< "trackQAHolder.dRefGloQ2Pt=" << trackQAHolder.dRefGloQ2Pt
2699+
<< "trackQAHolder.dTofdX=" << trackQAHolder.dTofdX
2700+
<< "trackQAHolder.dTofdZ=" << trackQAHolder.dTofdZ
2701+
<< "scaleTOF=" << scaleTOF
26872702
<< "\n";
26882703
}
26892704
}

Detectors/FOCAL/simulation/data/simcuts.dat

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66
FOC 0 5.e-5 1.e-4 1.e-4 1.e-4 1.e-4 1.e-4 1.e-4 1.e-4 1.e-4 -1. -1 -1 -1 -1 1 -1 3 -1 -1 -1 -1 -1
77
* Si sensor
88
FOC 1 1.e-5 1.e-5 1.e-5 1.e-5 1.e-5 1.e-5 1.e-5 1.e-5 1.e-5 -1. -1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 -1
9+
* Si pixel
10+
FOC 2 1.e-5 1.e-5 1.e-5 1.e-5 1.e-5 1.e-5 1.e-5 1.e-5 1.e-5 -1. -1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 -1
911
* G10 plate
10-
FOC 2 1.e-4 1.e-4 1.e-4 1.e-4 1.e-4 1.e-4 1.e-4 1.e-4 1.e-4 -1. -1 -1 -1 -1 1 -1 3 -1 -1 -1 -1 -1
12+
FOC 3 1.e-4 1.e-4 1.e-4 1.e-4 1.e-4 1.e-4 1.e-4 1.e-4 1.e-4 -1. -1 -1 -1 -1 1 -1 3 -1 -1 -1 -1 -1
1113
* Alloy
12-
FOC 5 5.e-5 1.e-4 1.e-4 1.e-4 1.e-4 1.e-4 1.e-4 1.e-4 1.e-4 -1. -1 -1 -1 -1 1 -1 3 -1 -1 -1 -1 -1
14+
FOC 6 5.e-5 1.e-4 1.e-4 1.e-4 1.e-4 1.e-4 1.e-4 1.e-4 1.e-4 -1. -1 -1 -1 -1 1 -1 3 -1 -1 -1 -1 -1
1315
* Aluminium
14-
FOC 10 5.e-5 1.e-4 1.e-4 1.e-4 1.e-4 1.e-4 1.e-4 1.e-4 1.e-4 -1. -1 -1 -1 -1 1 -1 3 -1 -1 -1 -1 -1
15-
* G10 plate
16-
FOC 12 1.e-4 1.e-4 1.e-4 1.e-4 1.e-4 1.e-4 1.e-4 1.e-4 1.e-4 -1. -1 -1 -1 -1 1 -1 3 -1 -1 -1 -1 -1
16+
FOC 11 5.e-5 1.e-4 1.e-4 1.e-4 1.e-4 1.e-4 1.e-4 1.e-4 1.e-4 -1. -1 -1 -1 -1 1 -1 3 -1 -1 -1 -1 -1

Detectors/FOCAL/simulation/geometryFiles/geometry_Spaghetti.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ COMMAND_INSERT_PIX_AT_L9
5858
GLOBAL_TOWER_TOL 0. Air
5959
GLOBAL_TOWER_TOLX 0.02 Air
6060
GLOBAL_TOWER_TOLY 0.8 Al
61-
GLOBAL_FOCAL_Z 764.47
61+
GLOBAL_FOCAL_Z 763.5
6262
GLOBAL_Tower_NX 2
6363
GLOBAL_Tower_NY 11
6464
GLOBAL_MIDDLE_TOWER_OFFSET 5

0 commit comments

Comments
 (0)