HIPO4 C++ Library 4.4.1
Columnar I/O library for CLAS12 physics data
Loading...
Searching...
No Matches
reaction.h
Go to the documentation of this file.
1//******************************************************************
2//* ██╗ ██╗██╗██████╗ ██████╗ ██╗ ██╗ ██████╗
3//* ██║ ██║██║██╔══██╗██╔═══██╗ ██║ ██║ ██╔═████╗
4//* ███████║██║██████╔╝██║ ██║ ███████║ ██║██╔██║
5//* ██╔══██║██║██╔═══╝ ██║ ██║ ╚════██║ ████╔╝██║
6//* ██║ ██║██║██║ ╚██████╔╝ ██║██╗╚██████╔╝
7//* ╚═╝ ╚═╝╚═╝╚═╝ ╚═════╝ ╚═╝╚═╝ ╚═════╝
8//************************ Jefferson National Lab (2017) ***********
9//******************************************************************
10//* A simple library to do physics analysis directly from hipo file
11//* Author: G.Gavalian
12//* Date: 11/22/2023
13//*--
14
15
16#ifndef __FIZIKA_REACTION__
17#define __FIZIKA_REACTION__
18
19#include <cstdlib>
20#include <iostream>
21#include "reader.h"
22#include "fizika.h"
23
24namespace fizika {
25
26class reaction {
27
28 private:
29 hipo::reader reader;
30 hipo::dictionary factory;
31 hipo::event event;
32
33 fizika::lorentz4 lz4_beam,lz4_target, centermass;
34
35 std::vector<hipo::bank> banks;
36 std::vector<std::pair<int,int>> filter;
37 bool filter_exclusive = true;
38
39 void initialize(const char* file, std::vector<std::string> blist){
40 reader.open(file);
41 reader.readDictionary(factory);
42 for(decltype(blist)::size_type i = 0; i < blist.size(); i++) {
43 hipo::bank b(factory.getSchema("REC::Particle"));
44 banks.push_back(b);
45 }
46 }
47
48 public:
49
51 reaction(const char* file){
52 initialize(file,{"REC::Particle"});
53 }
54 reaction(const char *file, std::initializer_list<std::tuple<int,int> > desc){
55 initialize(file,{"REC::Particle"});
57 }
58 reaction(const char *file, double benergy, std::initializer_list<std::tuple<int,int> > desc){
59 initialize(file,{"REC::Particle"});
61 lz4_beam.setXYZM(0.0,0.0,benergy, 0.0005);
62 lz4_target.setXYZM(0.0,0.0,0.0,0.938);
63 centermass = lz4_beam + lz4_target;
64 }
65
66 reaction(const char *file, double benergy, int *pids, int *count, int length){
67 initialize(file,{"REC::Particle"});
68 lz4_beam.setXYZM(0.0,0.0,benergy, 0.0005);
69 lz4_target.setXYZM(0.0,0.0,0.0,0.938);
70 centermass = lz4_beam + lz4_target;
71 printf(">>>> initializing the reaction\n");
72 for(int k = 0; k < length; k++){
73 filter.push_back(std::make_pair(pids[k],count[k]));
74 printf("push back -> %6d %6d\n",pids[k],count[k]);
75 }
76 }
77
78 virtual ~reaction(){}
79
80
81 fizika::lorentz4 &cm(){return centermass;}
82
83 void init_filter(std::initializer_list<std::tuple<int,int> > desc){
84 std::initializer_list< std::tuple<int,int>>::iterator it; // same as: const int* it
85 for ( it=desc.begin(); it!=desc.end(); ++it){
86 printf("PID %d, count %d\n", std::get<0>(*it),std::get<1>(*it));
87 filter.push_back(std::make_pair( std::get<0>(*it),std::get<1>(*it)));
88 //banks[counter].parse(std::get<0>(*it),std::get<1>(*it),std::get<2>(*it),std::get<3>(*it));
89 //counter++;
90 }
91 }
92
93 fizika::lorentz4 get(std::initializer_list<std::tuple<int,int,int, double> > desc){
94 fizika::lorentz4 vec(0.0,0.0,0.0,0.0), temp;
95 std::initializer_list< std::tuple<int,int,int ,double>>::iterator it;
96 for ( it=desc.begin(); it!=desc.end(); ++it){
97 int ind = index(std::get<1>(*it), std::get<2>(*it));
98 if(ind>=0) {
99 get_vector(temp,std::get<3>(*it),banks[0],ind, 1,2,3);
100 if(std::get<0>(*it)<0) vec -= temp; else vec += temp;
101 }
102 }
103 return vec;
104 }
105
106 fizika::lorentz4 get(int *signs, int *pids, int *skips, double *masses, int length){
107 fizika::lorentz4 vec(0.0,0.0,0.0,0.0), temp;
108 //printf("analyzing # %d counts \n", length);
109 for(int k = 0; k < length; k++){
110 int ind = index(pids[k],skips[k]);
111 if(ind>=0){
112 get_vector(temp,masses[k],banks[0],ind,1,2,3);
113 if(signs[k]<0) vec -= temp; else vec += temp;
114 }
115 }
116 //printf("final vector %f %f %f %f\n",vec.x(),vec.y(),vec.z(),vec.e());
117 return vec;
118 }
119
120 bool next(){
121 bool status = reader.next();
122 if(status==false) return status;
123 reader.read(event);
124 for(decltype(banks)::size_type r = 0; r < banks.size(); r++) event.read(banks[r]);
125 return true;
126 }
127
131
132 bool is_valid(){
133 for(decltype(filter)::size_type f = 0; f < filter.size(); f++){
134 int count = countpid(filter[f].first);
135 //printf(" pid = %d, count = %d\n",filter[f].first, count);
136 if(filter_exclusive==true){
137 if(count!=filter[f].second) return false;
138 } else { if(count<filter[f].second) return false; }
139 }
140 return true;
141 }
142
143 int countpid(int pid){
144 int counter = 0;
145 for(int r = 0; r < banks[0].getRows(); r++){
146 int upid = banks[0].getInt(0,r);
147 int stat = banks[0].getInt("status",r);
148 if(upid == pid)
149 if(abs(stat)>2000&&abs(stat)<3000) counter++;
150 }
151 return counter;
152 }
153
154 int index(int pid, int skip){
155 int skipped = 0;
156 for(int r = 0; r < banks[0].getRows(); r++){
157 int upid = banks[0].getInt(0,r);
158 int stat = banks[0].getInt("status",r);
159 if(upid == pid)
160 if(abs(stat)>2000&&abs(stat)<3000){
161 if(skip==skipped) { return r; } else { skipped++;}
162 }
163 }
164 return -1;
165 }
166
167 std::vector<hipo::bank> &getBanks(){return banks;}
168 fizika::lorentz4 &beam(){ return lz4_beam; }
169 fizika::lorentz4 &target(){ return lz4_target; }
170};
171}
172#endif
Definition fizika.h:159
void setXYZM(double _x, double _y, double _z, double _m)
Definition fizika.h:195
Definition reaction.h:26
reaction(const char *file, double benergy, std::initializer_list< std::tuple< int, int > > desc)
Definition reaction.h:58
void get_vector(fizika::lorentz4 &vec, double mass, hipo::bank &b, int order, int ind_px, int ind_py, int ind_pz)
Definition reaction.h:128
reaction(const char *file)
Definition reaction.h:51
bool next()
Definition reaction.h:120
fizika::lorentz4 get(int *signs, int *pids, int *skips, double *masses, int length)
Definition reaction.h:106
int index(int pid, int skip)
Definition reaction.h:154
void init_filter(std::initializer_list< std::tuple< int, int > > desc)
Definition reaction.h:83
bool is_valid()
Definition reaction.h:132
int countpid(int pid)
Definition reaction.h:143
reaction(const char *file, std::initializer_list< std::tuple< int, int > > desc)
Definition reaction.h:54
std::vector< hipo::bank > & getBanks()
Definition reaction.h:167
reaction(const char *file, double benergy, int *pids, int *count, int length)
Definition reaction.h:66
fizika::lorentz4 & target()
Definition reaction.h:169
fizika::lorentz4 & beam()
Definition reaction.h:168
virtual ~reaction()
Definition reaction.h:78
fizika::lorentz4 get(std::initializer_list< std::tuple< int, int, int, double > > desc)
Definition reaction.h:93
reaction()
Definition reaction.h:50
fizika::lorentz4 & cm()
Definition reaction.h:81
Definition bank.h:210
float getFloat(int item, int index) const noexcept
Definition bank.h:416
Collection of schema definitions, typically read from a HIPO file header.
Definition dictionary.h:157
schema & getSchema(const char *name)
Definition dictionary.h:167
Definition event.h:62
void read(hipo::bank &b)
Definition event.cpp:63
Definition reader.h:197
void read(hipo::event &dataevent)
Reads current event from the record without advancing the current event position.
Definition reader.cpp:233
void readDictionary(hipo::dictionary &dict)
Reads the dictionary for the file.
Definition reader.cpp:318
bool next()
Advances the event pointer to the next event.
Definition reader.cpp:341
void open(const char *filename)
Open file, if file stream is open, it is closed first.
Definition reader.cpp:78
Definition fizika.h:33