3 #include "RichCharge.h"
5 #include "richradidOff.h"
6 #include "richrecOff.h"
10 bool RichBaseData::Fill(RichRingR *ringPtr, RichRingBR *ringBPtr) {
12 if (!ringPtr && !ringBPtr)
18 data.isNaF = ringPtr->IsNaF();
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;
41 data.hasBetaLIP =
true;
49 bool RichPlusData::Fill(AMSEventR *evPtr, RichRingR *ringPtr, RichRingBR *ringPtrB, TrTrackR *trackPtr) {
50 RichAdditionalData data;
52 data.NHitsTot = evPtr->NRichHit();
53 data.NPETotUncorr = RichHitR::getCollectedPhotoElectrons();
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;
68 FillHyp1Data(data, evPtr, ringPtr, trackPtr);
71 data.LIP_ringProb = ringPtrB->ProbKolm;
77 void RichPlusData::FillHyp1Data(RichAdditionalData &data, AMSEventR *evPtr, RichRingR *ringPtr, TrTrackR *trackPtr) {
79 RichPMTCalib *pmt_calib = (!
m_isMC) ? RichPMTCalib::getHead() :
nullptr;
85 std::array<float, 3> coo{0, 0, 0};
89 std::map<unsigned int, pmt_info> pmt_info_map;
90 std::vector<int> crossed_pmt[2];
91 std::vector<RichHitR *> rich_hit_on_ring_list;
92 std::map<int, RichHitR *> rich_hit_offline_map;
95 for (
const RichHitR &hit : evPtr->RichHit()) {
96 int pmt = int(hit.Channel / 16);
99 if ((pmt_calib) && (find(
begin(pmt_calib->BadPMTs),
end(pmt_calib->BadPMTs), pmt) !=
end(pmt_calib->BadPMTs)))
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];
110 for (
auto &it : pmt_info_map) {
111 for (
int icoo = 0; icoo < 3; icoo++)
112 it.second.coo[icoo] /= it.second.np;
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.));
120 if (it.second.np < 5)
122 crossed_pmt[(it.second.dist < 3.5) ? 0 : 1].push_back(it.first);
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);
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;
133 std::array<float, 5> pmt_np_uncorr;
134 std::array<float, 5> pmt_dist;
135 for (
const auto &it : pmt_info_vec) {
138 pmt_np_uncorr[index] = it.second.np;
139 pmt_dist[index] = it.second.dist;
144 for (
int ihit = 0; ihit < ringPtr->getUsedHits(
false); ihit++)
145 rich_hit_on_ring_list.push_back(evPtr->pRichHit(ringPtr->iRichHit(ihit)));
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()));
152 for (
int i = 0; i < ringPtr->RawBetas(); i++) {
153 int ihit = ringPtr->HitBeta(i);
154 RichHitR *rich_hit = rich_hit_offline_map[ihit];
158 int pmt = int(rich_hit->Channel / 16);
160 (pmt_calib) && (find(
begin(pmt_calib->BadPMTs),
end(pmt_calib->BadPMTs), pmt) !=
end(pmt_calib->BadPMTs));
163 bool is_bad_occupancy =
false;
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);
174 if ((rich_hit->Status >> 31) & 0x1)
176 if ((status2 & 0xf) != 0)
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])
185 data.NHitsHyp1Tot[ibeta]++;
186 if ((ringPtr->UsedBeta(i) < 0) || (ringPtr->UsedBeta(i) > 1)) {
187 data.NHitsHyp1OutOfRing[ibeta]++;
188 data.NPEHyp1UncorrTot += rich_hit->Npe;
196 unsigned int nclus = ringPtr->ClusterizeZ1();
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)
208 for (
int is = 0; is < 5; is++) {
209 if ((pmt_np_uncorr[is] > 5) && (pmt_dist[is] > 3.5))
210 data.NSecondaryHits++;