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;