#pragma implementation
using namespace std;
#include <iostream>
#include <iomanip>
#include "hades.h"
#include "hparhadasciifileio.h"
#include "hspectrometer.h"
#include "hshowerparset.h"
#include "hshowerdetector.h"
#include "hshowercalpar.h"
#include "hshowercalparcell.h"
#include "TH2.h"
ClassImp(HShowerCalPar)
HShowerCalPar::HShowerCalPar(const Char_t* name,const Char_t* title,
const Char_t* context)
: HShowerParSet(name,title,context) {
m_bWriteForElectronic = kFALSE;
setSetup(6, 3, 32, 32);
setCellClassName("HShowerCalParCell");
defaultInit();
}
HShowerCalPar::~HShowerCalPar()
{
m_ParamsTable.deleteTab();
}
void HShowerCalPar::setSetup(Int_t nSectors, Int_t nModules,
Int_t nRows, Int_t nColumns)
{
m_nSectors = nSectors;
m_nModules = nModules;
m_nRows = nRows;
m_nColumns = nColumns;
}
void HShowerCalPar::setCellClassName(const Char_t* pszName)
{
strncpy(m_szClassName, pszName, sizeof(m_szClassName));
}
Char_t* HShowerCalPar::getCellClassName()
{
return m_szClassName;
}
HShowerCalParCell*& HShowerCalPar::getSlot(HLocation &loc)
{
return (HShowerCalParCell*&) m_ParamsTable.getSlot(loc);
}
HShowerCalParCell* HShowerCalPar::getObject(HLocation &loc)
{
return (HShowerCalParCell*) m_ParamsTable.getObject(loc);
}
Float_t HShowerCalPar::getSlope(HLocation &loc)
{
return getObject(loc)->getSlope();
}
Float_t HShowerCalPar::getOffset(HLocation &loc)
{
return getObject(loc)->getOffset();
}
Float_t HShowerCalPar::getThreshold(HLocation &loc)
{
return getObject(loc)->getThreshold();
}
Float_t HShowerCalPar::getGain(HLocation &loc)
{
return getObject(loc)->getGain();
}
void HShowerCalPar::setSlope(HLocation &loc, Float_t fSlope)
{
getObject(loc)->setSlope(fSlope);
}
void HShowerCalPar::setOffset(HLocation &loc, Float_t fOffset)
{
getObject(loc)->setOffset(fOffset);
}
void HShowerCalPar::setThreshold(HLocation &loc, Float_t fThreshold)
{
getObject(loc)->setThreshold(fThreshold);
}
void HShowerCalPar::setGain(HLocation &loc, Float_t fGain)
{
getObject(loc)->setGain(fGain);
}
Bool_t HShowerCalPar::initAscii(HParHadAsciiFileIo* pHadAsciiFile) {
Bool_t status = kTRUE;
if (!pHadAsciiFile) return kFALSE;
Char_t sectname[60];
Int_t sect, mod, row, col, row1, col1;
Float_t slope, offset, fThreshold, fGain;
HLocation loc;
HShowerCalParCell *pCell;
Bool_t bForElectronic;
loc.setNIndex(4);
try {
HAsciiRaw* pHAscii = pHadAsciiFile->GetRawAscii();
HAsciiRaw &mydata = *pHAscii;
mydata.SetActiveSection("Shower Calibrater Parameters Setup");
mydata.SetReadKeyTypes('i', 'i', 'i', 'i');
mydata.ReadRawLine(0,&m_nSectors,&m_nModules,&m_nRows,&m_nColumns);
setSetup(m_nSectors, m_nModules, m_nRows, m_nColumns);
m_ParamsTable.set(4, m_nSectors, m_nModules, m_nRows, m_nColumns);
m_ParamsTable.setCellClassName(getCellClassName());
m_ParamsTable.makeObjTable();
for(sect = 0; sect < m_nSectors; sect++)
for(mod = 0; mod < m_nModules; mod++) {
sprintf(sectname,
"Shower Calibrater Parameters: Sector %d Module %d",
sect, mod);
if (!mydata.SetActiveSection(sectname))
return kFALSE;
bForElectronic = (mydata.GetKeys() == 4);
if(bForElectronic)
mydata.SetReadKeyTypes('i', 'i', 'f', 'f');
else
mydata.SetReadKeyTypes('i', 'i', 'f', 'f', 'f', 'f');
loc[0] = sect;
loc[1] = mod;
Int_t line = 0;
for(row = 0; row < m_nRows; row++)
for(col = 0; col < m_nColumns; col++) {
loc[2] = row;
loc[3] = col;
if(bForElectronic)
{
mydata.ReadRawLine(line, &row1, &col1,
&slope, &fThreshold);
offset = fThreshold;
fGain = 1.0f;
}
else
{
mydata.ReadRawLine(line, &row1, &col1,
&slope, &offset, &fThreshold, &fGain);
}
if(row!=row1 || col!=col1) {
printf("error");
return kFALSE;
}
pCell = (HShowerCalParCell*) getSlot(loc);
if (pCell) {
pCell = new(pCell) HShowerCalParCell;
pCell->setSlope(slope);
pCell->setThreshold(fThreshold);
pCell->setOffset(offset);
pCell->setGain(fGain);
}
line++;
}
}
}
catch (Bool_t ret) {
status = ret;
}
return status;
}
Bool_t HShowerCalPar::writeAscii(HParHadAsciiFileIo* pHadAsciiFile)
{
Bool_t status = kTRUE;
if (!pHadAsciiFile) return kFALSE;
Char_t sectname[60];
Int_t sect, mod, row, col;
Float_t slope, offset, fThreshold, fGain;
HLocation loc;
loc.setNIndex(4);
try {
HAsciiRaw* pHAscii = pHadAsciiFile->GetRawAscii();
HAsciiRaw &mydata = *pHAscii;
mydata.SetSeparator('\t');
mydata.WriteSection("Shower Calibrater Parameters Setup");
mydata.WriteKeywords(4, "Sector", "Module", "Row", "Column");
mydata.SetWriteKeyTypes('i', 'i', 'i', 'i');
mydata.WriteRawLine(m_nSectors, m_nModules, m_nRows, m_nColumns);
for(sect = 0; sect < m_nSectors; sect++)
for(mod = 0; mod < m_nModules; mod++) {
sprintf(sectname, "Shower Calibrater Parameters: Sector %d Module %d",
sect, mod);
mydata.WriteSection(sectname);
if(m_bWriteForElectronic)
{
mydata.WriteKeywords(4, "Row", "Column", "Slope", "Threshold");
mydata.SetWriteKeyTypes('i', 'i', 'f', 'f');
}
else
{
mydata.WriteKeywords(6, "Row", "Column", "Slope", "Offset",
"Threshold", "Gain");
mydata.SetWriteKeyTypes('i', 'i', 'f', 'f', 'f', 'f');
}
loc[0] = sect;
loc[1] = mod;
for(row = 0; row < m_nRows; row++)
for(col = 0; col < m_nColumns; col++) {
loc[2] = row;
loc[3] = col;
slope = getSlope(loc);
fThreshold = getThreshold(loc);
if(m_bWriteForElectronic)
{
mydata.WriteRawLine(row, col, slope * getGain(loc),
fThreshold);
}
else
{
offset = getOffset(loc);
fGain = getGain(loc);
mydata.WriteRawLine(row, col, slope, offset, fThreshold,
fGain);
}
}
}
}
catch (Bool_t ret) {
status = ret;
}
return status;
}
Bool_t HShowerCalPar::defaultInit()
{
printf("initialization of ShowerCalPar\n");
Int_t sect, mod, row, col;
HShowerDetector *pShowerDet = (HShowerDetector*)gHades->getSetup()
->getDetector("Shower");
if (!pShowerDet) return kFALSE;
m_nSectors = pShowerDet->getShowerSectors();
m_nModules = pShowerDet->getShowerModules();
m_nRows = pShowerDet->getRows();
m_nColumns = pShowerDet->getColumns();
printf("%d - %d - %d - %d\n", m_nSectors, m_nModules, m_nRows, m_nColumns);
m_ParamsTable.set(4, m_nSectors, m_nModules, m_nRows, m_nColumns);
m_ParamsTable.setCellClassName(getCellClassName());
m_ParamsTable.makeObjTable();
HLocation loc;
HShowerCalParCell *pCell;
loc.setNIndex(4);
for(sect = 0; sect < m_nSectors; sect++)
for(mod = 0; mod < m_nModules; mod++)
for(row = 0; row < m_nRows; row++)
for(col = 0; col < m_nColumns; col++) {
loc[0] = sect;
loc[1] = mod;
loc[2] = row;
loc[3] = col;
pCell = (HShowerCalParCell*) getSlot(loc);
if (pCell) {
pCell = new(pCell) HShowerCalParCell;
pCell->setSlope(1.0);
pCell->setOffset(0.0);
}
}
printf("Shower calpar default initialization\n");
return kTRUE;
}
void HShowerCalPar::Print() {
Int_t i, j, k, l;
Float_t slope, offset,threshold,gain;
HLocation loc;
loc.setNIndex(4);
for (i = 0; i < m_nSectors; i++)
for (j = 0; j < m_nModules; j++)
for (k = 0; k < m_nRows; k++)
for (l = 0; l < m_nColumns; l++) {
loc[0] = i;
loc[1] = j;
loc[2] = k;
loc[3] = l;
slope = getSlope(loc);
offset = getOffset(loc);
threshold = getThreshold(loc);
gain = getGain(loc);
if (offset < 0)
printf("%d:%d:%d:%d %f %f %f %f\n", i, j, k, l, slope, offset,threshold,gain);
}
}
void HShowerCalPar::changeValues(Int_t iVar, Int_t iOpr, Float_t f)
{
HLocation loc;
Int_t iSec, iMod, iRow, iCol;
Float_t fVals[4];
HShowerCalParCell *pCell;
loc.setNIndex(4);
for(iSec = 0; iSec < m_nSectors; iSec++)
{
loc[0] = iSec;
for(iMod = 0; iMod < m_nModules; iMod++)
{
loc[1] = iMod;
for(iRow = 0; iRow < m_nRows; iRow++)
{
loc[2] = iRow;
for(iCol = 0; iCol < m_nColumns; iCol++)
{
loc[3] = iCol;
if((pCell = (HShowerCalParCell *) getSlot(loc)) == NULL)
continue;
fVals[HSCPV_SLOPE] = pCell->getSlope();
fVals[HSCPV_OFFSET] = pCell->getOffset();
fVals[HSCPV_THRESHOLD] = pCell->getThreshold();
fVals[HSCPV_GAIN] = pCell->getGain();
switch(iOpr)
{
case HSCPM_SET:
fVals[iVar] = f;
break;
case HSCPM_ADD:
fVals[iVar] += f;
break;
default:
fVals[iVar] *= f;
break;
}
pCell->setParams(fVals[HSCPV_SLOPE], fVals[HSCPV_OFFSET],
fVals[HSCPV_THRESHOLD], fVals[HSCPV_GAIN]);
}
}
}
}
}
TH2F* HShowerCalPar::getHist(Int_t iSector, Int_t iModule,
enum_HSCPM_Var enType)
{
if((iSector < 0) || (iSector >= m_nSectors))
{
Error("getHist", "Sector %d out of bounds [0, %d]",
iSector, m_nSectors - 1);
return NULL;
}
if((iModule < 0) || (iModule >= m_nModules))
{
Error("getHist", "Module %d out of bounds [0, %d]",
iModule, m_nModules - 1);
return NULL;
}
if(m_nRows <= 0)
{
Error("getHist", "m_nRows = %d", m_nRows);
return NULL;
}
if(m_nColumns <= 0)
{
Error("getHist", "m_nColumns = %d", m_nColumns);
return NULL;
}
TH2F *h;
Char_t sT[100];
Char_t sN[100];
strcpy(sT, "Shower calibration params: ");
strcpy(sN, "hShwCal_");
switch(enType)
{
case HSCPV_SLOPE:
strcat(sT, "slopes");
strcat(sN, "slope");
break;
case HSCPV_OFFSET:
strcat(sT, "offsets");
strcat(sN, "off");
break;
case HSCPV_THRESHOLD:
strcat(sT, "thresholds");
strcat(sN, "thr");
break;
case HSCPV_GAIN:
strcat(sT, "gains");
strcat(sN, "gain");
break;
default:
Error("getHist", "Wrong option enType=%d", enType);
return NULL;
}
sprintf(sT + strlen(sT), " sec: %d mod: %d", iSector, iModule);
sprintf(sN + strlen(sN), "_%d_%d", iSector, iModule);
if((h = new TH2F(sN, sT, m_nColumns, 0, m_nColumns, m_nRows, 0, m_nRows))
== NULL)
{
Error("getHist", "Cannot create histogram");
return NULL;
}
HLocation hLoc;
Float_t f;
hLoc.setNIndex(4);
hLoc[0] = iSector;
hLoc[1] = iModule;
for(hLoc[2] = 0; hLoc[2] < m_nRows; hLoc[2]++)
{
for(hLoc[3] = 0; hLoc[3] < m_nColumns; hLoc[3]++)
{
switch(enType)
{
case HSCPV_SLOPE:
f = getSlope(hLoc);
break;
case HSCPV_OFFSET:
f = getOffset(hLoc);
break;
case HSCPV_THRESHOLD:
f = getThreshold(hLoc);
break;
default:
f = getGain(hLoc);
break;
}
h->Fill(hLoc[3], hLoc[2], f);
}
}
return h;
}
Last change: Sat May 22 13:13:15 2010
Last generated: 2010-05-22 13:13
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.