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 const char* type_name();
99 ClassDef(PathMark, 1);
102 /**************************************************************************/
104 /**************************************************************************/
106 class MCTrack : public TParticle // ?? Copy stuff over ??
109 Int_t label; // Label of the track
110 Int_t index; // Index of the track (in some source array)
111 Int_t eva_label; // Label of primary particle
113 Bool_t decayed; // True if decayed during tracking.
114 // ?? Perhaps end-of-tracking point/momentum would be better.
115 Float_t t_decay; // Decay time
116 Vector V_decay; // Decay vertex
117 Vector P_decay; // Decay momentum
119 MCTrack() : label(-1), index(-1), eva_label(-1),
120 decayed(false), t_decay(0), V_decay(), P_decay() {}
121 virtual ~MCTrack() {}
123 MCTrack& operator=(const TParticle& p)
124 { *((TParticle*)this) = p; return *this; }
126 void ResetPdgCode() { fPdgCode = 0; }
128 ClassDef(MCTrack, 1);
132 /**************************************************************************/
134 /**************************************************************************/
138 class MCTrackRef : public TObject
148 MCTrackRef() : label(-1), status(-1), V(), P(), length(0), time(0) {}
149 virtual ~MCTrackRef() {}
151 ClassDef(MCTrackRef, 1)
155 /**************************************************************************/
157 /**************************************************************************/
159 // Representation of a hit.
161 // Members det_id (and subdet_id) serve for cross-referencing into
162 // geometry. Hits should be stored in det_id (+some label ordering) in
163 // order to maximize branch compression.
166 class Hit : public TObject
169 UShort_t det_id; // Custom detector id
170 UShort_t subdet_id; // Custom sub-detector id
171 Int_t label; // Label of particle that produced the hit
175 // ?? Float_t charge. Probably specific.
177 Hit() : det_id(0), subdet_id(0), label(0), eva_label(0), V() {}
184 /**************************************************************************/
186 /**************************************************************************/
188 // Base class for reconstructed clusters
190 // ?? Should Hit and cluster have common base? No.
192 class Cluster : public TObject
195 UShort_t det_id; // Custom detector id
196 UShort_t subdet_id; // Custom sub-detector id
197 Int_t label[3]; // Labels of particles that contributed hits
198 // ?? Should include reconstructed track using it? Rather not, separate.
201 // Vector W; // Cluster widths
202 // ?? Coord system? Special variables Wz, Wy?
204 Cluster() : det_id(0), subdet_id(0), V() { label[0] = label[1] = label [2] = 0; }
205 virtual ~Cluster() {}
207 ClassDef(Cluster, 1);
211 /**************************************************************************/
213 /**************************************************************************/
215 class RecTrack : public TObject
218 Int_t label; // Label of the track
219 Int_t index; // Index of the track (in some source array)
220 Int_t status; // Status as exported from reconstruction
222 Vector V; // Start vertex from reconstruction
223 Vector P; // Reconstructed momentum at start vertex
228 RecTrack() : label(-1), index(-1), status(0), sign(0), V(), P(), beta(0) {}
229 virtual ~RecTrack() {}
231 Float_t Pt() { return P.Perp(); }
233 ClassDef(RecTrack, 1);
236 // Another class with specified points/clusters
239 /**************************************************************************/
241 /**************************************************************************/
243 class RecKink : public RecTrack
246 Int_t label_sec; // Label of the secondary track
247 Vector V_end; // End vertex: last point on the primary track
248 Vector V_kink; // Kink vertex: reconstructed position of the kink
249 Vector P_sec; // Momentum of secondary track
251 RecKink() : RecTrack(), label_sec(0), V_end(), V_kink(), P_sec() {}
252 virtual ~RecKink() {}
254 ClassDef(RecKink, 1);
258 /**************************************************************************/
260 /**************************************************************************/
262 class RecV0 : public TObject
267 Vector V_neg; // Vertex of negative track
268 Vector P_neg; // Momentum of negative track
269 Vector V_pos; // Vertex of positive track
270 Vector P_pos; // Momentum of positive track
272 Vector V_ca; // Point of closest approach
273 Vector V0_birth; // Reconstucted birth point of neutral particle
275 // ? Data from simulation.
276 Int_t label; // Neutral mother label read from kinematics
277 Int_t pdg; // PDG code of mother
278 Int_t d_label[2]; // Daughter labels ?? Rec labels present anyway.
280 RecV0() : status(), V_neg(), P_neg(), V_pos(), P_pos(),
281 V_ca(), V0_birth(), label(0), pdg(0)
282 { d_label[0] = d_label[1] = 0; }
288 /**************************************************************************/
289 /**************************************************************************/
291 // Missing primary vertex.
293 // Missing GenInfo, RecInfo.
295 class GenInfo : public TObject
298 Bool_t is_rec; // is reconstructed
305 GenInfo() : is_rec(false), has_V0(false), has_kink(false),
306 label(0), n_hits(0), n_clus(0) {}
307 virtual ~GenInfo() {}
309 ClassDef(GenInfo, 1);
312 /**************************************************************************/
313 /**************************************************************************/
315 // This whole construction is highly embarrassing. It requires
316 // shameless copying of experiment data. What is good about this
319 // 1) Filters can be applied at copy time so that only part of the
320 // data is copied over.
322 // 2) Once the data is extracted it can be used without experiment
323 // software. Thus, external service can provide this data and local
324 // client can be really thin.
326 // 3) Some pretty advanced visualization schemes/selections can be
327 // implemented in a general framework by providing data extractors
328 // only. This is also good for PR or VIP displays.
330 // 4) These classes can be extended by particular implementations. The
331 // container classes will use TClonesArray with user-specified element
334 // The common behaviour could be implemented entirely without usage of
335 // a common base classes, by just specifying names of members that
336 // retrieve specific data. This is fine as long as one only uses tree
337 // selections but becomes painful for extraction of data into local
338 // structures (could a) use interpreter but this is an overkill and
339 // would cause serious trouble for multi-threaded environment; b) use
340 // member offsets and data-types from the dictionary).