using namespace std;
#include <stdlib.h>
#include "hmdccelleff.h"
#include "hades.h"
#include "hruntimedb.h"
#include "hspectrometer.h"
#include "hmdcdetector.h"
#include "hpario.h"
#include "hdetpario.h"
#include "TMath.h"
#include <iostream>
#include <iomanip>
ClassImp(HMdcCellEffAngle)
ClassImp(HMdcCellEffMod)
ClassImp(HMdcCellEff)
HMdcCellEffMod::HMdcCellEffMod(Int_t sec, Int_t mod, Int_t angle) {
array = new TObjArray(angle);
for (Int_t i=0; i<angle; ++i)
array->AddAt(new HMdcCellEffAngle(),i);
}
HMdcCellEffMod::~HMdcCellEffMod() {
array->Delete();
delete array;
}
HMdcCellEff::HMdcCellEff(const Char_t* name,const Char_t* title,
const Char_t* context,Int_t n)
: HParSet(name,title,context) {
comment="no comment";
strcpy(detName,"Mdc");
if (gHades) {
fMdc=(HMdcDetector*)(((HSpectrometer*)(gHades->getSetup()))->getDetector("Mdc"));
} else {
fMdc = 0;
}
array = new TObjArray(n);
for (Int_t i=0; i<n; i++) array->AddAt( new HMdcCellEffMod(i),i);
}
HMdcCellEff::~HMdcCellEff() {
array->Delete();
delete array;
}
Bool_t HMdcCellEff::init(HParIo* inp,Int_t* set) {
Int_t myset[4]={1,1,1,1};
HDetParIo* input=inp->getDetParIo("HMdcParIo");
if (input) return (input->init(this,myset));
return kFALSE;
}
Int_t HMdcCellEff::write(HParIo* output) {
HDetParIo* out=output->getDetParIo("HMdcParIo");
if (out) return out->write(this);
return -1;
}
void HMdcCellEff::readline(const Char_t* buf, Int_t* set) {
Int_t mod,angle;
Float_t maximumR,slopeEff;
sscanf(buf,"%i%i%f%f", &mod, &angle, &maximumR, &slopeEff);
Int_t n=mod;
HMdcCellEffMod &module=(*this)[mod];
if (angle<=module.getSize())
{
HMdcCellEffAngle& rAngle=module[angle];
rAngle.setFunctionValues(maximumR,slopeEff);
}
else
{
Error("HMdcCellEff::readline()","array out of bounds");
}
set[n]=999;
}
void HMdcCellEff::putAsciiHeader(TString& header) {
header=
"# Cell Efficiency parameters of the HMdcDigitizer\n"
"# Format: \n"
"# module angle maxR slope\n";
}
Bool_t HMdcCellEff::writeline(Char_t *buf, Int_t mod, Int_t angle) {
Bool_t r = kTRUE;
HMdcCellEffMod &module = (*this)[mod];
if (angle<=module.getSize())
{
HMdcCellEffAngle& rAngle=module[angle];
sprintf(buf,"%1i %2i %7.5f %7.5f\n", mod, angle, rAngle.getMaxR(), rAngle.getSlope());
}
else
{
r = kFALSE;
Error("HMdcCellEff::writeline()","array out of bounds");
}
return r;
}
Int_t HMdcCellEff::calcEfficiency(Int_t m, Float_t r , Float_t b, Float_t l)
{
Int_t status=0;
Float_t angleDeg=0;
Int_t angleStep=0;
if(b<=90 && b>=0)
{
angleDeg=90-b;
}
else
{
if(b<=180 && b> 90 ) angleDeg=90-(180-b);
if(b<=270 && b> 180) angleDeg=90-(270-b);
if(b< 360 && b> 270) angleDeg=90-(360-b);
}
angleStep=((Int_t)((angleDeg)/5));
if(angleStep==18)angleStep=17;
HMdcCellEffAngle& rAngle=(*this)[m][angleStep];
HMdcCellEffAngle rAngle2;
if(angleStep<17)
{
rAngle2=(*this)[m][angleStep+1];
}
else
{
rAngle2=(*this)[m][angleStep];
}
Float_t rCut=0;
Float_t slope=0;
Float_t delta=0;
Float_t r1=0;
Float_t r2=0;
r1= rAngle.getMaxR() +( l*(rAngle.getSlope()));
r2= rAngle2.getMaxR()+( l*(rAngle2.getSlope()));
slope= (Float_t) (r2-r1)/5.;
delta= angleDeg-(angleStep*5);
rCut=r1+slope*delta;
if(r > rCut )
{
status=-1;
}
else
{
status=1;
}
return status;
}
Float_t HMdcCellEff::calcEffval(Int_t m, Float_t r , Float_t b, Float_t l)
{
Float_t angleDeg=0;
Int_t angleStep=0;
if(b<=90 && b>=0)
{
angleDeg=90-b;
}
else
{
if(b<=180 && b> 90 ) angleDeg=90-(180-b);
if(b<=270 && b> 180) angleDeg=90-(270-b);
if(b< 360 && b> 270) angleDeg=90-(360-b);
}
angleStep=((Int_t)((angleDeg)/5));
if(angleStep==18)angleStep=17;
HMdcCellEffAngle& rAngle=(*this)[m][angleStep];
HMdcCellEffAngle rAngle2;
if(angleStep<17)
{
rAngle2=(*this)[m][angleStep+1];
}
else
{
rAngle2=(*this)[m][angleStep];
}
Float_t myfraction=0;
Float_t myslope=0;
Float_t mydelta=0;
Float_t d1=0;
Float_t d2=0;
if(rAngle.getSlope()!=0 && rAngle2.getSlope()!=0)
{
d1=(r - rAngle .getMaxR())/(rAngle.getSlope() );
d2=(r - rAngle2.getMaxR())/(rAngle2.getSlope());
}
else
{
if(rAngle.getSlope()!=0 && rAngle2.getSlope()==0)
{
d1=(r - rAngle .getMaxR())/(rAngle.getSlope() );
d2=(r - rAngle2.getMaxR())/(-0.001);
}
else if(rAngle.getSlope()==0 && rAngle2.getSlope()!=0)
{
d1=(r - rAngle .getMaxR())/(-0.001);
d2=(r - rAngle2.getMaxR())/(rAngle2.getSlope());
}
else
{
d1=(r - rAngle .getMaxR())/(-0.001);
d2=(r - rAngle2.getMaxR())/(-0.001);
}
}
if((d1<=100&&d2<=100)&&(d1>=0&&d2>=0))
{
myslope= (Float_t) (d2-d1)/5.;
mydelta=angleDeg-(angleStep*5);
myfraction=100-TMath::Abs(d1+myslope*mydelta);
}
else
{
if((d1<=100&&d1>=0))
{
myfraction=100-TMath::Abs(d1);
}
else if((d2<=100&&d2>=0))
{
myfraction=100-TMath::Abs(d2);
}
}
if(myfraction>100||myfraction<=0)
{
Float_t testR=rAngle.getMaxR();
if(rAngle2.getMaxR()>rAngle.getMaxR())testR=rAngle2.getMaxR();
if(r>(testR*0.9))
{
myfraction=100;
}
else
{
myfraction=0;
}
}
return myfraction;
}
void HMdcCellEff::clear() {
for(Int_t m=0;m<getSize();m++) {
HMdcCellEffMod& mod=(*this)[m];
for(Int_t a=0;a<mod.getSize();a++) {
HMdcCellEffAngle& angle=mod[a];
angle.clear();
}
}
status=kFALSE;
resetInputVersions();
}
Last change: Sat May 22 13:00:36 2010
Last generated: 2010-05-22 13:00
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.