using namespace std;
#include <stdlib.h>
#include "hmdctdcthreshold.h"
#include "hades.h"
#include "hruntimedb.h"
#include "hspectrometer.h"
#include "hmdcdetector.h"
#include "hpario.h"
#include "hdetpario.h"
#include "hmdcrawstruct.h"
#include "hmessagemgr.h"
#include "hmdcmboreadout.h"
#include "hmdcevreadout.h"
#include "TSystem.h"
#include <iostream>
#include <iomanip>
#include <cerrno>
ClassImp(HMdcTdcThresholdDbo)
ClassImp(HMdcTdcThresholdMbo)
ClassImp(HMdcTdcThresholdMod)
ClassImp(HMdcTdcThresholdSec)
ClassImp(HMdcTdcThreshold)
void HMdcTdcThresholdDbo::fill(HMdcTdcThresholdDbo& r) {
threshold=r.getThreshold();
}
HMdcTdcThresholdMbo::HMdcTdcThresholdMbo(Int_t dbo, const Text_t* name) {
SetName(name);
array = new TObjArray(dbo);
for (Int_t i=0; i<dbo; ++i) array->AddAt(new HMdcTdcThresholdDbo(),i);
}
HMdcTdcThresholdMbo::~HMdcTdcThresholdMbo() {
array->Delete();
delete array;
}
HMdcTdcThresholdMod::HMdcTdcThresholdMod(Int_t sec, Int_t mod, Int_t mbo) {
array = new TObjArray(mbo);
HMdcRawStruct* pMdc=
(HMdcRawStruct*)gHades->getRuntimeDb()->getContainer("MdcRawStruct");
if (pMdc) {
HMdcRawModStru& rMod=(*pMdc)[sec][mod];
for (Int_t i=0; i<rMod.getSize(); i++) {
HMdcRawMothStru& rMbo=rMod[i];
array->AddAt(new HMdcTdcThresholdMbo((Int_t)(rMod[i].getNTdcs()/16),(Char_t*)rMbo.GetName()),i);
}
}
else cerr<<"HMdcTdcThreshold not created, container MdcRawStruct not found"<<endl;
}
HMdcTdcThresholdMod::~HMdcTdcThresholdMod() {
array->Delete();
delete array;
}
HMdcTdcThresholdSec::HMdcTdcThresholdSec(Int_t sec, Int_t mod) {
array = new TObjArray(mod);
for (Int_t i=0; i<mod; i++)
array->AddAt(new HMdcTdcThresholdMod(sec,i),i);
}
HMdcTdcThresholdSec::~HMdcTdcThresholdSec() {
array->Delete();
delete array;
}
HMdcTdcThreshold::HMdcTdcThreshold(const Char_t* name,const Char_t* title,
const Char_t* context,Int_t n)
: HParSet(name,title,context) {
strcpy(detName,"Mdc");
oraVersion=-1;
array = new TObjArray(n);
mbo_readout=(HMdcMboReadout*)gHades->getRuntimeDb()->getContainer("MdcMboReadout");
for (Int_t i=0; i<n; i++) array->AddAt(new HMdcTdcThresholdSec(i),i);
}
HMdcTdcThreshold::~HMdcTdcThreshold() {
array->Delete();
delete array;
}
Bool_t HMdcTdcThreshold::init(HParIo* inp,Int_t* set) {
HDetParIo* input=inp->getDetParIo("HMdcParIo");
if (input) if (!input->init(this,set)) return kFALSE;
if (( raw_struct=(HMdcRawStruct*)gHades->getRuntimeDb()->getContainer("MdcRawStruct")) == NULL) return kFALSE;
if((hardwareToDatabaseIndexMap =
(HMdcEvReadout *)gHades->getRuntimeDb()->getContainer( "MdcEvReadout" )) == NULL) return kFALSE;
return kTRUE;
}
Int_t HMdcTdcThreshold::write(HParIo* output) {
HDetParIo* out=output->getDetParIo("HMdcParIo");
if (out) return out->write(this);
return -1;
}
void HMdcTdcThreshold::readline(const Char_t* buf, Int_t* set) {
Int_t sec, mod, mbo, dbo;
Int_t thresh;
Char_t mboName[10];
sscanf(buf,"%i%i%i%s%i%x",
&sec, &mod, &mbo, mboName, &dbo, &thresh);
Int_t n=sec*4+mod;
if (!set[n]) return;
HMdcTdcThresholdMbo& rMbo=(*this)[sec][mod][mbo];
rMbo.SetName(mboName);
HMdcTdcThresholdDbo& db=rMbo[dbo];
db.fill(thresh);
set[n]=999;
}
void HMdcTdcThreshold::readlinefromfile(const Char_t* buf) {
Int_t sec, mod, mbo, dbo;
Int_t thresh;
sscanf(buf,"%i%i%i%i%x",
&mod, &sec, &mbo, &dbo, &thresh);
HMdcRawModStru & rawMod=(*raw_struct)[sec][mod];
if(rawMod.getSize()>mbo)
{
HMdcRawMothStru &rawMbo=rawMod[mbo];
if (rawMbo.getNTdcs() > dbo*16 )
{
HMdcTdcThresholdMbo& rMbo=(*this)[sec][mod][mbo];
HMdcTdcThresholdDbo& db=rMbo[dbo];
db.fill(thresh);
}
}
}
void HMdcTdcThreshold::writelinetofile(Char_t* buf, Int_t sec, Int_t mod, Int_t mbo, Int_t dbo) {
Int_t thresh;
HMdcRawModStru & rawMod=(*raw_struct)[sec][mod];
if(rawMod.getSize()>mbo)
{
HMdcRawMothStru &rawMbo=rawMod[mbo];
if (rawMbo.getNTdcs() > dbo*16 )
{
HMdcTdcThresholdMbo& rMbo=(*this)[sec][mod][mbo];
HMdcTdcThresholdDbo& db=rMbo[dbo];
thresh = db.getThreshold();
sprintf(buf, "%i %i %i %i %x", mod, sec, mbo, dbo, thresh);
}
else sprintf(buf,"%i %i %i %i 60",mod,sec,mbo,dbo);
}
else sprintf(buf,"%i %i %i %i 60",mod,sec,mbo,dbo);
}
void HMdcTdcThreshold::addvalue(Int_t factor) {
Int_t sec, mbo, mod, dbo;
for(sec=0; sec<6; sec++)
{
HMdcTdcThresholdSec & rawSec= (*this)[sec];
for(mod=0; mod<rawSec.getSize(); mod++)
{
HMdcTdcThresholdMod & rawMod=rawSec[mod];
for(mbo =0 ; mbo < rawMod.getSize() ; mbo++)
{
HMdcTdcThresholdMbo &rawMbo=rawMod[mbo];
for(dbo =0; dbo < rawMbo.getSize(); dbo++ )
{
HMdcTdcThresholdDbo& db=rawMbo[dbo];
db.fill((db.getThreshold())+factor);
}
}
}
}
}
void HMdcTdcThreshold::putAsciiHeader(TString& header) {
header=
"# Calibration parameters of the MDC\n"
"# Format:\n"
"# sector module mbo mboName threshold\n";
}
Bool_t HMdcTdcThreshold::write_thresholds(Char_t *ofilename, Int_t plane, Int_t sector){
FILE *Ofile;
Int_t module = plane -1;
Char_t *buf, *bufn, *fileout;
Int_t mbo, port, i, roc, lvl1;
i = 0;
buf = new char[256];
bufn= new char[256];
fileout= new char[256];
Bool_t isFirst;
if(status)
{
sprintf(fileout,"%s",ofilename);
switch(plane){
case 1 :
strcat(fileout,"I");
break;
case 2 :
strcat(fileout,"II");
break;
case 3 :
strcat(fileout,"III");
break;
case 4 :
strcat(fileout,"IV");
break;
default:
delete []buf;
delete []bufn;
delete []fileout;
return kFALSE;
}
sprintf(fileout,"%s%d%s",fileout,sector+1,"/threshold.conf");
Ofile = fopen(fileout,"w");
if(Ofile == NULL)
{
delete []buf;
delete []bufn;
delete []fileout;
return kFALSE;
}
sprintf(buf,"%s\t%d\n","plane",plane);
fputs(buf,Ofile);
sprintf(buf,"%s %d\n","thresholdversion",oraVersion);
fputs(buf,Ofile);
HMdcMboReadoutMod & rMod = (*mbo_readout)[sector][module];
HMdcTdcThresholdMod& rModThr=(*this)[sector][module];
sprintf(buf,"-----------------------------------\n");
fputs(buf,Ofile);
sprintf(buf,"%s%s%d%s\n","------------"," Plane ",plane,"--------------");
fputs(buf,Ofile);
sprintf(buf,"-----------------------------------\n");
fputs(buf,Ofile);
sprintf(buf,"\n");
for(Int_t i=0;i<6;i++)
fputs(buf,Ofile);
for(roc = 1; roc <= 5; roc++){
isFirst=kTRUE;
for(port = 0; port <2; port++){
for(lvl1=1;lvl1<4;lvl1++)
{
for(mbo =0 ; mbo < rMod.getSize() ; mbo++){
HMdcMboReadoutMoth & rMoth = rMod[mbo];
if (mbo < rModThr.getSize()){
if ((rMoth.getRoc()==roc) &&
(rMoth.getBusPos()==port) &&
(rMoth.getBus()==lvl1)){
if (isFirst) {
sprintf(buf,"ROC %d\n",roc);
fputs(buf,Ofile);
isFirst=kFALSE;
}
sprintf(bufn,"mbo %s %d %x %x %x %x ",rMoth.GetName(),port,
rModThr[mbo][0].getThreshold(),rModThr[mbo][1].getThreshold(),
rModThr[mbo][2].getThreshold(),rModThr[mbo][3].getThreshold());
Int_t ndbo;
ndbo = rModThr[mbo].getSize();
if(ndbo > 4) {
if(rModThr[mbo][4].getThreshold() != -1)
sprintf(buf,"%s%x %x\n",bufn,rModThr[mbo][4].getThreshold(),rModThr[mbo][5].getThreshold());
else sprintf(buf,"%s%d %d\n",bufn,-1,-1);
} else sprintf(buf,"%s%d %d\n",bufn,-1,-1);
fputs(buf,Ofile);
}
} else
cout << " Error " <<endl;
}
}
}
}
sprintf(buf,"###\n");
fputs(buf,Ofile);
delete []buf;
delete []bufn;
fclose(Ofile);
delete []fileout;
return kTRUE;
}
else
{
delete []buf;
delete []bufn;
delete []fileout;
ERROR_msg(HMessageMgr::DET_MDC,"This version is no longer valid for DAQ!");
return kFALSE;
}
}
Bool_t HMdcTdcThreshold::writeline(Char_t *buf, Int_t sec, Int_t mod, Int_t mbo, Int_t dbo) {
HMdcTdcThresholdMbo& rMbo=(*this)[sec][mod][mbo];
HMdcTdcThresholdDbo& db=rMbo[dbo];
sprintf(buf,"%1i %1i %2i %s %2i %3x\n",
sec, mod, mbo, rMbo.GetName(), dbo, db.getThreshold());
return kTRUE;
}
void HMdcTdcThreshold::clear() {
oraVersion=-1;
for(Int_t s=0;s<getSize();s++) {
HMdcTdcThresholdSec& sec=(*this)[s];
for(Int_t m=0;m<sec.getSize();m++) {
HMdcTdcThresholdMod& mod=sec[m];
for(Int_t l=0;l<mod.getSize();l++) {
HMdcTdcThresholdMbo& mbo=mod[l];
for(Int_t c=0;c<mbo.getSize();c++) mbo[c].clear();
}
}
}
status=kFALSE;
resetInputVersions();
}
void HMdcTdcThreshold::printParam() {
SEPERATOR_msg("-",60);
INFO_msg(10,HMessageMgr::DET_MDC,"HMdcTdcThreshold");
for(Int_t s=0;s<getSize();s++) {
HMdcTdcThresholdSec& sec=(*this)[s];
for(Int_t m=0;m<sec.getSize();m++) {
HMdcTdcThresholdMod& mod=sec[m];
for(Int_t l=0;l<mod.getSize();l++) {
HMdcTdcThresholdMbo& 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 %3x",
s, m, l, mbo.GetName(), c, mbo[c].getThreshold());
}
}
}
}
SEPERATOR_msg("-",60);
}
Bool_t HMdcTdcThreshold::readRocFile(const Char_t *filename)
{
Char_t *lastDigit = NULL;
Char_t *rocFile = NULL;
Char_t *chamberDir = NULL;
Char_t *buf = NULL;
Char_t *tmpfilename = NULL;
UInt_t roc = 0;
UInt_t sector = 0;
UInt_t module = 0;
UInt_t sam = 0;
UInt_t rocAddr = 0;
UInt_t threshold = 0;
UInt_t l1BusPort = 0;
UInt_t mboChainIndex = 0;
UInt_t tdcPair = 0;
UInt_t mboDBIndex = 0;
UInt_t dbIndex = 0;
FILE *input = NULL;
tmpfilename = new char[strlen(filename) + 1 + strlen(".threshold")];
strcpy(tmpfilename,filename);
rocFile = new char[strlen( filename ) + 1];
chamberDir = new char[strlen( filename ) + 1];
strcpy( rocFile, gSystem->BaseName( filename ) );
*((Char_t*)gSystem->BaseName( filename ) - 1) = '\0';
strcpy( chamberDir, gSystem->BaseName( filename ) );
errno = 0;
roc = (UInt_t)strtol( &rocFile[3], &lastDigit, 0 );
if(errno == EINVAL || errno == ERANGE || *lastDigit != 0)
{
ERROR_msg( HMessageMgr::DET_MDC,
"Error while extracting ROC number from path!" );
return kFALSE;
}
errno = 0;
sector = (UInt_t)strtol( &chamberDir[strlen( chamberDir ) - 1],
&lastDigit, 0 );
if(errno == EINVAL || errno == ERANGE || *lastDigit != 0)
{
ERROR_msg( HMessageMgr::DET_MDC,
"Error while extracting sector number from path!" );
return kFALSE;
}
sector -= 1;
chamberDir[strlen( chamberDir ) - 1] = '\0';
module = 0;
for (UInt_t iChar = 0; iChar < strlen( chamberDir ); iChar++)
module += chamberDir[iChar] == 'I' ? 1 : 3;
if (module > 4)
{
ERROR_msg( HMessageMgr::DET_MDC,
"Error while extracting module number from path!" );
return kFALSE;
}
module -= 1;
delete []rocFile;
delete []chamberDir;
sam = hardwareToDatabaseIndexMap->getModuleAndSectorToSamNumber( module,
sector );
strcat((Char_t *)tmpfilename,".threshold");
input = fopen( tmpfilename, "r" );
if (input == NULL)
{
ERROR_msg( HMessageMgr::DET_MDC, "Could not open input file!" );
return kFALSE;
}
buf = new char[256];
while (!feof(input))
{
fgets(buf,256,input);
if((strlen(buf) != 0) || (strcmp((const Char_t *)&buf[0],"#") != 0))
{
rocAddr = 0;
threshold = 0;
sscanf( buf, "%x%x", &rocAddr, &threshold );
strcpy(buf," ");
if((rocAddr & 0x60) == 0x40)
{
l1BusPort = (rocAddr >> 9) & 0x1;
mboChainIndex = ((rocAddr >> 7) & 0x3);
tdcPair = rocAddr & 0x7;
}
else
{
continue;
}
if ((Int_t)sector != (*hardwareToDatabaseIndexMap)
[sam][roc][l1BusPort][mboChainIndex].getSec() ||
(Int_t)module != (*hardwareToDatabaseIndexMap)
[sam][roc][l1BusPort][mboChainIndex].getMod() )
{
ERROR_msg( HMessageMgr::DET_MDC,
"Missmatch between hadware and database indexes!" );
delete buf;
delete tmpfilename;
fclose (input);
return kFALSE;
}
mboDBIndex = (*hardwareToDatabaseIndexMap)
[sam][roc][l1BusPort][mboChainIndex].getMbo();
HMdcTdcThresholdMbo& mbo = (*this)[sector][module][mboDBIndex];
dbIndex = tdcPair;
HMdcTdcThresholdDbo& db = mbo[dbIndex];
db.fill( threshold );
}
}
delete buf;
delete tmpfilename;
fclose( input );
return kTRUE;
}
Int_t HMdcTdcThreshold::readRocFileVersion(const Char_t *filename)
{
FILE *input = NULL;
Char_t buffer[256] = { '\0' };
Int_t thresholdVersion = -1;
Int_t channelMaskVersion = -1;
input = fopen( filename, "r" );
if (input == NULL)
{
ERROR_msg( HMessageMgr::DET_MDC, "Could not open input file!" );
return kFALSE;
}
while (!feof( input ))
{
fgets( buffer, 255, input );
if(strncmp( buffer, "#", 1 ) == 0)
{
thresholdVersion = -1;
channelMaskVersion = -1;
sscanf( buffer, "# %d %d", &thresholdVersion, &channelMaskVersion );
if (thresholdVersion > 0 && channelMaskVersion > 0)
{
fclose (input);
return thresholdVersion;
}
}
}
fclose( input );
return -1;
}
Last change: Sat May 22 13:03:50 2010
Last generated: 2010-05-22 13:03
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.