ROOT logo
#ifndef __TUsrMux_h__
#define __TUsrMux_h__

//_________________________________________________[C++ CLASS DEFINITION FILE]
//////////////////////////////////////////////////////////////////////////////
// Name:           TUsrMux.h
// Purpose:        Class to describe data structure of Mesytec Mux16 multiplexer
// Description:
// Author:         R. Lutter
// Revision:       $Id: TUsrMux.h,v 1.3 2007-10-25 17:24:12 Marabou Exp $       
// Date:           $Date: 2007-10-25 17:24:12 $
// URL:            
// Keywords:       
//////////////////////////////////////////////////////////////////////////////

namespace std {} using namespace std;

#include <iostream>

#include "TObject.h"
#include "TObjArray.h"
#include "TString.h"
#include "TEnv.h"
#include "TH1F.h"

#include "TUsrHit.h"
#include "TUsrHitBuffer.h"
#include "TUsrHBX.h"

//______________________________________________________[C++ CLASS DEFINITION]
//////////////////////////////////////////////////////////////////////////////
// Name:           TUsrMuxLookup
// Purpose:        Defines a lookup table
// Description:    
// Keywords:       
//////////////////////////////////////////////////////////////////////////////

class TUsrMuxLookup : public TNamed, public TArrayI {

	friend class TUsrMux;

	public:
		TUsrMuxLookup(const Char_t * MuxName, Int_t Size) : TNamed(MuxName, MuxName) {
			fGoodHits = 0;
			fBadHits = 0;
			fHitRatio = 0;
			this->Set(Size);
			this->Reset(0);
		};

		inline void CountHit(Int_t Channel) {
			if (Channel > 0) {
				fGoodHits = (fGoodHits * 999 + 1) / 1000;
			} else {
				fBadHits = (fBadHits * 999 + 1) / 1000;
			}
		}

		inline Int_t GetEntries() {
			Int_t nofEntries = 0;
			for (Int_t i = 0; i < this->GetSize(); i++) {
				if (this->At(i) != 0) nofEntries++;
			}
			return(nofEntries);
		}

		inline Double_t CalculateRatio() { if (fGoodHits > 0) fHitRatio = fBadHits / fGoodHits; return(fHitRatio); };

	protected:		
		Double_t fGoodHits; 		// count good hits (central half of window)
		Double_t fBadHits;			// count bad hits (outer quarters of window)
		Double_t fHitRatio; 		// ratio bad/good
		
	ClassDef(TUsrMuxLookup, 0)				// [Analyze] Multiplexer lookup table
};

//______________________________________________________[C++ CLASS DEFINITION]
//////////////////////////////////////////////////////////////////////////////
// Name:           TUsrMuxEntry
// Purpose:        Define an entry in the mux channel table
// Description:    
// Keywords:       
//////////////////////////////////////////////////////////////////////////////

class TUsrMuxEntry : public TObject {

	friend class TUsrMux;

	public:
		TUsrMuxEntry(TEnv * LkpEnv, TUsrMuxLookup * Lookup, TUsrHit * Hit = NULL) {
			fLkpEnv = LkpEnv;
			fLookup = Lookup;
			fHit = Hit;
		};

		~TUsrMuxEntry() {};

		const Char_t * PrintEntry(TString & Output);

	protected:		
		TEnv * fLkpEnv;
		TUsrMuxLookup * fLookup;
		TUsrHit * fHit;
		
	ClassDef(TUsrMuxEntry, 0)				// [Analyze] Multiplexer entry
};

//______________________________________________________[C++ CLASS DEFINITION]
//////////////////////////////////////////////////////////////////////////////
// Name:           TUsrMux
// Purpose:        Class to store hit data
// Description:    Describes a single hit.
// Keywords:       
//////////////////////////////////////////////////////////////////////////////

class TUsrMux : public TObject {

	public:
		TUsrMux() {};
		TUsrMux(const Char_t * ConfigFile);
		~TUsrMux() {};					// default dtor

		Bool_t Init(const Char_t * ConfigFile);
		void ClearTables();
		
		TUsrMuxLookup * MakeLookupTable(TEnv * LkpEnv);

		TUsrMuxEntry * IsMuxChannel(TUsrHit * Hit);
		Bool_t CollectHits(TUsrHBX * HbufIndex);
		void AccuSingles();
		inline void ResetIndex() { fHitIter = fLofMuxHits.MakeIterator(); };
		inline TUsrHit * NextHit() { return((TUsrHit *) fHitIter->Next()); };
		inline Int_t GetNofHits() { return(fLofMuxHits.GetEntriesFast()); };

		inline TObjArray * GetLofLookups() { return(&fLofLookups); };

		inline Bool_t IsVerbose() { return(fVerbose); };
		inline Bool_t IsDebug() { return(fDebug); };

		inline Int_t GetIndexOfFirstHisto() { return(fIndexOfFirstHisto); };
		inline Int_t GetNofHistograms() { return(fNofHistograms); };

		void PrintChanTable();
		void PrintLookup(TUsrMuxLookup * Lookup);
		void PrintLofMuxHits();

	protected:		
		TEnv * fConfig;
		Bool_t fVerbose;
		Bool_t fDebug;					// debug flag
		TString fDebugLock; 			// lock file for debug
		Int_t fSmin;					// min serial number
		Int_t fSmax;					// max serial number
		Int_t fChansPerModule;			// number of mux pchannels per adc
		Int_t fModuleRange; 			// number of channels per adc
		Int_t fIndexOfFirstHisto; 		// index of first mux histo in histo list
		Int_t fNofHistograms; 			// number of histograms
		TIterator * fHitIter;			// hit iterator
		TObjArray fChanTable;			// describes where mux channels are located in the adcs
		TObjArray fLofMuxEntries;  		// collects mux channels (TUsrMuxEntry) of current event
		TObjArray fLofMuxHits; 			// collects mux hits (TUsrHit) of current event
		TObjArray fLofLookups; 			// list of lookups generated (TUsrMuxLookup)
		
	ClassDef(TUsrMux, 1)				// [Analyze] Mesytec Mux16 Multiplexer
};

#endif
 TUsrMux.h:1
 TUsrMux.h:2
 TUsrMux.h:3
 TUsrMux.h:4
 TUsrMux.h:5
 TUsrMux.h:6
 TUsrMux.h:7
 TUsrMux.h:8
 TUsrMux.h:9
 TUsrMux.h:10
 TUsrMux.h:11
 TUsrMux.h:12
 TUsrMux.h:13
 TUsrMux.h:14
 TUsrMux.h:15
 TUsrMux.h:16
 TUsrMux.h:17
 TUsrMux.h:18
 TUsrMux.h:19
 TUsrMux.h:20
 TUsrMux.h:21
 TUsrMux.h:22
 TUsrMux.h:23
 TUsrMux.h:24
 TUsrMux.h:25
 TUsrMux.h:26
 TUsrMux.h:27
 TUsrMux.h:28
 TUsrMux.h:29
 TUsrMux.h:30
 TUsrMux.h:31
 TUsrMux.h:32
 TUsrMux.h:33
 TUsrMux.h:34
 TUsrMux.h:35
 TUsrMux.h:36
 TUsrMux.h:37
 TUsrMux.h:38
 TUsrMux.h:39
 TUsrMux.h:40
 TUsrMux.h:41
 TUsrMux.h:42
 TUsrMux.h:43
 TUsrMux.h:44
 TUsrMux.h:45
 TUsrMux.h:46
 TUsrMux.h:47
 TUsrMux.h:48
 TUsrMux.h:49
 TUsrMux.h:50
 TUsrMux.h:51
 TUsrMux.h:52
 TUsrMux.h:53
 TUsrMux.h:54
 TUsrMux.h:55
 TUsrMux.h:56
 TUsrMux.h:57
 TUsrMux.h:58
 TUsrMux.h:59
 TUsrMux.h:60
 TUsrMux.h:61
 TUsrMux.h:62
 TUsrMux.h:63
 TUsrMux.h:64
 TUsrMux.h:65
 TUsrMux.h:66
 TUsrMux.h:67
 TUsrMux.h:68
 TUsrMux.h:69
 TUsrMux.h:70
 TUsrMux.h:71
 TUsrMux.h:72
 TUsrMux.h:73
 TUsrMux.h:74
 TUsrMux.h:75
 TUsrMux.h:76
 TUsrMux.h:77
 TUsrMux.h:78
 TUsrMux.h:79
 TUsrMux.h:80
 TUsrMux.h:81
 TUsrMux.h:82
 TUsrMux.h:83
 TUsrMux.h:84
 TUsrMux.h:85
 TUsrMux.h:86
 TUsrMux.h:87
 TUsrMux.h:88
 TUsrMux.h:89
 TUsrMux.h:90
 TUsrMux.h:91
 TUsrMux.h:92
 TUsrMux.h:93
 TUsrMux.h:94
 TUsrMux.h:95
 TUsrMux.h:96
 TUsrMux.h:97
 TUsrMux.h:98
 TUsrMux.h:99
 TUsrMux.h:100
 TUsrMux.h:101
 TUsrMux.h:102
 TUsrMux.h:103
 TUsrMux.h:104
 TUsrMux.h:105
 TUsrMux.h:106
 TUsrMux.h:107
 TUsrMux.h:108
 TUsrMux.h:109
 TUsrMux.h:110
 TUsrMux.h:111
 TUsrMux.h:112
 TUsrMux.h:113
 TUsrMux.h:114
 TUsrMux.h:115
 TUsrMux.h:116
 TUsrMux.h:117
 TUsrMux.h:118
 TUsrMux.h:119
 TUsrMux.h:120
 TUsrMux.h:121
 TUsrMux.h:122
 TUsrMux.h:123
 TUsrMux.h:124
 TUsrMux.h:125
 TUsrMux.h:126
 TUsrMux.h:127
 TUsrMux.h:128
 TUsrMux.h:129
 TUsrMux.h:130
 TUsrMux.h:131
 TUsrMux.h:132
 TUsrMux.h:133
 TUsrMux.h:134
 TUsrMux.h:135
 TUsrMux.h:136
 TUsrMux.h:137
 TUsrMux.h:138
 TUsrMux.h:139
 TUsrMux.h:140
 TUsrMux.h:141
 TUsrMux.h:142
 TUsrMux.h:143
 TUsrMux.h:144
 TUsrMux.h:145
 TUsrMux.h:146
 TUsrMux.h:147
 TUsrMux.h:148
 TUsrMux.h:149
 TUsrMux.h:150
 TUsrMux.h:151
 TUsrMux.h:152
 TUsrMux.h:153
 TUsrMux.h:154
 TUsrMux.h:155
 TUsrMux.h:156
 TUsrMux.h:157
 TUsrMux.h:158
 TUsrMux.h:159
 TUsrMux.h:160
 TUsrMux.h:161
 TUsrMux.h:162
 TUsrMux.h:163
 TUsrMux.h:164
 TUsrMux.h:165
 TUsrMux.h:166
 TUsrMux.h:167