82 const char* system_name,
83 const char* parameter_name,
84 const char* member_name,
110 const char* system_name,
111 const char* parameter_name,
112 const char* member_name,
157 if (start_run > end_run) {
158 cout <<
"ERROR: start run (" << start_run <<
") cannot be greater than end run (" << end_run <<
")" << endl;
167 cout <<
"Run range " << period_number <<
":" << start_run <<
"-" << end_run
168 <<
" (from the cache) corresponds"
175 int run_count =
UniRun::GetRunNumbers(run_numbers, period_number, start_run, period_number, end_run);
177 cout <<
"ERROR: getting run numbers from the Unified Database has been failed" << endl;
180 if (run_count == 0) {
181 delete[] run_numbers;
182 cout <<
"ERROR: there are no runs in the range " << period_number <<
":" << start_run <<
"-" << end_run
183 <<
" in the Unified Database" << endl;
190 for (
int i = 0;
i < run_count;
i++) {
193 if (pRun ==
nullptr) {
194 cout <<
"ERROR: run " << period_number <<
":" << run_number <<
" was not found in the Unified Database"
196 delete[] run_numbers;
206 if (run_end ==
nullptr) {
208 if (
i == run_count - 1) {
209 cout <<
"ERROR: there is no end time for the last run " << period_number <<
":" << run_number
210 <<
" in the Unified Database" << endl;
211 delete[] run_numbers;
215 cout <<
"WARNING: there is no end time for the run " << period_number <<
":" << run_number
216 <<
" in the Unified Database, it is excluded from the run time intervals" << endl;
219 if (
i == run_count - 1)
225 delete[] run_numbers;
230 cout <<
"Run range " << period_number <<
":" << first_run <<
"-" << last_run <<
" (" << run_count
247 cout <<
"Old MySQL Database is used to get Tango data" << endl;
249 cout <<
"PostgreSQL Database is used to get Tango data" << endl;
261 cout <<
"Input Start Date = " <<
strStartDate.Data() << endl;
263 cout <<
"Input End Date = " <<
strEndDate.Data() << endl;
265 cout <<
"ERROR: start datetime and end datetime should not be empty!" << endl;
269 cout <<
"ERROR: start date cannot be less than 2000 year" << endl;
276 start_date_new +=
" Europe/Moscow", end_date_new +=
" Europe/Moscow";
285 if (connDb ==
nullptr)
288 if (db_server ==
nullptr)
299 "SELECT att_conf_id, data_type "
300 "FROM att_conf ac join att_conf_data_type acdt on ac.att_conf_data_type_id = acdt.att_conf_data_type_id "
301 "WHERE family='%s' and name='%s' ",
306 "WHERE domain='%s' and name='%s' ",
312 if (slash_pos !=
kNPOS) {
316 if (family_name !=
"")
317 strStatement +=
TString::Format(
"and family = '%s' ", family_name.Data());
318 if (member_name !=
"")
320 strStatement +=
"ORDER BY att_conf_id";
324 cout <<
"Processing the following SQL request to get info on the Tango parameter:" << endl
325 << strStatement << endl;
328 cout <<
"ERROR: getting info on parameter from Tango has been failed: " <<
GetFullName() << endl;
335 cout <<
"ERROR: There is no Tango parameter '" <<
GetFullName() << endl;
343 <<
" detector" << endl;
349 int parameter_id = stmt_select->
GetInt(0);
353 cout <<
"WARNING: several Tango parameters correspond to '" <<
GetFullName()
354 <<
"', the first one is used. Specify the family in the member name as \"family/member\"" << endl;
358 cout <<
"Found Data Table name = " << table_name <<
". Parameter ID = " << parameter_id << endl;
365 if (table_name.
Contains(
"array_devdouble"))
367 else if (table_name.
Contains(
"array_devboolean"))
369 else if (table_name.
Contains(
"scalar_devdouble") || table_name.
Contains(
"scalar_devshort")
370 || table_name.
Contains(
"scalar_devlong") || table_name.
Contains(
"scalar_devstate"))
372 else if (table_name.
Contains(
"scalar_devboolean"))
375 cout <<
"ERROR: This Tango type is not supported: '" << table_name <<
"'" << endl;
382 query_data =
"SELECT date_format(data_time, '%Y-%m-%d %H:%i:%S'), value_r ";
384 query_data =
"SELECT to_char(data_time, 'YYYY-MM-DD HH24:MI:SS.MS'), value_r ";
387 query_data +=
", dim_x_r, dim_x_w, idx ";
391 "WHERE att_conf_id='%d' and ((data_time > '%s' and data_time <= '%s') "
392 "or (data_time = (SELECT max(data_time) FROM %s WHERE att_conf_id='%d' and data_time "
393 "<= '%s' and value_r is not null))) "
394 "and value_r is not null ",
395 table_name.
Data(), parameter_id, start_date_new.Data(), end_date_new.
Data(),
396 table_name.
Data(), parameter_id, start_date_new.Data());
399 query_data +=
"ORDER BY data_time,idx";
401 query_data +=
"ORDER BY data_time";
404 cout <<
"Query data with the following SQL request:" << endl << query_data << endl;
405 stmt_select = db_server->
Statement(query_data);
407 cout <<
"ERROR: getting parameter values from Tango has been failed" << endl;
422 const char* pc_datetime = stmt_select->
GetString(0);
425 if ((cur_num == 0) && (strcmp(pc_datetime,
strStartDate) < 0))
430 i_par_len = stmt_select->
GetInt(2);
431 if (i_par_len == 0) {
432 cout <<
"ERROR: Parameter length cannot be equal 0" << endl;
438 int i_real_par_len = 1;
440 i_real_par_len = stmt_select->
GetInt(3);
441 if (i_real_par_len == 0) {
442 cout <<
"ERROR: Real parameter length cannot be equal 0" << endl;
450 for (
int ind = 0; ind < i_par_len; ind++) {
456 i_idx = stmt_select->
GetInt(4);
459 cout <<
"ERROR: idx should be equal index of the parameter array" << endl;
465 if (ind >= i_real_par_len)
471 bool b_val = (str_val ==
"t") || (str_val ==
"true") || (str_val.
Atoi() != 0);
476 double d_val = stmt_select->
GetDouble(1);
506 cout <<
"ERROR: Tango parameter has not been obtained" << endl;
510 int def_precision = cout.precision();
520 for (
int j = 0; j < par_length; j++)
522 cout <<
"" << endl << endl;
525 cout.precision(def_precision);
532 for (
const auto& tango_data : vecTangoData) {
533 cout <<
"The current parameter: " << tango_data->GetFullName() << endl;
534 tango_data->PrintTangoDataConsole();
564 return TString::Format(
"_t%d_%04d_%d_%04d", start_date.GetDate(), start_date.GetTime() / 100, end_date.
GetDate(),
580 TangoData *pFirst = vecTangoData.front(), *pLast = vecTangoData.back();
581 if (vecTangoData.size() == 1)
597 TangoData *pFirst = vecTangoData.front(), *pLast = vecTangoData.back();
598 if (vecTangoData.size() == 1)
607 title = pFirst->
GetFullName() +
" - " + pLast->GetFullName();
616 TString canvas_name = data_name +
"_" + view_name;
619 if (!isalnum(canvas_name[
i]))
620 canvas_name[
i] =
'_';
622 return new TCanvas(canvas_name, canvas_name, 800, 600);
630 cout <<
"ERROR: Tango parameter has not been obtained" << endl;
644 for (
int j = 0; j < par_length; j++) {
648 tango_graph->
SetPoint(
i * par_length + j, cur_time, j + 1, value);
652 tango_graph->
Draw(
"SURF1");
686 int n = graph.
GetN();
687 if ((
n > 0) && (graph.
GetY()[
n - 1] != y)) {
688 double previous_y = graph.
GetY()[
n - 1];
701 cout <<
"ERROR: Tango parameter has not been obtained" << endl;
706 cout <<
"WARNING: There are no elements in the Tango array" << endl;
717 for (
int j = 0; j < par_length; j++) {
719 if ((color == 0) || (color == 10) || ((color > 16) && (color < 20)))
729 for (
int j = 0; j < par_length; j++) {
731 double x = is3D ? ((double)cur_time - start_time) / 3600 : cur_time;
739 for (
int j = 0; j < par_length; j++) {
740 tango_multi->
Add(&tango_graphs[j]);
789 if (vecTangoData.size() < 1) {
790 cout <<
"WARNING: There are no parameters in the specified array" << endl;
795 for (
const auto& current_parameter : vecTangoData) {
796 if ((current_parameter->GetTangoData() ==
nullptr) || (current_parameter->GetTangoData()->IsEmpty())) {
797 cout <<
"ERROR: There are no elements in the parameter (" << current_parameter->GetFullName() <<
")"
802 if ((((TangoTimeParameter*)current_parameter->GetTangoData()->At(0))->double_parameter_value.size()) != 1) {
803 cout <<
"ERROR: the parameter " << current_parameter->GetFullName() <<
" must have single value" << endl;
809 int par_length = vecTangoData.size();
813 TGraph* tango_graphs =
new TGraph[par_length]();
816 for (j = 0; j < par_length; j++) {
818 if ((color == 0) || (color == 10) || ((color > 16) && (color < 20)))
824 TString start_date = vecTangoData[0]->GetStartDate();
825 UInt_t start_time = TDatime(start_date).Convert();
827 for (
const auto& current_parameter : vecTangoData) {
828 TObjArray*
arrTangoData = current_parameter->GetTangoData();
831 double x = is3D ? ((double)cur_time - start_time) / 3600 : cur_time;
838 TMultiGraph* tango_multi =
new TMultiGraph();
840 for (j = 0; j < par_length; j++) {
841 tango_multi->
Add(&tango_graphs[j]);
846 TString draw_par =
"AL";
879 TLegend* pLegend = c1->
BuildLegend(0.92, 0.77, 0.99, 0.98,
"");
900 const char* draw_option,
903 if (vecTangoData.size() < 1) {
904 cout <<
"WARNING: There are no parameters in the specified array" << endl;
908 cout <<
"ERROR: the number of time bins should be greater than 0" << endl;
913 for (
const auto& current_parameter : vecTangoData) {
914 if ((current_parameter->GetTangoData() ==
nullptr) || (current_parameter->GetTangoData()->IsEmpty())) {
915 cout <<
"ERROR: There are no elements in the parameter (" << current_parameter->GetFullName() <<
")"
920 if ((((TangoTimeParameter*)current_parameter->GetTangoData()->At(0))->double_parameter_value.size()) != 1) {
921 cout <<
"ERROR: the parameter " << current_parameter->GetFullName() <<
" must have single value" << endl;
929 if (end_time <= start_time) {
930 cout <<
"ERROR: the end time should be greater than the start time of the parameters" << endl;
933 int channel_count = vecTangoData.size();
934 double bin_width = (double)(end_time - start_time) / time_bins;
939 TH2D* tango_hist =
new TH2D(
"tango_surface",
GetArrayTitle(vecTangoData), time_bins, start_time, end_time,
940 channel_count, -0.5, channel_count - 0.5);
943 vector<double> bin_sum(time_bins), bin_sec(time_bins);
944 for (
int j = 0; j < channel_count; j++) {
945 TangoData* current_parameter = vecTangoData[j];
946 TObjArray* arrParameterData = current_parameter->
GetTangoData();
949 fill(bin_sum.begin(), bin_sum.end(), 0);
950 fill(bin_sec.begin(), bin_sec.end(), 0);
952 UInt_t value_start, value_end;
953 current_parameter->
GetValuePeriod(
i, data_start, data_end, value_start, value_end);
954 double value = ((TangoTimeParameter*)arrParameterData->
At(
i))->double_parameter_value[0];
957 int first_bin =
max(0, (
int)
floor(((
double)value_start - start_time) / bin_width));
958 int last_bin =
min(time_bins - 1, (
int)
floor(((
double)value_end - start_time) / bin_width));
959 for (
int b = first_bin;
b <= last_bin;
b++) {
960 double bin_start = start_time +
b * bin_width, bin_end = bin_start + bin_width;
961 double overlap =
min((
double)value_end, bin_end) -
max((
double)value_start, bin_start);
964 bin_sum[
b] +=
value * overlap;
965 bin_sec[
b] += overlap;
969 for (
int b = 0;
b < time_bins;
b++)
971 tango_hist->
SetBinContent(b + 1, j + 1, bin_sum[b] / bin_sec[b]);
975 TString view_name(draw_option);
983 bool is3D = view_name.Contains(
"surf") || view_name.Contains(
"lego");
1007 tango_hist->
Draw(draw_option);
1016 vector<double> result;
1018 cout <<
"ERROR: Tango parameter has not been obtained" << endl;
1023 cout <<
"strStartDateAvg = " <<
strStartDate.Data() << endl;
1025 cout <<
"strEndDateAvg = " <<
strEndDate.Data() << endl;
1031 for (
int i = 0;
i < time_count;
i++) {
1042 for (
size_t j = 0; j < result.size(); j++)
1043 result[j] /= time_count;
1059 cout <<
"ERROR: Tango parameter has not been obtained" << endl;
1060 return vector<double>();
1063 cout <<
"ERROR: there are no run time intervals, the object should be created by the Run Range Constructor"
1065 return vector<double>();
1078 vector<double> result;
1080 if (time_count == 0) {
1081 cout <<
"ERROR: there are no elements in the Tango array" << endl;
1085 size_t channel_count = ((TangoTimeParameter*)
arrTangoData->At(0))->double_parameter_value.size();
1086 result.assign(channel_count, 0);
1088 double total_sec = 0;
1089 for (
int i = 0;
i < time_count;
i++) {
1090 TangoTimeParameter* pParameter = (TangoTimeParameter*)
arrTangoData->At(
i);
1092 cout <<
"ERROR: channel count of the Tango parameter is not constant during the time interval" << endl;
1097 UInt_t value_start, value_end;
1101 for (
const auto& time_interval : time_intervals) {
1102 UInt_t overlap_start =
max(value_start, time_interval.start_time.Convert());
1103 UInt_t overlap_end =
min(value_end, time_interval.end_time.Convert());
1104 if (overlap_end <= overlap_start)
1107 UInt_t sec = overlap_end - overlap_start;
1108 for (
size_t j = 0; j < channel_count; j++)
1114 if (total_sec == 0) {
1115 cout <<
"ERROR: the total time of the intervals for the average value is equal 0" << endl;
1120 cout <<
"Total time of " << time_intervals.size() <<
" interval(s) used for the average value = " << total_sec
1123 for (
size_t j = 0; j < channel_count; j++)
1124 result[j] /= total_sec;
1135 value_end = data_end;
1136 if ((
i == 0) && (data_start < value_start))
1137 value_start = data_start;
1158 cout <<
"ERROR: Tango parameter has not been obtained" << endl;
1162 cout <<
"ERROR: comparison operator in the searching of intervals is not supported" << endl;
1166 TObjArray* pTimeIntervals =
new TObjArray();
1171 if (time_count == 0)
1172 return pTimeIntervals;
1175 size_t channel_count = ((TangoTimeParameter*)
arrTangoData->At(0))->double_parameter_value.size();
1176 for (
size_t j = 0; j < channel_count; j++) {
1177 TObjArray* pChannel =
new TObjArray();
1179 pTimeIntervals->
Add(pChannel);
1183 auto AddInterval = [&](
size_t j, TDatime start_interval, TDatime end_interval) {
1184 int real_channel = j;
1185 if (mapChannel !=
nullptr) {
1186 if (mapChannel->size() > j) {
1187 real_channel = mapChannel->at(j);
1189 cout <<
"CRITICAL WARNING: Tango array size is less than the corrected channel: " << real_channel
1194 cout <<
"CRITICAL WARNING: map channel size is less than the current channel: " << j << endl;
1196 ((TObjArray*)pTimeIntervals->
At(real_channel))->Add(
new TangoTimeInterval(start_interval, end_interval));
1199 auto GetStartTime = [&](
int start_i) {
1200 TDatime start_interval = ((TangoTimeParameter*)
arrTangoData->At(start_i))->parameter_time;
1202 TDatime previous_time = ((TangoTimeParameter*)
arrTangoData->At(start_i - 1))->parameter_time;
1205 return start_interval;
1209 vector<int> vecStart(channel_count, -1);
1210 for (
int i = 0;
i < time_count;
i++) {
1211 TangoTimeParameter* pParameter = (TangoTimeParameter*)
arrTangoData->At(
i);
1213 cout <<
"ERROR: channel count of the Tango parameter is not constant during the time interval" << endl;
1214 delete pTimeIntervals;
1219 for (
size_t j = 0; j < channel_count; j++) {
1221 bool isCondition =
false;
1222 switch (condition) {
1224 isCondition = cur_value <
value;
1227 isCondition = cur_value <=
value;
1230 isCondition = cur_value ==
value;
1233 isCondition = cur_value !=
value;
1236 isCondition = cur_value >
value;
1239 isCondition = cur_value >=
value;
1247 if (vecStart[j] < 0)
1251 else if (vecStart[j] >= 0)
1254 TDatime end_interval(uiEndTime - 1);
1257 (uiEndTime + ((TangoTimeParameter*)
arrTangoData->At(
i - 1))->parameter_time.Convert()) / 2);
1258 AddInterval(j, GetStartTime(vecStart[j]), end_interval);
1265 TDatime end_time = ((TangoTimeParameter*)
arrTangoData->At(time_count - 1))->parameter_time;
1266 for (
size_t j = 0; j < channel_count; j++)
1267 if (vecStart[j] >= 0)
1268 AddInterval(j, GetStartTime(vecStart[j]), end_time);
1270 return pTimeIntervals;
1284 if (!isShowOnlyExists)
1285 cout << channel_name.
Data() <<
" " <<
i <<
":" << endl
1286 <<
" No intervals correspond to the specified conditions" << endl;
1289 cout << channel_name.
Data() <<
" " <<
i <<
":" << endl;
friend F32vec4 min(const F32vec4 &a, const F32vec4 &b)
friend F32vec4 max(const F32vec4 &a, const F32vec4 &b)
R__EXTERN TRandom * gRandom
static int cached_end_run
const char *const TANGO_DB_USERNAME_b2020
static TString GetRangeSuffix(TangoData *pTangoData)
static TString cached_end_date
const char *const TANGO_DB_NAME_b2020
const char *const TANGO_DB_PASSWORD_b2020
static void AddStepPoint(TGraph &graph, double x, double y)
const char *const TANGO_DB_HOST_b2020
static TString GetArrayDataName(vector< TangoData * > &vecTangoData)
static TString GetArrayTitle(vector< TangoData * > &vecTangoData)
static TString cached_start_date
static TString GetSourceName(TangoData *pTangoData)
static TString GetDataName(TangoData *pTangoData)
static vector< TangoTimeInterval > cached_run_intervals
static int cached_start_run
static TCanvas * CreateTangoCanvas(TString data_name, TString view_name)
virtual void SetTitleOffset(Float_t offset=1)
virtual void SetLabelSize(Float_t size=0.04)
virtual void SetLabelOffset(Float_t offset=0.005)
virtual void SetNdivisions(Int_t n1, Int_t n2, Int_t n3, Bool_t optim=kTRUE)
virtual void SetLineWidth(Width_t lwidth)
virtual void SetLineColor(Color_t lcolor)
virtual void SetRightMargin(Float_t rightmargin)
virtual void SetTimeOffset(Double_t toffset, Option_t *option="local")
void CenterLabels(Bool_t center=kTRUE)
virtual void SetTimeDisplay(Int_t value)
void CenterTitle(Bool_t center=kTRUE)
virtual void SetTimeFormat(const char *format="")
virtual void SetOwner(Bool_t enable=kTRUE)
const char * AsSQLString() const
UInt_t Convert(Bool_t toGMT=kFALSE) const
void SetTitle(const char *title="") override
virtual void SetPoint(Int_t point, Double_t x, Double_t y, Double_t z)
void Draw(Option_t *option="P0") override
virtual void SetPoint(Int_t i, Double_t x, Double_t y)
void SetTitle(const char *title="") override
static void AddDirectory(Bool_t add=kTRUE)
void Draw(Option_t *option="") override
virtual void SetMinimum(Double_t minimum=-1111)
virtual Double_t GetMinimum(Double_t minval=-FLT_MAX) const
static Bool_t AddDirectoryStatus()
virtual void SetStats(Bool_t stats=kTRUE)
void SetBinContent(Int_t bin, Double_t content) override
void SetMargin(Float_t margin)
virtual void Add(TGraph *graph, Option_t *chopt="")
void Draw(Option_t *chopt="") override
virtual void SetTitle(const char *title="")
Int_t GetEntriesFast() const
TObject * At(Int_t idx) const override
void Add(TObject *obj) override
TLegend * BuildLegend(Double_t x1=0.3, Double_t y1=0.21, Double_t x2=0.3, Double_t y2=0.21, const char *title="", Option_t *option="") override
void Modified(Bool_t flag=true) override
virtual void SetSeed(ULong_t seed=0)
virtual UInt_t Integer(UInt_t imax)
const char * GetDB() const
virtual TSQLResult * GetTables(const char *dbname, const char *wild=nullptr)=0
virtual TSQLStatement * Statement(const char *, Int_t=100)
virtual const char * GetString(Int_t)
virtual Bool_t NextResultRow()=0
virtual Int_t GetNumAffectedRows()
virtual Int_t GetInt(Int_t)
virtual Bool_t Process()=0
virtual Double_t GetDouble(Int_t)
virtual Bool_t StoreResult()=0
const char * Data() const
static TString Format(const char *fmt,...)
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
TSQLServer * GetSQLServer()
static TangoConnection * Open()
void GetValuePeriod(int i, UInt_t data_start, UInt_t data_end, UInt_t &value_start, UInt_t &value_end)
std::vector< double > GetAverageTangoData()
static int PrintTangoArraySurface(std::vector< TangoData * > vecTangoData, const char *z_axis="parameter", const char *y_axis="channel", const char *draw_option="SURF1", int time_bins=100)
Function displays a set of "simple" parameters obtained from Tango, e.g.
TObjArray * SearchTangoIntervals(enumConditions condition=conditionEqual, double value=1, std::vector< int > *mapChannel=nullptr)
Function SearchTangoIntervals gets time intervals for defined condition on the parameter values (e....
std::vector< double > GetRunAverageTangoData()
std::vector< double > GetTimeWeightedAverage(const std::vector< TangoTimeInterval > &time_intervals)
static void PrintTangoArrayConsole(std::vector< TangoData * > vecTangoData)
int SetRunRangeDates(int period_number, int start_run, int end_run)
std::vector< TangoTimeInterval > vecRunIntervals
void PrintTangoDataConsole()
@ conditionGreaterOrEqual
void DeleteTangoParameter()
void PrintTangoDataSurface(const char *y_axis="tango parameter")
TObjArray * GetTangoData()
int PrintTangoDataMultiGraph(const char *y_axis="parameter", bool is3D=false)
TString GetParameterName()
TangoData(const char *start_date, const char *end_date, const char *system_name, const char *parameter_name, const char *member_name="", int verbose=0)
Time Range Constructor: fill Tango data array according to the given parameters Tango database connec...
static int PrintTangoArrayMultiGraph(std::vector< TangoData * > vecTangoData, const char *y_axis="parameter", bool is3D=false)
void PrintTangoIntervalConsole(TObjArray *tango_intervals, TString channel_name="Channel", bool isShowOnlyExists=false)
Function displays (in console) time intervals obtained from Tango for a defined condition Parameters:...
TangoTimeInterval()
Default constructor.
virtual ~TangoTimeInterval()
Destructor.
std::vector< bool > bool_parameter_value
Tango_Parameter_Type parameter_type
TangoTimeParameter()
Default constructor.
std::vector< double > double_parameter_value
virtual ~TangoTimeParameter()
Destructor.
UniRun.h Class for the table: run_.
static UniRun * GetRun(int period_number, int run_number)
get run from the database
TDatime * GetEndDatetime()
get end datetime of the current run
TDatime GetStartDatetime()
get start datetime of the current run
static int GetRunNumbers(UniqueRunNumber *&run_numbers, int start_period, int start_run=0, int end_period=-1, int end_run=-1)
get numbers of runs stored in the Database for a selected range
RVec< PromoteType< T > > floor(const RVec< T > &v)
*brief user defined string literal for JSON values *sa std::size_t n
*brief create JSON pointer *sa reference_tokens const std::string const std::string & b