ROOT logo
#ifndef __TMrbCaen_V1X90_h__
#define __TMrbCaen_V1X90_h__

//_________________________________________________[C++ CLASS DEFINITION FILE]
//////////////////////////////////////////////////////////////////////////////
// Name:           expconf/inc/TMrbCaen_V1X90.h
// Purpose:        Define experimental configuration for MARaBOU
// Class:          TMrbCaen_V1X90        -- 128 chn TDC
// Description:    Class definitions to implement a configuration front-end for MARaBOU
// Author:         R. Lutter
// Revision:       $Id: TMrbCaen_V1X90.h,v 1.1 2009-07-20 07:09:43 Marabou Exp $       
// Date:           
// Keywords:
//////////////////////////////////////////////////////////////////////////////

namespace std {} using namespace std;

#include <cstdlib>
#include <iostream>
#include <sstream>
#include <iomanip>
#include <fstream>

#include "Rtypes.h"
#include "TSystem.h"
#include "TObject.h"
#include "TArrayS.h"

#include "TMrbVMEModule.h"

class TMrbSubevent;
class TMrbVMEChannel;

//______________________________________________________[C++ CLASS DEFINITION]
//////////////////////////////////////////////////////////////////////////////
// Name:           TMrbCaen_V1X90
// Purpose:        Define a VME adc type CAEN V1X90
// Description:    Defines a VME adc CAEN V1X90
// Keywords:
//////////////////////////////////////////////////////////////////////////////

class TMrbCaen_V1X90 : public TMrbVMEModule {

	public:
		enum				{	kSegSize			=	0x10000	};
		enum				{	kAddrMod			=	0x39	};

		enum				{	kAllChannels		=	-1		};
		enum				{	kNofChannels		=	128		};

		enum EMrbRegisters	{	kRegTriggerMode,
								kRegWindowWidth,
								kRegWindowOffset,
								kRegSearchMargin,
								kRegRejectMargin,
								kRegTrigTimeSubtr,
								kRegEdgeDetection,
								kRegEdgeResolution,
								kRegPairResolutionEdge,
								kRegPairResolutionWidth,
								kRegDeadTime,
								kRegHeaderTrailer,
								kRegEventSize,
								kRegFifoSize,
								kRegChannelEnable,
								kRegAlmostFullLevel
							};
		
		enum EMrbEdgeDetect {	kEdgeDetectPair,
								kEdgeDetectTrailing,
								kEdgeDetectLeading,
								kEdgeDetectBoth
							};
		enum				{	kEdgeDetectDefault	=	kEdgeDetectLeading	};

		enum EMrbEdgeRes	{	kEdgeRes800,
								kEdgeRes200,
								kEdgeRes100,
								kEdgeResOff
							};
		enum				{	kEdgeResDefault	=	kEdgeRes100	};

		enum EMrbPairRes	{	kPairRes100,
								kPairRes200,
								kPairRes400,
								kPairRes800,
								kPairRes1600,
								kPairRes3125,
								kPairRes6250,
								kPairRes12500,
								kPairRes25ns,
								kPairRes50ns,
								kPairRes100ns,
								kPairRes200ns,
								kPairRes400ns,
								kPairRes800ns
							};
		enum				{	kPairResDefault	=	kPairRes100	};

		enum EMrbDeadTime 	{	kDtime5,
								kDtime10,
								kDtime30,
								kDtime100
							};
		enum				{	kDtimeDefault	=	kDtime5	};

		enum EMrbEventSize 	{	kEvtSiz0,
								kEvtSiz1,
								kEvtSiz2,
								kEvtSiz4,
								kEvtSiz8,
								kEvtSiz16,
								kEvtSiz32,
								kEvtSiz64,
								kEvtSiz128,
								kEvtSizNoLim,
							};
		enum				{	kEvtSizDefault	=	kEvtSizNoLim	};

		enum EMrbFifoSize 	{	kFifoSiz2,
								kFifoSiz4,
								kFifoSiz8,
								kFifoSiz16,
								kFifoSiz32,
								kFifoSiz64,
								kFifoSiz128,
								kFifoSiz256
							};
		enum				{	kFifoSizDefault	=	kFifoSiz256	};

		enum				{	kWindowWidthDefault =		20	};
		enum				{	kWindowOffsetDefault =		-40	};
		enum				{	kSearchMarginDefault =		8	};
		enum				{	kRejectMarginDefault =		4	};
		enum				{	kAlmostFullLevelDefault =	64	};

	public:

		TMrbCaen_V1X90() {};  												// default ctor
		TMrbCaen_V1X90(const Char_t * ModuleName, UInt_t BaseAddr); 	// define a new adc
		~TMrbCaen_V1X90() {};												// default dtor

		Bool_t MakeReadoutCode(ofstream & RdoStrm, TMrbConfig::EMrbModuleTag TagIndex);  	// generate part of code
		Bool_t MakeReadoutCode(ofstream & RdoStrm, TMrbConfig::EMrbModuleTag TagIndex, TMrbVMEChannel * Channel, Int_t Value = 0);  	// generate code for given channel

		virtual inline const Char_t * GetMnemonic() const { return("caen_V1X90"); }; 	// module mnemonic

		inline void SetTriggerMatchingOn(Bool_t Flag = kTRUE) { fTriggerMatching = Flag; };
		inline Bool_t TriggerMatchingIsOn() { return(fTriggerMatching); };

		inline Bool_t SetWindowWidthTicks(Int_t Width) { return(this->Set(TMrbCaen_V1X90::kRegWindowWidth, Width)); };
		inline Int_t GetWindowWidthTicks() { return(this->Get(TMrbCaen_V1X90::kRegWindowWidth)); };
		inline Int_t GetWindowWidthNsec() { return(this->GetWindowWidthTicks() * 25); };

		inline Bool_t SetWindowOffsetTicks(Int_t Offset) { return(this->Set(TMrbCaen_V1X90::kRegWindowOffset, Offset)); };
		inline Int_t GetWindowOffsetTicks() { return(this->Get(TMrbCaen_V1X90::kRegWindowOffset)); };
		inline Int_t GetWindowOffsetNsec() { return(this->GetWindowOffsetTicks() * 25); };

		inline Bool_t SetSearchMarginTicks(Int_t Margin) { return(this->Set(TMrbCaen_V1X90::kRegSearchMargin, Margin)); };
		inline Int_t GetSearchMarginTicks() { return(this->Get(TMrbCaen_V1X90::kRegSearchMargin)); };
		inline Int_t GetSearchMarginNsec() { return(this->GetSearchMarginTicks() * 25); };

		inline Bool_t SetRejectMarginTicks(Int_t Margin) { return(this->Set(TMrbCaen_V1X90::kRegRejectMargin, Margin)); };
		inline Int_t GetRejectMarginTicks() { return(this->Get(TMrbCaen_V1X90::kRegRejectMargin)); };
		inline Int_t GetRejectMarginNsec() { return(this->GetRejectMarginTicks() * 25); };

		inline void EnableTriggerTimeSubtraction(Bool_t Flag) { fSubtractTrigTime = Flag; };
		inline Bool_t TriggerTimeSubtractionEnabled() { return(fSubtractTrigTime); };


		Bool_t SetResolution(Int_t Mode, Int_t Eticks, Int_t Wticks = -1);
		TMrbNamedX * GetEdgeDetection();
		TMrbNamedX * GetEdgeResolution();
		TMrbNamedX * GetPairResolution();
		TMrbNamedX * GetPairWidth();

		inline void EnableErrorMark(Bool_t Flag = kTRUE) { fErrorMark = Flag; };
		inline Bool_t ErrorMarkEnabled() { return(fErrorMark); };

		inline Bool_t SetDeadTime(Int_t Ticks) { return(this->Set(TMrbCaen_V1X90::kRegDeadTime, Ticks)); };
		TMrbNamedX * GetDeadTime();

		inline Bool_t SetEventSize(Int_t Size) { return(this->Set(TMrbCaen_V1X90::kRegEventSize, Size)); };
		TMrbNamedX * GetEventSize();

		inline Bool_t SetFifoSize(Int_t Size) { return(this->Set(TMrbCaen_V1X90::kRegFifoSize, Size)); };
		TMrbNamedX * GetFifoSize();

		inline Bool_t SetAlmostFullLevel(Int_t Level) { return(this->Set(TMrbCaen_V1X90::kRegAlmostFullLevel, Level)); };
		inline Int_t GetAlmostFullLevel() { return(this->Get(TMrbCaen_V1X90::kRegAlmostFullLevel)); };

		inline void EnableHeaderTrailer(Bool_t Flag = kTRUE) { fHeaderTrailer = Flag; };
		inline Bool_t HeaderTrailerEnabled() { return(fHeaderTrailer); };

		inline void EnableExtendedTriggerTag(Bool_t Flag = kTRUE) { fExtendedTriggerTag = Flag; };
		inline Bool_t ExtendedTriggerTagEnabled() { return(fExtendedTriggerTag); };

		inline void EnableEmptyEvent(Bool_t Flag = kTRUE) { fEmptyEvent = Flag; };
		inline Bool_t EmptyEventEnabled() { return(fEmptyEvent); };

		inline void EnableEventFifo(Bool_t Flag = kTRUE) { fEventFifo = Flag; };
		inline Bool_t EventFifoEnabled() { return(fEventFifo); };

		Bool_t EnableChannel(Int_t Channel = kAllChannels);
		Bool_t EnableChannel(Int_t ChannelFrom, Int_t ChannelTo);
		Bool_t DisableChannel(Int_t Channel = kAllChannels);
		Bool_t DisableChannel(Int_t ChannelFrom, Int_t ChannelTo);
		Bool_t IsChannelEnabled(Int_t Channel);
		inline TArrayS * GetChannelPattern() { return(&fChannelPattern); };

		Bool_t UseSettings(const Char_t * SettingsFile = NULL);
		Bool_t SaveSettings(const Char_t * SettingsFile = NULL);

		inline void SetVerboseMode(Bool_t Flag = kTRUE) { fVerboseMode = Flag; };
		inline Bool_t IsVerboseMode() { return(fVerboseMode); };
		inline void SetVerify(Bool_t Flag = kTRUE) { fVerify = Flag; };
		inline Bool_t IsVerify() { return(fVerify); };
		inline void DumpRegisters(Bool_t Flag = kTRUE) { fDumpRegisters = Flag; };
		inline Bool_t RegistersToBeDumped() { return(fDumpRegisters); };

		inline void UpdateSettings(Bool_t Flag = kTRUE) { fUpdateSettings = Flag; };	// update settings
		inline Bool_t SettingsToBeUpdated() { return(fUpdateSettings); };
		inline void SetUpdateInterval(Int_t Interval = 0) { fUpdateInterval = Interval; };
		inline Int_t GetUpdateInterval() { return(fUpdateInterval); };

		void PrintSettings(ostream & OutStrm);
		inline void PrintSettings() { this->PrintSettings(cout); };

		inline Char_t * GetDeviceStruct() { return(Form("s_%s", this->GetName())); };

 		virtual Bool_t CheckSubeventType(TMrbSubevent * Subevent) const;		// check if subevent type is [10,4x]

		inline Bool_t HasRandomReadout() const { return(kFALSE); };

		virtual inline Bool_t HasPrivateCode() const { return(kTRUE); }; 			// use private code files
		virtual inline const Char_t * GetPrivateCodeFile() const { return("Module_Caen_V1X90"); };
		
		inline void Help() { gSystem->Exec(Form("mrbHelp %s", this->ClassName())); };

	protected:
		void DefineRegisters(); 							// define vme registers
		void SetChannelEnable(Int_t Channel);

	protected:
		Bool_t fVerboseMode;
		Bool_t fVerify;
		Bool_t fDumpRegisters;

		Bool_t fUpdateSettings;
		Int_t fUpdateInterval;

		Bool_t fTriggerMatching;
		Bool_t fSubtractTrigTime;
		Bool_t fHeaderTrailer;
		Bool_t fExtendedTriggerTag;
		Bool_t fEmptyEvent;
		Bool_t fEventFifo;
		Bool_t fErrorMark;

		TMrbNamedX * fEdgeDetection;
		TMrbNamedX * fResolution;
		TMrbNamedX * fDoubleHitRes;
		TMrbNamedX * fPairResEdge;
		TMrbNamedX * fPairResWidth;
		TMrbNamedX * fEventSize;
		TArrayS fChannelPattern;

		TString fSettingsFile;

	ClassDef(TMrbCaen_V1X90, 1)		// [Config] CAEN V1X90, 128 chn VME TDC
};

#endif
 TMrbCaen_V1X90.h:1
 TMrbCaen_V1X90.h:2
 TMrbCaen_V1X90.h:3
 TMrbCaen_V1X90.h:4
 TMrbCaen_V1X90.h:5
 TMrbCaen_V1X90.h:6
 TMrbCaen_V1X90.h:7
 TMrbCaen_V1X90.h:8
 TMrbCaen_V1X90.h:9
 TMrbCaen_V1X90.h:10
 TMrbCaen_V1X90.h:11
 TMrbCaen_V1X90.h:12
 TMrbCaen_V1X90.h:13
 TMrbCaen_V1X90.h:14
 TMrbCaen_V1X90.h:15
 TMrbCaen_V1X90.h:16
 TMrbCaen_V1X90.h:17
 TMrbCaen_V1X90.h:18
 TMrbCaen_V1X90.h:19
 TMrbCaen_V1X90.h:20
 TMrbCaen_V1X90.h:21
 TMrbCaen_V1X90.h:22
 TMrbCaen_V1X90.h:23
 TMrbCaen_V1X90.h:24
 TMrbCaen_V1X90.h:25
 TMrbCaen_V1X90.h:26
 TMrbCaen_V1X90.h:27
 TMrbCaen_V1X90.h:28
 TMrbCaen_V1X90.h:29
 TMrbCaen_V1X90.h:30
 TMrbCaen_V1X90.h:31
 TMrbCaen_V1X90.h:32
 TMrbCaen_V1X90.h:33
 TMrbCaen_V1X90.h:34
 TMrbCaen_V1X90.h:35
 TMrbCaen_V1X90.h:36
 TMrbCaen_V1X90.h:37
 TMrbCaen_V1X90.h:38
 TMrbCaen_V1X90.h:39
 TMrbCaen_V1X90.h:40
 TMrbCaen_V1X90.h:41
 TMrbCaen_V1X90.h:42
 TMrbCaen_V1X90.h:43
 TMrbCaen_V1X90.h:44
 TMrbCaen_V1X90.h:45
 TMrbCaen_V1X90.h:46
 TMrbCaen_V1X90.h:47
 TMrbCaen_V1X90.h:48
 TMrbCaen_V1X90.h:49
 TMrbCaen_V1X90.h:50
 TMrbCaen_V1X90.h:51
 TMrbCaen_V1X90.h:52
 TMrbCaen_V1X90.h:53
 TMrbCaen_V1X90.h:54
 TMrbCaen_V1X90.h:55
 TMrbCaen_V1X90.h:56
 TMrbCaen_V1X90.h:57
 TMrbCaen_V1X90.h:58
 TMrbCaen_V1X90.h:59
 TMrbCaen_V1X90.h:60
 TMrbCaen_V1X90.h:61
 TMrbCaen_V1X90.h:62
 TMrbCaen_V1X90.h:63
 TMrbCaen_V1X90.h:64
 TMrbCaen_V1X90.h:65
 TMrbCaen_V1X90.h:66
 TMrbCaen_V1X90.h:67
 TMrbCaen_V1X90.h:68
 TMrbCaen_V1X90.h:69
 TMrbCaen_V1X90.h:70
 TMrbCaen_V1X90.h:71
 TMrbCaen_V1X90.h:72
 TMrbCaen_V1X90.h:73
 TMrbCaen_V1X90.h:74
 TMrbCaen_V1X90.h:75
 TMrbCaen_V1X90.h:76
 TMrbCaen_V1X90.h:77
 TMrbCaen_V1X90.h:78
 TMrbCaen_V1X90.h:79
 TMrbCaen_V1X90.h:80
 TMrbCaen_V1X90.h:81
 TMrbCaen_V1X90.h:82
 TMrbCaen_V1X90.h:83
 TMrbCaen_V1X90.h:84
 TMrbCaen_V1X90.h:85
 TMrbCaen_V1X90.h:86
 TMrbCaen_V1X90.h:87
 TMrbCaen_V1X90.h:88
 TMrbCaen_V1X90.h:89
 TMrbCaen_V1X90.h:90
 TMrbCaen_V1X90.h:91
 TMrbCaen_V1X90.h:92
 TMrbCaen_V1X90.h:93
 TMrbCaen_V1X90.h:94
 TMrbCaen_V1X90.h:95
 TMrbCaen_V1X90.h:96
 TMrbCaen_V1X90.h:97
 TMrbCaen_V1X90.h:98
 TMrbCaen_V1X90.h:99
 TMrbCaen_V1X90.h:100
 TMrbCaen_V1X90.h:101
 TMrbCaen_V1X90.h:102
 TMrbCaen_V1X90.h:103
 TMrbCaen_V1X90.h:104
 TMrbCaen_V1X90.h:105
 TMrbCaen_V1X90.h:106
 TMrbCaen_V1X90.h:107
 TMrbCaen_V1X90.h:108
 TMrbCaen_V1X90.h:109
 TMrbCaen_V1X90.h:110
 TMrbCaen_V1X90.h:111
 TMrbCaen_V1X90.h:112
 TMrbCaen_V1X90.h:113
 TMrbCaen_V1X90.h:114
 TMrbCaen_V1X90.h:115
 TMrbCaen_V1X90.h:116
 TMrbCaen_V1X90.h:117
 TMrbCaen_V1X90.h:118
 TMrbCaen_V1X90.h:119
 TMrbCaen_V1X90.h:120
 TMrbCaen_V1X90.h:121
 TMrbCaen_V1X90.h:122
 TMrbCaen_V1X90.h:123
 TMrbCaen_V1X90.h:124
 TMrbCaen_V1X90.h:125
 TMrbCaen_V1X90.h:126
 TMrbCaen_V1X90.h:127
 TMrbCaen_V1X90.h:128
 TMrbCaen_V1X90.h:129
 TMrbCaen_V1X90.h:130
 TMrbCaen_V1X90.h:131
 TMrbCaen_V1X90.h:132
 TMrbCaen_V1X90.h:133
 TMrbCaen_V1X90.h:134
 TMrbCaen_V1X90.h:135
 TMrbCaen_V1X90.h:136
 TMrbCaen_V1X90.h:137
 TMrbCaen_V1X90.h:138
 TMrbCaen_V1X90.h:139
 TMrbCaen_V1X90.h:140
 TMrbCaen_V1X90.h:141
 TMrbCaen_V1X90.h:142
 TMrbCaen_V1X90.h:143
 TMrbCaen_V1X90.h:144
 TMrbCaen_V1X90.h:145
 TMrbCaen_V1X90.h:146
 TMrbCaen_V1X90.h:147
 TMrbCaen_V1X90.h:148
 TMrbCaen_V1X90.h:149
 TMrbCaen_V1X90.h:150
 TMrbCaen_V1X90.h:151
 TMrbCaen_V1X90.h:152
 TMrbCaen_V1X90.h:153
 TMrbCaen_V1X90.h:154
 TMrbCaen_V1X90.h:155
 TMrbCaen_V1X90.h:156
 TMrbCaen_V1X90.h:157
 TMrbCaen_V1X90.h:158
 TMrbCaen_V1X90.h:159
 TMrbCaen_V1X90.h:160
 TMrbCaen_V1X90.h:161
 TMrbCaen_V1X90.h:162
 TMrbCaen_V1X90.h:163
 TMrbCaen_V1X90.h:164
 TMrbCaen_V1X90.h:165
 TMrbCaen_V1X90.h:166
 TMrbCaen_V1X90.h:167
 TMrbCaen_V1X90.h:168
 TMrbCaen_V1X90.h:169
 TMrbCaen_V1X90.h:170
 TMrbCaen_V1X90.h:171
 TMrbCaen_V1X90.h:172
 TMrbCaen_V1X90.h:173
 TMrbCaen_V1X90.h:174
 TMrbCaen_V1X90.h:175
 TMrbCaen_V1X90.h:176
 TMrbCaen_V1X90.h:177
 TMrbCaen_V1X90.h:178
 TMrbCaen_V1X90.h:179
 TMrbCaen_V1X90.h:180
 TMrbCaen_V1X90.h:181
 TMrbCaen_V1X90.h:182
 TMrbCaen_V1X90.h:183
 TMrbCaen_V1X90.h:184
 TMrbCaen_V1X90.h:185
 TMrbCaen_V1X90.h:186
 TMrbCaen_V1X90.h:187
 TMrbCaen_V1X90.h:188
 TMrbCaen_V1X90.h:189
 TMrbCaen_V1X90.h:190
 TMrbCaen_V1X90.h:191
 TMrbCaen_V1X90.h:192
 TMrbCaen_V1X90.h:193
 TMrbCaen_V1X90.h:194
 TMrbCaen_V1X90.h:195
 TMrbCaen_V1X90.h:196
 TMrbCaen_V1X90.h:197
 TMrbCaen_V1X90.h:198
 TMrbCaen_V1X90.h:199
 TMrbCaen_V1X90.h:200
 TMrbCaen_V1X90.h:201
 TMrbCaen_V1X90.h:202
 TMrbCaen_V1X90.h:203
 TMrbCaen_V1X90.h:204
 TMrbCaen_V1X90.h:205
 TMrbCaen_V1X90.h:206
 TMrbCaen_V1X90.h:207
 TMrbCaen_V1X90.h:208
 TMrbCaen_V1X90.h:209
 TMrbCaen_V1X90.h:210
 TMrbCaen_V1X90.h:211
 TMrbCaen_V1X90.h:212
 TMrbCaen_V1X90.h:213
 TMrbCaen_V1X90.h:214
 TMrbCaen_V1X90.h:215
 TMrbCaen_V1X90.h:216
 TMrbCaen_V1X90.h:217
 TMrbCaen_V1X90.h:218
 TMrbCaen_V1X90.h:219
 TMrbCaen_V1X90.h:220
 TMrbCaen_V1X90.h:221
 TMrbCaen_V1X90.h:222
 TMrbCaen_V1X90.h:223
 TMrbCaen_V1X90.h:224
 TMrbCaen_V1X90.h:225
 TMrbCaen_V1X90.h:226
 TMrbCaen_V1X90.h:227
 TMrbCaen_V1X90.h:228
 TMrbCaen_V1X90.h:229
 TMrbCaen_V1X90.h:230
 TMrbCaen_V1X90.h:231
 TMrbCaen_V1X90.h:232
 TMrbCaen_V1X90.h:233
 TMrbCaen_V1X90.h:234
 TMrbCaen_V1X90.h:235
 TMrbCaen_V1X90.h:236
 TMrbCaen_V1X90.h:237
 TMrbCaen_V1X90.h:238
 TMrbCaen_V1X90.h:239
 TMrbCaen_V1X90.h:240
 TMrbCaen_V1X90.h:241
 TMrbCaen_V1X90.h:242
 TMrbCaen_V1X90.h:243
 TMrbCaen_V1X90.h:244
 TMrbCaen_V1X90.h:245
 TMrbCaen_V1X90.h:246
 TMrbCaen_V1X90.h:247
 TMrbCaen_V1X90.h:248
 TMrbCaen_V1X90.h:249
 TMrbCaen_V1X90.h:250
 TMrbCaen_V1X90.h:251
 TMrbCaen_V1X90.h:252
 TMrbCaen_V1X90.h:253
 TMrbCaen_V1X90.h:254
 TMrbCaen_V1X90.h:255
 TMrbCaen_V1X90.h:256
 TMrbCaen_V1X90.h:257
 TMrbCaen_V1X90.h:258
 TMrbCaen_V1X90.h:259
 TMrbCaen_V1X90.h:260
 TMrbCaen_V1X90.h:261
 TMrbCaen_V1X90.h:262
 TMrbCaen_V1X90.h:263
 TMrbCaen_V1X90.h:264
 TMrbCaen_V1X90.h:265
 TMrbCaen_V1X90.h:266
 TMrbCaen_V1X90.h:267
 TMrbCaen_V1X90.h:268
 TMrbCaen_V1X90.h:269
 TMrbCaen_V1X90.h:270
 TMrbCaen_V1X90.h:271
 TMrbCaen_V1X90.h:272
 TMrbCaen_V1X90.h:273