Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DFCALCluster.h
Go to the documentation of this file.
1 // $Id: DFCALShower.h 1899 2006-07-13 16:29:56Z davidl $
2 //
3 // File: DFCALShower.h
4 // Created: Tue May 17 11:57:50 EST 2005
5 // Creator: remitche (on Linux mantrid00 2.4.20-18.8smp i686)
6 //
7 
8 #ifndef _DFCALCluster_
9 #define _DFCALCluster_
10 
11 #include <DVector3.h>
12 #include "DFCALHit.h"
13 using namespace std;
14 
15 #include <JANA/JObject.h>
16 #include <JANA/JFactory.h>
17 using namespace jana;
18 
19 #define FCAL_USER_HITS_MAX 2800
20 #define MOLIERE_RADIUS 3.696
21 #define MAX_SHOWER_RADIUS 25
22 
23 class DFCALCluster : public JObject {
24  public:
25  JOBJECT_PUBLIC(DFCALCluster);
26 
27  DFCALCluster( const int nhits );
28  ~DFCALCluster();
29 
30  typedef struct {
31  oid_t id;
32  int ch;
33  float x;
34  float y;
35  float E;
36  float t;
37  // this may be pruned at a later stage to reduce size
38  // but it is useful for development now
39  float intOverPeak;
40  } userhit_t;
41 
42  typedef struct {
43  int nhits;
44  userhit_t hit[1];
45  } userhits_t;
46 
47  typedef struct {
48  oid_t id;
49  int ch;
50  float x;
51  float y;
52  float E;
53  float t;
54  float intOverPeak;
56 
57  void saveHits( const userhits_t* const hit );
58 
59  double getEexpected(const int ihit) const;
60  double getEallowed(const int ihit) const;
61  double getEnergy() const;
62  double getEmax() const;
63  int getChannelEmax() const;
64  double getTime() const;
65  double getTimeMaxE() const;
66  double getTimeEWeight() const;
67  // the centroid returned by this function is in
68  // a frame where z=0 is at the center of the target
69  DVector3 getCentroid() const;
70 
71  double getRMS() const;
72  double getRMS_t() const;
73  double getRMS_x() const;
74  double getRMS_y() const;
75  double getRMS_u() const;
76  double getRMS_v() const;
77 
78  int getHits() const; // get number of hits owned by a cluster
79  int addHit(const int ihit, const double frac);
80  void resetClusterHits();
81  bool update( const userhits_t* const hitList, double fcalFaceZ );
82 
83 // get hits that form a cluster after clustering is finished
84  inline const vector<DFCALClusterHit_t> GetHits() const { return my_hits; }
85  inline uint32_t GetNHits(void) const { return my_hits.size(); }
86 
87  void toStrings(vector<pair<string,string> > &items) const {
88  AddString(items, "x(cm)", "%3.1f", getCentroid().x());
89  AddString(items, "y(cm)", "%3.1f", getCentroid().y());
90  AddString(items, "z(cm)", "%3.1f", getCentroid().z());
91  AddString(items, "E(GeV)", "%2.3f", getEnergy());
92  AddString(items, "t(ns)", "%2.3f", getTime());
93  }
94 
95  private:
96 
97  void shower_profile( const userhits_t* const hitList,
98  const int ihit,
99  double& Eallowed, double& Eexpected,
100  double fcalMidplaneZ ) const ;
101 
102  // internal parsers of properties for a hit belonging to a cluster
103  oid_t getHitID( const userhits_t* const hitList, const int ihit) const;
104  int getHitCh( const userhits_t* const hitList, const int ihit) const;
105  double getHitX( const userhits_t* const hitList, const int ihit) const;
106  double getHitY( const userhits_t* const hitList, const int ihit) const;
107  double getHitT( const userhits_t* const hitList, const int ihit) const;
108  double getHitIntOverPeak( const userhits_t* const hitList, const int ihit) const;
109  double getHitE( const userhits_t* const hitList, const int ihit) const; // hit energy owned by cluster
110  double getHitEhit( const userhits_t* const hitList, const int ihit) const; // energy in a FCAL block
111 
112  double fEnergy; // total cluster energy (GeV) or 0 if stale
113  double fTime; // cluster time(ns) set equivalent to fTimeMaxE below
114  double fTimeMaxE; // cluster time(ns) set by first (max E) block, for now
115  double fTimeEWeight; // cluster time(ns) energy weighted average
116  double fEmax; // energy in the first block of the cluster
117  int fChannelEmax; // Channel number with maximum energy
118  DVector3 fCentroid; // cluster centroid position (cm) [z=0 at target center]
119  double fRMS; // cluster r.m.s. size (cm)
120  double fRMS_t; // r.m.s. of energy weighted hits (ns)
121  double fRMS_x; // cluster r.m.s. size along X-axis (cm)
122  double fRMS_y; // cluster r.m.s. size along Y-axis (cm)
123  double fRMS_u; // cluster r.m.s. size in radial direction (cm)
124  double fRMS_v; // cluster r.m.s. size in azimuth direction (cm)
125  int m_nFcalHits; // total number of hits to work with
126  // need to rename other member data
127  int fNhits; // number of hits owned by this cluster
128  int *fHit; // index list of hits owned by this cluster
129  double *fHitf; // list of hit fractions owned by this cluster
130  double *fEexpected; // expected energy of hit by cluster (GeV)
131  double *fEallowed; // allowed energy of hit by cluster (GeV)
132 
133  // container for hits that form a cluster to be used after clustering is done
134  vector<DFCALClusterHit_t> my_hits;
135 
136 };
137 
138 inline double DFCALCluster::getEexpected(const int ihit) const
139 {
140  if ( ihit >= 0 && ihit < m_nFcalHits )
141  return fEexpected[ ihit ];
142  else
143  return 0;
144 }
145 
146 inline double DFCALCluster::getEallowed(const int ihit) const
147 {
148 
149  if ( ihit >= 0 && ihit < m_nFcalHits )
150  return fEallowed[ ihit ];
151  else
152  return 0;
153 }
154 
155 inline double DFCALCluster::getEnergy() const
156 {
157  return fEnergy;
158 }
159 
160 inline double DFCALCluster::getEmax() const
161 {
162  return fEmax;
163 }
164 
165 inline double DFCALCluster::getTime() const
166 {
167  return fTime;
168 }
170 {
171  return fChannelEmax;
172 }
173 inline double DFCALCluster::getTimeMaxE() const
174 {
175  return fTimeMaxE;
176 }
177 
178 inline double DFCALCluster::getTimeEWeight() const
179 {
180  return fTimeEWeight;
181 }
182 
184 {
185  return fCentroid;
186 }
187 
188 inline double DFCALCluster::getRMS() const
189 {
190  return fRMS;
191 }
192 
193 inline double DFCALCluster::getRMS_t() const
194 {
195  return fRMS_t;
196 }
197 
198 inline double DFCALCluster::getRMS_x() const
199 {
200  return fRMS_x;
201 }
202 
203 inline double DFCALCluster::getRMS_y() const
204 {
205  return fRMS_y;
206 }
207 
208 inline double DFCALCluster::getRMS_u() const
209 {
210  return fRMS_u;
211 }
212 
213 inline double DFCALCluster::getRMS_v() const
214 {
215  return fRMS_v;
216 }
217 
218 inline int DFCALCluster::getHits() const
219 {
220  return fNhits;
221 }
222 
223 inline JObject::oid_t DFCALCluster::getHitID(const userhits_t* const hitList, const int ihit ) const
224 {
225  if ( ihit >= 0 && ihit < fNhits && hitList && ihit < hitList->nhits ) {
226  return hitList->hit[ fHit[ ihit ] ].id;
227  }
228  else {
229  return 0;
230  }
231 }
232 
233 inline int DFCALCluster::getHitCh(const userhits_t* const hitList, const int ihit ) const
234 {
235  if ( ihit >= 0 && ihit < fNhits && hitList && ihit < hitList->nhits ) {
236  return hitList->hit[ fHit[ ihit ] ].ch;
237  }
238  else {
239  return 0;
240  }
241 }
242 
243 inline double DFCALCluster::getHitX(const userhits_t* const hitList, const int ihit ) const
244 {
245  if ( ihit >= 0 && ihit < fNhits && hitList && ihit < hitList->nhits ) {
246  return hitList->hit[ fHit[ ihit ] ].x;
247  }
248  else {
249  return 0.;
250  }
251 }
252 
253 inline double DFCALCluster::getHitY(const userhits_t* const hitList, const int ihit ) const
254 {
255  if ( ihit >= 0 && ihit < fNhits && hitList && ihit < hitList->nhits ) {
256  return hitList->hit[ fHit[ ihit ] ].y;
257  }
258  else {
259  return 0.;
260  }
261 }
262 
263 inline double DFCALCluster::getHitT(const userhits_t* const hitList, const int ihit ) const
264 {
265  if ( ihit >= 0 && ihit < fNhits && hitList && ihit < hitList->nhits ) {
266  return hitList->hit[ fHit[ ihit ] ].t;
267  }
268  else {
269  return 0.;
270  }
271 }
272 
273 inline double DFCALCluster::getHitIntOverPeak(const userhits_t* const hitList, const int ihit ) const
274 {
275  if ( ihit >= 0 && ihit < fNhits && hitList && ihit < hitList->nhits ) {
276  return hitList->hit[ fHit[ ihit ] ].intOverPeak;
277  }
278  else {
279  return 0.;
280  }
281 }
282 
283 inline double DFCALCluster::getHitE(const userhits_t* const hitList, const int ihit ) const
284 {
285  if ( ihit >= 0 && ihit < fNhits && hitList && ihit < hitList->nhits ) {
286  return fHitf[ ihit ] * hitList->hit[ fHit[ ihit ] ].E ;
287  }
288  else {
289  return -1.;
290  }
291 }
292 
293 inline double DFCALCluster::getHitEhit(const userhits_t* const hitList, const int ihit ) const
294 {
295  if ( ihit >= 0 && ihit < fNhits && hitList && ihit < hitList->nhits ) {
296  return hitList->hit[ fHit[ ihit ] ].E ;
297  }
298  else {
299  return -1.;
300  }
301 }
302 
303 #endif // _DFCALCluster_
304 
double getHitT(const userhits_t *const hitList, const int ihit) const
Definition: DFCALCluster.h:263
DVector3 getCentroid() const
Definition: DFCALCluster.h:183
double getRMS() const
Definition: DFCALCluster.h:188
TVector3 DVector3
Definition: DVector3.h:14
const vector< DFCALClusterHit_t > GetHits() const
Definition: DFCALCluster.h:84
Double_t x[NCHANNELS]
Definition: st_tw_resols.C:39
double * fEexpected
Definition: DFCALCluster.h:130
#define y
double getTimeEWeight() const
Definition: DFCALCluster.h:178
void toStrings(vector< pair< string, string > > &items) const
Definition: DFCALCluster.h:87
double getTime() const
Definition: DFCALCluster.h:165
double * fEallowed
Definition: DFCALCluster.h:131
double getTimeMaxE() const
Definition: DFCALCluster.h:173
double getEallowed(const int ihit) const
Definition: DFCALCluster.h:146
double getHitEhit(const userhits_t *const hitList, const int ihit) const
Definition: DFCALCluster.h:293
double getEnergy() const
Definition: DFCALCluster.h:155
double getRMS_u() const
Definition: DFCALCluster.h:208
uint32_t GetNHits(void) const
Definition: DFCALCluster.h:85
double getRMS_y() const
Definition: DFCALCluster.h:203
double getRMS_x() const
Definition: DFCALCluster.h:198
double getHitY(const userhits_t *const hitList, const int ihit) const
Definition: DFCALCluster.h:253
double getHitX(const userhits_t *const hitList, const int ihit) const
Definition: DFCALCluster.h:243
vector< DFCALClusterHit_t > my_hits
Definition: DFCALCluster.h:134
double fEnergy
Definition: DFCALCluster.h:112
double * fHitf
Definition: DFCALCluster.h:129
double getHitE(const userhits_t *const hitList, const int ihit) const
Definition: DFCALCluster.h:283
oid_t getHitID(const userhits_t *const hitList, const int ihit) const
Definition: DFCALCluster.h:223
int getChannelEmax() const
Definition: DFCALCluster.h:169
int getHits() const
Definition: DFCALCluster.h:218
double fTimeMaxE
Definition: DFCALCluster.h:114
int getHitCh(const userhits_t *const hitList, const int ihit) const
Definition: DFCALCluster.h:233
double fTimeEWeight
Definition: DFCALCluster.h:115
double getRMS_v() const
Definition: DFCALCluster.h:213
double getHitIntOverPeak(const userhits_t *const hitList, const int ihit) const
Definition: DFCALCluster.h:273
double getEexpected(const int ihit) const
Definition: DFCALCluster.h:138
DVector3 fCentroid
Definition: DFCALCluster.h:118
double getEmax() const
Definition: DFCALCluster.h:160
double getRMS_t() const
Definition: DFCALCluster.h:193