Index: trunk/src/tablePriority.cpp
===================================================================
--- trunk/src/tablePriority.cpp (revision 464)
+++ trunk/src/tablePriority.cpp (revision 465)
@@ -1,182 +1,182 @@
//==============================================================================
// tablePriority.cpp
//
// Copyright (C) 2021 Tobias Toll and Thomas Ullrich
//
// This file is part of Sartre.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation.
// This program is distributed in the hope that it will be useful,
// but without any warranty; without even the implied warranty of
// merchantability or fitness for a particular purpose. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
//
// Author: Thomas Ullrich
// Last update:
-// $Date: 2019-09-04 12:48:48 -0400 (Wed, 04 Sep 2019) $
+// $Date: 2021-08-24 16:17:14 -0400 (Tue, 24 Aug 2021) $
// $Author: ullrich $
//==============================================================================
//
// Utility program to display or set the table priority.
// Usage: tableInspector [-s priority] file(s) ...
// -s priority set the priority to given value
//==============================================================================
#include "Table.h"
#include "TFile.h"
#include "TH2F.h"
#include "TH3F.h"
#include
#include
#include
#include
#include
#include
using namespace std;
#define PR(x) cout << #x << " = " << (x) << endl;
void usage(const char* prog)
{
cout << "Usage: " << prog << " [-s priority] [-d] file(s) ..." << endl;
cout << " " << "-s priority set the priority to given value" << endl;
cout << " " << "-f display filename after priority" << endl;
}
int main(int argc, char **argv)
{
//
// Handle command line arguments
//
if (argc == 1) {
usage(argv[0]);
return 2;
}
bool setPriority = false;
bool displayFilename = false;
unsigned int newPriority = 0;
int ch;
while ((ch = getopt(argc, argv, "fs:")) != -1) {
switch (ch) {
case 'f':
displayFilename = true;
break;
case 's':
setPriority = true;
newPriority = atol(optarg);
break;
case '?':
default:
usage(argv[0]);
return 2;
break;
}
}
if (optind == argc) {
usage(argv[0]);
return 2;
}
if (setPriority && newPriority > 0xFF) {
cout << "Error, priority cannot be larger than 255." << endl;
return 1;
}
//
// Set priority mode
//
TFile *file;
if (setPriority) {
for (int index = optind; index < argc; index++) {
//
// Open file in read only mode and get table
//
file = TFile::Open(argv[index],"READ");
if (!file) {
cout << "Error, failed opening file '" << argv[index] << "'." << endl;
return 1;
}
auto ptr = file->Get("table");
if (ptr == 0) {
cout << "Error, failed retrieving table from file '" << argv[index] << "'." << endl;
return 1;
}
//
// Rewrite ID (histo title) using new priority
//
uint64_t mID = atoll(ptr->GetTitle());
uint64_t one = 1;
int oldPriority = ((mID >> 34) & 0xFF);
for (int k=34; k<41; k++) mID &= ~(one << k);
mID |= (static_cast(newPriority) << 34);
ostringstream titlestream;
titlestream << mID;
string title = titlestream.str();
//
// Type of table different for UPC
//
bool isUPCTable = (mID & (static_cast(1) << 46));
if (isUPCTable) {
auto hist = reinterpret_cast(ptr);
hist->SetDirectory(0);
hist->SetTitle(title.c_str());
}
else {
auto hist = reinterpret_cast(ptr);
hist->SetDirectory(0);
hist->SetTitle(title.c_str());
}
file->Close();
//
// Open same file in recreate/new mode and write
// updated histos into them.
// We need to write a new file since adding it
// to the same one (update mode) doubles the size
// of the file otherwise.
//
file = TFile::Open(argv[index],"RECREATE");
if (isUPCTable) {
auto hist = reinterpret_cast(ptr);
hist->Write();
}
else {
auto hist = reinterpret_cast(ptr);
hist->Write();
}
file->Close();
//
// Print out
//
cout << oldPriority << " -> " << newPriority;
if (displayFilename) cout << '\t' << argv[index];
cout << endl;
}
}
//
// List mode only
//
else {
for (int index = optind; index < argc; index++) {
Table tbl;
if (tbl.read(argv[index])) {
cout << tbl.priority();
if (displayFilename) cout << '\t' << tbl.filename();
cout << endl;
}
}
}
return 0;
}