ROOT logo
#ifndef __TUsrEvent_h__
#define __TUsrEvent_h__

//_________________________________________________[C++ CLASS DEFINITION FILE]
//////////////////////////////////////////////////////////////////////////////
// Name:           TUsrEvent.h
// Purpose:        Class to describe a user-defined event
// Description:
// Author:         R. Lutter
// Revision:       $Id: TUsrEvent.h,v 1.7 2011-09-16 12:12:31 Marabou Exp $
// Date:
// URL:
// Keywords:
//////////////////////////////////////////////////////////////////////////////

#include "TObject.h"
#include "TSystem.h"
#include "TTree.h"
#include "TBranch.h"
#include "TObjArray.h"

#include "mbsio.h"
#include "TUsrHit.h"
#include "TUsrHBX.h"

//______________________________________________________[C++ CLASS DEFINITION]
//////////////////////////////////////////////////////////////////////////////
// Name:           TUsrEvent
// Purpose:        Base class for user-defined events
// Description:    Defines methods common to all user-specific events
// Keywords:
//////////////////////////////////////////////////////////////////////////////

class TUsrEvent : public TObject {

	public:
		TUsrEvent(); 								// default ctor
		~TUsrEvent() { fLofSubevents.Delete(); fLofHBXs.Delete(); };	// dtor

		const UShort_t * NextSubevent(MBSDataIO * BaseAddr, Int_t NofWords = 0, Bool_t RawMode = kFALSE) const;	// get next subevent
		UInt_t NextSubeventHeader(MBSDataIO * BaseAddr) const;
		const UShort_t * NextSubeventData(MBSDataIO * BaseAddr, Int_t NofWords = 0, Bool_t RawMode = kFALSE) const;

		inline void SetScaleDown(Int_t ScaleDown) { fScaleDown = ScaleDown; }; // set individual scale down
		inline Int_t GetScaleDown() const { return(fScaleDown); };	// get current scale down
		inline Int_t GetClockSecs() const { return(fClockSecs); };	// return event time (secs since 1-Jan-70)
		inline Int_t GetClockNsecs() const { return(fClockNsecs); };	// return event time (nanosecs of current second)
		inline Int_t GetTimeStamp() const { return(GetUniqueID()); };	// return time stamp (100 microsecs since start)
		inline Int_t GetTimeRS() const { return(fTimeRS); };			// get time (ROOT style)
		Int_t CalcTimeDiff(TUsrEvent * Event) const;					// calc time diff with respect to event
		inline TTree * GetTreeIn() const { return(fTreeIn); }; 	// return tree addr (input)
		inline TTree * GetTreeOut() const { return(fTreeOut); }; 	// ... (output)

		inline void WriteTree(const Bool_t WriteFlag = kTRUE) {
			fWriteTree = (fTreeOut == NULL) ? kFALSE : WriteFlag;
		};
		inline Bool_t TreeToBeWritten() const { return(fWriteTree); };

		inline void SetReplayMode(const Bool_t ReplayMode = kTRUE) {
			fReplayMode = (fTreeIn == NULL) ? kFALSE : ReplayMode;
		};
		inline Bool_t IsReplayMode() const { return(fReplayMode); };

		inline void SetFakeMode(const Bool_t FakeMode = kTRUE) {
			fReplayMode = fFakeMode = FakeMode;
		};
		inline Bool_t IsFakeMode() const { return(fFakeMode); };

		inline Int_t GetNofEvents() const { return(fNofEvents); };
		inline Bool_t IsModScaleDown() const { return((fNofEvents % fScaleDown) == 0); };

																					// list of subevents
		inline void AddSubevent(TObject * Subevent, Int_t SevtSerial = -1) {		// add subevent to list
				if (SevtSerial == -1)	fLofSubevents.AddLast(Subevent);
				else					fLofSubevents.AddAtAndExpand(Subevent, SevtSerial);
		};
		inline TObjArray * GetLofSubevents() { return(&fLofSubevents); };
		inline TObject * GetSubevent(Int_t SevtSerial) { return(fLofSubevents.At(SevtSerial)); };	// get it from list
		inline Int_t GetNofSubevents() const { return(fLofSubevents.GetEntries()); };

																	// list of hit buffers
		inline void AddHBX(TUsrHBX * HBX, Int_t SevtSerial = -1) {	// add hit buffer wrapper to list
				if (SevtSerial == -1)	fLofHBXs.AddLast(HBX);
				else					fLofHBXs.AddAtAndExpand(HBX, SevtSerial);
		};
		inline TUsrHBX * GetHBX(Int_t SevtSerial) { return((TUsrHBX *) fLofHBXs.At(SevtSerial)); }; // get it from list

		Int_t FillSevtFromHB(TUsrHBX * HBX, Int_t Hidx, Bool_t FillHisto = kTRUE, Int_t Didx = TUsrHit::kHitEnergy);
		Int_t FillSevtFromHB(TUsrHBX * HBX, Int_t Hidx, Int_t DeltaTS, Bool_t FillHisto = kTRUE, Int_t Didx = TUsrHit::kHitEnergy);
		Bool_t FillEventFromHB(TArrayI & LofIndices, Bool_t FillHisto = kTRUE, Int_t Didx = TUsrHit::kHitEnergy, Int_t InitValue = 0);
		Bool_t FillEventFromHB(TArrayI & LofIndices, Int_t DeltaTS, Bool_t FillHisto = kTRUE, Int_t Didx = TUsrHit::kHitEnergy, Int_t InitValue = 0);
		
		Int_t FillArrayFromHB(TUsrHBX * HBX, ULong64_t & TimeStamp, TArrayI & Data, Int_t Hidx, Int_t Didx = TUsrHit::kHitEnergy, Int_t InitValue = 0);

		virtual void Reset(Int_t InitValue = 0, Bool_t DataOnly = kFALSE) {};
		
		void Print(const Char_t * Text, UInt_t TimeStamp = 0);

		inline void Help() { gSystem->Exec(Form("mrbHelp %s", this->ClassName())); };

	protected:
		Int_t CalcTimeRS(); 				// convert time to ROOT style
		inline void SetTimeStamp(Int_t TimeStamp) { SetUniqueID(TimeStamp); };

	protected:
		TBranch * fBranch;					//! ptr to event to be used in TTree::Branch()

		TTree * fTreeOut;					//! tree to store data in ROOT format
		TTree * fTreeIn;					//! tree to read data from ROOT file
		Bool_t fReplayMode; 				//! kTRUE if replay mode on
		Bool_t fFakeMode; 					//! kTRUE if fake mode on
		Bool_t fWriteTree;					//! kTRUE if tree data should be written to file

		Int_t fNofEntries; 					// number of entries in ROOT tree (replay mode only)

		UInt_t fType;						// event type
		UInt_t fSubtype;					// ... subtype
		Int_t fTrigger;						// trigger number
		Int_t fEventNumber;					// event number provided by MBS
		Int_t fNofEvents; 					// number of events collected so far
		Int_t fScaleDown;					// individual scale down factor
		Int_t fClockRes;					// clock resolution in nsecs
		Int_t fClockSecs; 					// seconds since January 1, 1970
		Int_t fClockNsecs;  				// nano secs of current second
		Int_t fTimeRS;						// time (ROOT style)

		TObjArray fLofHBXs; 				//! list of hit buffer wrappers, indexed by hit buffer
		TObjArray fLofSubevents;			//! list of subevents

	ClassDef(TUsrEvent, 1)		// [Analyze] User's event structure
};

#endif
 TUsrEvent.h:1
 TUsrEvent.h:2
 TUsrEvent.h:3
 TUsrEvent.h:4
 TUsrEvent.h:5
 TUsrEvent.h:6
 TUsrEvent.h:7
 TUsrEvent.h:8
 TUsrEvent.h:9
 TUsrEvent.h:10
 TUsrEvent.h:11
 TUsrEvent.h:12
 TUsrEvent.h:13
 TUsrEvent.h:14
 TUsrEvent.h:15
 TUsrEvent.h:16
 TUsrEvent.h:17
 TUsrEvent.h:18
 TUsrEvent.h:19
 TUsrEvent.h:20
 TUsrEvent.h:21
 TUsrEvent.h:22
 TUsrEvent.h:23
 TUsrEvent.h:24
 TUsrEvent.h:25
 TUsrEvent.h:26
 TUsrEvent.h:27
 TUsrEvent.h:28
 TUsrEvent.h:29
 TUsrEvent.h:30
 TUsrEvent.h:31
 TUsrEvent.h:32
 TUsrEvent.h:33
 TUsrEvent.h:34
 TUsrEvent.h:35
 TUsrEvent.h:36
 TUsrEvent.h:37
 TUsrEvent.h:38
 TUsrEvent.h:39
 TUsrEvent.h:40
 TUsrEvent.h:41
 TUsrEvent.h:42
 TUsrEvent.h:43
 TUsrEvent.h:44
 TUsrEvent.h:45
 TUsrEvent.h:46
 TUsrEvent.h:47
 TUsrEvent.h:48
 TUsrEvent.h:49
 TUsrEvent.h:50
 TUsrEvent.h:51
 TUsrEvent.h:52
 TUsrEvent.h:53
 TUsrEvent.h:54
 TUsrEvent.h:55
 TUsrEvent.h:56
 TUsrEvent.h:57
 TUsrEvent.h:58
 TUsrEvent.h:59
 TUsrEvent.h:60
 TUsrEvent.h:61
 TUsrEvent.h:62
 TUsrEvent.h:63
 TUsrEvent.h:64
 TUsrEvent.h:65
 TUsrEvent.h:66
 TUsrEvent.h:67
 TUsrEvent.h:68
 TUsrEvent.h:69
 TUsrEvent.h:70
 TUsrEvent.h:71
 TUsrEvent.h:72
 TUsrEvent.h:73
 TUsrEvent.h:74
 TUsrEvent.h:75
 TUsrEvent.h:76
 TUsrEvent.h:77
 TUsrEvent.h:78
 TUsrEvent.h:79
 TUsrEvent.h:80
 TUsrEvent.h:81
 TUsrEvent.h:82
 TUsrEvent.h:83
 TUsrEvent.h:84
 TUsrEvent.h:85
 TUsrEvent.h:86
 TUsrEvent.h:87
 TUsrEvent.h:88
 TUsrEvent.h:89
 TUsrEvent.h:90
 TUsrEvent.h:91
 TUsrEvent.h:92
 TUsrEvent.h:93
 TUsrEvent.h:94
 TUsrEvent.h:95
 TUsrEvent.h:96
 TUsrEvent.h:97
 TUsrEvent.h:98
 TUsrEvent.h:99
 TUsrEvent.h:100
 TUsrEvent.h:101
 TUsrEvent.h:102
 TUsrEvent.h:103
 TUsrEvent.h:104
 TUsrEvent.h:105
 TUsrEvent.h:106
 TUsrEvent.h:107
 TUsrEvent.h:108
 TUsrEvent.h:109
 TUsrEvent.h:110
 TUsrEvent.h:111
 TUsrEvent.h:112
 TUsrEvent.h:113
 TUsrEvent.h:114
 TUsrEvent.h:115
 TUsrEvent.h:116
 TUsrEvent.h:117
 TUsrEvent.h:118
 TUsrEvent.h:119
 TUsrEvent.h:120
 TUsrEvent.h:121
 TUsrEvent.h:122
 TUsrEvent.h:123
 TUsrEvent.h:124
 TUsrEvent.h:125
 TUsrEvent.h:126
 TUsrEvent.h:127
 TUsrEvent.h:128
 TUsrEvent.h:129
 TUsrEvent.h:130
 TUsrEvent.h:131
 TUsrEvent.h:132
 TUsrEvent.h:133