NAIA  1.1.1
RichFill.cpp
Go to the documentation of this file.
1 #include "Containers/Rich.h"
2 
3 #include "RichCharge.h"
4 #include "richidOff.h"
5 #include "richradidOff.h"
6 #include "richrecOff.h"
7 
8 namespace NAIA {
9 
10 bool RichBaseData::Fill(RichRingR *ringPtr, RichRingBR *ringBPtr) {
11 
12  if (!ringPtr && !ringBPtr)
13  return false;
14 
15  RichBaseDataR data;
16 
17  if (ringPtr) {
18  data.isNaF = ringPtr->IsNaF();
19 
20  data.beta[Rich::BetaType::CIEMAT] = ringPtr->getBeta();
21  data.beta[Rich::BetaType::SIMPLE] = ringPtr->Beta;
22  data.beta[Rich::BetaType::REFIT] = ringPtr->BetaRefit;
23  data.beta[Rich::BetaType::LIP] = 0;
24 
25  data.ebeta[Rich::BetaType::CIEMAT] = ringPtr->getBetaError();
26  data.ebeta[Rich::BetaType::SIMPLE] = ringPtr->ErrorBeta;
27  data.ebeta[Rich::BetaType::REFIT] = ringPtr->getBetaError();
28  data.ebeta[Rich::BetaType::LIP] = 0;
29 
30  data.isGood = ringPtr->IsGood();
31  data.Pos[0] = ringPtr->getTrackEmissionPoint()[0];
32  data.Pos[1] = ringPtr->getTrackEmissionPoint()[1];
33  data.Theta = ringPtr->getTrackEmissionPoint()[3];
34  data.Theta = ringPtr->getTrackEmissionPoint()[3];
35  data.Phi = ringPtr->getTrackEmissionPoint()[4];
36  data.hasBetaLIP = false;
37  }
38  if (ringBPtr) {
39  data.beta[Rich::BetaType::LIP] = ringBPtr->Beta;
40  data.ebeta[Rich::BetaType::LIP] = 0;
41  data.hasBetaLIP = true;
42  }
43 
44  m_beta.push_back(data);
45 
46  return true;
47 }
48 
49 bool RichPlusData::Fill(AMSEventR *evPtr, RichRingR *ringPtr, RichRingBR *ringPtrB, TrTrackR *trackPtr) {
50  RichAdditionalData data;
51 
52  data.NHitsTot = evPtr->NRichHit();
53  data.NPETotUncorr = RichHitR::getCollectedPhotoElectrons();
54  if (ringPtr) {
55  data.NHitsUsed = ringPtr->getUsedHits();
56  data.NPEExpUncorr = ringPtr->getExpectedPhotoElectrons(false);
57  data.NPEExpCorr = ringPtr->getExpectedPhotoElectrons();
58  data.NPEMeasUncorr = ringPtr->getPhotoElectrons(false);
59  data.NPEMeasCorr = ringPtr->getPhotoElectrons();
60  data.Probability = ringPtr->getProb();
61  data.RingPMTs = ringPtr->NpColPMT.size();
62  data.RingPMTs2 = ringPtr->getPMTs();
63  data.RichPMTs = RichHitR::getPMTs() - RichHitR::getPMTs(false);
64  data.ChargeConsistency = ringPtr->getPMTChargeConsistency();
65  data.RichCharge = ringPtr->getCharge2Estimate();
66  data.RichCharge2 = ringPtr->NpExp > 0 ? sqrt(ringPtr->NpCol / ringPtr->NpExp) : -1; // expected collected
67 
68  FillHyp1Data(data, evPtr, ringPtr, trackPtr);
69  }
70  if (ringPtrB)
71  data.LIP_ringProb = ringPtrB->ProbKolm;
72 
73  m_data.push_back(data);
74  return true;
75 }
76 
77 void RichPlusData::FillHyp1Data(RichAdditionalData &data, AMSEventR *evPtr, RichRingR *ringPtr, TrTrackR *trackPtr) {
78  // get the PMT calibration, if available
79  RichPMTCalib *pmt_calib = (!m_isMC) ? RichPMTCalib::getHead() : nullptr;
80 
81  struct pmt_info {
82  int pmt = -1;
83  int nhit = 0;
84  float np = 0;
85  std::array<float, 3> coo{0, 0, 0};
86  float dist = 0;
87  };
88 
89  std::map<unsigned int, pmt_info> pmt_info_map;
90  std::vector<int> crossed_pmt[2]; // primary/secondary
91  std::vector<RichHitR *> rich_hit_on_ring_list;
92  std::map<int, RichHitR *> rich_hit_offline_map;
93 
94  // fill pmt info map
95  for (const RichHitR &hit : evPtr->RichHit()) {
96  int pmt = int(hit.Channel / 16);
97 
98  // discard bad PMTs
99  if ((pmt_calib) && (find(begin(pmt_calib->BadPMTs), end(pmt_calib->BadPMTs), pmt) != end(pmt_calib->BadPMTs)))
100  continue;
101 
102  float np = hit.Npe;
103  pmt_info_map[pmt].pmt = pmt;
104  pmt_info_map[pmt].nhit++;
105  pmt_info_map[pmt].np += np;
106  for (int icoo = 0; icoo < 3; icoo++)
107  pmt_info_map[pmt].coo[icoo] += np * hit.Coo[icoo];
108  }
109 
110  for (auto &it : pmt_info_map) {
111  for (int icoo = 0; icoo < 3; icoo++)
112  it.second.coo[icoo] /= it.second.np;
113  if (trackPtr) {
114  double rigidity;
115  AMSPlane plm(TVector3(0, 0, it.second.coo[2]), TVector3(1, 0, 0), TVector3(0, 1, 0));
116  trackPtr->Interpolate(plm, rigidity);
117  TVector3 pglob = plm.getP();
118  it.second.dist = sqrt(pow(it.second.coo[0] - pglob.x(), 2.) + pow(it.second.coo[1] - pglob.y(), 2.));
119  }
120  if (it.second.np < 5)
121  continue;
122  crossed_pmt[(it.second.dist < 3.5) ? 0 : 1].push_back(it.first);
123  }
124  int index = 0;
125  std::vector<std::pair<int, pmt_info>> pmt_info_vec;
126  for (const auto &it : pmt_info_map) {
127  pmt_info_vec.emplace_back(it.first, it.second);
128  }
129  std::sort(begin(pmt_info_vec), end(pmt_info_vec),
130  [](const std::pair<int, pmt_info> &elem1, const std::pair<int, pmt_info> &elem2) {
131  return elem1.second.np > elem2.second.np;
132  });
133  std::array<float, 5> pmt_np_uncorr;
134  std::array<float, 5> pmt_dist;
135  for (const auto &it : pmt_info_vec) {
136  if (index > 4)
137  continue;
138  pmt_np_uncorr[index] = it.second.np;
139  pmt_dist[index] = it.second.dist;
140  index++;
141  }
142 
143  // selected ring
144  for (int ihit = 0; ihit < ringPtr->getUsedHits(false); ihit++)
145  rich_hit_on_ring_list.push_back(evPtr->pRichHit(ringPtr->iRichHit(ihit)));
146  // beta hypothesys
147  int which = 0;
148  for (RichOffline::RichRawEvent *hit = new RichOffline::RichRawEvent(evPtr); hit; hit = hit->next(), which++) {
149  rich_hit_offline_map.insert(std::make_pair(which, hit->getpointer()));
150  }
151  // loop on beta hypothesys
152  for (int i = 0; i < ringPtr->RawBetas(); i++) {
153  int ihit = ringPtr->HitBeta(i);
154  RichHitR *rich_hit = rich_hit_offline_map[ihit];
155  if (!rich_hit)
156  continue;
157 
158  int pmt = int(rich_hit->Channel / 16);
159  bool is_bad_pmt =
160  (pmt_calib) && (find(begin(pmt_calib->BadPMTs), end(pmt_calib->BadPMTs), pmt) != end(pmt_calib->BadPMTs));
161 
162  // we don't have the offline occupancy map used in the dbar analysis. Disable this for now
163  bool is_bad_occupancy = false;
164  // bool is_bad_occupancy = (pRichOcc) ? (!pRichOcc->IsGood(rich_hit->Channel)) : true;
165 
166  bool is_crossed_pri = find(begin(crossed_pmt[0]), end(crossed_pmt[0]), pmt) != end(crossed_pmt[0]);
167  bool is_crossed_sec = find(begin(crossed_pmt[1]), end(crossed_pmt[1]), pmt) != end(crossed_pmt[1]);
168  bool is_not_in_selected_ring =
169  (find(begin(rich_hit_on_ring_list), end(rich_hit_on_ring_list), rich_hit) == end(rich_hit_on_ring_list));
170  int status2 = ((is_bad_pmt) ? 0x1 : 0) + ((is_bad_occupancy) ? 0x2 : 0) + ((is_crossed_pri) ? 0x4 : 0) +
171  ((is_crossed_sec) ? 0x8 : 0) + ((is_not_in_selected_ring) ? 0x10 : 0);
172 
173  // integrate beta = 1 hypothesys with only good hits
174  if ((rich_hit->Status >> 31) & 0x1)
175  continue;
176  if ((status2 & 0xf) != 0)
177  continue;
178 
179  int kind_of_tile = ringPtr->IsNaF();
180  std::array<float, 2> simple_resolution{1.2e-3, 4e-3};
181  for (int ibeta = 0; ibeta < 2; ibeta++) {
182  if (std::fabs(ringPtr->RawBeta(i, ibeta) - 1) > 3. * simple_resolution[kind_of_tile])
183  continue;
184 
185  data.NHitsHyp1Tot[ibeta]++;
186  if ((ringPtr->UsedBeta(i) < 0) || (ringPtr->UsedBeta(i) > 1)) {
187  data.NHitsHyp1OutOfRing[ibeta]++;
188  data.NPEHyp1UncorrTot += rich_hit->Npe;
189  }
190  }
191  }
192 
193  // Apparently re-clustering requires a valid TrTrackR. I don't know why
194  // this wasn't the case in the DBar ntuple
195  if (trackPtr) {
196  unsigned int nclus = ringPtr->ClusterizeZ1();
197  int dummy1;
198  float dummy2, mean;
199  if (nclus > 0) {
200  for (int iclu = 0; iclu < std::min(10u, nclus); iclu++) {
201  ringPtr->GetClusters(iclu, dummy1, mean, dummy2);
202  if (std::fabs(mean - ringPtr->getBeta()) > 0.01)
203  data.NBadClusters++;
204  }
205  }
206  }
207 
208  for (int is = 0; is < 5; is++) {
209  if ((pmt_np_uncorr[is] > 5) && (pmt_dist[is] > 3.5))
210  data.NSecondaryHits++;
211  }
212 }
213 
214 } // namespace NAIA
NAIA::end
NAIAChain::EventItr end(NAIAChain &chain)
Definition: NAIAChain.h:298
Rich.h
Rich container class description.
NAIA
Definition: Event.h:13
NAIA::Rich::SIMPLE
@ SIMPLE
Definition: Utils.h:420
NAIA::Rich::CIEMAT
@ CIEMAT
Definition: Utils.h:419
NAIA::RichPlusData::m_data
std::vector< RichAdditionalData > m_data
Definition: Rich.h:249
NAIA::Rich::REFIT
@ REFIT
Definition: Utils.h:421
NAIA::Rich::LIP
@ LIP
Definition: Utils.h:422
NAIA::RichPlusData::m_isMC
bool m_isMC
Definition: Rich.h:248
NAIA::begin
NAIAChain::EventItr begin(NAIAChain &chain)
Definition: NAIAChain.h:297
NAIA::RichBaseData::m_beta
std::vector< RichBaseDataR > m_beta
Definition: Rich.h:150