1 #ifndef __JGIZMOTOOLKIT__ 
    2 #define __JGIZMOTOOLKIT__ 
   17 #include "TGraphErrors.h" 
   19 #include "TMultiGraph.h" 
   25 #include "TIterator.h" 
   27 #include "TMethodCall.h" 
   42 namespace JPP { 
using namespace JGIZMO; }
 
   67     static const char* 
const Add()        { 
return "Add"; }        
 
   68     static const char* 
const add()        { 
return "add"; }        
 
   69     static const char* 
const Subtract()   { 
return "Subtract"; }   
 
   70     static const char* 
const subtract()   { 
return "subtract"; }   
 
   71     static const char* 
const Multiply()   { 
return "Multiply"; }   
 
   72     static const char* 
const multiply()   { 
return "multiply"; }   
 
   73     static const char* 
const Divide()     { 
return "Divide"; }     
 
   74     static const char* 
const divide()     { 
return "divide"; }     
 
   75     static const char* 
const efficiency() { 
return "efficiency"; } 
 
   76     static const char* 
const stdev()      { 
return "stdev"; }      
 
   77     static const char* 
const sqrt()       { 
return "sqrt"; }       
 
   78     static const char* 
const Replace()    { 
return "Replace"; }    
 
   85   static const char* 
const TIMESTAMP = 
"#splitline{}{#splitline{%d:%m:%y}{  %H:%M}}%F1970-01-01 00:00:00";
 
   98   inline TFile* 
getFile(
const std::string& file_name, 
const std::string& option = 
"exist")
 
  102     gErrorIgnoreLevel = kError;
 
  108     if (i == zmap.end() || i->second == NULL || !i->second->IsOpen()) {
 
  110       TFile* 
file = TFile::Open(file_name.c_str(), option.c_str());
 
  112       zmap[file_name] = 
file;
 
  135     if (in == NULL || !in->IsOpen()) {
 
  140       return in->GetDirectory(
id.getDirectory());
 
  158       const TRegexp regexp(
id.getObjectName());
 
  160       TIter iter(dir->GetListOfKeys());
 
  162       for (TKey* key; (key = (TKey*) iter.Next()) != NULL; ) {
 
  164         const TString tag(key->GetName());
 
  168         if (tag.Index(regexp) != -1) {
 
  169           return key->ReadObj();
 
  187       const TH1* 
h1 = 
dynamic_cast<const TH1*
>(object);
 
  191         if (h1->GetSumw2N()) {
 
  192           for (Int_t i = 1; i <= h1->GetNbinsX(); ++i) {
 
  193             if (h1->GetBinError(i) != 0.0) {
 
  201       const TGraphErrors* 
g1 = 
dynamic_cast<const TGraphErrors*
>(object);
 
  205         for (Int_t i = 0; i != g1->GetN(); ++i) {
 
  206           if (g1->GetEY()[i] != 0.0) {
 
  211         return g1->GetN() > 1;
 
  215       const TGraph* 
g1 = 
dynamic_cast<const TGraph*
>(object);
 
  218         return g1->GetN() > 1;
 
  242     TString buffer(text);
 
  244     if (
object != NULL) {
 
  246       TClass* p = TClass::GetClass(object->ClassName());
 
  252           TIterator* iter   = p->GetListOfAllPublicMethods()->MakeIterator();
 
  253           TMethod*   method = NULL;
 
  255           for (TMethod* p; (p = (TMethod*) iter->Next()) != NULL; ) {
 
  256             if (buffer.Index(p->GetName()) != -1) {
 
  257               if (method == NULL || strlen(p->GetName()) > strlen(method->GetName())) {
 
  263           if (method == NULL) {
 
  267           for (Ssiz_t index; (index = buffer.Index(method->GetName())) != -1; ) {
 
  269             const TRegexp fp(
" *([^)]*)");   
 
  272             Ssiz_t pos = buffer.Index(fp, &len, index);
 
  276             if (pos == -1 || pos != index + (Ssiz_t) strlen(method->GetName())) {
 
  278               TMethodCall(p, method->GetName(), NULL).Execute(
object, value);
 
  280               len  = strlen(method->GetName());
 
  284               TMethodCall(p, method->GetName(), NULL).Execute(
object, TString(buffer(pos + 1, len - 2)), value);
 
  286               len += strlen(method->GetName());
 
  289             buffer.Replace(index, len, TString::Format(
"%15.5e", value));
 
  295     return TFormula(
"/tmp", buffer.Data()).Eval(0.0);
 
  315     return getResult(TString(text.c_str()), 
object);
 
  329     const char* regexp(
"p[0-9]* *=");
 
  331     TString buffer(text.c_str());
 
  333     buffer = buffer(TRegexp(regexp));
 
  334     buffer = buffer(1, buffer.Length() - 2);
 
  336     if (!buffer.IsDigit()) {
 
  340     return buffer.Atoi();
 
  360     const char* regexp(
"=.*");
 
  362     TString buffer(text.c_str());
 
  364     buffer = buffer(TRegexp(regexp));
 
  365     buffer = buffer(1, buffer.Length() - 1);
 
  367     return getResult(std::string(buffer), 
object);
 
  390     const char* regexp(
"=.*");
 
  392     TString buffer(text.c_str());
 
  394     buffer = buffer(TRegexp(regexp));
 
  395     buffer = buffer(1, buffer.Length() - 1);
 
  398     istringstream 
is((std::string(buffer)));
 
  402     for (
int i = index; is >> value && i > 0; --i) {}
 
  407       THROW(
JParseError, 
"Text des not contain a number at given position " << buffer << 
' ' << index);
 
  420       const Int_t    
first = axis->GetFirst();
 
  421       const Int_t    last  = axis->GetLast();
 
  423       const Double_t xmin  = axis->GetBinLowEdge(first);
 
  424       const Double_t xmax  = axis->GetBinLowEdge(last)  +  axis->GetBinWidth(last);
 
  426       const Int_t 
N = axis->GetNbins();
 
  427       Double_t    buffer[N+1];
 
  429       buffer[0] = TMath::Power(10.0, axis->GetBinLowEdge(1));
 
  431       for (Int_t i = 1; i <= 
N; ++i) {
 
  432         buffer[i] = TMath::Power(10.0, axis->GetBinLowEdge(i) + axis->GetBinWidth(i));
 
  435       axis->Set(N, buffer);
 
  437       if (axis->TestBit(TAxis::kAxisRange)) {
 
  438         axis->SetRangeUser(TMath::Power(10.0, xmin), TMath::Power(10.0, xmax));
 
  453     const TRegexp regexp[] = {
 
  454       TString(
"^")          + TString(parameter) + TString(
"[^a-zA-Z_]"),   
 
  455       TString(
"[^a-zA-Z_]") + TString(parameter) + TString(
"[^a-zA-Z_]"),   
 
  456       TString(
"[^a-zA-Z_]") + TString(parameter) + TString(
"$")             
 
  459     const TString replacement = TString(
"log10(") + TString(parameter) + TString(
")");
 
  461     TString buffer(formula);
 
  463     if (buffer.Length() == 1 && buffer[0] == parameter) {
 
  465       buffer = replacement;
 
  469       for (Ssiz_t pos = 0, i; pos < buffer.Length(); pos += replacement.Length()) {
 
  470         if      ((i = buffer.Index(regexp[0], pos)) != -1) { buffer.Replace((pos = i + 0), 1, replacement); }
 
  471         else if ((i = buffer.Index(regexp[1], pos)) != -1) { buffer.Replace((pos = i + 1), 1, replacement); }
 
  472         else if ((i = buffer.Index(regexp[2], pos)) != -1) { buffer.Replace((pos = i + 1), 1, replacement); }
 
  486   inline void copy(
const TF1& from, TF1& to)
 
  488     static_cast<TAttLine&
>  (to) = static_cast<const TAttLine&>  (from);
 
  489     static_cast<TAttFill&
>  (to) = static_cast<const TAttFill&>  (from);
 
  490     static_cast<TAttMarker&
>(to) = static_cast<const TAttMarker&>(from);
 
  492     to.SetParameters(from.GetParameters());
 
  494     to.SetNpx(from.GetNpx());
 
  504   inline void copy(
const TF2& from, TF2& to)
 
  506     copy(static_cast<const TF1&>(from), static_cast<TF1&>(to));
 
  508     to.SetNpy(from.GetNpy());
 
  525       fn.SetRange(f1->GetXmin(),
 
  530       f1->SetRange(TMath::Power(10.0,f1->GetXmin()),
 
  531                    TMath::Power(10.0,f1->GetXmax()));
 
  549       fn.SetRange(f2->GetXmin(),
 
  556       f2->SetRange(TMath::Power(10.0,f2->GetXmin()),
 
  558                    TMath::Power(10.0,f2->GetXmax()),
 
  577       fn.SetRange(f2->GetXmin(),
 
  584       f2->SetRange(f2->GetXmin(),
 
  585                    TMath::Power(10.0,f2->GetYmin()),
 
  587                    TMath::Power(10.0,f2->GetYmax()));
 
  601       for (TIter iter(h1->GetListOfFunctions()); TF1* f1 = 
dynamic_cast<TF1*
>(iter.Next()); ) {
 
  621       for (TIter iter(h2->GetListOfFunctions()); TF2* f2 = 
dynamic_cast<TF2*
>(iter.Next()); ) {
 
  639       for (TIter iter(h2->GetListOfFunctions()); TF2* f2 = 
dynamic_cast<TF2*
>(iter.Next()); ) {
 
  657       for (TIter iter(g1->GetListOfFunctions()); TF1* f1 = 
dynamic_cast<TF1*
>(iter.Next()); ) {
 
  661       for (Int_t i = 0; i != g1->GetN(); ++i) {
 
  662         g1->GetX()[i] = 
pow(10.0, g1->GetX()[i]);
 
  677       for (TIter iter(g2->GetListOfFunctions()); TF2* f2 = 
dynamic_cast<TF2*
>(iter.Next()); ) {
 
  681       for (Int_t i = 0; i != g2->GetN(); ++i) {
 
  682         g2->GetX()[i] = 
pow(10.0, g2->GetX()[i]);
 
  697       for (TIter iter(g2->GetListOfFunctions()); TF2* f2 = 
dynamic_cast<TF2*
>(iter.Next()); ) {
 
  701       for (Int_t i = 0; i != g2->GetN(); ++i) {
 
  702         g2->GetY()[i] = 
pow(10.0, g2->GetY()[i]);
 
  717       for (TIter i1(m1->GetListOfGraphs()); TGraph* 
g1 = 
dynamic_cast<TGraph*
>(i1()); ) {
 
  736   inline void convertToPDF(TH1& 
h1, 
const std::string& option = 
"NW", 
const double factor = 1.0)
 
  740     const bool normalise = (option.find(
'N') != string::npos || option.find(
'n') != string::npos);
 
  741     const bool bin_width = (option.find(
'W') != string::npos || option.find(
'w') != string::npos);
 
  742     const bool use_error = (option.find(
'E') != string::npos || option.find(
'e') != string::npos);
 
  750       for (Int_t i = 1; i <= h1.GetXaxis()->GetNbins(); ++i) {
 
  751         W += h1.GetBinContent(i);
 
  757       for (Int_t i = 1; i <= h1.GetXaxis()->GetNbins(); ++i) {
 
  759         const Double_t 
w = W * (bin_width ? h1.GetXaxis()->GetBinWidth(i) : 1.0);
 
  761         h1.SetBinContent(i, h1.GetBinContent(i) * factor / 
w);
 
  764           h1.SetBinError(i, h1.GetBinError(i) * factor / 
w);
 
  785   inline void convertToPDF(TH2& h2, 
const std::string& option = 
"NXYW", 
const double factor = 1.0)
 
  789     const bool normalise = (option.find(
'N') != string::npos || option.find(
'n') != string::npos);
 
  790     const bool X         = (option.find(
'X') != string::npos || option.find(
'x') != string::npos);
 
  791     const bool Y         = (option.find(
'Y') != string::npos || option.find(
'y') != string::npos);
 
  792     const bool bin_width = (option.find(
'W') != string::npos || option.find(
'w') != string::npos);
 
  793     const bool use_error = (option.find(
'E') != string::npos || option.find(
'e') != string::npos);
 
  803         for (Int_t ix = 1; ix <= h2.GetXaxis()->GetNbins(); ++ix) {
 
  804           for (Int_t iy = 1; iy <= h2.GetYaxis()->GetNbins(); ++iy) {
 
  805             W += h2.GetBinContent(ix,iy);
 
  812         for (Int_t ix = 1; ix <= h2.GetXaxis()->GetNbins(); ++ix) {
 
  813           for (Int_t iy = 1; iy <= h2.GetYaxis()->GetNbins(); ++iy) {
 
  815             const Double_t 
w = W * (bin_width ? h2.GetXaxis()->GetBinWidth(ix) * h2.GetYaxis()->GetBinWidth(iy) : 1.0);
 
  817             h2.SetBinContent(ix, iy, h2.GetBinContent(ix,iy) * factor / 
w);
 
  820               h2.SetBinError(ix, iy, h2.GetBinError(ix,iy) * factor / 
w);
 
  828       for (Int_t iy = 1; iy <= h2.GetYaxis()->GetNbins(); ++iy) {
 
  834           for (Int_t ix = 1; ix <= h2.GetXaxis()->GetNbins(); ++ix) {
 
  835             W += h2.GetBinContent(ix,iy);
 
  841           for (Int_t ix = 1; ix <= h2.GetXaxis()->GetNbins(); ++ix) {
 
  843             const Double_t 
w = W * (bin_width ? h2.GetXaxis()->GetBinWidth(ix) : 1.0);
 
  845             h2.SetBinContent(ix, iy, h2.GetBinContent(ix,iy) * factor / 
w);
 
  848               h2.SetBinError(ix, iy, h2.GetBinError(ix,iy) * factor / 
w);
 
  856       for (Int_t ix = 1; ix <= h2.GetXaxis()->GetNbins(); ++ix) {
 
  862           for (Int_t iy = 1; iy <= h2.GetYaxis()->GetNbins(); ++iy) {
 
  863             W += h2.GetBinContent(ix,iy);
 
  869           for (Int_t iy = 1; iy <= h2.GetYaxis()->GetNbins(); ++iy) {
 
  871             const Double_t 
w = W * (bin_width ? h2.GetYaxis()->GetBinWidth(iy) : 1.0);
 
  873             h2.SetBinContent(ix, iy, h2.GetBinContent(ix,iy) / 
w);
 
  876               h2.SetBinError(ix, iy, h2.GetBinError(ix,iy) / 
w);
 
  894     Double_t ymin = numeric_limits<Double_t>::max();
 
  895     Double_t ymax = numeric_limits<Double_t>::lowest();
 
  897     for (Int_t i = 0; i != g1.GetN(); ++i) {
 
  899       const Double_t y = g1.GetY()[i];
 
  901       if (y > ymax) { ymax = y; }
 
  902       if (y < ymin) { ymin = y; }
 
  919     Double_t zmin = numeric_limits<Double_t>::max();
 
  920     Double_t zmax = numeric_limits<Double_t>::lowest();
 
  922     for (Int_t i = 0; i != g2.GetN(); ++i) {
 
  924       const Double_t z = g2.GetZ()[i];
 
  926       if (z > zmax) { zmax = z; }
 
  927       if (z < zmin) { zmin = z; }
 
  951     double dx = (xmax - xmin) * 0.1;
 
  953     if (xmin > dx || xmin < 0.0)
 
  985     if (axis->GetNbins() == (int) memo.size()) {
 
  987       for (
int i = 0; i != axis->GetNbins(); ++i) {
 
  989         const JPMTPhysicalAddress& address = memo[i];
 
  991         axis->SetBinLabel(i + 1, address.toString().c_str());
 
 1014     using namespace JPP;
 
 1018     if      (axis == 
"x" || axis == 
"X") 
 
 1019       pax = h1.GetXaxis();
 
 1020     else if (axis == 
"y" || axis == 
"Y") 
 
 1021       pax = h1.GetYaxis();
 
 1022     else if (axis == 
"z" || axis == 
"Z") 
 
 1023       pax = h1.GetZaxis();
 
 1027     if (pax->GetNbins() == (int) memo.size()) {
 
 1029       for (
int i = 0; i != pax->GetNbins(); ++i) {
 
 1033         pax->SetBinLabel(i + 1, address.toString().c_str());
 
 1036       h1.LabelsOption(
"a", axis.c_str());       
 
static const char *const sqrt()
Set contents to signed difference between squares. 
 
TObject * getObject(const JRootObjectID &id)
Get first TObject with given identifier. 
 
double getValue(const JScale_t scale)
Get numerical value corresponding to scale. 
 
int getParameter(const std::string &text)
Get parameter number from text string. 
 
static const char *const Divide()
ROOT TH1::Divide. 
 
static const char *const Subtract()
ROOT TH1::Subtract. 
 
static const char *const SAME_AS_INPUT()
Set name of output histogram to name of input histogram. 
 
void setLogarithmicX(TF1 *f1)
Make parameter x of function logarithmic (e.g. after filling with log10()). 
 
#define THROW(JException_t, A)
Marco for throwing exception with std::ostream compatible message. 
 
static const char *const Replace()
Set contents to associated function. 
 
void setLimits(TGraph &g1)
Set limits of TGraph. 
 
static const char *const subtract()
Subtract contents with lookup bin in second histogram. 
 
then for HISTOGRAM in h0 h1
 
Auxiliary class to handle file name, ROOT directory and object name. 
 
then usage $script< string identifier >< detectorfile > input file(toashort file)+" "\nNote that the input files and toashort files should be one-to-one related." fi if (( $
 
then fatal Wrong number of arguments fi set_variable STRING $argv[1] set_variable DETECTORXY_TXT $WORKDIR $DETECTORXY_TXT tail read X Y CHI2 RMS printf optimum n $X $Y $CHI2 $RMS awk v Y
 
static const char *const stdev()
Set contents to standard deviation. 
 
then fatal Wrong number of arguments fi set_variable DETECTOR $argv[1] set_variable STRING $argv[2] set_array QUANTILES set_variable FORMULA *[0] exp(-0.5 *(x-[1])*(x-[1])/([2]*[2]))" set_variable MODULE `getModule -a $DETECTOR -L "$STRING 0"` typeset -Z 4 STRING JOpera1D -f hydrophone.root
 
then echo The file $DIR KM3NeT_00000001_00000000 root already please rename or remove it first
 
void setLogarithmic(TAxis *axis)
Make histogram axis logarithmic (e.g. after filling with log10()). 
 
bool isTAttLine(const TObject *object)
Get drawing option of TH1. 
 
static const char *const efficiency()
Divide contents and multiply errors with inefficiency. 
 
static const char *const Add()
ROOT TH1::Add. 
 
Lookup table for PMT addresses in optical module. 
 
static const char *const multiply()
Multiply contents with lookup bin in second histogram. 
 
TFile * getFile(const std::string &file_name, const std::string &option="exist")
Get TFile pointer corresponding to give file name. 
 
static const char *const add()
Add contents with lookup bin in second histogram. 
 
Auxiliary data structure for JOpera1D.cc and JOpera2D.cc applications. 
 
Double_t getResult(const TString &text, TObject *object=NULL)
Get result of given textual formula. 
 
void convertToPDF(TH1 &h1, const std::string &option="NW", const double factor=1.0)
Convert 1D histogram to PDF. 
 
void setAxisLabels(TAxis *axis, const JModuleAddressMap &memo)
Set axis with PMT address labels. 
 
T pow(const T &x, const double y)
Power . 
 
then break fi done getCenter read X Y Z let X
 
static const char *const Multiply()
ROOT TH1::Multiply. 
 
static const char *const SAME_AS_OPERATION()
Set name of output histogram to name of operation. 
 
void setRange(double &xmin, double &xmax, const bool logx)
Set axis range. 
 
const JPMTAddressTranslator & getAddressTranslator(const int tdc) const 
Get PMT address translator. 
 
static const char *const divide()
Divide contents with lookup bin in second histogram. 
 
void copy(const Head &from, JHead &to)
Copy header from from to to. 
 
Exception for parsing value. 
 
TDirectory * getDirectory(const JRootObjectID &id)
Get TDirectory pointer. 
 
std::string getFilename(const std::string &file_name)
Get file name part, i.e. part after last JEEP::PATHNAME_SEPARATOR if any. 
 
void setLogarithmicY(TF2 *f2)
Make parameter y of function logarithmic (e.g. after filling with log10()). 
 
Exception for accessing a value in a collection that is outside of its range. 
 
TString getLogarithmic(const TString &formula, const char parameter)
Make given parameter in formula logarithmic (e.g. after filling with log10()). 
 
then fatal Wrong number of arguments fi set_variable DETECTOR $argv[1] set_variable INPUT_FILE $argv[2] eval JPrintDetector a $DETECTOR O IDENTIFIER eval JPrintDetector a $DETECTOR O SUMMARY source JAcoustics sh $DETECTOR_ID CHECK_EXIT_CODE typeset A TRIPODS get_tripods $WORKDIR tripod txt TRIPODS for EMITTER in
 
static const char *const TIMESTAMP
Time stamp of earliest UTC time. 
 
then usage $script[input file[working directory[option]]] nWhere option can be N
 
Double_t g1(const Double_t x)
Function.