30{
33
35
38 JRange_t X;
39 JRange_t Y;
40 double precision;
42
43 try {
44
45 JParser<> zap(
"Auxiliary program to zoom 2D histograms.");
46
47 zap[
'f'] =
make_field(inputFile,
"<input file>:<object name>");
53
54 zap(argc, argv);
55 }
56 catch(const exception &error) {
57 FATAL(error.what() << endl);
58 }
59
61
62 for (vector<JRootObjectID>::const_iterator input = inputFile.begin(); input != inputFile.end(); ++input) {
63
64 DEBUG(
"Input: " << *input << endl);
65
67
68 if (dir == NULL) {
69 ERROR(
"File: " << input->getFullFilename() <<
" not opened." << endl);
70 continue;
71 }
72
73 const TRegexp regexp(input->getObjectName());
74
75 TIter iter(dir->GetListOfKeys());
76
77 for (TKey* key; (
key = (TKey*) iter.Next()) != NULL; ) {
78
79 const TString tag(
key->GetName());
80
81 DEBUG(
"Key: " << tag <<
" match = " << tag.Contains(regexp) << endl);
82
83
84
85 if (tag.Contains(regexp) &&
isTObject(key)) {
86
87 TH2D* ha =
dynamic_cast<TH2D*
>(
key->ReadObj());
88
89 if (ha != NULL) {
90
91 const Int_t ix1 = max(ha->GetXaxis()->FindBin(X.getLowerLimit()), 1);
92 const Int_t ix2 = min(ha->GetXaxis()->FindBin(X.getUpperLimit()), ha->GetXaxis()->GetNbins());
93 const Int_t iy1 = max(ha->GetYaxis()->FindBin(Y.getLowerLimit()), 1);
94 const Int_t iy2 = min(ha->GetYaxis()->FindBin(Y.getUpperLimit()), ha->GetYaxis()->GetNbins());
95
97 << "[" << ix1 << "," << ix2 << "]" << " x "
98 << "[" << iy1 << "," << iy2 << "]" << endl);
99
100 TH2D* hb =
new TH2D(
MAKE_CSTRING(ha->GetName() <<
".zoom"), NULL,
101 ix2 - ix1 + 1, ha->GetXaxis()->GetBinLowEdge(ix1), ha->GetXaxis()->GetBinUpEdge(ix2),
102 iy2 - iy1 + 1, ha->GetYaxis()->GetBinLowEdge(iy1), ha->GetYaxis()->GetBinUpEdge(iy2));
103
104 if (fabs(ha->GetXaxis()->GetBinWidth(1) - hb->GetXaxis()->GetBinWidth(1)) > precision) {
105 FATAL(
"Binwidth x " <<
FIXED(9,5) << ha->GetXaxis()->GetBinWidth(1) <<
" != " <<
FIXED(9,5) << hb->GetXaxis()->GetBinWidth(1) << endl);
106 }
107 if (fabs(ha->GetYaxis()->GetBinWidth(1) - hb->GetYaxis()->GetBinWidth(1)) > precision) {
108 FATAL(
"Binwidth y " <<
FIXED(9,5) << ha->GetYaxis()->GetBinWidth(1) <<
" != " <<
FIXED(9,5) << hb->GetYaxis()->GetBinWidth(1) << endl);
109 }
110
111 for (Int_t ix = ix1; ix <= ix2; ++ix) {
112 for (Int_t iy = iy1; iy <= iy2; ++iy) {
113
114 hb->SetBinContent(ix - ix1 + 1, iy - iy1 + 1, ha->GetBinContent(ix, iy));
115
116 if (ha->GetSumw2N()) {
117 hb->SetBinError(ix - ix1 + 1, iy - iy1 + 1, ha->GetBinError(ix, iy));
118 }
119 }
120 }
121
122 listOfObjects.push_back(hb);
123 }
124 }
125 }
126 }
127
128 if (!listOfObjects.empty()) {
129
131
132 for (vector<TObject*>::const_iterator i = listOfObjects.begin(); i != listOfObjects.end(); ++i) {
133 (*i)->Write();
134 }
135
136 out.Write();
137 out.Close();
138 }
139}
#define DEBUG(A)
Message macros.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
#define MAKE_CSTRING(A)
Make C-string.
Utility class to parse command line options.
TDirectory * getDirectory(const JRootObjectID &id)
Get TDirectory pointer.
bool isTObject(const TKey *key)
Check if given key corresponds to a TObject.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Auxiliary data structure for floating point format specification.
Empty structure for specification of parser element that is initialised (i.e. does not require input)...