#include "hmdclayergeompar.h"
#include "hades.h"
#include "hruntimedb.h"
#include "hspectrometer.h"
#include "hmdcdetector.h"
#include "hpario.h"
#include "hdetpario.h"
#include "hmdcgeomstruct.h"
#include "hmessagemgr.h"
ClassImp(HMdcLayerGeomParLay)
ClassImp(HMdcLayerGeomParMod)
ClassImp(HMdcLayerGeomParSec)
ClassImp(HMdcLayerGeomPar)
void HMdcLayerGeomParLay::fill(HMdcLayerGeomParLay& r)
{
pitch=r.getPitch();
catDist=r.getCatDist();
wireOrient=r.getWireOrient();
centralWireNr=r.getCentralWireNr();
cathodeWireThickness=r.getCathodeWireThickness();
}
void HMdcLayerGeomParLay::Streamer(TBuffer &R__b)
{
UInt_t R__s, R__c;
if (R__b.IsReading()) {
Version_t R__v = R__b.ReadVersion(&R__s, &R__c); if (R__v) { }
TObject::Streamer(R__b);
R__b >> pitch;
R__b >> catDist;
R__b >> wireOrient;
R__b >> centralWireNr;
if (R__v>1) {
R__b >> cathodeWireThickness;
}
R__b.CheckByteCount(R__s, R__c, HMdcLayerGeomParLay::IsA());
} else {
R__c = R__b.WriteVersion(HMdcLayerGeomParLay::IsA(), kTRUE);
TObject::Streamer(R__b);
R__b << pitch;
R__b << catDist;
R__b << wireOrient;
R__b << centralWireNr;
R__b << cathodeWireThickness;
R__b.SetByteCount(R__c, kTRUE);
}
}
HMdcLayerGeomParMod::HMdcLayerGeomParMod() {
array = new TObjArray(6);
for (Int_t i = 0; i < 6; i++)
array->AddAt( new HMdcLayerGeomParLay(),i);
}
HMdcLayerGeomParMod::~HMdcLayerGeomParMod() {
array->Delete();
delete array;
}
Int_t HMdcLayerGeomParMod::getSize() {
return array->GetEntries();
}
HMdcLayerGeomParSec::HMdcLayerGeomParSec() {
array = new TObjArray(4);
for (Int_t i = 0; i < 4; i++)
array->AddAt( new HMdcLayerGeomParMod,i);
}
HMdcLayerGeomParSec::~HMdcLayerGeomParSec() {
array->Delete();
delete array;
}
Int_t HMdcLayerGeomParSec::getSize() {
return array->GetEntries();
}
HMdcLayerGeomPar::HMdcLayerGeomPar(const Char_t* name,const Char_t* title,
const Char_t* context)
: HParSet(name,title,context) {
strcpy(detName,"Mdc");
array = new TObjArray(6);
for (Int_t i = 0; i < 6; i++)
array->AddAt(new HMdcLayerGeomParSec,i);
HMdcGeomStruct* pMdc=
(HMdcGeomStruct*)gHades->getRuntimeDb()->getContainer("MdcGeomStruct");
if (pMdc) {
for(Int_t i=0;i<6;i++) {
for(Int_t j=0;j<4;j++) {
for(Int_t k=0;k<6;k++)
(*this)[i][j][k].setNumWires(((*pMdc)[i][j][k]));
}
}
} else {
ERROR_msg(HMessageMgr::DET_MDC,"numWires in container MdcLayerGeomPar not initialized");
ERROR_msg(HMessageMgr::DET_MDC,"container MdcGeomStruct not found");
}
ntuple=0;
}
HMdcLayerGeomPar::~HMdcLayerGeomPar() {
array->Delete();
delete array;
if (ntuple) delete ntuple;
}
Int_t HMdcLayerGeomPar::getSize() {
return array->GetEntries();
}
Bool_t HMdcLayerGeomPar::init(HParIo* inp,Int_t* set) {
HDetParIo* input=inp->getDetParIo("HMdcParIo");
Bool_t rc=kFALSE;
if (input) {
rc=input->init(this,set);
if (rc&&changed) {
calcLayerTransformations();
}
}
return rc;
}
void HMdcLayerGeomPar::calcLayerTransformations() {
Float_t pos0, catDist;
HGeomVector pos;
for(Int_t s=0;s<6;s++) {
HMdcLayerGeomParSec& sec=(*this)[s];
for(Int_t m=0;m<4;m++) {
HMdcLayerGeomParMod& mod=sec[m];
pos0=mod[3].getCathodeWireThickness()/2.;
for(Int_t l=0;l<3;l++) {
pos0-=mod[l].getCatDist();
}
for(Int_t l=0;l<mod.getSize();l++) {
HMdcLayerGeomParLay& lay=mod[l];
catDist=lay.getCatDist();
pos.setZ(pos0+catDist/2.);
lay.getLayerPos().setTransVector(pos);
pos0+=catDist;
}
}
}
}
Int_t HMdcLayerGeomPar::write(HParIo* output) {
HDetParIo* out=output->getDetParIo("HMdcParIo");
if (out) return out->write(this);
return -1;
}
void HMdcLayerGeomPar::readline(const Char_t *buf, Int_t *set) {
Int_t sector, module, layer, pos;
Float_t pit, cd, wor, cwn, cwt;
sscanf(buf,"%i%i%i%f%f%f%f%f",§or,&module,&layer,&pit,&cd,&wor,&cwn,&cwt);
pos=sector*4+module;
if (!set[pos]) return;
HMdcLayerGeomParLay& l=(*this)[sector][module][layer];
l.fill(pit,cd,wor,cwn,cwt);
set[pos]=999;
return;
}
void HMdcLayerGeomPar::putAsciiHeader(TString& header) {
header=
"# Geometry parameters for digitization of the MDC\n"
"# Format:\n"
"# sector module layer\n"
"# pitch\n"
"# distace of cathode planes\n"
"# wire orientation\n"
"# number of central wire\n"
"# thickness of cathode wires\n";
}
Bool_t HMdcLayerGeomPar::writeline(Char_t *buf, Int_t sec, Int_t mod, Int_t lay) {
HMdcLayerGeomParLay &l = (*this)[sec][mod][lay];
if (l.getNumWires()<=0) return kFALSE;
sprintf(buf,"%1i %1i %1i %8.4f %8.4f %8.4f %8.4f %8.3f\n",
sec, mod, lay,
l.getPitch(), l.getCatDist(), l.getWireOrient(),
l.getCentralWireNr(),l.getCathodeWireThickness());
return kTRUE;
}
void HMdcLayerGeomPar::clear() {
for(Int_t s=0;s<6;s++) {
HMdcLayerGeomParSec& sec=(*this)[s];
for(Int_t m=0;m<4;m++) {
HMdcLayerGeomParMod& mod=sec[m];
for(Int_t l=0;l<mod.getSize();l++) {
HMdcLayerGeomParLay& lay=mod[l];
lay.clear();
}
}
}
status=kFALSE;
resetInputVersions();
}
TNtuple* HMdcLayerGeomPar::getNtuple() {
if (ntuple) ntuple->Reset();
else ntuple=new TNtuple("MdcLayerGeomParNtuple","Ntuple of Mdc layer geometry",
"s:m:l:pt:nw:cd:wor:wof:cwt");
Int_t nw;
Float_t pt, cd, wor, wof, cwt;
for(Int_t s=0;s<6;s++) {
HMdcLayerGeomParSec& sec=(*this)[s];
for(Int_t m=0;m<4;m++) {
HMdcLayerGeomParMod& mod=sec[m];
for(Int_t l=0;l<mod.getSize();l++) {
HMdcLayerGeomParLay& lay=mod[l];
pt=lay.getPitch();
nw=lay.getNumWires();
cd=lay.getCatDist();
wor=lay.getWireOrient();
wof=lay.getCentralWireNr();
cwt=lay.getCathodeWireThickness();
ntuple->Fill(s,m,l,pt,nw,cd,wor,wof,cwt);
}
}
}
return ntuple;
}
void HMdcLayerGeomPar::printParam() {
for(Int_t s=0;s<6;s++) {
HMdcLayerGeomParSec& sec=(*this)[s];
for(Int_t m=0;m<4;m++) {
HMdcLayerGeomParMod& mod=sec[m];
for(Int_t l=0;l<mod.getSize();l++) {
HMdcLayerGeomParLay& lay=mod[l];
Int_t nw=lay.getNumWires();
if (nw)
gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName(),
"%1i %1i %1i %8.4f %5i %8.4f %8.2f %8.4f %8.4f %8.4f\n",
s, m, l, lay.getPitch(), nw, lay.getCatDist(),
lay.getWireOrient(), lay.getCentralWireNr(),
lay.getCathodeWireThickness(),
lay.getLayerPos().getTransVector().getZ());
}
}
}
SEPERATOR_msg("-",60);
}
Last change: Sat May 22 13:02:33 2010
Last generated: 2010-05-22 13:02
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.