| 1 | #include <TROOT.h>
 | 
|---|
| 2 | #include <TClass.h>
 | 
|---|
| 3 | #include <TSystem.h>
 | 
|---|
| 4 | #include <TGClient.h>
 | 
|---|
| 5 | #include <TApplication.h>
 | 
|---|
| 6 | #include <TObjectTable.h>
 | 
|---|
| 7 | 
 | 
|---|
| 8 | #include "MLog.h"
 | 
|---|
| 9 | #include "MLogManip.h"
 | 
|---|
| 10 | 
 | 
|---|
| 11 | #include "MEnv.h"
 | 
|---|
| 12 | #include "MArgs.h"
 | 
|---|
| 13 | #include "MArray.h"
 | 
|---|
| 14 | #include "MDirIter.h"
 | 
|---|
| 15 | 
 | 
|---|
| 16 | #include "MStatusDisplay.h"
 | 
|---|
| 17 | 
 | 
|---|
| 18 | #include "MDataSet.h"
 | 
|---|
| 19 | #include "MJSpectrum.h"
 | 
|---|
| 20 | 
 | 
|---|
| 21 | using namespace std;
 | 
|---|
| 22 | 
 | 
|---|
| 23 | static void StartUpMessage()
 | 
|---|
| 24 | {
 | 
|---|
| 25 |     gLog << all << endl;
 | 
|---|
| 26 | 
 | 
|---|
| 27 |     //                1         2         3         4         5
 | 
|---|
| 28 |     //       12345678901234567890123456789012345678901234567890123456
 | 
|---|
| 29 |     gLog << "========================================================" << endl;
 | 
|---|
| 30 |     gLog << "                  Sponde - MARS V" << MARSVER             << endl;
 | 
|---|
| 31 |     gLog << "               MARS -- SPectrum ON DEmand"                << endl;
 | 
|---|
| 32 |     gLog << "   Compiled with ROOT v" << ROOT_RELEASE << " on <" << __DATE__ << ">" << endl;
 | 
|---|
| 33 |     gLog << "========================================================" << endl;
 | 
|---|
| 34 |     gLog << endl;
 | 
|---|
| 35 | }
 | 
|---|
| 36 | 
 | 
|---|
| 37 | static void Usage()
 | 
|---|
| 38 | {
 | 
|---|
| 39 |     //                1         2         3         4         5         6         7         8
 | 
|---|
| 40 |     //       12345678901234567890123456789012345678901234567890123456789012345678901234567890
 | 
|---|
| 41 |     gLog << all << endl;
 | 
|---|
| 42 |     gLog << "Sorry the usage is:" << endl;
 | 
|---|
| 43 |     gLog << " sponde [options] inputfile.root mcdataset.txt [outputfile.root]" << endl << endl;
 | 
|---|
| 44 |     gLog << " Arguments:" << endl;
 | 
|---|
| 45 |     gLog << "   inputfile.root:           Ganymed output [and result] file" << endl;
 | 
|---|
| 46 |     gLog << "   mcdataset.txt:            Dataset describing the Monte Carlos to be used" << endl;
 | 
|---|
| 47 |     gLog << "                             For more details see MDataSet." << endl;
 | 
|---|
| 48 |     gLog << "   outputfile.root:          Optional file in which the result is stored" << endl << endl;
 | 
|---|
| 49 |     gLog << " Root Options:" << endl;
 | 
|---|
| 50 |     gLog << "   -b                        Batch mode (no graphical output to screen)" << endl<<endl;
 | 
|---|
| 51 |     gLog << " Operation Mode:" << endl;
 | 
|---|
| 52 |     gLog << "   --refill                  Refill the excess histogram from result file" << endl;
 | 
|---|
| 53 |     gLog << "                             (usefull to change the binning)" << endl;
 | 
|---|
| 54 |     gLog << "   --accurate                Fill original energy/theta distribution from data" << endl;
 | 
|---|
| 55 |     gLog << "                             (do not weight the histogram)" << endl;
 | 
|---|
| 56 |     gLog << "   --raw-mc                  Use the mc sample as it is" << endl << endl;
 | 
|---|
| 57 |     gLog << " Options:" << endl;
 | 
|---|
| 58 |     gLog.Usage();
 | 
|---|
| 59 |     gLog << "   --debug-env=0             Disable debugging setting resources <default>" << endl;
 | 
|---|
| 60 |     gLog << "   --debug-env[=1]           Display untouched resources after program execution" << endl;
 | 
|---|
| 61 |     gLog << "   --debug-env=2             Display untouched resources after eventloop setup" << endl;
 | 
|---|
| 62 |     gLog << "   --debug-env=3             Debug setting resources from resource file" << endl;
 | 
|---|
| 63 |     gLog << "   --debug-mem               Debug memory usage" << endl << endl;
 | 
|---|
| 64 |     gLog << endl;
 | 
|---|
| 65 |     gLog << "   -q                        Quit when job is finished" << endl;
 | 
|---|
| 66 |     gLog << "   -f                        Force overwrite of existing files" << endl;
 | 
|---|
| 67 |     gLog << "   --print-ds                Print Dataset information" << endl;
 | 
|---|
| 68 |     gLog << "   --print-files             Print Files taken from Sequences ('+' found, '-' missing)" << endl;
 | 
|---|
| 69 |     gLog << "   --config=sponde.rc        Resource file [default=sponde.rc]" << endl;
 | 
|---|
| 70 |     gLog << endl;
 | 
|---|
| 71 |     gLog << "   --version, -V             Show startup message with version number" << endl;
 | 
|---|
| 72 |     gLog << "   -?, -h, --help            This help" << endl << endl;
 | 
|---|
| 73 |     gLog << "Background:" << endl;
 | 
|---|
| 74 |     gLog << " Sponde is a natural satellite of Jupiter. It was discovered by a team"  << endl;
 | 
|---|
| 75 |     gLog << " of astronomers from the University of Hawaii led by Scott S. Sheppard," << endl;
 | 
|---|
| 76 |     gLog << " et al in 2001, and given the temporary designation S/2001 J 5. Sponde"  << endl;
 | 
|---|
| 77 |     gLog << " is about  2 kilometers in diameter,  and orbits Jupiter at an average"  << endl;
 | 
|---|
| 78 |     gLog << " of 23,487,000 kilometers. It is also designated as Jupiter XXXVI."      << endl;
 | 
|---|
| 79 |     gLog << " It is named after one of the Horae (Hours),  which presided  over the"  << endl;
 | 
|---|
| 80 |     gLog << " seventh hour (libations poured after lunch).  The Hours, godesses  of"  << endl;
 | 
|---|
| 81 |     gLog << " the time of day but also of the seasons,  were daughters of  Zeus and"  << endl;
 | 
|---|
| 82 |     gLog << " Themis." << endl;
 | 
|---|
| 83 |     gLog << " It belongs to the Pasipha group, irregular retrograde moons orbiting" << endl;
 | 
|---|
| 84 |     gLog << " Jupiter  at distances ranging between  22.8  and  24.1 Gm,  and  with" << endl;
 | 
|---|
| 85 |     gLog << " inclinations ranging between 144.5ø and 158.3ø." << endl << endl;
 | 
|---|
| 86 | }
 | 
|---|
| 87 | 
 | 
|---|
| 88 | int main(int argc, char **argv)
 | 
|---|
| 89 | {
 | 
|---|
| 90 |     if (!MARS::CheckRootVer())
 | 
|---|
| 91 |         return 0xff;
 | 
|---|
| 92 | 
 | 
|---|
| 93 |     //
 | 
|---|
| 94 |     // Evaluate arguments
 | 
|---|
| 95 |     //
 | 
|---|
| 96 |     MArgs arg(argc, argv, kTRUE);
 | 
|---|
| 97 |     gLog.Setup(arg);
 | 
|---|
| 98 | 
 | 
|---|
| 99 |     StartUpMessage();
 | 
|---|
| 100 | 
 | 
|---|
| 101 |     if (arg.HasOnly("-V") || arg.HasOnly("--version"))
 | 
|---|
| 102 |         return 0;
 | 
|---|
| 103 | 
 | 
|---|
| 104 |     if (arg.HasOnly("-?") || arg.HasOnly("-h") || arg.HasOnly("--help"))
 | 
|---|
| 105 |     {
 | 
|---|
| 106 |         Usage();
 | 
|---|
| 107 |         return 2;
 | 
|---|
| 108 |     }
 | 
|---|
| 109 | 
 | 
|---|
| 110 |     const TString kConfig       =  arg.GetStringAndRemove("--config=", "sponde.rc");
 | 
|---|
| 111 | 
 | 
|---|
| 112 |     const Bool_t  kPrintSeq     =  arg.HasOnlyAndRemove("--print-ds");
 | 
|---|
| 113 |     const Bool_t  kPrintFiles   =  arg.HasOnlyAndRemove("--print-files");
 | 
|---|
| 114 |     const Bool_t  kDebugMem     =  arg.HasOnlyAndRemove("--debug-mem");
 | 
|---|
| 115 |     Int_t  kDebugEnv = arg.HasOnlyAndRemove("--debug-env") ? 1 : 0;
 | 
|---|
| 116 |     kDebugEnv = arg.GetIntAndRemove("--debug-env=", kDebugEnv);
 | 
|---|
| 117 | 
 | 
|---|
| 118 |     const Bool_t  kQuit          =  arg.HasOnlyAndRemove("-q");
 | 
|---|
| 119 |     const Bool_t  kBatch         =  arg.HasOnlyAndRemove("-b");
 | 
|---|
| 120 |     const Bool_t  kOverwrite     =  arg.HasOnlyAndRemove("-f");
 | 
|---|
| 121 | 
 | 
|---|
| 122 |     const Bool_t  kRefill        =  arg.HasOnlyAndRemove("--refill");
 | 
|---|
| 123 |     const Bool_t  kSimple        = !arg.HasOnlyAndRemove("--accurate");
 | 
|---|
| 124 |     const Bool_t  kRawMc         =  arg.HasOnlyAndRemove("--raw-mc");
 | 
|---|
| 125 | 
 | 
|---|
| 126 |     if (arg.GetNumOptions()>0)
 | 
|---|
| 127 |     {
 | 
|---|
| 128 |         gLog << warn << "WARNING - Unknown command line options..." << endl;
 | 
|---|
| 129 |         arg.Print("options");
 | 
|---|
| 130 |         gLog << endl;
 | 
|---|
| 131 |         return 2;
 | 
|---|
| 132 |     }
 | 
|---|
| 133 | 
 | 
|---|
| 134 |     //
 | 
|---|
| 135 |     // check for the right usage of the program
 | 
|---|
| 136 |     //
 | 
|---|
| 137 |     if (arg.GetNumArguments()<2 || arg.GetNumArguments()>3)
 | 
|---|
| 138 |     {
 | 
|---|
| 139 |         Usage();
 | 
|---|
| 140 |         return 2;
 | 
|---|
| 141 |     }
 | 
|---|
| 142 | 
 | 
|---|
| 143 |     //
 | 
|---|
| 144 |     // Setup sequence file and check for its existence
 | 
|---|
| 145 |     //
 | 
|---|
| 146 |     const TString kInfile  = arg.GetArgumentStr(0);
 | 
|---|
| 147 |     const TString kDataset = arg.GetArgumentStr(1);
 | 
|---|
| 148 |     const TString kOutfile = arg.GetArgumentStr(2);
 | 
|---|
| 149 | 
 | 
|---|
| 150 |     if (gSystem->AccessPathName(kInfile, kFileExists))
 | 
|---|
| 151 |     {
 | 
|---|
| 152 |         gLog << err << "Sorry, sequences file '" << kInfile << "' doesn't exist." << endl;
 | 
|---|
| 153 |         return 2;
 | 
|---|
| 154 |     }
 | 
|---|
| 155 |     if (gSystem->AccessPathName(kDataset, kFileExists))
 | 
|---|
| 156 |     {
 | 
|---|
| 157 |         gLog << err << "Sorry, dataset file '" << kDataset << "' doesn't exist." << endl;
 | 
|---|
| 158 |         return 2;
 | 
|---|
| 159 |     }
 | 
|---|
| 160 | 
 | 
|---|
| 161 |     if (kDebugMem)
 | 
|---|
| 162 |         TObject::SetObjectStat(kTRUE);
 | 
|---|
| 163 | 
 | 
|---|
| 164 |     //
 | 
|---|
| 165 |     // Setup sequence and check its validity
 | 
|---|
| 166 |     //
 | 
|---|
| 167 |     MDataSet seq(kDataset);
 | 
|---|
| 168 |     if (kPrintSeq || kPrintFiles)
 | 
|---|
| 169 |     {
 | 
|---|
| 170 |         gLog << all;
 | 
|---|
| 171 |         gLog.Separator(kDataset);
 | 
|---|
| 172 |         seq.Print(kPrintFiles?"files":"");
 | 
|---|
| 173 |         gLog << endl;
 | 
|---|
| 174 |     }
 | 
|---|
| 175 |     if (!seq.IsValid())
 | 
|---|
| 176 |     {
 | 
|---|
| 177 |         gLog << err << "Dataset read but not valid (maybe analysis number not set)!" << endl << endl;
 | 
|---|
| 178 |         return 2;
 | 
|---|
| 179 |     }
 | 
|---|
| 180 | 
 | 
|---|
| 181 |     if (!seq.IsMonteCarlo())
 | 
|---|
| 182 |         gLog << warn << "Dataset file seems not to be a Monte Carlo dataset." << endl << endl;
 | 
|---|
| 183 | 
 | 
|---|
| 184 | 
 | 
|---|
| 185 |     //
 | 
|---|
| 186 |     // Initialize root
 | 
|---|
| 187 |     //
 | 
|---|
| 188 |     MArray::Class()->IgnoreTObjectStreamer();
 | 
|---|
| 189 |     MParContainer::Class()->IgnoreTObjectStreamer();
 | 
|---|
| 190 | 
 | 
|---|
| 191 |     TApplication app("sponde", &argc, argv);
 | 
|---|
| 192 |     if (!gROOT->IsBatch() && !gClient || gROOT->IsBatch() && !kBatch)
 | 
|---|
| 193 |     {
 | 
|---|
| 194 |         gLog << err << "Bombing... maybe your DISPLAY variable is not set correctly!" << endl;
 | 
|---|
| 195 |         return 1;
 | 
|---|
| 196 |     }
 | 
|---|
| 197 | 
 | 
|---|
| 198 |     //
 | 
|---|
| 199 |     // Update frequency by default = 1Hz
 | 
|---|
| 200 |     //
 | 
|---|
| 201 |     MStatusDisplay *d = new MStatusDisplay;
 | 
|---|
| 202 | 
 | 
|---|
| 203 |     // From now on each 'Exit' means: Terminate the application
 | 
|---|
| 204 |     d->SetBit(MStatusDisplay::kExitLoopOnExit);
 | 
|---|
| 205 |     d->SetTitle(kDataset);
 | 
|---|
| 206 | 
 | 
|---|
| 207 |     //
 | 
|---|
| 208 |     // Calculate pedestal for pedestal-calculation and calibration
 | 
|---|
| 209 |     //
 | 
|---|
| 210 |     MEnv env(kConfig);
 | 
|---|
| 211 | 
 | 
|---|
| 212 |     MJSpectrum job(Form("MJSpectrum #%d", seq.GetNumAnalysis()));
 | 
|---|
| 213 |     job.SetEnv(&env);
 | 
|---|
| 214 |     job.SetEnvDebug(kDebugEnv);
 | 
|---|
| 215 |     job.SetDisplay(d);;
 | 
|---|
| 216 |     job.SetOverwrite(kOverwrite);
 | 
|---|
| 217 |     job.SetPathOut(kOutfile);
 | 
|---|
| 218 |     job.SetPathIn(kInfile);
 | 
|---|
| 219 | 
 | 
|---|
| 220 |     job.EnableRefilling(kRefill);
 | 
|---|
| 221 |     job.EnableSimpleMode(kSimple);
 | 
|---|
| 222 |     job.EnableRawMc(kRawMc);
 | 
|---|
| 223 | 
 | 
|---|
| 224 |     if (!job.Process(seq))
 | 
|---|
| 225 |     {
 | 
|---|
| 226 |         gLog << err << "Calculation of spectrum failed." << endl << endl;
 | 
|---|
| 227 |         return 2;
 | 
|---|
| 228 |     }
 | 
|---|
| 229 |     if (kDebugEnv>0)
 | 
|---|
| 230 |         env.PrintUntouched();
 | 
|---|
| 231 | 
 | 
|---|
| 232 |     if (!job.GetDisplay())
 | 
|---|
| 233 |     {
 | 
|---|
| 234 |         gLog << warn << "Display closed by user... execution aborted." << endl << endl;
 | 
|---|
| 235 |         return 1;
 | 
|---|
| 236 |     }
 | 
|---|
| 237 | 
 | 
|---|
| 238 |     if (kBatch || kQuit)
 | 
|---|
| 239 |         delete d;
 | 
|---|
| 240 |     else
 | 
|---|
| 241 |     {
 | 
|---|
| 242 |         // From now on each 'Close' means: Terminate the application
 | 
|---|
| 243 |         d->SetBit(MStatusDisplay::kExitLoopOnClose);
 | 
|---|
| 244 | 
 | 
|---|
| 245 |         // Wait until the user decides to exit the application
 | 
|---|
| 246 |         app.Run(kFALSE);
 | 
|---|
| 247 |     }
 | 
|---|
| 248 | 
 | 
|---|
| 249 |     if (TObject::GetObjectStat())
 | 
|---|
| 250 |     {
 | 
|---|
| 251 |         TObject::SetObjectStat(kFALSE);
 | 
|---|
| 252 |         gObjectTable->Print();
 | 
|---|
| 253 |     }
 | 
|---|
| 254 | 
 | 
|---|
| 255 |     return 0;
 | 
|---|
| 256 | }
 | 
|---|