#include<hshowergeometry.h>
#include<hades.h>
#include<hshowerdetector.h>
#include<hspectrometer.h>
#include<hdetpario.h>
#include "hpario.h"
#include "hgeomcompositevolume.h"
ClassImp(HShowerGeometry)
HShowerGeometry::HShowerGeometry(const Char_t* name, const Char_t* title, const Char_t* context)
:HDetGeomPar(name,title,context,"Shower") {
m_nModules = 3;
m_nSectors = 6;
m_nRows = 32;
m_nColumns = 32;
m_nLab = 0;
for(Int_t i = 0; i < 6; i++)
sectors[i].setSectorID(i);
}
HShowerGeometry::~HShowerGeometry()
{
clear();
}
Bool_t HShowerGeometry::init(HParIo* inp,Int_t* set){
HDetParIo* input=inp->getDetParIo("HShowerParIo");
if (input) return (input->init(this,set));
return kFALSE;
}
Int_t HShowerGeometry::write(HParIo* output) {
HDetParIo* out=output->getDetParIo("HShowerParIo");
if (out) return out->write(this);
return -1;
}
Bool_t HShowerGeometry::initAscii(HParHadAsciiFileIo* pHadAsciiFile)
{
Bool_t status = kTRUE;
if (!pHadAsciiFile) return kFALSE;
try {
HAsciiKey* pHAscii = pHadAsciiFile->GetKeyAscii();
HAsciiKey &mydata = *pHAscii;
mydata.SetActiveSection(" Shower General Geometry Data ");
mydata.ReadInt(&m_nSectors, "Sectors");
mydata.ReadInt(&m_nModules, "Modules");
mydata.ReadInt(&m_nRows, "Rows");
mydata.ReadInt(&m_nColumns, "Columns");
mydata.ReadInt(&m_nLab, "Labolatory");
for(Int_t i = 0; i < 6; i++)
sectors[i].initAscii(pHadAsciiFile);
for(Int_t i = 0; i < 3; i++) {
frames[i].setModuleID(i);
frames[i].initAscii(pHadAsciiFile);
}
for(Int_t i = 0; i < 3; i++) {
wires[i].setModuleID(i);
wires[i].initAscii(pHadAsciiFile);
}
for(Int_t i = 0; i < 3; i++) {
pads[i].setModuleID(i);
pads[i].setFrame(&frames[i]);
pads[i].initAscii(pHadAsciiFile);
pads[i].setModuleID(i);
}
attachTables();
initModGeomParAscii(pHadAsciiFile);
updateDetGeom();
}
catch (Bool_t ret) {
status = ret;
}
return status;
}
Bool_t HShowerGeometry::writeAscii(HParHadAsciiFileIo* pHadAsciiFile)
{
Bool_t status = kTRUE;
if (!pHadAsciiFile) return kFALSE;
try {
HAsciiKey* pHAscii = pHadAsciiFile->GetKeyAscii();
HAsciiKey &mydata = *pHAscii;
if(!mydata.WriteSection(" Shower General Geometry Data "))
return kFALSE;
mydata.WriteInt("Sectors", m_nSectors);
mydata.WriteInt("Modules", m_nModules);
mydata.WriteInt("Rows", m_nRows);
mydata.WriteInt("Columns", m_nColumns);
mydata.WriteInt("Labolatory", m_nLab);
for(Int_t i = 0; i < 6; i++)
sectors[i].writeAscii(pHadAsciiFile);
for(Int_t i = 0; i < 3; i++)
frames[i].writeAscii(pHadAsciiFile);
for(Int_t i = 0; i < 3; i++)
wires[i].writeAscii(pHadAsciiFile);
for(Int_t i = 0; i < 3; i++)
pads[i].writeAscii(pHadAsciiFile);
writeModGeomParAscii(pHadAsciiFile);
writeCompositeVolAscii(pHadAsciiFile);
}
catch (Bool_t ret) {
status = ret;
}
return status;
}
void HShowerGeometry::attachTables() {
Int_t i,j;
for(i = 0; i < 6; i++)
for(j = 0; j < 3; j++) {
HShowerModuleGeom* pModGeom = sectors[i].getModule(j);
pModGeom->setFrame(frames + j);
pModGeom->setWires(wires + j);
pModGeom->setPads(pads + j);
}
for(Int_t i = 0; i < 3; i++)
pads[i].setFrame(&frames[i]);
}
void HShowerGeometry::clear()
{
}
const HGeomTransform& HShowerGeometry::getTransform(Int_t sect) {
return sectors[sect].getTransform();
}
const HGeomTransform& HShowerGeometry::getTransform(Int_t sect, Int_t mod) {
return sectors[sect].getModule(mod)->getTransform();
}
void HShowerGeometry::getLocalCoord(HLocation& loc, HGeomVector& v) {
Float_t fX, fY;
Float_t scale = 10.0;
HShowerPadTab* pPads = getPadParam(loc[1]);
pPads->getPad(loc[2], loc[3])->getPadCenter(&fX, &fY);
v.setX(scale*fX);
v.setY(scale*fY);
v.setZ(0.0);
}
void HShowerGeometry::transVectToLab(HLocation& loc, HGeomVector vLocal, HGeomVector2& vLab) {
HGeomTransform tt = getTransform(loc[0], loc[1]);
vLab = tt.transFrom(vLocal);
}
void HShowerGeometry::getLabCoord(HLocation& loc, HGeomVector2& v) {
HGeomVector vLoc;
HGeomTransform tt;
getLocalCoord(loc, vLoc);
tt = getTransform(loc[0], loc[1]);
v = tt.transFrom(vLoc);
}
void HShowerGeometry::getSphereCoord(HLocation& loc, HGeomVector2& v, HGeomVector *pvTarget){
Float_t r,theta,phi;
HGeomVector2 vLoc;
getLabCoord(loc,vLoc);
if(pvTarget != NULL)
vLoc -= *pvTarget;
vLoc.sphereCoord(r,theta,phi);
v.setRad(r);
v.setTheta(theta);
v.setPhi(phi);
}
void HShowerGeometry::transLabToSphereCoord(HGeomVector2& labIn, HGeomVector2& sphereOut, HGeomVector *pvTarget){
Float_t r,theta,phi;
if(pvTarget != NULL)
labIn -= *pvTarget;
labIn.sphereCoord(r,theta,phi);
sphereOut.setRad(r);
sphereOut.setTheta(theta);
sphereOut.setPhi(phi);
}
void HShowerGeometry::translModules() {
sectors[0].translateModules();
}
void HShowerGeometry::rotateSectors() {
Int_t i, j;
HGeomTransform modt[3];
HGeomTransform st;
st = sectors[0].getTransform();
for (j = 0; j < sectors[0].getModules(); j++)
modt[j] = sectors[0].getModule(j)->getTransform();
for(i = 1; i < m_nSectors; i++) {
sectors[i].setTransform(st);
for(j = 0; j < sectors[i].getModules(); j++)
sectors[i].getModule(j)->setTransform(modt[j]);
sectors[i].rotateSector();
}
}
Bool_t HShowerGeometry::transToLab() {
if (IsLab()) {
printf("Geometry has been transformed to labolatory coordinates already\n");
return kFALSE;
}
printf("Geometry is being transformed to labolatory coordinates now\n");
translModules();
rotateSectors();
setLab();
setChanged();
return kTRUE;
}
Bool_t HShowerGeometry::transPadToLab() {
HGeomTransform tt;
HGeomVector2 vLoc,vLab;
Float_t fX,fY,r,theta,phi;
Float_t scale = 10.0;
FILE *fp;
fp = fopen("test.txt","w");
for(Int_t i=0;i<m_nSectors;i++) {
for(Int_t j=0;j<sectors[i].getModules();j++) {
for (Int_t k=0;k < m_nRows; k++) {
for (Int_t l=0;l < m_nColumns; l++) {
HShowerPadTab* pPads = getPadParam(j);
pPads->getPad(k,l)->getPadCenter(&fX, &fY);
vLoc.setX(scale*fX);
vLoc.setY(scale*fY);
vLoc.setZ(0.0);
tt = getTransform(i,j);
vLab = tt.transFrom(vLoc);
vLab.sphereCoord(r,theta,phi);
if(!j) fprintf(fp,"%3d%3d%3d %10.3f%10.3f\n",i,k,l,phi,theta);
}
}
}
}
fclose(fp);
return kTRUE;
}
void HShowerGeometry::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) { }
if (R__v<2){
Warning("Streamer","\n!!! Old version of the ShowerGeometry\n!!! Not full functionality from HDetGeomPar will be available\n");
HShowerParSet showerSet;
showerSet.Streamer(R__b);
R__b >> m_nSectors;
R__b >> m_nModules;
R__b >> m_nRows;
R__b >> m_nColumns;
R__b >> m_nLab;
Int_t R__i;
for (R__i = 0; R__i < 6; R__i++)
sectors[R__i].Streamer(R__b);
for (R__i = 0; R__i < 3; R__i++)
frames[R__i].Streamer(R__b);
for (R__i = 0; R__i < 3; R__i++)
wires[R__i].Streamer(R__b);
for (R__i = 0; R__i < 3; R__i++)
pads[R__i].Streamer(R__b);
if ( !initDetGeom() || !updateDetGeom()){
Warning("Streamer","ShowerDetGeom not initialized correctly");
}
}
else {
HDetGeomPar::Streamer(R__b);
R__b >> m_nSectors;
R__b >> m_nModules;
R__b >> m_nRows;
R__b >> m_nColumns;
R__b >> m_nLab;
Int_t R__i;
for (R__i = 0; R__i < 6; R__i++)
sectors[R__i].Streamer(R__b);
for (R__i = 0; R__i < 3; R__i++)
frames[R__i].Streamer(R__b);
for (R__i = 0; R__i < 3; R__i++)
wires[R__i].Streamer(R__b);
for (R__i = 0; R__i < 3; R__i++)
pads[R__i].Streamer(R__b);
R__b.CheckByteCount(R__s, R__c, HShowerGeometry::IsA());
attachTables();
}
} else {
R__c = R__b.WriteVersion(HShowerGeometry::IsA(), kTRUE);
HDetGeomPar::Streamer(R__b);
R__b << m_nSectors;
R__b << m_nModules;
R__b << m_nRows;
R__b << m_nColumns;
R__b << m_nLab;
Int_t R__i;
for (R__i = 0; R__i < 6; R__i++)
sectors[R__i].Streamer(R__b);
for (R__i = 0; R__i < 3; R__i++)
frames[R__i].Streamer(R__b);
for (R__i = 0; R__i < 3; R__i++)
wires[R__i].Streamer(R__b);
for (R__i = 0; R__i < 3; R__i++)
pads[R__i].Streamer(R__b);
R__b.SetByteCount(R__c, kTRUE);
}
}
Bool_t HShowerGeometry::updateDetGeom() {
HGeomVector vm[3] = { HGeomVector(0.000 , 0.00 , -3.997),
HGeomVector(0.000 , 0.00 , 67.601),
HGeomVector(0.000 , 0.00 , 134.897)};
for (Int_t s=0;s<getSectors();s++){
for(Int_t m=0;m<getModules();m++){
HGeomVector tr = sectors[s].getModule(m)->transform.getTransVector();
HGeomRotation rot = sectors[s].getModule(m)->getTransform().getRotMatrix();
getModule(s,m)->getLabTransform().setRotMatrix(rot);
getModule(s,m)->getLabTransform().setTransVector(tr -rot*vm[m]);
}
}
return kTRUE;
}
Bool_t HShowerGeometry::initDetGeom(){
if(gHades){
HSpectrometer* spec=gHades->getSetup();
HDetector* shower=0;
if ( !(shower = spec->getDetector("Shower")) ) {
shower = new HShowerDetector;
Int_t showerMods[3]={1,1,1};
for(Int_t nSector =0 ; nSector<6 ;nSector++) {
shower->setModules(nSector,showerMods);
}
spec->addDetector(shower);
}
else{
Error("initDetGeom","Detector not found");
return kFALSE;
}
shapes=gHades->getSetup()->getShapes();
maxSectors=shower->getMaxSectors();
maxModules=shower->getMaxModules();
numComponents=shower->getMaxComponents();
if (maxModules>0) {
refVolumes=new TObjArray(maxModules);
Int_t* set=shower->getModules();
Int_t n=0;
if (maxSectors>0) n=maxSectors*maxModules;
else n=maxModules;
modules=new TObjArray(n);
for (Int_t i=0;i<n;++i) {
if (set[i]!=0) modules->AddAt(new HModGeomPar(),i);
else modules->RemoveAt(i);
}
}
}
else return kFALSE;
Char_t modNames[18][6] = {"SH1M1",
"SH2M1",
"SH3M1",
"SH1M2",
"SH2M2",
"SH3M2",
"SH1M3",
"SH2M3",
"SH3M3",
"SH1M4",
"SH2M4",
"SH3M4",
"SH1M5",
"SH2M5",
"SH3M5",
"SH1M6",
"SH2M6",
"SH3M6",
};
Int_t i=0;
Char_t ref[6];
for(Int_t s=0;s<6;s++)
for(Int_t m=0; m<3;m++){
HModGeomPar* pMod=getModule(s,m);
if( pMod ){
pMod->SetName(modNames[i]);
strcpy(ref,modNames[i]);
ref[4]='1';
pMod->setRefName(ref);
Int_t mr=getModNumInMod(ref);
HGeomCompositeVolume* refMod=getRefVolume(mr);
if (refMod==0) {
refMod=new HGeomCompositeVolume(getNumComponents());
refMod->SetName(ref);
addRefVolume(refMod,mr);
}
pMod->setVolume(refMod);
}
i++;
}
return kTRUE;
}
Bool_t HShowerGeometry::writeModGeomParAscii(HParHadAsciiFileIo* pHadAsciiFile){
Bool_t status = kTRUE;
Float_t matrixRot[9];
Float_t transVect[3];
if (!pHadAsciiFile) return kFALSE;
try {
HAsciiKey* pHAscii = pHadAsciiFile->GetKeyAscii();
HAsciiKey &mydata = *pHAscii;
mydata.WriteString("\n");
mydata.WriteRemark("");
mydata.WriteRemark("Geometry Data according to the HDetGeomPar scheme");
mydata.WriteRemark("DO NOT change Rotation Matrix or Translation Vector");
mydata.WriteRemark("for \"Shower ModGeom\"!!! Your changes will be lost!!!");
mydata.WriteRemark("Transformation for ModGeom is always recalculated from:");
mydata.WriteRemark("\"SectorX Geometry Data\"");
mydata.WriteRemark("");
mydata.WriteString("\n");
if(!mydata.WriteSection("Shower ModGeom"))
return kFALSE;
for(Int_t i=0;i< getNumModules();i++) {
HModGeomPar* p = getModule(i);
Char_t buf[10];
if (p){
if(i!=0)
mydata.WriteLine("\n");
sprintf(buf,"\"%s\"",p->GetName());
mydata.WriteString("Name", buf);
sprintf(buf,"\"%s\"",p->getRefName());
mydata.WriteString("RefName", buf);
for(Int_t i=0; i < 9; i++)
matrixRot[i]=p->getLabTransform().getRotMatrix()(i);
transVect[0]=p->getLabTransform().getTransVector().getX();
transVect[1]=p->getLabTransform().getTransVector().getY();
transVect[2]=p->getLabTransform().getTransVector().getZ();
mydata.SetNumInLine(3);
mydata.WriteFloat("Rotation Matrix*", 9, (Float_t*)matrixRot);
mydata.WriteFloat("Translation Vector", 3, (Float_t*)transVect);
}
}
}
catch (Bool_t ret) {
status = ret;
}
return status;
}
Bool_t HShowerGeometry::writeCompositeVolAscii(HParHadAsciiFileIo* pHadAsciiFile){
Bool_t status = kTRUE;
if (!pHadAsciiFile) return kFALSE;
try {
HAsciiKey* pHAscii = pHadAsciiFile->GetKeyAscii();
HAsciiKey &mydata = *pHAscii;
if(!mydata.WriteSection("Shower Geom Volume "))
return kFALSE;
for(Int_t i=0;i<refVolumes->GetSize();i++) {
HGeomCompositeVolume* p=(HGeomCompositeVolume*)refVolumes->At(i);
if(p){
writeGeomVolAscii(pHadAsciiFile,p);
mydata.WriteLine("\n");
writeGeomVolAscii(pHadAsciiFile,p->getComponent(0));
mydata.WriteLine("\n");
}
}
}
catch (Bool_t ret) {
status = ret;
}
return status;
}
Bool_t HShowerGeometry::writeGeomVolAscii(HParHadAsciiFileIo* pHadAsciiFile,HGeomVolume *p){
Bool_t status = kTRUE;
Float_t geomVect[3];
Float_t matrixRot[9];
Float_t transVect[3];
Char_t buf[10];
if (!pHadAsciiFile) return kFALSE;
try {
HAsciiKey* pHAscii = pHadAsciiFile->GetKeyAscii();
HAsciiKey &mydata = *pHAscii;
if (p) {
Int_t nPoints = p->getNumPoints();
sprintf(buf,"\"%s\"",p->getName().Data());
mydata.WriteString("Name",buf);
sprintf(buf,"\"%s\"",p->getShape().Data());
mydata.WriteString("Shape", buf);
sprintf(buf,"\"%s\"", p->getMother().Data());
mydata.WriteString("Mother", buf);
if (nPoints)
for (Int_t i=0;i<nPoints;i++){
HGeomVector *pVector = p->getPoint(i);
geomVect[0]=pVector->getX();
geomVect[1]=pVector->getY();
geomVect[2]=pVector->getZ();
mydata.WriteFloat("Point", 3, (Float_t*)geomVect);
}
for(Int_t n=0; n < 9; n++)
matrixRot[n]=p->getTransform().getRotMatrix()(n);
transVect[0]=p->getTransform().getTransVector().getX();
transVect[1]=p->getTransform().getTransVector().getY();
transVect[2]=p->getTransform().getTransVector().getZ();
mydata.SetNumInLine(3);
mydata.WriteFloat("Rotation Matrix*", 9, (Float_t*)matrixRot);
mydata.WriteFloat("Translation Vector", 3, (Float_t*)transVect);
}
}
catch (Bool_t ret) {
status = ret;
}
return status;
}
Bool_t HShowerGeometry::initModGeomParAscii(HParHadAsciiFileIo* pHadAsciiFile)
{
Bool_t status = kTRUE;
if (!pHadAsciiFile) return kFALSE;
try {
HAsciiKey* pHAscii = pHadAsciiFile->GetKeyAscii();
HAsciiKey &mydata = *pHAscii;
mydata.SetActiveSection(" Shower ModGeom ");
if(gHades){
HSpectrometer* spec=gHades->getSetup();
HDetector* shower=0;
spec->print();
if ( !(shower = spec->getDetector("Shower")) ) {
shower = new HShowerDetector;
Int_t showerMods[3]={1,1,1};
for(Int_t nSector =0 ; nSector<6 ;nSector++) {
shower->setModules(nSector,showerMods);
}
spec->addDetector(shower);
}
shapes=gHades->getSetup()->getShapes();
maxSectors=shower->getMaxSectors();
maxModules=shower->getMaxModules();
numComponents=shower->getMaxComponents();
if (maxModules>0) {
refVolumes=new TObjArray(maxModules);
Int_t* set=shower->getModules();
Int_t n=0;
if (maxSectors>0) n=maxSectors*maxModules;
else n=maxModules;
modules=new TObjArray(n);
for (Int_t i=0;i<n;++i) {
if (set[i]!=0) modules->AddAt(new HModGeomPar(),i);
else modules->RemoveAt(i);
}
}
}
Char_t name[10],refName[10],shape[10],mother[10];
Float_t fRot[9];
Float_t fTrans[3];
Float_t fPoint[3];
while(mydata.IsNextKeyword()){
strcpy(name,mydata.ReadString("*"));
strcpy(refName,mydata.ReadString("*"));
HModGeomPar* pMod=getModule(getSecNum(name),getModNumInMod(name));
pMod->SetName(name);
pMod->setRefName(refName);
mydata.ReadFloat(fRot,"*");
mydata.ReadFloat(fTrans,"*");
pMod->getLabTransform().setTransVector(fTrans);
pMod->getLabTransform().setRotMatrix(fRot);
refName[4]='1';
Int_t mr=getModNumInMod(refName);
HGeomCompositeVolume* refMod=getRefVolume(mr);
if (refMod==0) {
refMod=new HGeomCompositeVolume(getNumComponents());
refMod->SetName(refName);
addRefVolume(refMod,mr);
}
pMod->setVolume(refMod);
}
mydata.SetActiveSection("Shower Geom Volume");
while(mydata.IsNextKeyword()){
strcpy(name,mydata.ReadString("*"));
strcpy(shape,mydata.ReadString("*"));
strcpy(mother,mydata.ReadString("*"));
HGeomCompositeVolume* p=
(HGeomCompositeVolume*)refVolumes->At(getModNumInMod(name));
p->createPoints(8);
for (Int_t i=0;i<8;i++){
mydata.ReadFloat(fPoint,"*");
p->setPoint(i,fPoint[0],fPoint[1],fPoint[2]);
}
mydata.ReadFloat(fRot,"*");
mydata.ReadFloat(fTrans,"*");
p->getTransform().setTransVector(fTrans);
p->getTransform().setRotMatrix(fRot);
p->SetName(name);
p->setShape(shape);
p->setMother(mother);
HGeomVolume *vol = p->getComponent(0);
vol->createPoints(8);
strcpy(name,mydata.ReadString("*"));
strcpy(shape,mydata.ReadString("*"));
strcpy(mother,mydata.ReadString("*"));
vol->SetName(name);
vol->setShape(shape);
vol->setMother(mother);
for (Int_t i=0;i<8;i++){
mydata.ReadFloat(fPoint,"*");
vol->setPoint(i,fPoint[0],fPoint[1],fPoint[2]);
}
mydata.ReadFloat(fRot,"*");
mydata.ReadFloat(fTrans,"*");
vol->getTransform().setTransVector(fTrans);
vol->getTransform().setRotMatrix(fRot);
}
}
catch (Bool_t ret) {
status = ret;
}
return status;
}
Last change: Sat May 22 13:13:32 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.