ROOT logo
//*-- AUTHOR : J.Wuestenfeld
//*-- Modified : 13/08/2003 by J. Wuestenfeld

//_HADES_CLASS_DESCRIPTION
////////////////////////////////////////////////////////////////////////////
// HMdcTdcChannel
//
// Container class for the TDC channle masks of the MDC
//
////////////////////////////////////////////////////////////////////////////
using namespace std;
#include <stdlib.h>

#include "hmdctdcchannel.h"
#include "hades.h"
#include "hruntimedb.h"
#include "hspectrometer.h"
#include "hmdcdetector.h"
#include "hpario.h"
#include "hdetpario.h"
#include "hmdcrawstruct.h"
#include "hmdclookupgeom.h"
#include "hmessagemgr.h"
#include "TSystem.h"
#include <iostream>
#include <iomanip>
#include <cerrno>

ClassImp(HMdcTdcChannelTdc)
ClassImp(HMdcTdcChannelMbo)
ClassImp(HMdcTdcChannelMod)
ClassImp(HMdcTdcChannelSec)
ClassImp(HMdcTdcChannel)

void HMdcTdcChannelTdc::fill(HMdcTdcChannelTdc& r)
{
  channelMask[0]=r.getChannelMask(0);
	channelMask[1]=r.getChannelMask(1);
}

HMdcTdcChannelMbo::HMdcTdcChannelMbo(Int_t tdc, const Text_t* name)
{
  // constructor takes the number of TDCs  and the name of the MBO
  SetName(name);
  array = new TObjArray(tdc);
  for (Int_t i=0; i<tdc; ++i) array->AddAt(new HMdcTdcChannelTdc(),i);
}

HMdcTdcChannelMbo::~HMdcTdcChannelMbo()
{
  // destructor
  array->Delete();
  delete array;
}

HMdcTdcChannelMod::HMdcTdcChannelMod(Int_t mbo)
{
  // constructor takes the number of MBOs
  // The array objects of type HMdcTdcChannelMbo are created in the init function.
  array = new TObjArray(mbo);
}

HMdcTdcChannelMod::~HMdcTdcChannelMod()
{
  // destructor
  array->Delete();
  delete array;
}

void HMdcTdcChannelMod::createMbo(Int_t mbo, Int_t nTdcs, const Char_t* mboName)
{
  // creates the array object of type HMdcTdcChannelMbo
  if (mbo<array->GetSize() && array->At(mbo)==NULL) {
    array->AddAt(new HMdcTdcChannelMbo(nTdcs,mboName),mbo);
  }
}

HMdcTdcChannelSec::HMdcTdcChannelSec(Int_t mod)
{
  // constructor takes the number of modules
  array = new TObjArray(mod);
  for (Int_t i=0; i<mod; i++)
        array->AddAt(new HMdcTdcChannelMod(),i);
}

HMdcTdcChannelSec::~HMdcTdcChannelSec()
{
  // destructor
  array->Delete();
  delete array;
}

HMdcTdcChannel::HMdcTdcChannel(const Char_t* name,const Char_t* title,
                             const Char_t* context,Int_t n)
              : HParSet(name,title,context)
{
  // constructor
  strcpy(detName,"Mdc");
  oraVersion=-1;
  array = new TObjArray(n);
  mapNotConnectedChannels = kFALSE;
  status = kTRUE;
  for (Int_t i=0; i<n; i++) array->AddAt(new HMdcTdcChannelSec(),i);
  pRawStruct=(HMdcRawStruct*)(gHades->getRuntimeDb()->getContainer("MdcRawStruct"));
  pLookupGeom = (HMdcLookupGeom *)(gHades->getRuntimeDb()->getContainer("MdcLookupGeom"));
}

HMdcTdcChannel::~HMdcTdcChannel()
{
  // destructor
  array->Delete();
  delete array;
}

Bool_t HMdcTdcChannel::init(HParIo* inp,Int_t* set)
{
  // creates the array objects of type HMdcTdcChannelMbo using the data in the parameter container
  // MdcRawStruct and initializes the container from an input
  if (pRawStruct==NULL) {
    Error("HMdcTdcChannel::init()","MdcTdcChannel not initialized, container MdcRawStruct is NULL");
    return kFALSE;
  }
  for(Int_t s=0;s<getSize();s++) {
    HMdcTdcChannelSec& secPar=(*this)[s];
    HMdcRawSecStru& secStru=(*pRawStruct)[s];
    for(Int_t m=0;m<secPar.getSize();m++) {
      HMdcTdcChannelMod& modPar=secPar[m];
      HMdcRawModStru& modStru=secStru[m];
      for(Int_t i=0;i<modStru.getSize();i++) {
        modPar.createMbo(i,modStru[i].getNTdcs()/8,modStru[i].GetName());
      }
    }
  }
  if (pLookupGeom==NULL) {
    Error("HMdcTdcChannel::init()","Container MdcLookupGeom is NULL");
    return kFALSE;
  }
  HDetParIo* input=inp->getDetParIo("HMdcParIo");
  if(input) if  (!input->init(this,set)) return kFALSE;
  return kTRUE;
}

Int_t HMdcTdcChannel::write(HParIo* output)
{
  // writes the container to an output
  HDetParIo* out=output->getDetParIo("HMdcParIo");
  if (out) return out->write(this);
  return -1;
}

void HMdcTdcChannel::readline(const Char_t* buf, Int_t* set)
{
  // decodes one line read from ascii file I/O and calls HMdcTdcChannelTdc::fill(...)
  Int_t sec, mod, mbo, dbo;
  Int_t cal,meas;
  Char_t mboName[20];

  sscanf(buf,"%i%i%i%s%i%x%x",&sec, &mod, &mbo, mboName, &dbo, &cal,&meas);
  Int_t n=sec*4+mod;
  if (!set[n]) return;
  HMdcTdcChannelMbo& rMbo=(*this)[sec][mod][mbo];
  rMbo.SetName(mboName);
  HMdcTdcChannelTdc& tdc=rMbo[dbo];
  tdc.fill(cal,0);
  tdc.fill(meas,1);
  set[n]=999;
}

void HMdcTdcChannel::readLineFromFile(const Char_t* buf)
{
  // decodes one line read from ascii file I/O and calls HMdcTdcChannelTdc::fill(...)
  Int_t sec, mod, mbo, dbo;
  Int_t cal,meas;
  sscanf(buf,"%i%i%i%i%x%x", &mod, &sec, &mbo, &dbo, &cal,&meas);
  HMdcRawModStru & rawMod=(*pRawStruct)[sec][mod];
  HMdcRawMothStru &rawMbo=rawMod[mbo];
  if (rawMbo.getNTdcs() >= dbo*16 ) {
      HMdcTdcChannelMbo& rMbo=(*this)[sec][mod][mbo];
      HMdcTdcChannelTdc& db=rMbo[dbo-1];
      db.fill(cal,0);
      db.fill(meas,1);
    }
}

void HMdcTdcChannel::putAsciiHeader(TString& header)
{
  // puts the ascii header to the string used in HMdcParAsciiFileIo
  header=
    "# Channelmasks of the MDC TDC\n"
    "# Format:\n"
    "# sector  module  mbo  mboName  TDC#  cal. mask  meas. mask\n";
}

Bool_t HMdcTdcChannel::writeline(Char_t *buf, Int_t sec, Int_t mod, Int_t mbo, Int_t dbo) {
  // writes one line to the buffer used by ascii file I/O
  HMdcTdcChannelMbo& rMbo=(*this)[sec][mod][mbo];
  HMdcTdcChannelTdc& db=rMbo[dbo];
  sprintf(buf,"%1i %1i %2i %s %2i %2x %2x\n",
          sec, mod, mbo, rMbo.GetName(), dbo, db.getChannelMask(0),db.getChannelMask(1));
  return kTRUE;
}

void HMdcTdcChannel::clear() {
  // clears the container
  oraVersion=-1;
  for(Int_t s=0;s<getSize();s++) {
    HMdcTdcChannelSec& sec=(*this)[s];
    for(Int_t m=0;m<sec.getSize();m++) {
      HMdcTdcChannelMod& mod=sec[m];
      for(Int_t l=0;l<mod.getSize();l++) {
        HMdcTdcChannelMbo& mbo=mod[l];
        for(Int_t c=0;c<mbo.getSize();c++) mbo[c].clear();
      }
    }
  }
  status=kFALSE;
  resetInputVersions();
}

void HMdcTdcChannel::printParam() {
  // prints the container
	SEPERATOR_msg("-",60);
	INFO_msg(10,HMessageMgr::DET_MDC,"HMdcTdcChannel");
	INFO_msg(10,HMessageMgr::DET_MDC,"sector module layer mbo channel calMask measurementMask");
	for(Int_t s=0;s<getSize();s++) {
		HMdcTdcChannelSec& sec=(*this)[s];
		for(Int_t m=0;m<sec.getSize();m++) {
			HMdcTdcChannelMod& mod=sec[m];
			for(Int_t l=0;l<mod.getSize();l++) {
				HMdcTdcChannelMbo& mbo=mod[l];
				for(Int_t c=0;c<mbo.getSize();c++){
					gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName(),
												 "%1i %1i %2i %s %1i %2x %2x",
						 s, m, l, mbo.GetName(), c, mbo[c].getChannelMask(0),
																	mbo[c].getChannelMask(1));
				}
			}
		}
	}
	SEPERATOR_msg("-",60);
}

void HMdcTdcChannel::mapOutUnusedChannels(void)
{
  // Maps out all channels that have no wire connected. Test is done against HMdcLookupGeom container.
	for(Int_t s=0;s<getSize();s++)
	{
		HMdcTdcChannelSec& sec=(*this)[s];
		for(Int_t m=0;m<sec.getSize();m++)
		{
			HMdcTdcChannelMod& mod=sec[m];
			for(Int_t l=0;l<mod.getSize();l++)
			{
				HMdcTdcChannelMbo& mbo=mod[l];
				for(Int_t c=0;c<mbo.getSize();c++)
				{
					HMdcTdcChannelTdc &tdc=mbo[c];
					for(Int_t ch=0;ch<8;ch++)
					{
						if((*pLookupGeom)[s][m][l][c*8+ch].getNCell() < 0)
						{
							tdc.setChannelMask(tdc.getChannelMask(0)&(~(0x1<<ch)),0);
							tdc.setChannelMask(tdc.getChannelMask(1)&(~(0x1<<ch)),1);
						}
					}
				}
			}
		}
	}
}

void HMdcTdcChannel::Streamer(TBuffer &R__b)
{
   // Stream an object of class HMdcTdcChannel.

   UInt_t R__s, R__c;
   if (R__b.IsReading()) {
      Version_t R__v = R__b.ReadVersion(&R__s, &R__c); if (R__v) { }
      HParSet::Streamer(R__b);
      R__b >> array;
      R__b >> oraVersion;
      R__b >> status;
      R__b >> mapNotConnectedChannels;
      if (R__v==1) {
        Int_t* dummy;
        R__b >> dummy;  // HMdcEvReadout*
      }
      R__b.CheckByteCount(R__s, R__c, HMdcTdcChannel::IsA());
   } else {
      R__c = R__b.WriteVersion(HMdcTdcChannel::IsA(), kTRUE);
      HParSet::Streamer(R__b);
      R__b << array;
      R__b << oraVersion;
      R__b << status;
      R__b << mapNotConnectedChannels;
      R__b.SetByteCount(R__c, kTRUE);
   }
}

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