#include "hgeoset.h" #include "hnamedlistfc.h" template class HNamedList; int HGeoSet::readKeepIn(HGeoInfo & geoInfo, HGeoMedia & geoMedia) { HGeoParam ele; int noKeepIn=0; int ns=geoInfo.getNs(); for(int i=1;i<=ns;i++) { HString volName=keepinName + HString(i); if (readParam(geoInfo,volName,ele,geoMedia)==HSUCCESS) { append(volName,ele); noKeepIn++; #ifdef ILSESHOW showAll(volName,ele); #endif } } return noKeepIn; } int HGeoSet::readModule(HGeoInfo & geoInfo, HGeoMedia & geoMedia) { HGeoParam ele; int no=0; int ns=geoInfo.getNs(); for(int i=1;i<=ns;i++) { HString volName=detName + HString(i); if (readParam(geoInfo,volName,ele,geoMedia)==HSUCCESS) { append(volName,ele); #ifdef ILSESHOW showAll(volName,ele); #endif no++; } } HString moName=detName + "1"; if (readDaughters(geoInfo,moName,geoMedia)==HSUCCESS) return no; return 0; } int HGeoSet::readParam(HGeoInfo & geoInfo, HString & volName, HGeoParam & ele, HGeoMedia & geoMedia) { #ifdef WITHORACLE char* vName=volName; HString s1; int i=geoInfo.geoDb->getMother(vName); ele.mother=geoInfo.geoDb->getName(i,s1.assign(22)); ele.shape=(geoInfo.geoDb->getGeantShape(vName,s1)); if (ele.shape.length()<4) ele.shape += ' '; ele.inout=1; // not stored in database i=geoInfo.geoDb->getMaterial(vName); if (i<0) { cerr << ele.material << " not defined in oracle" << endl; return HFAILURE; } ele.material=geoInfo.geoDb->getMaterialName(i,s1); if (geoMedia.readDbMedium(ele.material,geoInfo)==HFAILURE) return HFAILURE; ele.material.upper(); if (readVol(geoInfo,volName,ele)==HFAILURE) { cerr << "cannot read points of " << volName << endl; return HFAILURE; } char* moName=ele.mother; if (geoInfo.geoDb->getTransTransl(vName,moName,ele.trans)==HFAILURE) { cerr << "cannot read translationvector of " << volName << endl; return HFAILURE; } if (geoInfo.geoDb->getTransRot(vName,moName,ele.rot)==HFAILURE) { cerr << "cannot read rotationmatrix of " << volName << endl; return HFAILURE; } #endif return HSUCCESS; } int HGeoSet::readDaughters(HGeoInfo & geoInfo, HString & moName, HGeoMedia & geoMedia) { #ifdef WITHORACLE char* mName=moName; HString volName(' ',4); HString s1; HGeoParam ele; int ndaughter=geoInfo.geoDb->getNrAllDaughters(mName); if (ndaughter>0) { int* pdaughter=new int[ndaughter]; if (geoInfo.geoDb->getAllDaughters(mName,pdaughter)==HSUCCESS) { for(int i=0;igetName(*(pdaughter + i),s1.assign(22)); if (readParam(geoInfo,volName,ele,geoMedia)==HSUCCESS) { append(volName,ele); #ifdef ILSESHOW showAll(volName,ele); #endif } else { cerr << "cannot read " << volName << endl; delete [] pdaughter; return HFAILURE; } } } else { cerr << "cannot read daugthers of " << moName << endl; } delete [] pdaughter; } #endif return HSUCCESS; } int HGeoSet::readVol(HGeoInfo & geoInfo, HString & volName, HGeoParam & ele) { if (pShapes->readPoints(geoInfo,volName,ele)==HSUCCESS) return HSUCCESS; return HFAILURE; } int HGeoSet::readKeepIn(HGeoInfo & geoInfo) { HGeoParam ele; HString volName(' ',120), copyName; int n=0, noKeepIn=0, nfirst=1, retVal, lName; int lKeepinName=keepinName.length(); int ns=geoInfo.getNs(); while(!geoInfo.fin.eof() && n> volName; if (volName.empty() || volName(0)=='/') geoInfo.fin.getline(volName,120); else { if (volName(0,lKeepinName)==keepinName) { n++; readInout(geoInfo,ele); lName=volName.length(); if (lName<=4) nfirst=1; else { HString s=volName(0,4); if (s!=copyName) { copyName=s; nfirst=1; } } if (ele.inout==1) { if (nfirst) { nfirst=0; retVal=readParam(geoInfo,ele); } else retVal=readCopy(geoInfo,ele); if (retVal==HSUCCESS) { noKeepIn++; append(volName,ele); } } } } } return noKeepIn; } int HGeoSet::readModule(HGeoInfo & geoInfo) { HGeoParam ele; HString volName(' ',120), copyName; int lName, retVal, nfirst=1, noKeepIn=0; int lDetName=detName.length(); int lEleName=eleName.length(); while(!geoInfo.fin.eof()) { geoInfo.fin >> volName; if (volName.empty() || volName(0)=='/') geoInfo.fin.getline(volName,120); else { if ((volName(0,lDetName)==detName) || (volName(0,lEleName)==eleName)) { lName=volName.length(); if (lName<=4) nfirst=1; else { HString s=volName(0,4); if (s!=copyName) { copyName=s; nfirst=1; } } if (!volName.find(detName)) { readInout(geoInfo,ele); if (ele.inout==1) noKeepIn++; } if (nfirst) { nfirst=0; retVal=readParam(geoInfo,ele); } else retVal=readCopy(geoInfo,ele); if (retVal==HSUCCESS) append(volName,ele); } } } return noKeepIn; } void HGeoSet::readInout(HGeoInfo & geoInfo, HGeoParam & ele){ geoInfo.fin >> ele.inout; return; } int HGeoSet::readVol(HGeoInfo & geoInfo, HGeoParam & ele) { if (pShapes->readPoints(geoInfo,ele)==HSUCCESS) return HSUCCESS; return HFAILURE; } int HGeoSet::readParam(HGeoInfo & geoInfo, HGeoParam & ele) { geoInfo.fin >> ele.mother.assign(10) >> ele.shape.assign(10) >> ele.material.assign(25); if (ele.shape.length()<4) ele.shape += ' '; if (readVol(geoInfo,ele)==HSUCCESS) { geoInfo.fin >> ele.trans >> ele.rot; return HSUCCESS; } return HFAILURE; } int HGeoSet::readCopy(HGeoInfo & geoInfo, HGeoParam & ele) { geoInfo.fin >> ele.mother.assign(10) >> ele.trans >> ele.rot; return HSUCCESS; } int HGeoSet::createKeepIn(HGeoInfo & geoInfo,HGeoMedia & geoMedia) { int matNo, ivolu, no=0; HGeoParam ele; HGeoParam mo; HString volName; int lName=keepinName.length(); int ns=geoInfo.getNs(); do { volName=name(); if (volName(0,lName)==keepinName) { no++; ele=element(); if (ele.inout==1) { mo.shape="PGON"; mo.geaPos=mo.geaPos * 0.0F; matNo=geoMedia.createMedium(ele.material,geoInfo); if (matNo) { HString vtmp=volName(0,4); char* cN=vtmp; char* eS=ele.shape; HGeoShapePar & shapePar=pShapes->shapePar; if (pShapes->calcShape(ele)==HSUCCESS) { #ifdef WITHGEANT GSVOLU(cN,eS,matNo,&(shapePar.volPar[0]),shapePar.noPar,ivolu); #endif } else return HFAILURE; if (pShapes->posShape(ele,mo,pShapes->shapePar)==HSUCCESS) { HString mtmp=ele.mother(0,4); char* moN=mtmp; #ifdef WITHGEANT GSPOS(cN,1,moN,shapePar.pos[0],shapePar.pos[1],shapePar.pos[2], shapePar.nRot,"ONLY"); #endif replace(volName,ele); } else return HFAILURE; #ifdef ILSESHOW cout << volName << " matNo: " << matNo << '\n'; pShapes->showShapePar(); #endif } else { cerr << "material for " << volName << " not defined" << endl; return HFAILURE; } } } } while (next(1) && no<=ns); if (no>0) return HSUCCESS; else return HFAILURE; } int HGeoSet::createModule(HGeoInfo & geoInfo,HGeoMedia & geoMedia) { int matNo, copyNo, ivolu; HGeoParam ele; HGeoParam mo; HString volName, copyName; int lKeepinName=keepinName.length(); int lDetName=detName.length(); int lEleName=eleName.length(); do { volName=name(); if ((lDetName>0 && volName(0,lDetName)==detName) || (lEleName>0 && volName(0,lEleName)==eleName)) { ele=element(); if (ele.inout==1) { if (volName(0,lDetName)==detName) { if (lKeepinName>0 && ele.mother(0,lKeepinName)==keepinName) { mo=peek(ele.mother); } else { mo.shape="PGON"; mo.geaPos=mo.geaPos * 0.0F; } } else mo=peek(ele.mother); matNo=geoMedia.createMedium(ele.material,geoInfo); HGeoShapePar & shapePar=pShapes->shapePar; if (matNo) { if (volName.length()<=4) { copyName=volName(0,4); copyNo=1; } else { HString s=volName(0,4); if (s!=copyName) { copyName=s; copyNo=1; } else copyNo++; } char* cN=copyName; char* eS=ele.shape; if (copyNo==1) { if (pShapes->calcShape(ele)==HSUCCESS) { #ifdef WITHGEANT GSVOLU(cN,eS,matNo,&(shapePar.volPar[0]),shapePar.noPar,ivolu); #endif } else return HFAILURE; } if (pShapes->posShape(ele,mo,shapePar)==HSUCCESS) { HString tmp=ele.mother(0,4); char* moN=tmp; #ifdef WITHGEANT GSPOS(cN,copyNo,moN,shapePar.pos[0],shapePar.pos[1], shapePar.pos[2],shapePar.nRot,"ONLY"); #endif replace(volName,ele); } else return HFAILURE; #ifdef ILSESHOW cout << volName << " matNo: " << matNo << '\n'; pShapes->showShapePar(); #endif if (copyNo==1 && geoMedia.getCurrentSensFlag()==1) { if (createHits(copyName)==HFAILURE) { cerr << "cannot create hits for " << volName << endl; return HFAILURE; } } } else { cerr << "material for " << volName << " not defined" << endl; return HFAILURE; } } } } while(next(1)); return HSUCCESS; } void HGeoSet::showAll(HString & volName, HGeoParam & ele) { HString bl=" "; cout << volName << bl << ele.inout << bl << ele.mother << bl << ele.shape << bl << ele.material << '\n'; for(int i=0;i