6 #include "GM_SubLibrary.h"
10 #include <SESMagFieldIGRF.h>
12 #include <SESTraceMagFieldLine.h>
17 template <
typename ValueType,
long unsigned int N>
18 constexpr
int FindBin(ValueType value,
const std::array<ValueType, N> &bins) {
19 auto binIt = std::lower_bound(
begin(bins),
end(bins), value, std::less_equal<ValueType>());
20 return binIt ==
end(bins) ? -1 : std::distance(
begin(bins), binIt) - 1;
23 template <
typename ValueType>
24 int FindBin(ValueType value,
const std::map<
unsigned int, std::pair<ValueType, ValueType>> &bins) {
25 auto binIt = std::find_if(
begin(bins),
end(bins),
26 [&value](
auto it) {
return (value >= it.second.first && value < it.second.second); });
27 return binIt ==
end(bins) ? -1 : binIt->first;
31 BetaHR *beta = part->pBetaH();
33 TrTrackR *trk = part->pTrTrack();
37 constexpr
int refit = 31;
38 constexpr
int fit_algo = 1;
39 int id_max = trk->iTrTrackPar(fit_algo, 0, refit);
43 bool hasinnery =
false;
44 bool L2y =
false, L34y =
false, L56y =
false, L78y =
false;
45 TrRecHitR *trkHit =
nullptr;
46 trkHit = trk->GetHitLJ(2);
48 if (trkHit->pTrCluster(
'y')) {
51 trkHit = trk->GetHitLJ(3);
53 if (trkHit->pTrCluster(
'y')) {
56 trkHit = trk->GetHitLJ(4);
58 if (trkHit->pTrCluster(
'y')) {
61 trkHit = trk->GetHitLJ(5);
63 if (trkHit->pTrCluster(
'y')) {
66 trkHit = trk->GetHitLJ(6);
68 if (trkHit->pTrCluster(
'y')) {
71 trkHit = trk->GetHitLJ(7);
73 if (trkHit->pTrCluster(
'y')) {
76 trkHit = trk->GetHitLJ(8);
78 if (trkHit->pTrCluster(
'y')) {
81 if (L2y && L34y && L56y && L78y)
84 float chi2 = trk->GetNormChisqY(id_max);
85 if (!beta || beta->GetSumHit() < 4 || !trk || id_max < 0 || !hasinnery || chi2 < 0 || chi2 > 10)
91 void RTIInfo::Fill(AMSSetupR::RTI *rtiPtr,
unsigned int runTag) {
98 Theta = rtiPtr->theta;
117 for (
unsigned int i = 0; i < 4; i++) {
118 for (
unsigned int j = 0; j < 2; j++) {
133 AMSEventR::GetRTInL1L9(nexl, rtiPtr->utime, 90);
141 AMSPoint pn1, pn9, pd1, pd9;
142 AMSEventR::GetRTIdL1L9(0, pn1, pd1,
UTCTime, 60);
143 AMSEventR::GetRTIdL1L9(1, pn9, pd9,
UTCTime, 60);
144 MeanAlignDiffExtLayer[0] = {
static_cast<float>(pd1.x()),
static_cast<float>(pd1.y()),
static_cast<float>(pd1.z())};
145 MeanAlignDiffExtLayer[1] = {
static_cast<float>(pd9.x()),
static_cast<float>(pd9.y()),
static_cast<float>(pd9.z())};
159 AMSSetupR::DSPError dsperr;
162 for (
int inode = 0x80; inode < 0x88; inode++)
163 if (dsperr.SearchNA(inode))
166 for (
int inode = 0x88; inode < 0x8C; inode++)
167 if (dsperr.SearchNA(inode))
170 for (
int inode = 0x34; inode < 0x3E; inode++)
171 if (dsperr.SearchNA(inode))
173 for (
int inode = 0x96; inode < 0xCE; inode++)
174 if (dsperr.SearchNA(inode))
178 static SESMagFieldIGRF igrf_field_calculator{};
179 igrf_field_calculator.SetTime(SESTime{
UTCTime, 0});
182 const SESVector iss_position{(
Altitude +
Re) / 1e5,
Theta,
Phi, SESVectorType::Geographic};
183 const SESVector mag_field = igrf_field_calculator.GetB(iss_position);
186 SESTraceMagFieldLine trace_mline(iss_position, M_PI / 2, &igrf_field_calculator);
187 trace_mline.Integrate();
188 Bm = trace_mline.GetBm();
189 I = trace_mline.GetI();
190 BEq = trace_mline.GetBEq();
191 L = trace_mline.GetL();
194 void RTIInfo::FillEventVariables() {
222 std::for_each(
begin(inner),
end(inner), normalize);
224 std::for_each(
begin(inner),
end(inner), normalize);
226 std::for_each(
begin(inner),
end(inner), normalize);
234 std::for_each(
begin(inner),
end(inner), normalize);
236 std::for_each(
begin(inner),
end(inner), normalize);
258 void RTIInfo::AccumulateEventVariables(AMSEventR *evPtr) {
265 std::for_each(
begin(evPtr->TrdCluster()),
end(evPtr->TrdCluster()),
266 [
this](
const TrdClusterR &cl) { nTRDLayerHits[cl.Layer]++; });
273 std::for_each(
begin(evPtr->TrRawCluster()),
end(evPtr->TrRawCluster()), [
this](TrRawClusterR &cl) {
274 if (cl.GetSide() == 0) {
276 if (cl.GetLayerJ() == 1)
280 if (cl.GetLayerJ() == 1)
286 nTofClusterH += evPtr->nTofClusterH();
289 std::for_each(
begin(evPtr->Particle()),
end(evPtr->Particle()), [
this](ParticleR &part) {
292 if (GoodParticle(&part)) {
295 constexpr int refit = 31;
296 constexpr int fit_algo = 1;
297 int id_inner = part.pTrTrack()->iTrTrackPar(fit_algo, 3, refit);
300 float rig = part.pTrTrack()->GetRigidity(id_inner);
301 float q = part.pTrTrack()->GetQ(part.pBetaH()->GetBeta());
302 int rbin = FindBin(rig, rigbins);
303 int qbin = rig < 0 ? 0 : FindBin(q, qbins);
304 if (qbin >= 0 && rbin >= 0)
305 nPartInnRate[qbin][rbin]++;
307 int id_max = part.pTrTrack()->iTrTrackPar(fit_algo, 0, refit);
310 float rig = part.pTrTrack()->GetRigidity(id_inner);
311 float q = part.pTrTrack()->GetQ(part.pBetaH()->GetBeta());
312 int rbin = FindBin(rig, rigbins);
313 int qbin = rig < 0 ? 0 : FindBin(q, qbins);
314 if (qbin >= 0 && rbin >= 0)
315 nPartRate[qbin][rbin]++;
317 int bbin = FindBin(part.pBetaH()->GetBeta(), betabins);
318 nPartBetaRate[qbin][bbin]++;
320 float maxrigcutoff = max(fabs(MaxIGRFCutoff[3][0]), fabs(MaxIGRFCutoff[3][1]));
321 float minrigcutoff = min(fabs(MinIGRFCutoff[1][0]), fabs(MinIGRFCutoff[1][1]));
322 if (qbin >= 0 && fabs(rig) < minrigcutoff)
323 nPartBelowCutoff[qbin]++;
324 if (qbin >= 0 && fabs(rig) > maxrigcutoff)
325 nPartAboveCutoff[qbin]++;
330 std::for_each(
begin(evPtr->TrTrack()),
end(evPtr->TrTrack()), [
this](TrTrackR &trtrack) {
331 constexpr int refit = 31;
332 constexpr int fit_algo = 1;
334 int id_inner = trtrack.iTrTrackPar(fit_algo, 3, refit);
337 float rig = trtrack.GetRigidity(id_inner);
338 float q = trtrack.GetQ(1.0);
339 int rbin = FindBin(rig, rigbins);
340 int qbin = rig < 0 ? 0 : FindBin(q, qbins);
341 if (qbin >= 0 && rbin >= 0)
342 nTrkInnRate[qbin][rbin]++;
344 int id_max = trtrack.iTrTrackPar(fit_algo, 0, refit);
347 float rig = trtrack.GetRigidity(id_max);
348 float q = trtrack.GetQ(1.0);
349 int rbin =
FindBin(rig, rigbins);
350 int qbin = rig < 0 ? 0 :
FindBin(q, qbins);
351 if (qbin >= 0 && rbin >= 0)
352 nTrkRate[qbin][rbin]++;
356 auto *trig = evPtr->pLevel1(0);
358 trig->RestorePhysBPat();
359 auto bpatt = std::bitset<8>(trig->PhysBPatt);
360 for (
size_t ipatt = 0; ipatt < 8; ipatt++)
362 TrigPhysBPatt[ipatt]++;
364 auto jpatt = std::bitset<16>(trig->JMembPatt);
365 for (
size_t ipatt = 0; ipatt < 16; ipatt++)
367 TrigJMembPatt[ipatt]++;
369 for (
size_t i = 0; i < 19; i++)
370 TrigRates[i] += (
float)trig->TrigRates[i];
372 auto antipatt = std::bitset<8>(trig->AntiPatt);
373 for (
size_t iacc = 0; iacc < 8; iacc++)
377 if (trig->TofFlag1 < 0)
379 else if (trig->TofFlag1 < 15)
380 TofFlags[trig->TofFlag1]++;
382 std::for_each(
begin(evPtr->TofRawSide()),
end(evPtr->TofRawSide()), [
this](TofRawSideR &tofraw) {
383 TofRaw_nstdc += tofraw.nstdc;
384 TofRaw_nftdc += tofraw.nftdc;
385 TofRaw_nsumh += tofraw.nsumh;
386 TofRaw_nsumsh += tofraw.nsumsh;
389 std::for_each(
begin(evPtr->AntiRawSide()),
end(evPtr->AntiRawSide()), [
this](AntiRawSideR &antiraw) {
390 AntiRaw_ntdct += antiraw.ntdct;
391 AntiRaw_nftdc += antiraw.nftdc;
395 auto *daq = evPtr->pDaqEvent(0);
397 bool jinj_room_error =
false;
398 for (
int ijinj = 0; ijinj < 4; ijinj++) {
399 if ((daq->JINJStatus[ijinj] >> 8) & 0x2) {
400 for (
int ijinf = 0; ijinf < 24; ijinf++) {
401 if ((((daq->JError[ijinf]) >> 3) == 0x1A) || (((daq->JError[ijinf]) >> 3) == 0x12))
402 jinj_room_error =
true;