36 using GroupID_t = size_t;
37 using MeasID_t = size_t;
38 using DetID_t = Int_t;
42 using Gates_t = std::vector<std::unordered_map<
43 GroupID_t, std::unordered_map<DetID_t, std::unordered_map<MeasID_t,
67 SkipEvent(
const GamR::Tree::Reader &myreader, std::map<std::pair<GroupID_t, DetID_t>, Bool_t> &skipdet)
const
71 std::set<size_t> gatespassed;
72 for (
auto &d : skipdet) {
77 const GroupID_t &itrGroup = gid_n.first;
88 for (
size_t idxGate = 0; idxGate <
fGates.size(); ++idxGate) {
90 if (!
fGates[idxGate].count(itrGroup)) {
92 }
else if (gatespassed.count(idxGate)) {
95 else if (gatespassed.size() ==
fGates.size()) {
100 Bool_t pass = kFALSE;
102 for (
size_t idxDet0 = 0; !pass && (idxDet0 < myreader[itrGroup].NumFired()); ++idxDet0) {
103 const DetID_t &itrDet = myreader[itrGroup].ID[idxDet0];
106 if (
fGates.at(idxGate).at(itrGroup).count(itrDet)) {
107 for (
const auto &m_g :
fGates.at(idxGate).at(itrGroup).at(itrDet)) {
108 const MeasID_t &itrMeas = m_g.first;
109 const auto &itrGateMap = m_g.second;
110 if (itrGateMap.PassAny(myreader[itrGroup][itrMeas][idxDet0])) {
111 skipdet[{itrGroup, itrDet}] = kTRUE;
113 gatespassed.insert(idxGate);
119 if (!pass &&
fGates.at(idxGate).at(itrGroup).count(-1)) {
120 for (
const auto &m_g :
fGates.at(idxGate).at(itrGroup).at(-1)) {
121 const MeasID_t &itrMeas = m_g.first;
122 const auto &itrGateMap = m_g.second;
123 if (itrGateMap.PassAny(myreader[itrGroup][itrMeas][idxDet0])) {
124 skipdet[{itrGroup, itrDet}] = kTRUE;
126 gatespassed.insert(idxGate);
134 if (gatespassed.size() ==
fGates.size()) {
140 inline const Double_t GetValue(
const Matrix::Axis &
Axis,
const size_t &MeasN,
145 return Group1[MeasN][Det1];
147 return Group1[MeasN][Det1] + Group2[MeasN][Det2];
149 return Group1[MeasN][Det1] - Group2[MeasN][Det2];
151 return Group1[MeasN][Det1] * Group2[MeasN][Det2];
153 return Group1[MeasN][Det1] / Group2[MeasN][Det2];
159 inline const Double_t GetX(
const GamR::Tree::Reader &myR,
const size_t &Det1,
const size_t &Det2)
const
163 inline const Double_t GetY(
const GamR::Tree::Reader &myR,
const size_t &Det1,
const size_t &Det2)
const
170 Matrix(
Sorter *parent, std::string prefix,
size_t g1,
size_t g2,
size_t m1,
size_t m2,
184 std::stringstream ssname;
191 std::cout << std::endl;
193 std::cout <<
"No gates defined.";
195 std::cout <<
"Gates" << std::endl;
196 static const std::regex gateregex(
"^\\s*([0-9]+).([0-9]+).([0-9*]+) ([0-9]+) ([0-9]+)\\s*$");
197 static std::smatch gatematches;
199 std::unordered_map<GroupID_t, std::unordered_set<MeasID_t>> trackmeasurements;
200 for (
size_t idxGate = 0; idxGate < gates.size(); ++idxGate) {
201 std::stringstream
ss(gates[idxGate]);
205 std::unordered_set<GroupID_t> groupsingate;
206 while (!
ss.eof() && std::getline(
ss, gate,
'|')) {
208 std::stringstream key;
209 Bool_t matched = std::regex_match(gate, gatematches, gateregex);
211 GroupID_t groupid = std::stoi(gatematches[1]);
212 MeasID_t measid = std::stoi(gatematches[2]);
213 DetID_t detid = !gatematches[3].compare(
"*") ? -1 : std::stoi(gatematches[3]);
214 key <<
"g" << groupid <<
"m" << measid <<
"d";
220 fGates[idxGate][groupid][detid][measid].SetName(key.str().c_str());
222 fGates[idxGate][groupid][detid][measid][key.str()].SetGate(std::stod(gatematches[4]),
223 std::stod(gatematches[5]));
224 std::cout <<
"(Group: " << groupid <<
" Meas: " << measid <<
" Det: " << gatematches[3];
225 std::cout <<
" LO: " << gatematches[4] <<
" HI: " << gatematches[5] <<
") ";
226 if (trackmeasurements[groupid].empty() || trackmeasurements[groupid].count(measid)) {
227 groupsingate.emplace(groupid);
229 trackmeasurements[groupid].emplace(measid);
232 p->WriteObject(&
fGates[idxGate][groupid][detid][measid], (
"gates/" + ssname.str()).c_str(),
"", kTRUE);
234 for (
auto &group : groupsingate) {
237 if (idxGate < gates.size() - 1) {
238 std::cout << std::endl <<
"AND" << std::endl;
240 TNamed gatestr((
"gatestr" + std::to_string(idxGate)).c_str(), gates[idxGate].c_str());
241 p->WriteObject(&gatestr, (
"gates/" + ssname.str()).c_str(),
"", kTRUE);
244 std::cout << std::endl <<
"Group " << g_n.first <<
" min required => " << g_n.second;
247 std::cout << std::endl;
254 std::map<std::pair<GroupID_t, DetID_t>, Bool_t> mSkipDetector;
256 while (R.Next() && !
p->Done()) {
262 if (
GatedSort && SkipEvent(myR, mSkipDetector)) {
266 for (
size_t idxDet1 = 0; idxDet1 < myR[
fGroupI].NumFired(); ++idxDet1) {
267 const auto &DetID1 = myR[
fGroupI].ID[idxDet1];
268 if (mSkipDetector[{
fGroupI, DetID1}]) {
271 for (
size_t idxDet2 = 0; idxDet2 < myR[
fGroupJ].NumFired(); ++idxDet2) {
272 const auto &DetID2 = myR[
fGroupJ].ID[idxDet2];
273 if (mSkipDetector[{
fGroupJ, DetID2}]) {
275 }
else if (DetID1 == DetID2) {
278 ptrMatrix->Fill(GetX(myR, idxDet1, idxDet2), GetY(myR, idxDet1, idxDet2));
Matrix(Sorter *parent, std::string prefix, size_t g1, size_t g2, size_t m1, size_t m2, std::vector< std::string > gates, Matrix::Axis x=Matrix::Axis::kCoincidence, Matrix::Axis y=Matrix::Axis::kCoincidence)