|
ATLAS Offline Software
|
#include <iostream>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <cstdlib>
#include <cstdio>
#include <fstream>
#include <sys/stat.h>
#include "simpletimer.h"
#include "node.h"
#include "addnode.h"
#include "spacer.h"
#include "TStyle.h"
#include "TCanvas.h"
#include "TKey.h"
#include "TH1D.h"
#include "TH2D.h"
#include "TProfile.h"
#include "TFile.h"
#include "TClass.h"
#include "TDirectory.h"
#include "TPad.h"
#include <algorithm>
#include "CxxUtils/checker_macros.h"
Go to the source code of this file.
|
std::string | date () |
| sadly, includes a return at the end More...
|
|
bool | file_exists (const std::string &file) |
|
template<typename T > |
std::ostream & | operator<< (std::ostream &s, const std::vector< T > &v) |
|
bool | contains (const std::string &s, const std::string ®x) |
| does a string contain the substring More...
|
|
template<typename T > |
std::ostream & | operator<< (std::ostream &s, const std::vector< T * > &v) |
|
template<class T > |
T * | get (TKey *tobj) |
| get a TObject* from a TKey* (why can't a TObject be a TKey?) More...
|
|
std::string | find (const std::string &s) |
| return a remapped string More...
|
|
int | count (std::string s, const std::string ®x) |
| count how many occurances of a regx are in a string More...
|
|
std::string | chop (std::string &s1, const std::string &s2) |
|
std::vector< std::string > | split (const std::string &s, const std::string &t=":") |
|
std::string | chopex (std::string &s1, const std::string &s2) |
|
std::string | chomp (std::string &s1, const std::string &s2) |
|
std::string | choptoken (std::string &s1, const std::string &s2) |
|
std::string | chomptoken (std::string &s1, const std::string &s2) |
|
std::string | chopfirst (std::string &s1, const std::string &s2) |
|
std::string | choplast (std::string &s1, const std::string &s2) |
|
std::string | chopends (std::string &s1, const std::string &s2) |
|
void | removespace (std::string &s, const std::string &s2) |
|
std::string | replace (std::string s, const std::string &s2, const std::string &s3) |
|
void | depunctuate (std::string &s, const std::string ®ex=":") |
|
std::vector< std::string > | maphist (const std::vector< std::string > &v) |
|
bool | match (std::string s1, std::string s2) |
| match the individual directories of two strings More...
|
|
bool | matchdir (const std::string &s) |
| see whether this directory matches any of the directories we are explicitly being asked to match More...
|
|
bool | matchcwd (const std::string &s) |
|
std::string | matchcwdstr (const std::string &s) |
|
std::map< std::string, int >::const_iterator | matchcwditr (const std::string &s) |
|
std::ostream & | operator<< (std::ostream &s, const reference &r) |
|
void | search (TDirectory *td, const std::string &s, std::string cwd, node *n) |
| recursive directory search for TH1 and TH2 and TProfiles More...
|
|
int | cost (std::vector< std::string > &files, node &n, const std::string &directory="", bool deleteref=false, bool relocate=false) |
|
int | usage (std::ostream &s, int, char **argv, int status=-1) |
|
void | referenceblock (const std::string &file) |
|
int | main (int argc, char **argv) |
|
◆ chomp()
std::string chomp |
( |
std::string & |
s1, |
|
|
const std::string & |
s2 |
|
) |
| |
Definition at line 211 of file hcg.cxx.
213 std::string::size_type
pos =
s1.find(
s2);
215 if (
pos == std::string::npos ) {
◆ chomptoken()
std::string chomptoken |
( |
std::string & |
s1, |
|
|
const std::string & |
s2 |
|
) |
| |
Definition at line 244 of file hcg.cxx.
247 std::string::size_type
pos =
s1.find(
s2);
248 if (
pos != std::string::npos ) {
◆ chop()
std::string chop |
( |
std::string & |
s1, |
|
|
const std::string & |
s2 |
|
) |
| |
Definition at line 158 of file hcg.cxx.
160 std::string::size_type
pos =
s1.find(
s2);
162 if (
pos == std::string::npos ) {
164 s1.erase(0,
s1.size());
◆ chopends()
std::string chopends |
( |
std::string & |
s1, |
|
|
const std::string & |
s2 |
|
) |
| |
◆ chopex()
std::string chopex |
( |
std::string & |
s1, |
|
|
const std::string & |
s2 |
|
) |
| |
Definition at line 194 of file hcg.cxx.
196 std::string::size_type
pos =
s1.find(
s2);
198 if (
pos == std::string::npos ) {
◆ chopfirst()
std::string chopfirst |
( |
std::string & |
s1, |
|
|
const std::string & |
s2 |
|
) |
| |
Definition at line 257 of file hcg.cxx.
260 std::string::size_type
pos =
s1.find_first_not_of(
s2);
261 if (
pos != std::string::npos ) {
◆ choplast()
std::string choplast |
( |
std::string & |
s1, |
|
|
const std::string & |
s2 |
|
) |
| |
Definition at line 273 of file hcg.cxx.
276 std::string::size_type
pos =
s1.find_last_not_of(
s2);
277 if (
pos != std::string::npos ) {
◆ choptoken()
std::string choptoken |
( |
std::string & |
s1, |
|
|
const std::string & |
s2 |
|
) |
| |
Definition at line 230 of file hcg.cxx.
233 std::string::size_type
pos =
s1.find(
s2);
234 if (
pos != std::string::npos ) {
◆ contains()
bool contains |
( |
const std::string & |
s, |
|
|
const std::string & |
regx |
|
) |
| |
does a string contain the substring
Definition at line 111 of file hcg.cxx.
111 {
return s.find(regx)!=std::string::npos; }
◆ cost()
int cost |
( |
std::vector< std::string > & |
files, |
|
|
node & |
n, |
|
|
const std::string & |
directory = "" , |
|
|
bool |
deleteref = false , |
|
|
bool |
relocate = false |
|
) |
| |
open the output file
navigate the directory structure to extracting all the info
if asked to delete the unused referenece then do so if however asked to relocate the histgrams, simply modify the list of histogram destinations first
std::cerr << "\t" << dirs[jh] << std::endl;
Definition at line 921 of file hcg.cxx.
923 std::cerr <<
"processing ..." << std::endl;
930 for (
unsigned i=0 ;
i<
files.size() ;
i++ ) {
934 std::cerr <<
"opening " <<
currentfile << std::endl;
937 std::cerr <<
"file " <<
files[
i] <<
" does not exist" << std::endl;
945 std::cerr <<
"file " <<
files[
i] <<
" cannot be opened" << std::endl;
970 if ( deleteref || relocate ) {
972 std::cerr <<
"remapping" << std::endl;
976 if ( relocate && !deleteref ) std::cerr <<
"saving histograms to file .newhist.root ... " << std::endl;
979 TFile* fnew =
new TFile(
outref.c_str(),
"recreate" );
986 for (
unsigned ih=0 ; ih<
savedhistos.size() ; ih++ ) {
990 for (
unsigned jh=0 ; jh<
dirs.size()-1 ; jh++ ) {
992 TDirectory* renedir =
gDirectory->GetDirectory(
dirs[jh].c_str() );
1000 href->Write(
dirs.back().c_str() );
1009 std::cerr <<
"closing files" << std::endl;
1016 if (
outref==
".newhist.root" ) {
1017 std::cerr <<
"replacing histogram file" << std::endl;
1018 std::string
cmd = std::string(
"mv ") +
files[
i] +
" " +
files[
i] +
".bak";
1019 std::system(
cmd.c_str() );
1020 cmd = std::string(
"mv .newhist.root ") +
files[
i];
1021 std::system(
cmd.c_str() );
◆ count()
int count |
( |
std::string |
s, |
|
|
const std::string & |
regx |
|
) |
| |
count how many occurances of a regx are in a string
Definition at line 143 of file hcg.cxx.
144 size_t p =
s.find( regx );
146 while (
p!=std::string::npos ) {
◆ date()
sadly, includes a return at the end
Definition at line 55 of file hcg.cxx.
58 std::string
a = ctime(&
t);
60 for (
unsigned i=0 ;
i<
a.size()-1 ;
i++ )
b+=
a[
i];
◆ depunctuate()
void depunctuate |
( |
std::string & |
s, |
|
|
const std::string & |
regex = ":" |
|
) |
| |
Definition at line 320 of file hcg.cxx.
322 std::string::size_type pos;
323 while ( (pos = s.find(regex))!=std::string::npos ) {
324 s.erase(pos, regex.size());
◆ file_exists()
bool file_exists |
( |
const std::string & |
file | ) |
|
◆ find()
std::string find |
( |
const std::string & |
s | ) |
|
return a remapped string
Definition at line 135 of file hcg.cxx.
136 std::map<std::string, std::string>::const_iterator itr =
remap.find(
s);
137 if ( itr!=
remap.end() )
return itr->second;
◆ get()
get a TObject* from a TKey* (why can't a TObject be a TKey?)
Definition at line 127 of file hcg.cxx.
128 TObject*
a = tobj->ReadObj()->Clone();
129 ((TH1*)
a)->SetDirectory(0);
◆ main()
int main |
( |
int |
argc, |
|
|
char ** |
argv |
|
) |
| |
if output file is not defined
check some input files
create the structure ...
create the side bar menu part
create the histogram assessment part
ensure that buffer is properly flushed
Definition at line 1065 of file hcg.cxx.
1073 gStyle->SetPadRightMargin(0.05);
1074 gStyle->SetPadTopMargin(0.075);
1077 TCanvas* tg =
new TCanvas(
"tg",
"tg", 700, 600 );
1080 gStyle->SetStatY(0.4);
1082 gStyle->SetStatX(0.89);
1084 gStyle->SetStatW(0.25);
1086 gStyle->SetStatH(0.16);
1093 for (
int i=1 ;
i<
argc ;
i++ ) {
1097 std::string
dir =
"";
1099 std::vector<std::string> subdirs;
1102 bool deleteref =
false;
1103 bool relocate =
false;
1110 for (
int i=1 ;
i<
argc ;
i++ ) {
1111 if ( std::string(
argv[
i])==
"-v" || std::string(
argv[
i])==
"--verbose" )
verbose =
true;
1112 else if ( std::string(
argv[
i])==
"-o" ) {
1117 else if ( std::string(
argv[
i])==
"-or" || std::string(
argv[
i])==
"--outrefr" ) {
1122 else if ( std::string(
argv[
i])==
"-ref" || std::string(
argv[
i])==
"--reference" ) {
1134 else if ( std::string(
argv[
i])==
"-rc" || std::string(
argv[
i])==
"-refconf" ) {
1139 else if ( std::string(
argv[
i])==
"-dr" || std::string(
argv[
i])==
"--deleteref" ) deleteref =
true;
1140 else if ( std::string(
argv[
i])==
"-rh" || std::string(
argv[
i])==
"--relocate" ) relocate =
true;
1141 else if ( std::string(
argv[
i])==
"-wc" || std::string(
argv[
i])==
"--wildcard" )
allhists =
false;
1142 else if ( std::string(
argv[
i])==
"-d" || std::string(
argv[
i])==
"--dir" ) {
1146 std::string stringdir(
argv[
i]);
1147 dirs.insert( std::map<std::string,int>::value_type( stringdir,
std::count( stringdir.begin(), stringdir.end(),
'/' ) ) );
1149 std::string tdir =
argv[
i];
1154 subdirs.push_back(
chop( tdir,
"/" ) );
1157 while ( tdir.size() );
1161 else if ( std::string(
argv[
i])==
"-x" ) {
1166 else if ( std::string(
argv[
i])==
"-ds" || std::string(
argv[
i]).
find(
"--desc")==0 ) {
1171 else if ( std::string(
argv[
i])==
"-b" || std::string(
argv[
i])==
"--base" ) {
1176 else if ( std::string(
argv[
i])==
"-a" || std::string(
argv[
i])==
"--algorithm" ) {
1186 else if ( std::string(
argv[
i])==
"-t" || std::string(
argv[
i])==
"--tag" ) {
1191 else if ( std::string(
argv[
i])==
"-r" ) {
1197 remap.insert( std::map<std::string,std::string>::value_type(
src,
dest ) );
1223 if (
verbose ) std::cerr <<
"timing" << std::endl;
1230 n.name(
"top_level" );
1253 (*outp) << std::endl;
1257 if (
t>1000 ) std::cerr <<
"total time " <<
t*0.001 <<
" s" << std::endl;
1258 else std::cerr <<
"total time " <<
t <<
" ms" << std::endl;
◆ maphist()
std::vector<std::string> maphist |
( |
const std::vector< std::string > & |
v | ) |
|
Definition at line 330 of file hcg.cxx.
332 for (
unsigned i=0 ;
i<
v.size() ;
i++ ) {
334 std::string
tmp =
v[
i];
◆ match()
bool match |
( |
std::string |
s1, |
|
|
std::string |
s2 |
|
) |
| |
match the individual directories of two strings
Definition at line 356 of file hcg.cxx.
361 int i = ( i1<i2 ? i1 : i2 );
365 for (
i++ ;
i-- ; ) {
366 size_t p1 =
s1.find(
'/');
367 size_t p2 =
s2.find(
'/');
369 std::string ss1 =
s1.substr( 0,
p1 );
370 std::string ss2 =
s2.substr( 0,
p2 );
377 if ( ss1!=ss2 )
return false;
◆ matchcwd()
bool matchcwd |
( |
const std::string & |
s | ) |
|
Definition at line 402 of file hcg.cxx.
403 if (
dirs.size()==0 )
return true;
404 std::map<std::string,int>::const_iterator itr =
dirs.begin();
405 while ( itr!=
dirs.end() ) {
406 if (
s.find(itr->first)!=std::string::npos )
return true;
◆ matchcwditr()
std::map<std::string,int>::const_iterator matchcwditr |
( |
const std::string & |
s | ) |
|
Definition at line 425 of file hcg.cxx.
426 if (
dirs.size()==0 )
return dirs.end();
427 std::map<std::string,int>::const_iterator itr =
dirs.begin();
428 while ( itr!=
dirs.end() ) {
429 if (
s.find(itr->first)!=std::string::npos )
return itr;
◆ matchcwdstr()
std::string matchcwdstr |
( |
const std::string & |
s | ) |
|
Definition at line 414 of file hcg.cxx.
415 if (
dirs.size()==0 )
return "";
416 std::map<std::string,int>::const_iterator itr =
dirs.begin();
417 while ( itr!=
dirs.end() ) {
418 if (
s.find(itr->first)!=std::string::npos )
return itr->first;
◆ matchdir()
bool matchdir |
( |
const std::string & |
s | ) |
|
see whether this directory matches any of the directories we are explicitly being asked to match
Definition at line 389 of file hcg.cxx.
392 std::map<std::string,int>::const_iterator itr =
dirs.begin();
393 while ( itr!=
dirs.end() ) {
◆ operator<<() [1/3]
Definition at line 504 of file hcg.cxx.
505 static bool first =
true;
507 s <<
"##########################\n";
508 s <<
"# References\n";
509 s <<
"##########################\n\n";
512 s <<
"reference " <<
r.name() <<
" {\n";
513 s <<
"\t\tfile = " <<
r.file() <<
"\n";
514 s <<
"\t\tpath = run_" <<
r.run() <<
"\n";
515 s <<
"\t\tname = same_name" <<
"\n";
◆ operator<<() [2/3]
template<typename T >
std::ostream& operator<< |
( |
std::ostream & |
s, |
|
|
const std::vector< T * > & |
v |
|
) |
| |
Definition at line 116 of file hcg.cxx.
117 if (
v.empty() )
return s;
118 for (
int i=0 ;
i<
v.size() ;
i++ )
s << *
v[
i] <<
"\n";
◆ operator<<() [3/3]
template<typename T >
std::ostream& operator<< |
( |
std::ostream & |
s, |
|
|
const std::vector< T > & |
v |
|
) |
| |
Definition at line 105 of file hcg.cxx.
106 if (
v.empty() )
return s;
107 for (
size_t i=0 ;
i<
v.size() ;
i++ )
s <<
v[
i] <<
"\n";
◆ referenceblock()
void referenceblock |
( |
const std::string & |
file | ) |
|
Definition at line 1059 of file hcg.cxx.
1060 std::ifstream strm(
file.c_str());
◆ removespace()
void removespace |
( |
std::string & |
s, |
|
|
const std::string & |
s2 |
|
) |
| |
Definition at line 297 of file hcg.cxx.
299 std::string::size_type
pos;
300 while ( (
pos =
s.find(
s2))!=std::string::npos ) {
◆ replace()
std::string replace |
( |
std::string |
s, |
|
|
const std::string & |
s2, |
|
|
const std::string & |
s3 |
|
) |
| |
Definition at line 307 of file hcg.cxx.
308 std::string::size_type
pos;
311 while ( (
pos =
s.find(
s2))!=std::string::npos ) {
◆ search()
void search |
( |
TDirectory * |
td, |
|
|
const std::string & |
s, |
|
|
std::string |
cwd, |
|
|
node * |
n |
|
) |
| |
recursive directory search for TH1 and TH2 and TProfiles
not a directory
don't go more than 10 directories deep
go through sub directories
descend into the subdirectory ...
if this is a directory we want, print (*outp) the histograms
get the full path to this object path relative to the file
save the histograms in case we need to save the, later ...
keep the max number of entries updated
Definition at line 738 of file hcg.cxx.
743 if ( std::string(td->GetName()).find(
"_LB")!=std::string::npos )
return;
744 if ( std::string(td->GetName()).find(
"lb_")!=std::string::npos )
return;
755 std::cerr <<
"search() WARNING too many levels of directories (max 10) !!!\n";
766 if (
cwd!=
"" )
cwd +=
"/";
767 cwd += td->GetName();
771 std::string
fulldir = td->GetName();
774 bool first_found =
false;
779 if ( (
cwd+
"/").
find( ase+
"/" )!=std::string::npos ) {
784 std::cerr <<
"matched dirs " <<
cwd <<
" " <<
matchdir(
cwd ) << std::endl;
787 std::map<std::string,int>::const_iterator fitr =
matchcwditr(
cwd );
789 if ( fitr!=
dirs.end() ) {
791 if ( fitr->second>0 ) {
793 std::vector<std::string> subpath;
795 std::string sp = fitr->first;
797 while( sp.size() ) subpath.push_back(
chop(sp,
"/") );
799 for (
unsigned ip=0 ;
ip<subpath.size()-1 ;
ip++ ) {
830 for (
int i=0 ;
i<
tl->GetSize() ;
i++ ) {
832 TKey* tobj = (TKey*)
tl->At(
i);
834 if ( tobj==0 )
continue;
840 if ( std::string(tobj->GetClassName()).find(
"TDirectory")!=std::string::npos ) {
843 TDirectory* tnd = (TDirectory*)tobj->ReadObj();
855 if ( std::string(tobj->GetClassName()).find(
"TH1")!=std::string::npos ||
856 std::string(tobj->GetClassName()).find(
"TH2")!=std::string::npos ||
857 std::string(tobj->GetClassName()).find(
"TProfile")!=std::string::npos ) {
874 if ( std::string(tobj->GetName())==
"Chain" ) {
875 double N = ((TH1*)get<TObject>(tobj))->
GetEntries();
879 std::cout <<
"\t" <<
subdir <<
"\t" <<
N << std::endl;
882 if (
p &&
p->name()!=
"Shifter" ) {
884 p->addrate(
p->name(),
N );
887 if (
p2 )
p2->addrate(
p->name(),
N );
◆ split()
std::vector<std::string> split |
( |
const std::string & |
s, |
|
|
const std::string & |
t = ":" |
|
) |
| |
Definition at line 174 of file hcg.cxx.
177 size_t pos = s2.find(t);
179 std::vector<std::string> tags;
181 while ( pos!=std::string::npos ) {
182 tags.push_back( chop(s2,t) );
◆ usage()
int usage |
( |
std::ostream & |
s, |
|
|
int |
, |
|
|
char ** |
argv, |
|
|
int |
status = -1 |
|
) |
| |
Definition at line 1034 of file hcg.cxx.
1035 s <<
"Usage: " <<
argv[0] <<
" [OPTIONS] input1.root ... inputN.root\n\n";
1036 s <<
" -o FILENAME \tname of output (filename required)\n";
1037 s <<
" -b, --base DIR \tuse directory DIR as the base for the han config\n";
1038 s <<
" -d, --dir DIR \tonly directories below DIR where DIR is a structure such as HLT/TRIDT etc\n";
1039 s <<
" -x, DIR \texclude directory DIR\n";
1040 s <<
" -r SRC DST \tremap directory SRC to directory DST\n";
1041 s <<
" -ds, --desc DESCRIP \tuse DESCRIP as the description\n";
1042 s <<
" -t, --tag VALUE \tadd the VALUE to the list of command per histogram\n";
1043 s <<
" -a, --algorithm VALUE \tuse VALUE as the execution algorithm for each histogram\n";
1044 s <<
" -wc, --wildcard \tprint use hist * rather than a separate entry for each histogram\n";
1045 s <<
" -dr, --deleteref \tdelete unselected histograms\n";
1046 s <<
" -or, --outref FILENAME \tdelete file to write reduced output to (overwrites input otherwise) \n";
1047 s <<
" -rh, --relocate \trelocate selected histograms\n";
1048 s <<
" -ref, --reference TAG FILE \tadd FILE as a reference file with tag TAG\n";
1049 s <<
" -rc, --refconf FILE \tadd FILE to the config as a reference block\n";
1050 s <<
" -v, --verbose \tprint verbose output\n";
1051 s <<
" -h, --help \tdisplay this help\n";
◆ algorithm
std::string algorithm = "HLT_Histogram_Not_Empty&GatherData" |
◆ allhists
◆ ATLAS_NO_CHECK_FILE_THREAD_SAFETY
ATLAS_NO_CHECK_FILE_THREAD_SAFETY |
◆ base
◆ currentfile
std::string currentfile = "" |
◆ description
std::string description = "https://twiki.cern.ch/twiki/bin/view/Atlas/HltTrackingDataQualityMonitoring#Tier0" |
glabal timer - how long have I taken so far?
Definition at line 88 of file hcg.cxx.
◆ dirs
std::map<std::string, int> dirs |
list of directories to be explicitly included, together with corresponding depths of subdirectories
Definition at line 99 of file hcg.cxx.
◆ exclude
std::set<std::string> exclude |
list of directories to be excluded
Definition at line 95 of file hcg.cxx.
◆ files
std::vector<std::string> files |
file names and file pointers
Definition at line 47 of file hcg.cxx.
◆ found_dir
◆ fptr
◆ mapped
std::vector<std::string> mapped |
◆ outp
std::ostream* outp = &std::cout |
send output to here ...
Definition at line 73 of file hcg.cxx.
◆ outref
◆ refblock
std::vector<std::string> refblock |
◆ references
◆ remap
std::map<std::string, std::string> remap |
list of directories to be explicitly remapped
Definition at line 92 of file hcg.cxx.
◆ savedhistos
std::vector<std::string> savedhistos |
◆ tags
std::vector<std::string> tags |
◆ verbose
std::ostream * outp
send output to here ...
std::string matchcwdstr(const std::string &s)
std::string replace(std::string s, const std::string &s2, const std::string &s3)
int cost(std::vector< std::string > &files, node &n, const std::string &directory="", bool deleteref=false, bool relocate=false)
std::map< std::string, int >::const_iterator matchcwditr(const std::string &s)
path
python interpreter configuration --------------------------------------—
struct timeval simpletimer_start(void)
std::string find(const std::string &s)
return a remapped string
std::string chop(std::string &s1, const std::string &s2)
std::vector< std::string > refblock
TGraphErrors * GetEntries(TH2F *histo)
std::set< std::string > exclude
list of directories to be excluded
node * addnode(node *np, const std::string &name, TObject *td, node::TYPE t)
add a submode with a specific name, or return the existing node if one already exists
std::vector< reference > references
void search(TDirectory *td, const std::string &s, std::string cwd, node *n)
recursive directory search for TH1 and TH2 and TProfiles
std::string chopfirst(std::string &s1, const std::string &s2)
std::vector< std::string > tags
T * Get(TFile &f, const std::string &n, const std::string &dir="", const chainmap_t *chainmap=0, std::vector< std::string > *saved=0)
get a histogram given a path, and an optional initial directory if histogram is not found,...
std::vector< std::string > maphist(const std::vector< std::string > &v)
bool matchdir(const std::string &s)
see whether this directory matches any of the directories we are explicitly being asked to match
std::vector< std::string > files
file names and file pointers
std::vector< std::string > split(const std::string &s, const std::string &t=":")
bool contains(const std::string &s, const std::string ®x)
does a string contain the substring
void referenceblock(const std::string &file)
int count(std::string s, const std::string ®x)
count how many occurances of a regx are in a string
std::vector< TFile * > fptr
double simpletimer_stop(const struct timeval &start_time)
std::string choplast(std::string &s1, const std::string &s2)
std::map< std::string, int > dirs
list of directories to be explicitly included, together with corresponding depths of subdirectories
int ir
counter of the current depth
std::map< std::string, std::string > remap
list of directories to be explicitly remapped
def time(flags, cells_name, *args, **kw)
std::vector< std::string > savedhistos
std::vector< std::string > mapped
int usage(std::ostream &s, int, char **argv, int status=-1)
bool file_exists(const std::string &file)
bool match(std::string s1, std::string s2)
match the individual directories of two strings
bool matchcwd(const std::string &s)
std::string description
glabal timer - how long have I taken so far?
make the histogram assessment part of the config