| 1 | #include "Configuration.h"
|
|---|
| 2 |
|
|---|
| 3 | #include "factfits.h"
|
|---|
| 4 | #include "factofits.h"
|
|---|
| 5 |
|
|---|
| 6 | using namespace std;
|
|---|
| 7 |
|
|---|
| 8 | void PrintUsage()
|
|---|
| 9 | {
|
|---|
| 10 | cout <<
|
|---|
| 11 | "fitsselect is....\n"
|
|---|
| 12 | "\n"
|
|---|
| 13 | "Usage: fitsselect rawfile eventlist outfile\n"
|
|---|
| 14 | "\n"
|
|---|
| 15 | ;
|
|---|
| 16 | cout << endl;
|
|---|
| 17 | }
|
|---|
| 18 |
|
|---|
| 19 | void SetupConfiguration(Configuration& conf)
|
|---|
| 20 | {
|
|---|
| 21 | po::options_description configs("Fitsdump options");
|
|---|
| 22 | configs.add_options()
|
|---|
| 23 | ("infile", var<string>()->required(), "")
|
|---|
| 24 | ("outfile", var<string>()->required(), "")
|
|---|
| 25 | ("eventlist", var<string>()->required(), "")
|
|---|
| 26 | ;
|
|---|
| 27 |
|
|---|
| 28 | po::positional_options_description p;
|
|---|
| 29 | p.add("infile", 1); // The first positional options
|
|---|
| 30 | p.add("eventlist", 1); // The second positional options
|
|---|
| 31 | p.add("outfile", -1); // All others
|
|---|
| 32 |
|
|---|
| 33 | conf.AddOptions(configs);
|
|---|
| 34 | conf.SetArgumentPositions(p);
|
|---|
| 35 | }
|
|---|
| 36 |
|
|---|
| 37 | int main(int argc, const char** argv)
|
|---|
| 38 | {
|
|---|
| 39 | Configuration conf(argv[0]);
|
|---|
| 40 | conf.SetPrintUsage(PrintUsage);
|
|---|
| 41 | SetupConfiguration(conf);
|
|---|
| 42 |
|
|---|
| 43 | if (!conf.DoParse(argc, argv))//, PrintHelp))
|
|---|
| 44 | return -1;
|
|---|
| 45 |
|
|---|
| 46 | const string infile = conf.Get<string>("infile");
|
|---|
| 47 |
|
|---|
| 48 | const string outfile = conf.Get<string>("outfile");
|
|---|
| 49 | const string eventlist = conf.Get<string>("eventlist");
|
|---|
| 50 |
|
|---|
| 51 | set<uint32_t> list;
|
|---|
| 52 | ifstream fin(eventlist.c_str());
|
|---|
| 53 | while (1)
|
|---|
| 54 | {
|
|---|
| 55 | uint32_t evt;
|
|---|
| 56 | fin >> evt;
|
|---|
| 57 | if (!fin)
|
|---|
| 58 | break;
|
|---|
| 59 |
|
|---|
| 60 | list.insert(evt);
|
|---|
| 61 | }
|
|---|
| 62 |
|
|---|
| 63 | factfits inf(infile.c_str(), "Events", false);
|
|---|
| 64 | factofits outf(outfile.c_str());
|
|---|
| 65 |
|
|---|
| 66 | outf.SetDrsCalibration(inf.GetOffsetCalibration());
|
|---|
| 67 |
|
|---|
| 68 | uint32_t rowWidth = inf.HasKey("ZNAXIS1") ? inf.GetUInt("ZNAXIS1") : inf.GetUInt("ZNAXIS2");
|
|---|
| 69 |
|
|---|
| 70 | vector<char> buffer(rowWidth);
|
|---|
| 71 |
|
|---|
| 72 | outf.CopyKeys(inf);
|
|---|
| 73 |
|
|---|
| 74 | vector<pair<void*, char*>> pointers;
|
|---|
| 75 |
|
|---|
| 76 | unsigned int count = 0;
|
|---|
| 77 |
|
|---|
| 78 | uint32_t *evtNum = 0;
|
|---|
| 79 |
|
|---|
| 80 | const fits::Table::Columns& columns = inf.GetColumns();
|
|---|
| 81 | for (fits::Table::Columns::const_iterator it=columns.begin(); it!=columns.end(); it++)
|
|---|
| 82 | {
|
|---|
| 83 | const fits::Table::Column &col = it->second;
|
|---|
| 84 |
|
|---|
| 85 | if (it->first=="Data" || it->first=="TimeMarker")
|
|---|
| 86 | {
|
|---|
| 87 | vector<uint16_t> processing(2);
|
|---|
| 88 | processing[0] = FITS::kFactSmoothing;
|
|---|
| 89 | processing[1] = FITS::kFactHuffman16;
|
|---|
| 90 |
|
|---|
| 91 | const FITS::Compression comp(processing, FITS::kOrderByRow);
|
|---|
| 92 |
|
|---|
| 93 | outf.AddColumn(comp, col.num, col.type, it->first, col.unit, "");
|
|---|
| 94 | }
|
|---|
| 95 | else
|
|---|
| 96 | outf.AddColumn(col.num, col.type, it->first, col.unit, "");
|
|---|
| 97 |
|
|---|
| 98 | void *ptr = inf.SetPtrAddress(it->first);
|
|---|
| 99 | pointers.emplace_back(ptr, buffer.data()+count);
|
|---|
| 100 | count += col.num*col.size;
|
|---|
| 101 |
|
|---|
| 102 | if (it->first=="EventNum")
|
|---|
| 103 | evtNum = reinterpret_cast<uint32_t*>(ptr);
|
|---|
| 104 | }
|
|---|
| 105 |
|
|---|
| 106 | if (evtNum==0)
|
|---|
| 107 | throw runtime_error("Colum EventNum not found.");
|
|---|
| 108 |
|
|---|
| 109 | if (count!=rowWidth)
|
|---|
| 110 | throw runtime_error("Size mismatch.");
|
|---|
| 111 |
|
|---|
| 112 | inf.PrintColumns();
|
|---|
| 113 |
|
|---|
| 114 | outf.WriteTableHeader(inf.GetStr("EXTNAME").c_str());
|
|---|
| 115 |
|
|---|
| 116 | while (inf.GetNextRow())
|
|---|
| 117 | {
|
|---|
| 118 | if (list.find(*evtNum)==list.end())
|
|---|
| 119 | continue;
|
|---|
| 120 |
|
|---|
| 121 | int i=0;
|
|---|
| 122 | for (fits::Table::Columns::const_iterator it=columns.begin(); it!= columns.end(); it++, i++)
|
|---|
| 123 | memcpy(pointers[i].second, pointers[i].first, it->second.num*it->second.size);
|
|---|
| 124 |
|
|---|
| 125 | outf.WriteRow(buffer.data(), rowWidth);
|
|---|
| 126 | if (!outf)
|
|---|
| 127 | throw runtime_error("Write stream failure.");
|
|---|
| 128 | }
|
|---|
| 129 |
|
|---|
| 130 | if (!inf.good())
|
|---|
| 131 | throw runtime_error("Read stream failure.");
|
|---|
| 132 |
|
|---|
| 133 | if (!outf.close())
|
|---|
| 134 | throw runtime_error("Write stream failure.");
|
|---|
| 135 |
|
|---|
| 136 | return 0;
|
|---|
| 137 | }
|
|---|