Analysis Software
Documentation for sPHENIX simulation software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
TpcPrototypeUnpacker.h
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file TpcPrototypeUnpacker.h
1 /*
2  * TpcPrototypeUnpacker.h
3  *
4  * Created on: Sep 19, 2018
5  * Author: jinhuang
6  */
7 
8 #ifndef CORESOFTWARE_OFFLINE_PACKAGES_TPCDAQ_TpcPrototypeUnpacker_H_
9 #define CORESOFTWARE_OFFLINE_PACKAGES_TPCDAQ_TpcPrototypeUnpacker_H_
10 
11 #include <fun4all/SubsysReco.h>
12 
13 #include <TObject.h>
14 
15 #include <cstdint>
16 #include <cmath>
17 #include <map>
18 #include <set>
19 #include <string>
20 #include <utility> // for pair
21 #include <vector>
22 
23 class PHCompositeNode;
25 class TTree;
26 class TClonesArray;
27 class PHG4TpcPadPlane;
31 
32 namespace TpcPrototypeDefs
33 {
34 namespace FEEv2
35 {
36 class SampleFit_PowerLawDoubleExp_PDFMaker;
37 }
38 } // namespace TpcPrototypeDefs
39 
41 {
42  public:
43  TpcPrototypeUnpacker(const std::string &outputfilename =
44  "TpcPrototypeUnpacker.root");
45  virtual ~TpcPrototypeUnpacker();
46 
47  int Init(PHCompositeNode *topNode);
48  int InitRun(PHCompositeNode *topNode);
49  int process_event(PHCompositeNode *topNode);
50  int ResetEvent(PHCompositeNode *topNode);
51  int End(PHCompositeNode *topNode);
52 
53  void setClusteringZeroSuppression(int threshold)
54  {
55  m_clusteringZeroSuppression = threshold;
56  }
57 
58  void setNPostSample(int nPostSample)
59  {
60  m_nPostSample = nPostSample;
61  }
62 
63  void setNPreSample(int nPreSample)
64  {
65  m_nPreSample = nPreSample;
66  }
67 
69 
72  class EventHeader : public TObject
73  {
74  public:
75  int run;
76  int event;
77 
78  uint32_t bx_counter;
80 
81  int xray_x;
82  int xray_y;
83 
85  : run(-1)
86  , event(-1)
87  , bx_counter(0)
89  , xray_x(-1)
90  , xray_y(-1)
91  {
92  }
93 
94  ClassDefOverride(TpcPrototypeUnpacker::EventHeader, 1)
95  };
96 
99  {
100  public:
101  PadPlaneData();
102  void Reset();
103 
104  struct SampleID
105  {
108  int sample;
109 
110  void adjust(const SampleID &adjustment)
111  {
112  pad_azimuth += adjustment.pad_azimuth;
113  pad_radial += adjustment.pad_radial;
114  sample += adjustment.sample;
115  }
116  };
117 
118  static bool IsValidPad(const int pad_x, const int pad_y);
119  std::vector<int> &getPad(const int pad_x, const int pad_y);
120  int getSample(const SampleID &id);
121 
123  void Clustering(int zero_suppression, bool verbosity = false);
124 
125 
126  const std::vector<std::vector<std::vector<int>>> &getData() const
127  {
128  return m_data;
129  }
130 
131  const std::multimap<int, SampleID> &getGroups() const
132  {
133  return m_groups;
134  }
135 
136  private:
138  std::vector<std::vector<std::vector<int>>> m_data;
139 
140  std::multimap<int, SampleID> m_groups;
141 
142  };
143 
145  class ClusterData : public TObject
146  {
147  public:
149  : clusterID(-1)
150  , min_sample(-1)
151  , max_sample(-1)
152  , min_pad_azimuth(-1)
153  , max_pad_azimuth(-1)
154  , peak(NAN)
155  , peak_sample(NAN)
156  , pedstal(NAN)
157  , avg_pad_radial(-1)
158  , avg_pad_azimuth(NAN)
159  , size_pad_radial(-1)
160  , size_pad_azimuth(-1)
161  , avg_pos_x(NAN)
162  , avg_pos_y(NAN)
163  , avg_pos_z(NAN)
164  , delta_azimuth_bin(NAN)
165  , delta_z(NAN)
166  {
167  }
168 
169  void Clear(Option_t * /*option*/ = "");
170 
172 
173  std::set<int> pad_radials;
174  std::set<int> pad_azimuths;
175  std::set<int> samples;
176 
177  std::map<int, std::vector<double>> pad_radial_samples;
178  std::map<int, std::vector<double>> pad_azimuth_samples;
179  std::vector<double> sum_samples;
180 
185 
186  double peak;
187  double peak_sample;
188  double pedstal;
189 
190  // std::map<int, double> pad_radial_peaks; // radial always have size = 1 in this analysis
191  std::map<int, double> pad_azimuth_peaks;
192 
196 
200 
202  double avg_pos_x;
203  double avg_pos_y;
204  double avg_pos_z;
205 
210  double delta_z;
211 
213  };
214 
216  class ChannelHeader : public TObject
217  {
218  public:
219  int size;
230 
232  int fee_id;
233 
235  int pad_x;
236  int pad_y;
237 
238  int pedestal;
239  int max;
240 
242  : size(-1)
243  , packet_type(-1)
244  , bx_counter(-1)
245  , sampa_address(-1)
246  , sampa_channel(-1)
247  , fee_channel(-1)
248  , fee_id(-1)
249  , pad_x(-1)
250  , pad_y(-1)
251  , pedestal(-1)
252  , max(-1)
253  {
254  }
255 
256  ClassDefOverride(TpcPrototypeUnpacker::ChannelHeader, 1)
257  };
258 
259  private:
264 
266  int exportDSTCluster(ClusterData &cluster, const int i);
267 
269  int exportDSTHits();
270 
271  int InitField(PHCompositeNode *topNode);
272 
273 
274  // IO stuff
275 
277 
279 
280  TTree *m_eventT;
281 
284 
286  TClonesArray *m_IOClusters;
287 
288  TTree *m_chanT;
289 
292  std::vector<uint32_t> m_chanData;
293 
294  // clustering stuff
296  std::map<int, ClusterData> m_clusters;
297 
300  static std::pair<int, int> roughZeroSuppression(std::vector<int> &data);
301 
304  int Clustering(void);
305 
306 
312 
314 };
315 
317 
318 #endif /* CORESOFTWARE_OFFLINE_PACKAGES_TPCDAQ_TpcPrototypeUnpacker_H_ */