//*-- AUTHOR : Ilse Koenig //*-- Created : 19/04/2006 by I. Koenig //_HADES_CLASS_DESCRIPTION ////////////////////////////////////////////////////////////////////////////// // // HHodoParOraIo // // Interface class to database Oracle for input/output of parameters needed // by the HODO detector // (uses the Oracle C/C++ precompiler) // ////////////////////////////////////////////////////////////////////////////// using namespace std; #include "hhodoparoraio.h" #include "hades.h" #include "hspectrometer.h" #include "hhododetector.h" #include "hhodocalpar.h" #include "hhodorefhitpar.h" #include #include #include #define SQLCA_STORAGE_CLASS extern #define ORACA_STORAGE_CLASS extern // Oracle communication area #include // SQL Communications Area #include ClassImp(HHodoParOraIo) #define HODO_MAXMODS 10 #define HODO_MAXFIBRES 128 HHodoParOraIo::HHodoParOraIo(HOraConn* pC) : HDetParOraIo(pC) { // constructor // sets the name of the I/O class "HHodoParIo" // gets the pointer to the connection class fName="HHodoParIo"; numModules=0; hodoIds=0; initModules=0; } HHodoParOraIo::~HHodoParOraIo() { // destructor if (initModules) delete initModules; if (hodoIds) delete hodoIds; } Bool_t HHodoParOraIo::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,"HHodoCalPar")==0) return read(((HHodoCalPar*)pPar),set); if (strcmp(name,"HHodoRefHitPar")==0) return read(((HHodoRefHitPar*)pPar),set); // cout<<"initialization of "<GetName()<<" not possible from Oracle!"<IsA()->GetName(); if (startIo(pPar)<=0) return 0; if (strcmp(name,"HHodoCalPar")==0) return writePar((HHodoCalPar*)pPar); if (strcmp(name,"HHodoRefHitPar")==0) return writePar((HHodoRefHitPar*)pPar); cout<<"No write-interface to Oracle for parameter container " <GetName()<0 && hodoIds==0) readIds(); if (runStart==-1 || numModules<=0) { pPar->setInputVersion(-1,inputNumber); return -1; } return runStart; } Int_t HHodoParOraIo::readIds() { // Gets the run start of the actual run // Reads all modules defined for the first run and stores them in array hodoIds // Returns -1, if the run is not found, or 0, if no modules are found for this run HHodoDetector* det=(HHodoDetector*)(gHades->getSetup()->getDetector("Hodo")); EXEC SQL BEGIN DECLARE SECTION; int ids[HODO_MAXMODS]; EXEC SQL END DECLARE SECTION; EXEC SQL WHENEVER SQLERROR DO showSqlError("readIds()"); EXEC SQL WHENEVER NOT FOUND CONTINUE; EXEC SQL SELECT module INTO :ids FROM start_ana.hodo_setup_at_date; numModules=sqlca.sqlerrd[2]; // number of rows returned by select if (numModules>0) { hodoIds=new TArrayI(HODO_MAXMODS); for(Int_t i=0;iAddAt(-1,i); initModules=new TArrayI(HODO_MAXMODS); } else { Error("readIds","No modules in actual setup"); } for(Int_t i=0;igetModule(-1,ids[i])) { hodoIds->AddAt(ids[i],ids[i]); } } return numModules; } Int_t HHodoParOraIo::getVersion(HParSet* pPar,Int_t* set,Int_t* versions) { // reads the versions of parameters valid for the current event file // (used for tables, where each module may have a different version) // returns -1, if no data are found, otherwise the current runId 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 module[HODO_MAXMODS]; int vers[HODO_MAXMODS]; double since[HODO_MAXMODS]; double until[HODO_MAXMODS]; } parvers; EXEC SQL END DECLARE SECTION; context=oraSet->contextId; EXEC SQL WHENEVER SQLERROR DO showSqlError("getVersion(HParOraSet*,Int_t)"); EXEC SQL WHENEVER NOT FOUND CONTINUE; const Char_t* containerClass=pPar->IsA()->GetName(); if (strcmp(containerClass,"HHodoCalPar")==0) { EXEC SQL SELECT module, version, hdate.to_ansitime(valid_since), hdate.to_ansitime(valid_until) INTO :parvers FROM start_ana.hodo_calpar_vers_at_date WHERE context_id = :context; } for(Int_t i=0;iAt(m)>=0) { versions[m]=parvers.vers[i]; if (parvers.since[i]>oraSet->versDate[0]) oraSet->versDate[0]=parvers.since[i]; if (parvers.until[i]versDate[1]) oraSet->versDate[1]=parvers.until[i]; } } if (oraSet->versDate[0]>=0) return getActRunId(); return -1; }; Int_t HHodoParOraIo::getVersion(HParSet* pPar) { // reads the version for parameter containers valid for the current event file // (used for tables with a single version for all data) // return the version number // 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; int vers; double since; double until; EXEC SQL END DECLARE SECTION; context=oraSet->contextId; EXEC SQL WHENEVER SQLERROR DO showSqlError("getVersion(HParOraSet*)"); EXEC SQL WHENEVER NOT FOUND CONTINUE; const Char_t* containerClass=pPar->IsA()->GetName(); if (strcmp(containerClass,"HHodoRefHitPar")==0) { EXEC SQL SELECT version, hdate.to_ansitime(valid_since), hdate.to_ansitime(valid_until) INTO :vers, :since, :until FROM start_ana.hodo_refhit_vers_at_date WHERE context_id = :context; } if (sqlca.sqlerrd[2]!=-1) { oraSet->versDate[0]=since; oraSet->versDate[1]=until; return vers; } else return -1; }; Bool_t HHodoParOraIo::read(HHodoCalPar* pPar, Int_t* set) { // reads the calibration parameters and fills the HodoCalPar container Int_t contVers=pPar->getInputVersion(inputNumber); Int_t versions[HODO_MAXMODS]; Int_t version=getVersion(pPar,set,versions); if (version==-1) { pPar->setInputVersion(-1,inputNumber); return kFALSE; } if (contVers==version) return kTRUE; pPar->clear(); // no initialization from 2 inputs possible! EXEC SQL BEGIN DECLARE SECTION; int module; int vers; struct { int fibre[HODO_MAXFIBRES]; float tslo[HODO_MAXFIBRES]; float tofs[HODO_MAXFIBRES]; float aslo[HODO_MAXFIBRES]; float aofs[HODO_MAXFIBRES]; } cal; EXEC SQL END DECLARE SECTION; EXEC SQL WHENEVER SQLERROR DO showSqlError("read(HHodoCalPar*,Int_t*)"); EXEC SQL WHENEVER NOT FOUND CONTINUE; EXEC SQL DECLARE cal_cur CURSOR FOR SELECT fibre, time_slope, time_offset, adc_slope, adc_offset FROM start_ana.hodo_calpar_data_view WHERE det_part_id = :module AND vers_id = :vers; Bool_t allFound=kTRUE; for(Int_t m=0;mAt(m)>=0 && versions[m]>0) { module=m; vers=versions[m]; EXEC SQL OPEN cal_cur; EXEC SQL FETCH cal_cur INTO :cal; for(Int_t i=0;isetInputVersion(version,inputNumber); setChanged(pPar); cout<GetName()<<" initialized from Oracle\n"; } return allFound; }; Bool_t HHodoParOraIo::read(HHodoRefHitPar* pPar, Int_t* set) { // reads and fills the HodoRefHitPar container 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(); // no initialization from 2 inputs possible! initModules->Reset(); EXEC SQL BEGIN DECLARE SECTION; int vers; struct { int module[HODO_MAXMODS]; float lt[HODO_MAXMODS]; float ht[HODO_MAXMODS]; float ls[HODO_MAXMODS]; float hs[HODO_MAXMODS]; } refhit; EXEC SQL END DECLARE SECTION; EXEC SQL WHENEVER SQLERROR DO showSqlError("read(HHodoRefHitPar*,Int_t*)"); EXEC SQL WHENEVER NOT FOUND CONTINUE; vers=version; EXEC SQL SELECT module_id, time_trig_ref_low, time_trig_ref_high, time_signal_low, time_signal_high INTO :refhit FROM start_ana.hodo_refhit_data WHERE vers_id = :vers; for ( Int_t i=0;i0) { HHodoRefHitParMod& p=(*pPar)[m]; p.fill(refhit.lt[i],refhit.ht[i],refhit.ls[i],refhit.hs[i]); initModules->AddAt(1,m); } } Bool_t allFound=kTRUE; for ( Int_t i=0;i0) { if (initModules->At(i)<1) allFound=kFALSE; } } if (allFound) { pPar->setInputVersion(version,inputNumber); setChanged(pPar); cout<GetName()<<" initialized from Oracle\n"; } return allFound; }; Int_t HHodoParOraIo::createVers(HParSet* pPar) { // creates a new version for the calibration parameters // return 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=-1; 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 not_found; EXEC SQL WHENEVER NOT FOUND GOTO not_found; const Char_t* className=pPar->IsA()->GetName(); if (strcmp(className,"HHodoCalPar")==0) { EXEC SQL EXECUTE BEGIN SELECT start_ana.hodo_par_query.next_version INTO :vers FROM DUAL; INSERT INTO start_ana.hodo_calpar_vers (vers_id, orig_context_id, run_id, author, description) VALUES (:vers, :context, :run, :creator, :descript); END; END-EXEC; } else if (strcmp(className,"HHodoRefHitPar")==0) { EXEC SQL EXECUTE BEGIN SELECT start_ana.hodo_par_query.next_version INTO :vers FROM DUAL; INSERT INTO start_ana.hodo_refhit_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(); m++) { if (hodoIds->At(m)>=0) { HHodoCalParMod& rMod= (*pPar)[m]; Int_t nChan=0; for(Int_t c=0; csetChanged(kFALSE); return -1; } } commit(); pPar->setChanged(kFALSE); return version; not_found: showSqlError("writePar(HHodoCalPar*)"); rollback(); pPar->setChanged(kFALSE); return -1; } Int_t HHodoParOraIo::writePar(HHodoRefHitPar* pPar) { // creates a new version and writes the RefHit parameters to Oracle Int_t version=createVers(pPar); if (version==-1) return -1; EXEC SQL BEGIN DECLARE SECTION; int module[HODO_MAXMODS]; int vers[HODO_MAXMODS]; float lt[HODO_MAXMODS]; float ht[HODO_MAXMODS]; float ls[HODO_MAXMODS]; float hs[HODO_MAXMODS]; int rows_to_insert; EXEC SQL END DECLARE SECTION; Int_t n=0; for(Int_t m=0; mgetSize(); m++) { if (hodoIds->At(m)>=0) { HHodoRefHitParMod& rMod= (*pPar)[m]; module[n]=m; vers[n]=version; lt[n]=rMod.getTrigRefLow(); ht[n]=rMod.getTrigRefHigh(); ls[n]=rMod.getHitLow(); hs[n]=rMod.getHitHigh(); n++; } } if (n>0) { rows_to_insert=n; EXEC SQL WHENEVER SQLERROR GOTO not_found; EXEC SQL WHENEVER NOT FOUND GOTO not_found; EXEC SQL FOR :rows_to_insert INSERT INTO start_ana.hodo_refHit_data (module_id, vers_id, time_trig_ref_low, time_trig_ref_high, time_signal_low, time_signal_high) VALUES (:module, :vers, :lt, :ht, :ls, :hs); cout<setChanged(kFALSE); return version; } else { Error("writePar(HHodoRefHitPar*)","Modules not in Oracle detector setup"); rollback(); pPar->setChanged(kFALSE); return -1; } not_found: showSqlError("writePar(HHodoRefHitPar*)"); rollback(); pPar->setChanged(kFALSE); return -1; }