13 /**************************************************************************/
15 /**************************************************************************/
17 // Basic structures for Reve. Design criteria:
19 // * provide basic cross-referencing functionality;
21 // * small memory/disk footprint (floats / count on compression in
24 // * simple usage from tree selections;
26 // * placement in TClonesArray (composites are TObject derived);
28 // * minimal member-naming (impossible to make everybody happy).
30 void DisablePODTObjectStreamers();
32 /**************************************************************************/
34 /**************************************************************************/
36 // Minimal Float_t copy of TVector3.
37 // Used to represent points and momenta.
44 Vector() : x(0), y(0), z(0) {}
45 Vector(Float_t _x, Float_t _y, Float_t _z) : x(_x), y(_y), z(_z) {}
48 Float_t* c_vec() { return &x; }
49 void Set(Float_t* v) { x=v[0]; y=v[1]; z=v[2]; }
50 void Set(Double_t* v) { x=v[0]; y=v[1]; z=v[2]; }
51 void Set(Float_t _x, Float_t _y, Float_t _z) { x=_x; y=_y; z=_z; }
52 void Set(Double_t _x, Double_t _y, Double_t _z) { x=_x; y=_y; z=_z; }
53 void Set(const TVector3& v) { x=v.x(); y=v.y(); z=v.z(); }
56 Float_t Theta() const;
57 Float_t CosTheta() const;
60 Float_t Mag() const { return TMath::Sqrt(x*x+y*y+z*z);}
61 Float_t Mag2() const { return x*x+y*y+z*z;}
63 Float_t Perp() const { return TMath::Sqrt(x*x+y*y);}
64 Float_t Perp2() const { return x*x+y*y;}
65 Float_t R() const { return Perp(); }
67 // need operator +,-,Dot
72 inline Float_t Vector::Phi() const
73 { return x == 0.0 && y == 0.0 ? 0.0 : TMath::ATan2(y,x); }
75 inline Float_t Vector::Theta() const
76 { return x == 0.0 && y == 0.0 && z == 0.0 ? 0.0 : TMath::ATan2(Perp(),z); }
78 inline Float_t Vector::CosTheta() const
79 { Float_t ptot = Mag(); return ptot == 0.0 ? 1.0 : z/ptot; }
81 /**************************************************************************/
83 /**************************************************************************/
88 enum Type_e { Reference, Daughter, Decay };
94 PathMark(Type_e t=Reference) : V(), P(), type(t) {}
95 virtual ~PathMark() {}
97 ClassDef(PathMark, 1);
100 /**************************************************************************/
102 /**************************************************************************/
104 class MCTrack : public TParticle // ?? Copy stuff over ??
107 Int_t label; // Label of the track
108 Int_t index; // Index of the track (in some source array)
109 Int_t eva_label; // Label of primary particle
111 Bool_t decayed; // True if decayed during tracking.
112 // ?? Perhaps end-of-tracking point/momentum would be better.
113 Float_t t_decay; // Decay time
114 Vector V_decay; // Decay vertex
115 Vector P_decay; // Decay momentum
117 MCTrack() : label(-1), index(-1), eva_label(-1),
118 decayed(false), t_decay(0), V_decay(), P_decay() {}
119 virtual ~MCTrack() {}
121 MCTrack& operator=(const TParticle& p)
122 { *((TParticle*)this) = p; return *this; }
124 void ResetPdgCode() { fPdgCode = 0; }
126 ClassDef(MCTrack, 1);
130 /**************************************************************************/
132 /**************************************************************************/
136 class MCTrackRef : public TObject
146 MCTrackRef() : label(-1), status(-1), V(), P(), length(0), time(0) {}
147 virtual ~MCTrackRef() {}
149 ClassDef(MCTrackRef, 1)
153 /**************************************************************************/
155 /**************************************************************************/
157 // Representation of a hit.
159 // Members det_id (and subdet_id) serve for cross-referencing into
160 // geometry. Hits should be stored in det_id (+some label ordering) in
161 // order to maximize branch compression.
164 class Hit : public TObject
167 UShort_t det_id; // Custom detector id
168 UShort_t subdet_id; // Custom sub-detector id
169 Int_t label; // Label of particle that produced the hit
173 // ?? Float_t charge. Probably specific.
175 Hit() : det_id(0), subdet_id(0), label(0), eva_label(0), V() {}
182 /**************************************************************************/
184 /**************************************************************************/
186 // Base class for reconstructed clusters
188 // ?? Should Hit and cluster have common base? No.
190 class Cluster : public TObject
193 UShort_t det_id; // Custom detector id
194 UShort_t subdet_id; // Custom sub-detector id
195 Int_t label[3]; // Labels of particles that contributed hits
196 // ?? Should include reconstructed track using it? Rather not, separate.
199 // Vector W; // Cluster widths
200 // ?? Coord system? Special variables Wz, Wy?
202 Cluster() : det_id(0), subdet_id(0), V() { label[0] = label[1] = label [2] = 0; }
203 virtual ~Cluster() {}
205 ClassDef(Cluster, 1);
209 /**************************************************************************/
211 /**************************************************************************/
213 class RecTrack : public TObject
216 Int_t label; // Label of the track
217 Int_t index; // Index of the track (in some source array)
218 Int_t status; // Status as exported from reconstruction
220 Vector V; // Start vertex from reconstruction
221 Vector P; // Reconstructed momentum at start vertex
226 RecTrack() : label(-1), index(-1), status(0), sign(0), V(), P(), beta(0) {}
227 virtual ~RecTrack() {}
229 Float_t Pt() { return P.Perp(); }
231 ClassDef(RecTrack, 1);
234 // Another class with specified points/clusters
237 /**************************************************************************/
239 /**************************************************************************/
241 class RecKink : public RecTrack
244 Int_t label_sec; // Label of the secondary track
245 Vector V_end; // End vertex: last point on the primary track
246 Vector V_kink; // Kink vertex: reconstructed position of the kink
247 Vector P_sec; // Momentum of secondary track
249 RecKink() : RecTrack(), label_sec(0), V_end(), V_kink(), P_sec() {}
250 virtual ~RecKink() {}
252 ClassDef(RecKink, 1);
256 /**************************************************************************/
258 /**************************************************************************/
260 class RecV0 : public TObject
265 Vector V_neg; // Vertex of negative track
266 Vector P_neg; // Momentum of negative track
267 Vector V_pos; // Vertex of positive track
268 Vector P_pos; // Momentum of positive track
270 Vector V_ca; // Point of closest approach
271 Vector V0_birth; // Reconstucted birth point of neutral particle
273 // ? Data from simulation.
274 Int_t label; // Neutral mother label read from kinematics
275 Int_t pdg; // PDG code of mother
276 Int_t d_label[2]; // Daughter labels ?? Rec labels present anyway.
278 RecV0() : status(), V_neg(), P_neg(), V_pos(), P_pos(),
279 V_ca(), V0_birth(), label(0), pdg(0)
280 { d_label[0] = d_label[1] = 0; }
286 /**************************************************************************/
287 /**************************************************************************/
289 // Missing primary vertex.
291 // Missing GenInfo, RecInfo.
293 class GenInfo : public TObject
296 Bool_t is_rec; // is reconstructed
303 GenInfo() : is_rec(false), has_V0(false), has_kink(false),
304 label(0), n_hits(0), n_clus(0) {}
305 virtual ~GenInfo() {}
307 ClassDef(GenInfo, 1);
310 /**************************************************************************/
311 /**************************************************************************/
313 // This whole construction is highly embarrassing. It requires
314 // shameless copying of experiment data. What is good about this
317 // 1) Filters can be applied at copy time so that only part of the
318 // data is copied over.
320 // 2) Once the data is extracted it can be used without experiment
321 // software. Thus, external service can provide this data and local
322 // client can be really thin.
324 // 3) Some pretty advanced visualization schemes/selections can be
325 // implemented in a general framework by providing data extractors
326 // only. This is also good for PR or VIP displays.
328 // 4) These classes can be extended by particular implementations. The
329 // container classes will use TClonesArray with user-specified element
332 // The common behaviour could be implemented entirely without usage of
333 // a common base classes, by just specifying names of members that
334 // retrieve specific data. This is fine as long as one only uses tree
335 // selections but becomes painful for extraction of data into local
336 // structures (could a) use interpreter but this is an overkill and
337 // would cause serious trouble for multi-threaded environment; b) use
338 // member offsets and data-types from the dictionary).