ROOT logo
//*****************************************************************************
// File: $RCSfile: $
//
// Author: Joern Wuestenfeld
//
// Version: $Revision $
// Modified by $Author $
//
//*****************************************************************************
#include "hmdcdataword.h"
#include "hmessagemgr.h"
#include "hevent.h"
#include "heventheader.h"

ClassImp(HMdcDataword)

    HMdcDataword::HMdcDataword(Bool_t comment)
{
    // Default constructor.
    // Coment switches off possible debug printouts.
    noComment = comment;
    clearAll();
}

HMdcDataword::HMdcDataword(void)
{
    // Constructor.
    // Debugoutput is always switched on. Use setQuiteMode() to disable it.
    clearAll();
}

Bool_t HMdcDataword::checkConsistency(UInt_t version, UInt_t data)
{
		// checks for the different decoding version whether the decoded value are consistent.
		// I.e. that
		//           tdcNb in [ 0,   11]
		//        channels in [ 0,    7]
		//           time1 in [ 0,0x7ff] (only here hex value!)
		//            time in [ 0,0x7ff] (only here hex value!)
		//
		// return values:
		//  kTRUE all checks passed
		//  kFALSE else
		Int_t tdcNbMin = 0;
		Int_t tdcNbMax = 11;
		Int_t chanMin  = 0;
		Int_t chanMax  = 7;
		Int_t hitMin   = 0;
		Int_t hitMax   = 1;
		Int_t timeMin  = 0;
		Int_t timeMax  = 0x7ff;
		
		switch(version)
		{
				case 0:
						//           tdcNb in [ 0,   11]
						//        channels in [ 0,    7]
						//            time in [ 0,0x7ff]
						if (tdcNumber < tdcNbMin || tdcNumber > tdcNbMax )
						{
								if(!noComment)Error("checkConsistency()","%s = %i out of range [%i,%i] while decoding: 0x%08x", "TDC Number", tdcNumber, tdcNbMin, tdcNbMax, data  );
								return kFALSE;
						}
						if (channel < chanMin || channel > chanMax )
						{
								if(!noComment)Error("checkConsistency()","%s = %i out of range [%i,%i] while decoding: 0x%08x", "Channel Number", channel, chanMin, chanMax, data  );
								return kFALSE;
						}
						if (hit < hitMin || hit > hitMax )
						{
								if(!noComment)Error("checkConsistency()","%s = %i out of range [%i,%i] while decoding: 0x%08x", "Hit Number (modulo 2)", hit, hitMin, hitMax, data  );
								return kFALSE;
						}
						if (time < timeMin || time > timeMax )
						{
								if(!noComment)Error("checkConsistency()","%s = %i out of range [%i,%x] while decoding: 0x%08x", "Time", time, timeMin, timeMax, data  );
								return kFALSE;
						}
						break;
				case 2:
						break;
				case 4:
						//           tdcNb in [ 0,   11]
						//        channels in [ 0,    7]
						//           time1 in [ 0,0x7ff]
						//            time in [ 0,0x7ff]
						
						if (tdcNumber < tdcNbMin || tdcNumber > tdcNbMax )
						{
								if(!noComment)Error("checkConsistency()","%s = %i out of range [%i,%i] while decoding: 0x%08x", "TDC Number", tdcNumber, tdcNbMin, tdcNbMax, data  );
								return kFALSE;
						}
						if (channel < chanMin || channel > chanMax )
						{
								if(!noComment)Error("checkConsistency()","%s = %i out of range [%i,%i] while decoding: 0x%08x", "Channel Number", channel, chanMin, chanMax, data  );
								return kFALSE;
						}
						if (time < timeMin || time > timeMax )
						{
								if(!noComment)Error("checkConsistency()","%s = %i out of range [%i,%x] while decoding: 0x%08x", "Time", time, timeMin, timeMax, data  );
								return kFALSE;
						}
						if (time1 < timeMin || time1 > timeMax )
						{
								if(!noComment)Error("checkConsistency()","%s = %i out of range [%i,%x] while decoding: 0x%08x", "Time 1", time1, timeMin, timeMax, data  );
								return kFALSE;
						}
						break;
				default:
						if(!noComment)Error("checkConsistency()","decoding version %i not valid",version);
						return kFALSE;
		}
		return kTRUE;
}

void HMdcDataword::clearData(void)
{
    mboAddress=tdcNumber=channel=hit=time=-1;
    time1 = -1;
		statusCode = -1;
		statusData = 1;
}

Bool_t HMdcDataword::decode(const UInt_t data, Bool_t consistencyCheck)
{
		// Decoding of the data word. version sets the
		// different decode version. A consistency check of the data
		// word is performed optionally (consistencyCheck=kTRUE).
		// Bit 29 to 31 define decoding type:
		// (data>>29)&0x7 -> type: 
		//          0 = debug(uncomressed) dataformat
		//          2 = status datawords
		//          4 = compressed data format (t1 and t2 in one word )
		
		if(data != 0)
		{
				decodeType = (data>>29)&m3;
				switch(decodeType)
				{
						case 0:
								//*****************************************************
								// Debug dataformat
								// decoding of 32 bit data word from right->left
								//
								//  bits        sz  mask           comments
								// ----------------------------------------------------
								//  0 - 10      11  0x7ff          time value (hit 0)
								//  11           1  0x1            hit
								//  12 - 14      3  0x7            Channel# of TDC chip 0..7
								//  15 - 18      4  0xf            Tdc chip# 1..12
								//*****************************************************
								tdcNumber		= ((data & m32) >> 25 & m4)-1;
								channel			=  (data & m32) >> 22 & m3;
								hit					=  (data & m32) >> 21 & m1;
								time				=  (data & m32) & m11;
								break;
						case 2:
								//*****************************************************
								// Status word 
								// decoding of 32 bit data word from right->left
								//
								//  bits        sz  mask           comments
								// ----------------------------------------------------
								//  0 - 23       24 0xFFFFFF       data
								//  24 - 28      5  0x1F           code
								//*****************************************************
								statusCode = ((data & m32) >> 24 & m5);
								statusData = (data & m24);
								break;
						case 4:
								//*****************************************************
								// compressed data format
								// decoding of 32 bit data word from right->left
								//
								//  bits        sz  mask           comments
								// ----------------------------------------------------
								//  0 - 10      11  0x7ff          time value (hit 0)
								// 11 - 21      11  0x7ff          time value (hit 1- if normal mode, 0x0 otherwise)
								// 22 - 24       3  0x7            Channel of TDC Chip#0..7
								// 25 - 28       4  0xf            TDC Chip#1..12
								//(29 - 31)      3  0x7            data type, decoded in unpacker already)
								//******************************************************
								time1				=   (data & m32) & m11;
								time				=  ((data & m32) >> 11) & m11;
								channel			=  ((data & m32) >> 22) & m3;
								tdcNumber		= (((data & m32) >> 25) & m4)-1;
								break;
						default:
								if(!noComment) Error("decode","decoding version %i not a valid number",decodeType);
								return kFALSE;
				}
				if (consistencyCheck) return checkConsistency(decodeType, data);
				return kTRUE;
		}
		return kFALSE;
}

void HMdcDataword::dump(void)
{
		// dumps the event sequence number to the screen.
		
		Info(" dump()","----------------------------------------");
		if (gHades) Info(" dump()","--- EvtSeqNr: %i\n",
				((HEventHeader*)((HEvent*)(gHades->getCurrentEvent())->getHeader()))->getEventSeqNumber());
		print(decodeType);
		Info(" dump()","----------------------------------------");
}


UInt_t HMdcDataword::getCodedDataword(UInt_t version)
{
    // Recode the 32 bit data word. version sets the
    // different decode version.

    UInt_t code = 0;

    switch(version)
    {
    case 0:
	code |= (tdcNumber+1) << 25;
	code |= channel << 22;
	code |= hit << 21;
	code |= time;
	break;
    case 1:
	code |= time & m11;
	code |= (time1 & m11) << 11;
	code |= (channel & m3) << 21;
	code |= ((tdcNumber+1) & m4) << 24;
	code |= (decodeType &m3) << 28;
	break;
    default:
	if(!noComment) Error("recode","version %i not a valid number",version);
	return kFALSE;
    }
    return code;
}

Bool_t HMdcDataword::subHeader(const UInt_t *data, UInt_t version, Bool_t consistencyCheck)
{
    // decodes the subheader information of the mdc data word
    // version sets the different decode version. A consistency check of the data
    // word is performed optionally (consistencyCheck=kTRUE).

    switch(version)
    {
    case 0:
    case 1:
	if((*data & m16) > 0x1fff )
	{
	    module	= ((*data &0x37f) & 0xf00) >> 8;
	    sector	= ((*data &0x37f) & 0xf0) >> 4;
	    mboAddress = ((*data &0x37f) &0xf);
	    subEventSize = (*data & 0xffff0000) >> 16;
	    mbo = mboAddress;
	    return kTRUE;
	}
	break;
    default:
	return kFALSE;
	break;
    }
    return kFALSE;
}

void HMdcDataword::print(UInt_t version)
{
    //Print out the contents of the dataword.
    switch(version)
    {
    case 0:
	gHades->getMsg()->info(10,HMessageMgr::DET_MDC,ClassName(),"%s: %2i | %s: %2i | %s: %2i | %s: %2i | %s: %4i ","mboNb",mboAddress, "tdcNb",tdcNumber, "chan", channel,"hit", hit,"time", time);
	gHades->getMsg()->info(10,HMessageMgr::DET_MDC,ClassName(),">>> RAW-Address:");
	gHades->getMsg()->info(10,HMessageMgr::DET_MDC,ClassName(),"%s: %2i | %s: %2i | %s: %2i | %s: %2i","sector" ,sector, "module" ,module, "mbo"    ,mbo, "tdc"    ,tdc);
	gHades->getMsg()->info(10,HMessageMgr::DET_MDC,ClassName()," | %s: %2i | %s: %2i", "channel ",channel, "hit ", hit);
	break;
    case 1:
	gHades->getMsg()->info(10,HMessageMgr::DET_MDC,ClassName(),"%s: %2i | %s: %2i | %s: %2i | %s: %2i | %s: %4i | %s: %4i   ","mboNb",mboAddress, "tdcNb",tdcNumber, "chan", channel,"hit", hit,"time", time,"time 1",time1);
	gHades->getMsg()->info(10,HMessageMgr::DET_MDC,ClassName(),">>> RAW-Address:");
	gHades->getMsg()->info(10,HMessageMgr::DET_MDC,ClassName(),"%s: %2i | %s: %2i | %s: %2i | %s: %2i","sector" ,sector, "module" ,module, "mbo"    ,mbo, "tdc"    ,tdc);
	gHades->getMsg()->info(10,HMessageMgr::DET_MDC,ClassName()," | %s: %2i | %s: %2i", "channel ",channel, "hit ", hit);
	break;
    default:
	Error("print()","decoding version %i not valid",version);
    }
    gHades->getMsg()->messageSeperator("-",60);
}


Int_t HMdcDataword::getAddress(void)
{
    return (0x2000 + (module << 8) + (sector << 4) + mbo);
}

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