//*-- AUTHOR : Ilse Koenig //*-- Last modified : 21/02/2007 by I. Koenig //*-- Created : 20/01/2005 //_HADES_CLASS_DESCRIPTION ////////////////////////////////////////////////////////////////////////////// // // HWallParOraIo // // Interface class to database Oracle for input/output of parameters needed // by the Forward Wall // (uses the Oracle C/C++ precompiler) // ////////////////////////////////////////////////////////////////////////////// using namespace std; #include "hwallparoraio.h" #include "hwalllookup.h" #include "hwallcalpar.h" #include "hwallgeompar.h" #include "hgeomcompositevolume.h" #include "hgeomoradetversion.h" #include "TClass.h" #include #include #include #define SQLCA_STORAGE_CLASS extern #define ORACA_STORAGE_CLASS extern // Oracle communication area #include // SQL Communications Area #include ClassImp(HWallParOraIo) #define WALL_MAXCELLS 302 HWallParOraIo::HWallParOraIo(HOraConn* pC) : HDetParOraIo(pC) { // constructor // sets the name of the I/O class "HWallParIo" // gets the pointer to the connection class fName="HWallParIo"; geomVers=0; } HWallParOraIo::~HWallParOraIo() { // destructor if (geomVers) delete geomVers; } Bool_t HWallParOraIo::init(HParSet* pPar,Int_t* set) { // calls special read-function for each parameter container const Text_t* name=pPar->IsA()->GetName(); if (startIo(pPar)<=0) return kFALSE; if (strcmp(name,"HWallLookup")==0) return read(((HWallLookup*)pPar)); if (strcmp(name,"HWallCalPar")==0) return read(((HWallCalPar*)pPar)); if (strcmp(name,"HWallGeomPar")==0) return read(((HWallGeomPar*)pPar),set); // cout<<"initialization of "<GetName()<<" not possible from Oracle!"<IsA()->GetName(); if (startIo(pPar)<=0) return kFALSE; if (strcmp(name,"HWallLookup")==0) return writePar((HWallLookup*)pPar); if (strcmp(name,"HWallCalPar")==0) return writePar((HWallCalPar*)pPar); if (strcmp(name,"HWallGeomPar")==0) return writeAlignment((HWallGeomPar*)pPar); cout<<"No write-interface to Oracle for parameter container " <GetName()<setInputVersion(-1,inputNumber); return -1; } return runStart; } Int_t HWallParOraIo::getVersion(HParSet* pPar) { // reads the version for the parameters // valid for the current event file // returns -1, if no data are found HParOraSet* oraSet=getOraSet(pPar); if (oraSet->contextId==-1) return -1; Int_t contVers=pPar->getInputVersion(inputNumber); if (contVers!=-1 && runStart>=oraSet->versDate[0] && runStart<=oraSet->versDate[1]) return contVers; oraSet->clearVersDate(); EXEC SQL BEGIN DECLARE SECTION; int context; struct { int vers; double since; double until; } parvers; EXEC SQL END DECLARE SECTION; context=oraSet->contextId; EXEC SQL WHENEVER SQLERROR GOTO errorfound; EXEC SQL WHENEVER NOT FOUND GOTO notfound; const Char_t* containerClass=pPar->IsA()->GetName(); if (strcmp(containerClass,"HWallLookup")==0) { EXEC SQL SELECT version, hdate.to_ansitime(valid_since), hdate.to_ansitime(valid_until) INTO :parvers FROM wall_ana.lookup_vers_at_date WHERE context_id = :context; } else if (strcmp(containerClass,"HWallCalPar")==0) { EXEC SQL SELECT version, hdate.to_ansitime(valid_since), hdate.to_ansitime(valid_until) INTO :parvers FROM wall_ana.calpar_vers_at_date WHERE context_id = :context; } oraSet->versDate[0]=parvers.since; oraSet->versDate[1]=parvers.until; return parvers.vers; notfound: return -1; errorfound: showSqlError("getVersion(HParSet*)"); return -1; }; Bool_t HWallParOraIo::read(HWallLookup* pPar) { // reads the lookup table Int_t contVers=pPar->getInputVersion(inputNumber); Int_t version=getVersion(pPar); if (version==-1) { pPar->setInputVersion(-1,inputNumber); return kFALSE; } if (contVers==version) return kTRUE; pPar->clear(); EXEC SQL BEGIN DECLARE SECTION; int vers; struct { int crate[WALL_MAXCELLS]; int slot[WALL_MAXCELLS]; int chan[WALL_MAXCELLS]; char branch[WALL_MAXCELLS][2]; int cell[WALL_MAXCELLS]; } lrecL; EXEC SQL END DECLARE SECTION; EXEC SQL WHENEVER SQLERROR goto errorfound; EXEC SQL WHENEVER NOT FOUND continue; vers=version; EXEC SQL SELECT crate, slot, channel, module_type, cell_id INTO :lrecL FROM wall_ana.lookup_data WHERE vers_id = :vers; if (sqlca.sqlerrd[2]>0) { for(Int_t i=0;ifill(lrecL.crate[i]-1,lrecL.slot[i]-1,lrecL.branch[i][0], lrecL.chan[i],lrecL.cell[i]-1); } pPar->setInputVersion(version,inputNumber); setChanged(pPar); cout<GetName()<<" initialized from Oracle: "; return kTRUE; } else { pPar->setInputVersion(-1,inputNumber); return kFALSE; } errorfound: showSqlError("read(HWallLookup*)"); pPar->setInputVersion(-1,inputNumber); return kFALSE; } Bool_t HWallParOraIo::read(HWallCalPar* pPar) { // reads the calibration parameters Int_t contVers=pPar->getInputVersion(inputNumber); Int_t version=getVersion(pPar); if (version==-1) { pPar->setInputVersion(-1,inputNumber); return kFALSE; } if (contVers==version) return kTRUE; pPar->clear(); EXEC SQL BEGIN DECLARE SECTION; int vers; struct { int cell[WALL_MAXCELLS]; float tslope[WALL_MAXCELLS]; float toffset[WALL_MAXCELLS]; float aslope[WALL_MAXCELLS]; float aoffset[WALL_MAXCELLS]; } lrecC; EXEC SQL END DECLARE SECTION; EXEC SQL WHENEVER SQLERROR goto errorfound; EXEC SQL WHENEVER NOT FOUND continue; vers=version; EXEC SQL SELECT cell_id, tdc_slope, tdc_offset, adc_slope, adc_offset INTO :lrecC FROM wall_ana.calpar_data WHERE vers_id = :vers; if (sqlca.sqlerrd[2]>0) { for(Int_t i=0;isetInputVersion(version,inputNumber); setChanged(pPar); cout<GetName()<<" initialized from Oracle\n"; return kTRUE; } else { pPar->setInputVersion(-1,inputNumber); return kFALSE; } errorfound: showSqlError("read(HWallCalPar*)"); pPar->setInputVersion(-1,inputNumber); return kFALSE; } Bool_t HWallParOraIo::read(HWallGeomPar* pPar, Int_t* set) { // reads the geometry of the Forward Wall and fills the WallGeomPar container Bool_t allFound=kTRUE; Int_t detId=-1; if (!geomVers) { detId=getDetectorId(pPar->getDetectorName()); geomVers=new HGeomOraDetVersion(pPar->getDetectorName(),detId); } else { detId=geomVers->getDetectorId(); } if (detId<=0) { allFound=kFALSE; delete geomVers; geomVers=0; } if (detId>0&&pPar->isFirstInitialization()) { if (!readModGeomNames(pPar) || !readCompGeomNames(pPar)) { allFound=kFALSE; pPar->clear(); } else addGeomOraSet(pPar); } if (allFound) allFound=readDetectorGeometry(pPar,set,geomVers); return allFound; } Bool_t HWallParOraIo::readModGeomNames(HWallGeomPar* pPar) { // sets the geometry object name of the module and creates the reference volume if not existing Bool_t allFound=kFALSE; TString modName=pPar->getDetectorName(); modName.ToUpper(); HModGeomPar* pMod=pPar->getModule(-1,0); if (pMod) { pMod->SetName(modName); pMod->setRefName(modName); HGeomCompositeVolume* refMod=pPar->getRefVolume(0); if (refMod==0) { refMod=new HGeomCompositeVolume(pPar->getNumComponents()); refMod->SetName(modName); pPar->addRefVolume(refMod,0); } pMod->setVolume(refMod); allFound=kTRUE; } return allFound; } Bool_t HWallParOraIo::readCompGeomNames(HWallGeomPar* pPar) { // reads the names of all cells in the geometry tables EXEC SQL BEGIN DECLARE SECTION; struct { int cell[WALL_MAXCELLS]; varchar oname[WALL_MAXCELLS][9]; } lrecG; EXEC SQL END DECLARE SECTION; EXEC SQL WHENEVER SQLERROR DO showSqlError("readCompGeomNames(...)"); EXEC SQL WHENEVER NOT FOUND CONTINUE; EXEC SQL SELECT id, geom_obj_name INTO :lrecG FROM wall_ana.detector_cell WHERE geom_obj_name IS NOT NULL; Int_t nCells=sqlca.sqlerrd[2]; for(Int_t k=0;kgetModule(-1,0); HGeomCompositeVolume* pRefMod=pMod->getRefVolume(); lrecG.oname[k].arr[lrecG.oname[k].len]='\0'; HGeomVolume* volu=pRefMod->getComponent((lrecG.cell[k]-1)); volu->SetName((Char_t*)(lrecG.oname[k].arr)); } return (nCells>0) ? kTRUE : kFALSE; } Int_t HWallParOraIo::createVers(HParSet* pPar) { // creates a new version for the parameters // returns the new version cout<<"--------------- "<GetName()<<" ---------------\n"; if (strlen(pPar->getAuthor())==0) { Error("createVers(HParSet*)", "author of parameters not defined"); return -1; } if (strlen(pPar->getDescription())==0) { Error("createVers(HParSet*)", "descriction of parameters not defined"); return -1; } EXEC SQL BEGIN DECLARE SECTION; int vers=-1; int context; int run; char* creator; char* descript; EXEC SQL END DECLARE SECTION; context = getContextId(pPar->IsA()->GetName(),pPar->getParamContext()); if (context==-1) return -1; run=getActRunId(); creator=(Char_t*)pPar->getAuthor(); descript=(Char_t*)pPar->getDescription(); EXEC SQL WHENEVER SQLERROR GOTO errorfound; EXEC SQL WHENEVER NOT FOUND GOTO errorfound; const Char_t* contName=pPar->IsA()->GetName(); if (strcmp(contName,"HWallLookup")==0) { EXEC SQL EXECUTE BEGIN SELECT wall_ana.wall_par_query.next_version INTO :vers FROM DUAL; INSERT INTO wall_ana.lookup_vers (vers_id, orig_context_id, run_id, author, description) VALUES (:vers, :context, :run, :creator, :descript); END; END-EXEC; } else if (strcmp(contName,"HWallCalPar")==0) { EXEC SQL EXECUTE BEGIN SELECT wall_ana.wall_par_query.next_version INTO :vers FROM DUAL; INSERT INTO wall_ana.calpar_vers (vers_id, orig_context_id, run_id, author, description) VALUES (:vers, :context, :run, :creator, :descript); END; END-EXEC; } cout<<"Oracle version for "<GetName()<<" created: "<getSize();cr++) { for(Int_t sl=0;sl<(*pPar)[cr].getSize();sl++) { HWallLookupSlot& pSlot=(*pPar)[cr][sl]; for(Int_t ch=0;ch=0) { vers[nChan]=version; crate[nChan]=cr+1; slot[nChan]=sl+1; chan[nChan]=ch; branch[nChan][0]=(Char_t)(pSlot.getType()); branch[nChan][1]='\0'; cell[nChan]=ce+1; nChan++; } } } } rows_to_insert=nChan; EXEC SQL WHENEVER SQLERROR GOTO errorfound; EXEC SQL WHENEVER NOT FOUND GOTO errorfound; EXEC SQL FOR :rows_to_insert INSERT INTO wall_ana.lookup_data (cell_id, module_type, vers_id, crate, slot, channel) VALUES (:cell, :branch, :vers, :crate, :slot, :chan); commit(); cout<setChanged(kFALSE); return version; errorfound: showSqlError("writePar(HWallLookup*)"); rollback(); pPar->setChanged(kFALSE); return -1; } Int_t HWallParOraIo:: writePar(HWallCalPar* pPar) { // creates a new version and writes the calibration parameters to Oracle Int_t version=createVers(pPar); if (version==-1) return -1; EXEC SQL BEGIN DECLARE SECTION; int vers[WALL_MAXCELLS]; int cell[WALL_MAXCELLS]; float tslope[WALL_MAXCELLS]; float toffset[WALL_MAXCELLS]; float aslope[WALL_MAXCELLS]; float aoffset[WALL_MAXCELLS]; int rows_to_insert; EXEC SQL END DECLARE SECTION; rows_to_insert=pPar->getSize(); for(Int_t i=0;isetChanged(kFALSE); return version; errorfound: showSqlError("writePar(HWallCalPar*)"); rollback(); pPar->setChanged(kFALSE); return -1; }