#include "hmdcdrifttimepar.h"
#include "hades.h"
#include "hspectrometer.h"
#include "hmdcdetector.h"
#include "hruntimedb.h"
#include "hmdccal2parsim.h"
#include "hmdcgetcontainers.h"
ClassImp(HMdcDriftTimeParBin)
ClassImp(HMdcDriftTimeParAngle)
ClassImp(HMdcDriftTimeParMod)
ClassImp(HMdcDriftTimeParSec)
ClassImp(HMdcDriftTimePar)
HMdcDriftTimeParBin::HMdcDriftTimeParBin(void) {
c0=c1=c2=c3=0.;
}
void HMdcDriftTimeParBin::setParam(Double_t k0, Double_t k1, Double_t k2,
Double_t k3) {
c0=k0;
c1=k1;
c2=k2;
c3=k3;
}
void HMdcDriftTimeParBin::print(void) const {
printf("DriftTime = %.5g + %.5g*alpha + %.5g*dist + %.5g*alpha*dist\n",
c0,c1,c2,c3);
printf("ErrDriftTime = %.5g + %.5g*alpha + %.5g*dist + %.5g*alpha*dist\n",
c0err,c1err,c2err,c3err);
}
void HMdcDriftTimeParBin::printTable(void) const {
printf("| %10.4g | %10.4g | %10.4g | %10.4g || %10.4g | %10.4g | %10.4g | %10.4g |\n",
c0,c1,c2,c3,c0err,c1err,c2err,c3err);
}
HMdcDriftTimeParAngle::HMdcDriftTimeParAngle(Int_t nb) : TObjArray(nb) {
for(Int_t i=0; i<nb; ++i) AddAt(new HMdcDriftTimeParBin(),i);
}
HMdcDriftTimeParAngle::~HMdcDriftTimeParAngle(void) {
Delete();
}
HMdcDriftTimeParMod::HMdcDriftTimeParMod(Int_t nAnBins, Int_t nDsBins) :
TObjArray(nAnBins) {
for(Int_t i=0; i<nAnBins; ++i) AddAt(new HMdcDriftTimeParAngle(nDsBins),i);
nAngleBins=nAnBins;
lAngleBin=nAngleBins-1;
angleBinSize=90./nAngleBins;
nDistBins=nDsBins;
lDistBin=nDistBins-1;
setDistBinSize(0.1);
}
void HMdcDriftTimeParMod::setDistBinSize(Double_t dBSize) {
distBinSize=dBSize;
lastBinDist=lDistBin*distBinSize;
}
Bool_t HMdcDriftTimeParMod::initContainer(HMdcCal2ParModSim& fC2PModS,
Double_t slOut) {
slopeOutside=slOut;
for(Int_t anBin=0; anBin<nAngleBins; anBin++) {
for(Int_t dsBin=0; dsBin<nDistBins; dsBin++) {
HMdcDriftTimeParBin* bin=at(anBin)->at(dsBin);
if(bin==0) return kFALSE;
HMdcCal2ParAngleSim& rAng1=fC2PModS[anBin];
HMdcCal2ParAngleSim& rAng2=(anBin<lAngleBin) ? fC2PModS[anBin+1]:rAng1;
fillDriftTime(rAng1,rAng2,bin,anBin,dsBin);
fillDriftTimeErr(rAng1,rAng2,bin,anBin,dsBin);
}
}
return kTRUE;
}
void HMdcDriftTimeParMod::print(void) {
for(Int_t anBin=0; anBin<nAngleBins; anBin++) {
for(Int_t dsBin=0; dsBin<nDistBins; dsBin++) {
HMdcDriftTimeParBin* bin=at(anBin)->at(dsBin);
if(bin==0) continue;
printf("%3i %3i ",anBin,dsBin);
bin->printTable();
}
}
}
void HMdcDriftTimeParMod::fillDriftTime(HMdcCal2ParAngleSim& rAng1,
HMdcCal2ParAngleSim& rAng2, HMdcDriftTimeParBin* bin,
Int_t anBin, Int_t dsBin) {
Double_t k0=90./angleBinSize-anBin;
if(dsBin==lDistBin) {
Double_t y1=rAng1.getDriftTime1(lDistBin);
Double_t y2=rAng2.getDriftTime1(lDistBin);
Double_t k1=y1-y2;
bin->setC0(y1-lastBinDist*slopeOutside - k0*k1);
bin->setC1(k1/angleBinSize);
bin->setC2(slopeOutside);
bin->setC3(0.);
} else {
Double_t y1=rAng1.getDriftTime1(dsBin);
Double_t y2=rAng2.getDriftTime1(dsBin);
Double_t y3=rAng2.getDriftTime1(dsBin+1);
Double_t y4=rAng1.getDriftTime1(dsBin+1);
Double_t k1=y1-y2;
Double_t k2=y1-y4;
Double_t k3=k1+y3-y4;
k1+=dsBin*k3;
bin->setC0(y1 + dsBin*k2 - k0*k1);
bin->setC1(k1/angleBinSize);
bin->setC2((k0*k3-k2)/distBinSize);
bin->setC3(-k3/distBinSize/angleBinSize);
}
}
void HMdcDriftTimeParMod::fillDriftTimeErr(HMdcCal2ParAngleSim& rAng1,
HMdcCal2ParAngleSim& rAng2, HMdcDriftTimeParBin* bin,
Int_t anBin, Int_t dsBin) {
Double_t k0=90./angleBinSize-anBin;
if(dsBin==lDistBin) {
Double_t y1=rAng1.getDriftTime1Error(lDistBin);
Double_t y2=rAng2.getDriftTime1Error(lDistBin);
Double_t k1=y1-y2;
bin->setC0Err(y1 - k0*k1);
bin->setC1Err(k1/angleBinSize);
bin->setC2Err(0.);
bin->setC3Err(0.);
} else {
Double_t y1=rAng1.getDriftTime1Error(dsBin);
Double_t y2=rAng2.getDriftTime1Error(dsBin);
Double_t y3=rAng2.getDriftTime1Error(dsBin+1);
Double_t y4=rAng1.getDriftTime1Error(dsBin+1);
Double_t k1=y1-y2;
Double_t k2=y1-y4;
Double_t k3=k1+y3-y4;
k1+=dsBin*k3;
bin->setC0Err(y1 + dsBin*k2 - k0*k1);
bin->setC1Err(k1/angleBinSize);
bin->setC2Err((k0*k3-k2)/distBinSize);
bin->setC3Err(-k3/distBinSize/angleBinSize);
}
}
Bool_t HMdcDriftTimeParMod::testSizes(Int_t anSz, Int_t dsSz) const {
return anSz==nAngleBins && dsSz==nDistBins;
}
HMdcDriftTimeParMod::~HMdcDriftTimeParMod(void) {
Delete();
}
HMdcDriftTimeParSec::HMdcDriftTimeParSec(void) : TObjArray(4) {
}
Bool_t HMdcDriftTimeParSec::initContainer(HMdcCal2ParSecSim& fC2PSecS,
Int_t sec, Double_t slOut) {
sector=sec;
HMdcDetector* pMdcDet = HMdcGetContainers::getObject()->getMdcDetector();
for(Int_t m=0; m<4; m++) {
Int_t nDistBins=100;
Double_t distBinSize=0.1;
if(pMdcDet->getModule(sec,m) <= 0) continue;
HMdcCal2ParModSim& fC2PModS=fC2PSecS[m];
if(&fC2PModS == 0) return kFALSE;
Int_t nAngleBins=fC2PModS.getSize();
if(At(m)==0) AddAt(new HMdcDriftTimeParMod(nAngleBins,nDistBins),m);
else if(!at(m)->testSizes(nAngleBins,nDistBins)) {
delete at(m);
AddAt(new HMdcDriftTimeParMod(nAngleBins,nDistBins),m);
}
at(m)->setDistBinSize(distBinSize);
if(!at(m)->initContainer(fC2PModS,slOut)) return kFALSE;
}
return kTRUE;
}
void HMdcDriftTimeParSec::print(void) {
HMdcDetector* pMdcDet = HMdcGetContainers::getObject()->getMdcDetector();
for(Int_t m=0; m<4; m++) {
if(pMdcDet->getModule(sector,m) <= 0) continue;
printf("\n HMdcDriftTimePar: %i sector %i module \n",sector+1,m+1);
printf("---bin---------------------------------------------------------");
printf( "-----------------------------------------------------\n");
printf("ang. dis. | c0 | c1 | c2 | c3 |");
printf( "| c0err | c1err | c2err | c3err |\n");
printf("----------|------------|------------|------------|------------|");
printf( "|------------|------------|------------|------------|\n");
at(m)->print();
}
}
HMdcDriftTimeParSec::~HMdcDriftTimeParSec(void) {
Delete();
}
HMdcDriftTimePar::HMdcDriftTimePar(void) : TObjArray(6) {
pCal2ParSim=(HMdcCal2ParSim*)gHades->getRuntimeDb()->
getContainer("MdcCal2ParSim");
}
Bool_t HMdcDriftTimePar::initContainer(void) {
if(!pCal2ParSim || !HMdcGetContainers::isInited(pCal2ParSim)) return kFALSE;
HMdcDetector* pMdcDet = HMdcGetContainers::getObject()->getMdcDetector();
if(pMdcDet==0) return kFALSE;
Double_t slopeOutside=pCal2ParSim->getSlopeOutside();
for(Int_t s=0; s<6; s++) {
if( !pMdcDet->isSectorActive(s) ) continue;
HMdcCal2ParSecSim& fC2PSecS=(*pCal2ParSim)[s];
if(&fC2PSecS == 0) return kFALSE;
if(At(s)==0) AddAt(new HMdcDriftTimeParSec(),s);
if(!at(s)->initContainer(fC2PSecS,s,slopeOutside)) return kFALSE;
}
return kTRUE;
}
void HMdcDriftTimePar::print(void) {
HMdcDetector* pMdcDet = HMdcGetContainers::getObject()->getMdcDetector();
if(pMdcDet==0) return;
for(Int_t s=0; s<6; s++) {
if( !pMdcDet->isSectorActive(s) ) continue;
at(s)->print();
}
}
HMdcDriftTimePar::~HMdcDriftTimePar(void) {
Delete();
}
Last change: Sat May 22 13:01:38 2010
Last generated: 2010-05-22 13:01
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.