/////////////////////////////////////////////////////////////////////////////// // Feb 2002 P.Murat: split source and include files /////////////////////////////////////////////////////////////////////////////// #include "TCdfOracle.hh" // #include "Stntuple/base/TUsedSet.hh" // #include "Stntuple/base/TTriggerConditions.hh" // #include "Stntuple/base/TBeamConditions.hh" //#include "Stntuple/obj/TStnRunSummary.hh" //#include "Stntuple/obj/TStnTrigger.hh" //#include "Stntuple/obj/TStnTriggerTable.hh" ClassImp(TCdfOracle) //_____________________________________________________________________________ TCdfOracle::TCdfOracle(const char* name) { // name = "cdfofprd" or "cdfonprd" or ... note that not every node // is allowed to access the online databases ("cdfonint" etc) // default: cdfofpr2 TString s = name; if (s == "cdfofprd") { fDbName = "cdfofprd.fnal.gov"; fDbFullName = "oracle://fcdfora1.fnal.gov:1521/cdfofprd.fnal.gov"; } else if (s == "cdfofpr2") { fDbName = "cdfofpr2.fnal.gov"; fDbFullName = "oracle://fcdfofprd.fnal.gov:1521/cdfofpr2.fnal.gov"; } else if (s == "cdfrep01") { fDbName = "cdfrep01.fnal.gov"; fDbFullName = "oracle://fcdflnx1.fnal.gov:1521/cdfrep01.fnal.gov"; } else if (s == "cdfofint") { fDbName = "cdfofint.fnal.gov"; fDbFullName = "oracle://fcdfora1.fnal.gov:1521/cdfofint.fnal.gov"; } else if (s == "cdfonint") { fDbName = "cdfonint.fnal.gov"; fDbFullName = "oracle://b0dau36.fnal.gov:1521/cdfonint.fnal.gov"; } else if (s == "cdfof1") { fDbName = "cdfof1.fnal.gov"; fDbFullName = "oracle://cdfdev.fnal.gov:1521/cdfof1.fnal.gov"; } else if (s == "cdfondev") { fDbName = "cdfondev.fnal.gov"; fDbFullName = "oracle://b0dau36.fnal.gov:1521/cdfondev.fnal.gov"; } else { fDbName = "cdfofpr2.fnal.gov"; fDbFullName = "oracle://fcdfofprd.fnal.gov:1521/cdfofpr2.fnal.gov"; } fDb = 0; fVerbose = 0; fLevel = 0; fForceDisconnect = 1; } //_____________________________________________________________________________ TCdfOracle::~TCdfOracle() { } //_____________________________________________________________________________ void TCdfOracle::ListTables(const char* List) { TString query; query = Form("select table_name from all_tables where table_name like '%s'", List); query.ToUpper(); Connect(); Query(query.Data()); Disconnect(); } //_____________________________________________________________________________ void TCdfOracle::DescribeTable(const char* Table) { TSQLRow *row; TString s = Form("'%s'",Table); s.ToUpper(); Connect(); TSQLResult* res = fDb->GetColumns(fDbName.Data(),s.Data()); while ((row = res->Next())) { printf("%30s ",row->GetField(2)); char* x = (char*) row->GetField(3); int npos = strlen(x); for (int i=npos-1; ((i>=0) && (x[i]==' ')); i--) x[i] = 0; printf("%s\n",x); } delete row; delete res; Disconnect(); } //_____________________________________________________________________________ char* TCdfOracle::Strip(char* Text, const char* TrailingChars) { // delete the trailing characters on a string int n = strlen(Text)-1; int nt = strlen(TrailingChars); int next = 1; while ((n>0) && next) { for (int i=0; iClose(); delete fDb; fDb = 0; } } } //_____________________________________________________________________________ void TCdfOracle::Query(const char* query) { // issue generic query and print the result Connect(); TSQLResult* res = fDb->Query(query); if (! res) return; PrintResult(res); delete res; } //_____________________________________________________________________________ void TCdfOracle::Query(const char* query, TSQLResult*& Res, Int_t Debug) { // issue generic query and return the result if (Verbose()) printf("%s \n",query); Connect(); Res = fDb->Query(query); // Disconnect(); if (! Res) return; if (Verbose()) PrintResult(Res); } //_____________________________________________________________________________ Int_t TCdfOracle::QueryTriggerTable(Int_t RunNumber, TSQLResult*& Result) { TString query; query = "select PHYSICSTABLENAME, PHYSICSTABLETAG "; query += Form("from runsets where name like \'RUN_%i\'",RunNumber); if (Verbose()) printf("%s\n",query.Data()); Query(query.Data(),Result); return 0; } //_____________________________________________________________________________ void TCdfOracle::QueryCalibTable(Int_t RunNumber , const char* Table , const char* ProcessName, const char* PassName , TSQLResult*& Result ) { // this is the most efficient example of finding CID of a given table // I've stolen so far TString query; query = "select tbl.* from "; query += Form("%s tbl",Table); query += " where tbl.cid in "; query += " (select crl.cid from calibrunlists crl where crl.cid in"; query += " (select srm.cid from set_run_maps srm where srm.jobset in"; query += " (select us.jobset from used_sets us"; if (PassName != 0) { query += " , passes ps, passcalibs pc"; } query += Form(" where us.process_name='%s'",ProcessName); if (PassName != 0) { query += " and us.process_name=ps.process_name"; query += Form(" and ps.passname='%s'",PassName); query += " and ps.pass_index=pc.pass_index"; query += " and us.proc_calib_version=pc.proc_calib_version"; } query += Form(" and us.process_run=%i)))",RunNumber); if (fVerbose > 0) printf("%s\n",query.Data()); Query(query.Data(),Result,0); } //_____________________________________________________________________________ void TCdfOracle::QueryCslSummary(Int_t RunNumber, TSQLResult*& Result) { TString query; query = "SELECT CS.RC_RUNNUMBER , CHR(65+CS.ID), "; query += "CS.STREAMINPUT, CS.STREAMOUTPUT from CSL_SUMMARY CS"; query += " where CS.RC_RUNNUMBER = "; char line[100]; sprintf(line,"%i",RunNumber); query += line; // printf("%s\n",query.Data()); Query(query.Data(),Result,0); } //_____________________________________________________________________________ void TCdfOracle::QueryDatasets(Int_t RunNumber, TSQLResult*& Result) { // get datasets corresponding to a given run (given trigger table) char query[1000]; // int myron_mode, l1early; sprintf(query,"select %s where name like 'RUN_%i'", "physicstablename physicstabletag from runsets", RunNumber); if (Verbose()) printf("%s\n",query); TSQLResult* res; Query(query,res); // get name of the trigger table // row->GetFieldData(0) TOracleRow* row = (TOracleRow *) res->Next(); char* table = row->GetFieldData(0); for (int i=strlen(table)-1; (i>=0) && (table[i]==' '); i--) table[i] = 0; int tag = *( (int*) row->GetFieldData(1)); printf("len=%i, table: %s, tag: %i\n", strlen(table), table, tag); sprintf(query,"%s %s in ('%s') and PHYSICS_TABLE_TAG=%i", "select DATASET_NAME DATASET_TAG from DATASETS_PHYSICS_TABLES", "where PHYSICS_TABLE_NAME ", table, tag); if (Verbose()) printf("%s\n",query); Query(query,Result); delete res; } //_____________________________________________________________________________ void TCdfOracle::ParseDatasetName(const char* Dataset, char* DsName , char* Book ) { // Dataset = DsName:Book const char* remainder; //----------------------------------------------------------------------------- // the defaults //----------------------------------------------------------------------------- DsName[0] = '%'; DsName[1] = 0; strcpy(Book,"FILECATALOG"); const char* ptr; int nb; ptr = strstr(Dataset,":"); if (ptr) { // Book is specified explicitly nb = ptr-Dataset; strncpy(DsName,Dataset,nb); DsName[nb] = 0; remainder = ptr+1; if (*remainder != 0) strcpy(Book,remainder); } else { // BOOK is not defined, use FILECATALOG strcpy(DsName,Dataset); } } //_____________________________________________________________________________ void TCdfOracle::QueryListOfFiles(const char* Dataset, Int_t Run1, Int_t Run2, TSQLResult*& Result) { // get datasets corresponding to a given run (given trigger table) // Dataset: "Dataset:book" TString query; char book[100], dsname[100]; ParseDatasetName(Dataset,dsname,book); query = "select "; query += "FL.DS_NAME_ID, FL.FILE_NAME,"; query += "FL.CREATION_TIME, FL.FILE_SIZE, FL.EVENT_COUNT, "; query += "FL.LOW_EVENT, FL.LOW_RUN, FL.HIGH_EVENT, FL.HIGH_RUN, "; query += "FL.LUM_SUM_ONLINE, FL.LUM_SUM_OFFLINE, "; query += "FL.CREATE_USER, FL.CREATE_DATE, "; query += "FL.UPDATE_USER, FL.UPDATE_DATE, "; query += "FL.FILESET_NAME, FL.STATUS "; query += "FROM "; query += Form("%s.CDF2_FILES FL ",book); query += "where "; if (strcmp(dsname,"\%") != 0) { query += "FL.DS_NAME_ID like \'"; query += dsname; query += "\' and "; } query += Form("((FL.LOW_RUN >= %i AND ",Run1); query += Form("FL.LOW_RUN <= %i) OR " ,Run2); query += Form("(FL.HIGH_RUN >= %i AND ",Run1); query += Form("FL.HIGH_RUN <= %i) OR ",Run2); query += Form("(FL.LOW_RUN <= %i AND ",Run1); query += Form("FL.HIGH_RUN >= %i))" ,Run2); query += "order by FL.LOW_RUN, FL.LOW_EVENT"; if (Verbose()) printf("%s\n",query.Data()); Query(query.Data(),Result); } //_____________________________________________________________________________ void TCdfOracle::QueryListOfFiles(const char* Book, const char* Dataset, const char* Fileset, TSQLResult*& Result) { // get files corresponding to a given fileset TString query; char dsname [100]; char book [100]; const char* remainder; //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- if (Book == 0) strcpy(book,"filecatalog"); else strcpy(book,Book); if (Dataset == 0) strcpy(dsname,"%"); else strcpy(dsname,Dataset); query = "select "; query += "FL.DS_NAME_ID, FL.FILE_NAME,"; query += "FL.CREATION_TIME, FL.FILE_SIZE, FL.EVENT_COUNT, "; query += "FL.LOW_EVENT, FL.LOW_RUN, FL.HIGH_EVENT, FL.HIGH_RUN, "; query += "FL.LUM_SUM_ONLINE, FL.LUM_SUM_OFFLINE, "; query += "FL.CREATE_USER, FL.CREATE_DATE, "; query += "FL.UPDATE_USER, FL.UPDATE_DATE, "; query += "FL.FILESET_NAME, FL.STATUS "; query += "FROM "; query += Form("%s.CDF2_FILES FL ",book); query += "where "; query += "FL.FILESET_NAME like \'"; query += Fileset; query += "\' "; query += "and FL.DS_NAME_ID like \'"; query += dsname; query += "\' "; query += "order by FL.LOW_RUN, FL.LOW_EVENT"; if (Verbose()) printf("%s\n",query.Data()); Query(query.Data(),Result); } //_____________________________________________________________________________ void TCdfOracle::QueryListOfFiles(const char* Dataset, const char* Fileset, TSQLResult*& Result) { // get files corresponding to a given fileset char dsname[100], book[100]; ParseDatasetName(Dataset,dsname,book); QueryListOfFiles(book,dsname,Fileset,Result); } //_____________________________________________________________________________ void TCdfOracle::QueryTapeContents(const char* TapeName, TSQLResult*& Result, const char* Dataset) { // get datasets corresponding to a given run (given trigger table) TString query; query = "select CDF2_DATASETS.DS_NAME_ID, CDF2_FILESETS.FILESET_NAME, "; query += "CDF2_FILES.FILE_NAME, CDF2_FILES.FILE_SIZE, CDF2_FILES.EVENT_COUNT "; query += "FROM FILECATALOG.CDF2_DATASETS,"; query += "FILECATALOG.CDF2_FILESETS, FILECATALOG.CDF2_FILES "; query += "where CDF2_DATASETS.DS_NAME_ID(+) = CDF2_FILESETS.DS_NAME_ID and "; query += "CDF2_FILESETS.TAPE_LABEL = \'"; query += TapeName; query += "\' and "; if (strcmp(Dataset,"\%") != 0) { query += "CDF2_DATASETS.DS_NAME_ID like \'"; query += Dataset; query += "\' and "; } query += "CDF2_FILESETS.FILESET_NAME(+) = CDF2_FILES.FILESET_NAME "; query += " order by CDF2_DATASETS.DS_NAME_ID"; if (Verbose()) printf("%s\n",query.Data()); Query(query.Data(),Result); } //_____________________________________________________________________________ void TCdfOracle::QueryRunSummary(Int_t RunNumber, TSQLResult*& Result) { } //_____________________________________________________________________________ void TCdfOracle::QueryFilesets(const char* Dataset, TSQLResult*& Result) { // get filesets corresponding to a given run (given trigger table) TString query; char dataset[100] = "%"; char book [100] = "FILECATALOG"; const char* remainder; const char* ptr; int nb; ptr = strstr(Dataset,":"); if (ptr) { nb = ptr-Dataset; strncpy(dataset,Dataset,nb); dataset[nb] = 0; remainder = ptr+1; if (*remainder != 0) strcpy(book,remainder); } else { strcpy(dataset,Dataset); } query = "select CDF2_DATASETS.DS_NAME_ID, CDF2_FILESETS.FILESET_NAME, "; query += "CDF2_FILESETS.TAPE_LABEL "; query += Form("FROM %s.CDF2_DATASETS,",book); query += Form("%s.CDF2_FILESETS ",book); query += "where CDF2_DATASETS.DS_NAME_ID(+) = CDF2_FILESETS.DS_NAME_ID and "; if (strcmp(dataset,"\%") != 0) { query += "CDF2_DATASETS.DS_NAME_ID like \'"; query += dataset; query += "\' "; } query += " order by CDF2_DATASETS.DS_NAME_ID"; if (Verbose()) printf("%s\n",query.Data()); Query(query.Data(),Result); } //_____________________________________________________________________________ void TCdfOracle::QueryUsedSets(const char* ProcessName, const char* PassName, TSQLResult*& Result, int RunMin, int RunMax, int All) { // get used sets for a given PASS(process name/version) for a // specified set of runs. // // // // // // // // // // // // // char text[100]; TString query; query = "select cus.* "; if (strcmp(PassName,"") != 0) { query += "from used_sets cus, passcalibs cpsc, passes cps "; query += Form("where cus.process_name = \'%s\' ",ProcessName); query += Form("and cus.process_run >= %i ",RunMin); query += Form("and cus.process_run <= %i ",RunMax); query += Form("and cps.passname = \'%s\' ",PassName); query += "and cus.process_run >= cpsc.lorun(+) "; query += "and cus.process_run <= cpsc.hirun(+) "; if (All == 0) { query += "and cps.retired is null "; } query += "and cus.proc_calib_version = cpsc.proc_calib_version(+) "; // query += "and cpsc.pass_index = cps.pass_index(+) "; query += "and cpsc.pass_index = cps.pass_index "; query += "order by to_number(cus.proc_calib_version) "; } else { query += "from used_sets cus "; query += Form("where cus.process_name = \'%s\' ",ProcessName); query += Form("and cus.process_run >= %i ",RunMin); query += Form("and cus.process_run <= %i ",RunMax); query += "order by to_number(cus.proc_calib_version) "; } if (Verbose()) printf("%s\n",query.Data()); Query(query.Data(),Result); } //_____________________________________________________________________________ void TCdfOracle::QueryListOfRuns(const char* Date1, const char* Date2, Int_t GoodRunsOnly, TSQLResult*& Result) { // get list of good runs after certain date TString query; // SELECT RC.RUNNUMBER||' ('||TO_CHAR(RC.RUNNUMBER,'FMXXXXXX')||')' // RUNNUMBER,DT.DESCRIPTION DATATYPE,RS.MYRONMODE||','||RS.L1EARLY MYRL1E, // RC.L1ACCEPTS L1A,RC.L2ACCEPTS L2A, // TO_CHAR((B0INTEGRATEDLUMI_TERMINATE-B0INTEGRATEDLUMI_ACTIVATE),'999990.999') DEL_NB_1, // TO_CHAR((B0INTEGRATEDLIVELUMI_TERMINATE-B0INTEGRATEDLIVELUMI_ACTIVATE),'999990.999') // LIVE_NB_1,TO_CHAR(RC.CREATETIME,'YYYY.MM.DD') DAY,TO_CHAR(RC.ACTIVATETIME,'HH24:MI:SS') // ACTIVATE,RUNDB.CLOCK_TO_TIME(RC.LIVETIME) LIVETIME, // RS.PHYSICSTABLENAME||' ['||RS.PHYSICSTABLETAG||','||RS.L3TAGSET||']' PHYSICSTABLE, // RC.GOODRUN_STATUS||','||RC.SHIFTCREW_STATUS||','||RC.RUNCONTROL_STATUS GOODRUN_SHIFT_RC // FROM RUNCONFIGURATIONS RC,RUNSETS RS,DATATYPES DT // WHERE RC.RS_NAME=RS.NAME AND RS.DATATYPE=DT.DATATYPE AND // HDWDB.BITAND(GOODRUN_STATUS,0)=0 AND HDWDB.BITAND(COMPONENT_STATUS,0)=0 AND // RC.ACTIVATETIME>=TO_DATE('2001.06.29','YYYY.MM.DD') AND // RC.ACTIVATETIME<=TO_DATE('2001.07.2','YYYY.MM.DD')+1 AND // RC.SHIFTCREW_STATUS!=0 ORDER BY RUNNUMBER // query = "SELECT RC.RUNNUMBER||' ('||TO_CHAR(RC.RUNNUMBER,'FMXXXXXX')||')' "; query = "SELECT RC.RUNNUMBER RUNNUMBER,"; query += "RS.PHYSICSTABLENAME, RS.PHYSICSTABLETAG, RC.L2ACCEPTS L2A, "; query += "RC.CSL_NEVENTSINPUT, "; query += "TO_CHAR((B0INTEGRATEDLUMI_TERMINATE-B0INTEGRATEDLUMI_ACTIVATE),'999990.999'),"; query += "TO_CHAR((B0INTEGRATEDLIVELUMI_TERMINATE-B0INTEGRATEDLIVELUMI_ACTIVATE),'999990.999'),"; query += "rundb.clock_to_time(rc.livetime), "; query += "TO_CHAR(RC.CREATETIME,'YYYY.MM.DD'),"; query += "TO_CHAR(RC.ACTIVATETIME,'HH24:MI:SS'),"; query += "RST.GOODRUN_STATUS GOODRUN, "; query += "rc.b0luminosity_activate, rc.b0luminosity_terminate "; query += "FROM RUNCONFIGURATIONS RC,RUNSETS RS, RUN_STATUS RST, DATATYPES DT "; query += "WHERE RC.RS_NAME=RS.NAME AND RS.DATATYPE=DT.DATATYPE "; query += "AND RC.RUNNUMBER=RST.RUNNUMBER "; query += "AND RC.ACTIVATETIME>=TO_DATE('"; query += Date1; query += "','YYYY.MM.DD') "; query += "AND RC.ACTIVATETIME<=TO_DATE('"; query += Date2; query += "','YYYY.MM.DD') "; if (GoodRunsOnly) { query += "AND RST.RUNCONTROL_STATUS != 0 "; query += "AND RST.SHIFTCREW_STATUS != 0 "; } query += "ORDER BY RUNNUMBER"; Query(query.Data(),Result); }; //_____________________________________________________________________________ void TCdfOracle::QueryListOfRuns(Int_t Run1, Int_t Run2, Int_t GoodRunsOnly, TSQLResult*& Result) { // get list of good runs in between 2 given ones (as above, but use run // numbers instead of dates // returns: // run_number, trig_table_name, trig_table_tag, // L2A, L3output, L(TeV) , L(tape), date, time, good_run_status TString query; char text[100]; query = "SELECT RC.RUNNUMBER RUNNUMBER, "; query += "RS.PHYSICSTABLENAME, "; query += "RS.PHYSICSTABLETAG, "; query += "RC.L2ACCEPTS L2A, "; query += "RC.CSL_NEVENTSINPUT, "; query += "TO_CHAR((B0INTEGRATEDLUMI_TERMINATE-B0INTEGRATEDLUMI_ACTIVATE),'999990.999') DEL_NB_1, "; query += "TO_CHAR((B0INTEGRATEDLIVELUMI_TERMINATE-B0INTEGRATEDLIVELUMI_ACTIVATE),'999990.999') LIVE_NB_1, "; query += "rundb.clock_to_time(rc.livetime), "; query += "TO_CHAR(RC.CREATETIME,'YYYY.MM.DD') DAY, "; query += "TO_CHAR(RC.ACTIVATETIME,'HH24:MI:SS') ACTIVATE,"; query += "RST.GOODRUN_STATUS GOODRUN, "; query += "rc.b0luminosity_activate, rc.b0luminosity_terminate "; query += "FROM RUNCONFIGURATIONS RC,RUNSETS RS,RUN_STATUS RST,DATATYPES DT "; query += "WHERE RC.RS_NAME=RS.NAME AND RS.DATATYPE=DT.DATATYPE "; query += "AND RC.RUNNUMBER=RST.RUNNUMBER "; query += "AND RC.RUNNUMBER>="; sprintf(text,"%i ",Run1); query += text; query += "AND RC.RUNNUMBER<="; sprintf(text,"%i ",Run2); query += text; if (GoodRunsOnly) { query += "AND RST.RUNCONTROL_STATUS!=0 "; query += "AND RST.SHIFTCREW_STATUS!=0 "; } query += "ORDER BY RUNNUMBER"; Query(query.Data(),Result); }; //_____________________________________________________________________________ Int_t TCdfOracle::QueryBeamConditions(TSQLResult*& Result, int RunMin, int RunMax) { // retrieve beam conditions for all the runs >= RunMin and < RunMax TString query; query = "select * from beam_conditions where "; query += Form("rc_runnumber >= %i and ",RunMin); query += Form("rc_runnumber <= %i " ,RunMax); query += "order by rc_runnumber, frontendtime"; if (Verbose()) printf("%s\n",query.Data()); Query(query.Data(),Result); return 0; } //_____________________________________________________________________________ Int_t TCdfOracle::QueryListOfRunSections(Int_t RMin, Int_t RMax, TSQLResult*& Result) { // retrieve run sections for RMin<=run<=RMax // do not read ID, it is marked as int, but is not! // has problems converting TString query; query = "select RUN_NUMBER, SECTION_NUMBER, BIRTH_TIME, LOW_EVENT"; query += ", HIGH_EVENT, LUM_AVERAGE_ONLINE, LUM_INTEGRAL_ONLINE"; query += ", LUM_AVERAGE_OFFLINE, LUM_INTEGRAL_OFFLINE, DATA_QUALITY"; query += ", LUMINOSITY_VERSION, LIVETIME, RUNTIME"; query += " from filecatalog.cdf2_runsections rs "; query += "where "; query += Form("rs.run_number>='%i' and ",RMin); query += Form("rs.run_number<='%i' " ,RMax); query += "order by rs.run_number, rs.section_number"; if (Verbose()) printf("%s\n",query.Data()); Query(query.Data(),Result); return 0; } //_____________________________________________________________________________ Int_t TCdfOracle::QueryListOfSetRunMaps(Int_t Jobset, TSQLResult*& Result) { // retrieve list of set_run_maps TString query; query = "select * from set_run_maps "; query += "where "; query += Form("jobset = %i ",Jobset); query += "order by cid"; if (Verbose()) printf("%s\n",query.Data()); Query(query.Data(),Result); return 0; } //_____________________________________________________________________________ Int_t TCdfOracle::QueryTrigger(const char* Name, Int_t Level, Int_t RunNumber, TSQLResult*& Result, Int_t& BitNumber) { //----------------------------------------------------- // works for L1 and L2, for L3 use a hack to return pathnumber // // returns: 0 run_number, // 1 trig_table_name, // 2 trig_table_tag, // 3 trig_name, // 4 trig_level // 5 trig_bit_no // 6 trig_id // 7 trig_tag TString query; if (Level != 3) { query = "SELECT UNIQUE rc.runnumber, DPT.PHYSICS_TABLE_NAME, "; query += "DPT.PHYSICS_TABLE_TAG, TBM.TRIGGER_NAME, "; query += "TBM.BIT_NO, TN.TRIGGER_ID, "; query += "TBM.TRIGGER_TAG TRG "; query += "FROM RUNCONFIGURATIONS RC, "; query += "RUNSETS RS, "; query += "DATASETS_PHYSICS_TABLES DPT, "; query += "DATASETS_TRIGGER_PATHS DTP, "; query += "TRIGGER_NAMES_TRIGGER_PATHS TP, "; query += "TRIGGER_BITMASKS TBM, "; query += "TRIGGER_NAMES TN "; query += Form("WHERE RC.RUNNUMBER = %i ",RunNumber); query += "AND RC.RS_NAME = RS.NAME "; query += "AND RS.PHYSICSTABLENAME = DPT.PHYSICS_TABLE_NAME "; query += "AND RS.PHYSICSTABLETAG = DPT.PHYSICS_TABLE_TAG "; query += "AND DPT.DATASET_NAME = DTP.DATASET_NAME "; query += "AND DPT.DATASET_TAG = DTP.DATASET_TAG "; query += "AND DTP.PATH_NAME = TP.PATH_NAME "; query += "AND DTP.PATH_TAG = TP.PATH_TAG "; query += "AND TP.TRIGGER_NAME = TBM.TRIGGER_NAME "; query += Form("AND TBM.TRIGGER_NAME = \'%s\' ",Name); query += "AND TP.TRIGGER_TAG = TBM.TRIGGER_TAG "; query += "AND TN.TRIGGER_LEVEL = TBM.TRIGGER_LEVEL "; query += "AND TN.TRIGGER_NAME = TBM.TRIGGER_NAME "; query += "AND TN.TRIGGER_TAG = TBM.TRIGGER_TAG "; query += "AND DPT.PHYSICS_TABLE_NAME = TBM.PHYSICS_TABLE_NAME "; query += "AND DPT.PHYSICS_TABLE_TAG = TBM.PHYSICS_TABLE_TAG "; query += "ORDER BY BIT_NO, TRG"; } else { //----------------------------------------------------------------------------- // currently L3 path # is not stored anywhere, so fake it with the path_id // to get the right number of returned columns // kludge: get all the L3 triggers ordered and figure the bit number by // ordering the paths //----------------------------------------------------------------------------- query = "SELECT UNIQUE rc.runnumber, dpt.physics_table_name, "; query += "dpt.physics_table_tag, dtp.path_name, tp.path_id, "; query += "tp.path_id, dtp.path_tag "; query += "FROM runconfigurations rc, runsets rs, "; query += "valid_tag_sets vt, l3_tcls l3t, physics_tables pt, "; query += "datasets_physics_tables dpt, datasets_trigger_paths dtp, "; query += "trigger_paths tp "; query += Form(" WHERE rc.runnumber = %i ",RunNumber); query += "AND rc.rs_name = rs.name "; query += "AND RS.L3TAGSET = VT.L3TAGSET "; query += "AND VT.TCL_TAG = L3T.TCL_TAG "; query += "AND L3T.PHYSICS_TABLE_NAME = PT.PHYSICS_TABLE_NAME "; query += "AND L3T.PHYSICS_TABLE_TAG = PT.PHYSICS_TABLE_TAG " ; query += "AND PT.PHYSICS_TABLE_NAME = DPT.PHYSICS_TABLE_NAME "; query += "AND PT.PHYSICS_TABLE_TAG = DPT.PHYSICS_TABLE_TAG " ; query += "AND DPT.DATASET_NAME = DTP.DATASET_NAME " ; query += "AND DPT.DATASET_TAG = DTP.DATASET_TAG " ; query += "AND TP.PATH_NAME = DTP.PATH_NAME "; // query += Form("AND TP.PATH_NAME = \'%s\' ",Name); query += "AND TP.PATH_TAG = DTP.PATH_TAG "; query += "ORDER BY DTP.PATH_NAME "; TSQLResult* res; Query(query.Data(),res); TOracleRow* row; int bit = 0; while ((row = (TOracleRow*) res->Next())) { char* name = Strip(row->GetFieldData(3)); if (strcmp(name,Name) == 0) { break; } bit++; } BitNumber = bit; delete res; // now repeat query once again selecting // just one trigger query = "SELECT UNIQUE rc.runnumber, dpt.physics_table_name, "; query += "dpt.physics_table_tag, dtp.path_name, tp.path_id, "; query += "tp.path_id, dtp.path_tag "; query += "FROM runconfigurations rc, runsets rs, "; query += "valid_tag_sets vt, l3_tcls l3t, physics_tables pt, "; query += "datasets_physics_tables dpt, datasets_trigger_paths dtp, "; query += "trigger_paths tp "; query += Form(" WHERE rc.runnumber = %i ",RunNumber); query += "AND rc.rs_name = rs.name "; query += "AND RS.L3TAGSET = VT.L3TAGSET "; query += "AND VT.TCL_TAG = L3T.TCL_TAG "; query += "AND L3T.PHYSICS_TABLE_NAME = PT.PHYSICS_TABLE_NAME "; query += "AND L3T.PHYSICS_TABLE_TAG = PT.PHYSICS_TABLE_TAG " ; query += "AND PT.PHYSICS_TABLE_NAME = DPT.PHYSICS_TABLE_NAME "; query += "AND PT.PHYSICS_TABLE_TAG = DPT.PHYSICS_TABLE_TAG " ; query += "AND DPT.DATASET_NAME = DTP.DATASET_NAME " ; query += "AND DPT.DATASET_TAG = DTP.DATASET_TAG " ; query += "AND TP.PATH_NAME = DTP.PATH_NAME "; query += Form("AND TP.PATH_NAME = \'%s\' ",Name); query += "AND TP.PATH_TAG = DTP.PATH_TAG "; query += "ORDER BY DTP.PATH_NAME "; } Query(query.Data(),Result); return 0; } //_____________________________________________________________________________ Int_t TCdfOracle::QueryTriggerConditions(Int_t Bit, Int_t Level, TSQLResult*& Result, int RunMin, int RunMax) { // Level = 1,2,3; table name = `level1_trigger_conditions` char text[100]; TString query; sprintf(text,"select * from level%1i_trigger_conditions where ",Level); query = text; sprintf(text,"rc_runnumber >= %i and ",RunMin); query += text; sprintf(text,"rc_runnumber <= %i and ",RunMax); query += text; sprintf(text,"bit = %i ",Bit); query += text; query += "order by rc_runnumber, frontendtime"; Query(query.Data(),Result); return 0; } //_____________________________________________________________________________ void TCdfOracle::QueryTriggerPaths(Int_t RunNumber, TSQLResult*& Result) { // get trigger paths corresponding to a given run (given trigger table) TString query; query = "select PATH_NAME||'_v-'||PATH_TAG from DATASETS_TRIGGER_PATHS "; query += "where DATASET_NAME||'_v-'||DATASET_TAG in ("; TSQLResult* res; QueryDatasets(RunNumber,res); TOracleRow* row; char* line; int first = 1; while ((row = (TOracleRow*) res->Next())) { line = row->GetFieldData(0); for (int k=strlen(line)-1; (k>=0) && (line[k]==' '); k--) { line[k] = 0; } if (! first) { query += ","; } first = 0; query += "'"; query += line; query += "'"; } query += ")"; Query(query.Data(),Result); delete res; } //_____________________________________________________________________________ void TCdfOracle::QueryTriggerTableName(Int_t RunNumber, TSQLResult*& Result) { // TString query; query = "select rc.runnumber, rs.physicstablename "; query += "from runconfigurations rc, runsets rs "; query += Form("where rc.rs_name=rs.name and rc.runnumber=%i",RunNumber); Query(query.Data(),Result); } //_____________________________________________________________________________ void TCdfOracle::QueryTriggers(Int_t RunNumber, TSQLResult*& Result) { // get triggers corresponding to a given run (given trigger table) TString query; query = "select TRIGGER_LEVEL||'/'||TRIGGER_NAME||'_v-'||TRIGGER_TAG "; query += "from TRIGGER_NAMES_TRIGGER_PATHS "; query += "where PATH_NAME||'_v-'||PATH_TAG in ("; TSQLResult* res; QueryTriggerPaths(RunNumber,res); TOracleRow* row; int first = 1; char* line; while ((row = (TOracleRow*) res->Next())) { line = row->GetFieldData(0); for (int k=strlen(line)-1; (k>=0) && (line[k]==' '); k--) { line[k] = 0; } if (! first) { query += ","; } first = 0; query += "'"; query += line; query += "'"; } query += ")"; Query(query.Data(),Result); delete res; } //_____________________________________________________________________________ void TCdfOracle::QueryL123(Int_t RunNumber, TSQLResult*& Result) { // get trigger paths corresponding to a given run (given trigger table) TString query; char text[100]; query = " SELECT UNIQUE TBM.BIT_NO, TBM.TRIGGER_LEVEL,"; query += " TBM.TRIGGER_NAME||'_v-'||TBM.TRIGGER_TAG TRG"; query += " FROM RUNCONFIGURATIONS RC, RUNSETS RS, "; query += " DATASETS_PHYSICS_TABLES DPT, DATASETS_TRIGGER_PATHS DTP, "; query += " TRIGGER_NAMES_TRIGGER_PATHS TP, "; query += " TRIGGER_BITMASKS TBM "; query += " WHERE RC.RUNNUMBER = " ; sprintf(text,"%i",RunNumber); query += text; query += " AND RC.RS_NAME = RS.NAME "; query += " AND RS.PHYSICSTABLENAME = DPT.PHYSICS_TABLE_NAME "; query += " AND RS.PHYSICSTABLETAG = DPT.PHYSICS_TABLE_TAG " ; query += " AND DPT.DATASET_NAME = DTP.DATASET_NAME " ; query += " AND DPT.DATASET_TAG = DTP.DATASET_TAG " ; // query += " AND DTP.PATH_NAME = TP.PATH_NAME " ; // query += " AND DTP.PATH_TAG = TP.PATH_TAG " ; // query += " AND TP.TRIGGER_LEVEL = TBM.TRIGGER_LEVEL " ; // query += " AND TP.TRIGGER_NAME = TBM.TRIGGER_NAME " ; // query += " AND TP.TRIGGER_TAG = TBM.TRIGGER_TAG " ; // query += " AND DPT.PHYSICS_TABLE_NAME = TBM.PHYSICS_TABLE_NAME " ; // query += " AND DPT.PHYSICS_TABLE_TAG = TBM.PHYSICS_TABLE_TAG "; // query += " ORDER BY BIT_NO, TRG"; Query(query.Data(),Result); } //_____________________________________________________________________________ void TCdfOracle::QueryListOfOpenSessions(TSQLResult*& Result) { // get list of currently open sessions TString query; query = "SELECT PROGRAM, LOGON_TIME, OSUSER, MACHINE, PROCESS, "; query += " TERMINAL, TYPE, SID, SERIAL#, SCHEMANAME, MODULE, STATUS "; query += " FROM V$SESSION"; if (Verbose()) printf("%s\n",query.Data()); Query(query.Data(),Result); } //_____________________________________________________________________________ void TCdfOracle::QueryTriggerBits(Int_t RunNumber, TSQLResult*& Result) { // get triggers corresponding to a given run (given trigger table) TString query; query = "select BIT_NO, TRIGGER_LEVEL||'/'||TRIGGER_NAME||'_v-'||TRIGGER_TAG "; query += "from TRIGGER_BITMASKS "; query += "where TRIGGER_LEVEL||'/'||TRIGGER_NAME||'_v-'||TRIGGER_TAG IN ("; TSQLResult* res; QueryTriggers(RunNumber,res); TOracleRow* row; int first = 1; char* line; while ((row = (TOracleRow*) res->Next())) { line = row->GetFieldData(0); for (int k=strlen(line)-1; (k>=0) && (line[k]==' '); k--) { line[k] = 0; } if (! first) { query += ","; } first = 0; query += "'"; query += line; query += "'"; } query += ") AND "; query += "PHYSICS_TABLE_NAME||'_v-'||PHYSICS_TABLE_TAG IN ('"; TSQLResult* r1; QueryTriggerTable(RunNumber,r1); row = (TOracleRow*) res->Next(); line = row->GetFieldData(0); for (int k=strlen(line)-1; (k>=0) && (line[k]==' '); k--) { line[k] = 0; } query += line; query += "') order by BIT_NO"; Query(query.Data(),Result); delete res; delete r1; }