diff --git a/src/any2many.cpp b/src/any2many.cpp index 1e6435a9..d1c27fd9 100644 --- a/src/any2many.cpp +++ b/src/any2many.cpp @@ -52,47 +52,69 @@ void any2many_syntax() { cout << endl << "usage: any2many [--help] : will show this help."; cout << endl << " any2many --version : will show the svn version."; - cout << endl << " any2many -I | -i -c [-p ] [-o ] [-y ]"; - cout << endl << " [-t ] [-s] [-rebin ]"; - cout << endl << " : a single file name, e.g. 2010/lem10_his_0111.root, but not starting with a '-'"; - cout << endl << " : a list of run numbers separated by ' ' of the form: etc."; - cout << endl << " or a sequence of runs -, e.g. 111-222"; - cout << endl << " : "; - cout << endl << " : input data file format. Supported formats are:"; - cout << endl << " PSI-BIN, ROOT (LEM), MUD, NeXuS, PSI-MDU, WKM"; - cout << endl << " : ouput data file format. Supported formats are:"; - cout << endl << " PSI-BIN, ROOT (LEM), MUD, NeXuS, MDU, WKM, ASCII"; - cout << endl << " : output path for the converted files. If nothing is given, the current directory will be used,"; - cout << endl << " unless the option '-s' is used."; - cout << endl << " : single output file name. If is a list of runs, this option"; - cout << endl << " should be omitted since the file names are generated according to the"; - cout << endl << " run number and the file format, e.g. 111 -> lemyy_his_0111.root, where yy is"; - cout << endl << " the current year."; - cout << endl << " : if the option -y is used, here a year in the form 'yy' can be given, if this"; - cout << endl << " is the case, any automatic file name generation needs a year, this number will"; - cout << endl << " be used."; - cout << endl << " "; - cout << endl << " : template file name. Needed for run-lists in order to generate the proper file names."; - cout << endl << " The following template tags can be used: [yy] for year, and [rrrr] for the run number."; - cout << endl << " If the run number tag is used, the number of 'r' will give the number of digits used"; - cout << endl << " with leading zeros, e.g. [rrrrrr] and run numbe 123 will result in 000123."; - cout << endl << " The same is true for the year, i.e. [yyyy] will result in something like 1999."; - cout << endl << " -s : with this option the output data file will be sent to the standard output."; - cout << endl << " : number of bins to be packed"; + cout << endl << " any2many -I | -i -c "; + cout << endl << " [-p ] [-o ] [-y ]"; + cout << endl << " [-t ] [-s] [-rebin ]"; + cout << endl << " [-z ]"; + cout << endl << " -I : where is a single file name,"; + cout << endl << " e.g. 2010/lem10_his_0111.root, but not starting with a '-'"; + cout << endl << " -i : where is a list of run numbers"; + cout << endl << " separated by spaces ' ' of the form: "; + cout << endl << " etc., or a sequence of runs -, e.g. 111-222"; + cout << endl << " -c : "; + cout << endl << " : input data file format. Supported formats are:"; + cout << endl << " PSI-BIN, ROOT (LEM), MUD, NeXuS, PSI-MDU, WKM"; + cout << endl << " : ouput data file format. Supported formats are:"; + cout << endl << " PSI-BIN, ROOT (LEM), MUD, NeXuS, MDU, WKM, ASCII"; + cout << endl << " -p : where is the output path for the"; + cout << endl << " converted files. If nothing is given, the current directory"; + cout << endl << " will be used, unless the option '-s' is used."; + cout << endl << " -o : where is a single output file name. If "; + cout << endl << " is a list of runs, this option should be omitted since the file"; + cout << endl << " names are generated according to the run number and the file"; + cout << endl << " format, e.g. 111 -> lemyy_his_0111.root, where yy is the"; + cout << endl << " current year."; + cout << endl << " -y : if the option -y is used, here a year in the form 'yy' can"; + cout << endl << " be given, if this is the case, any automatic file name"; + cout << endl << " generation needs a year, this number will be used."; + cout << endl << " -t : "; + cout << endl << " : template file name. Needed for run-lists in"; + cout << endl << " order to generate the proper file names. The following template"; + cout << endl << " tags can be used: [yy] for year, and [rrrr] for the run number."; + cout << endl << " If the run number tag is used, the number of 'r' will give the"; + cout << endl << " number of digits used with leading zeros, e.g. [rrrrrr] and run"; + cout << endl << " number 123 will result in 000123. The same is true for the"; + cout << endl << " year, i.e. [yyyy] will result in something like 1999."; + cout << endl << " -s : with this option the output data file will be sent to the stdout."; + cout << endl << " -rebin : where is the number of bins to be packed"; + cout << endl << " -z [g|b] : where is the output file name"; + cout << endl << " (without extension) of the compressed data collection, and"; + cout << endl << " 'g' will result in .tar.gz, and 'b' in .tar.bz2 files."; cout << endl; - cout << endl << " If the output option '-o' is missing, the output file name will be generated according to the"; - cout << endl << " input data file name, and the output data format."; + cout << endl << " If the output option '-o' is missing, the output file name will be"; + cout << endl << " generated according to the input data file name, and the output data"; + cout << endl << " format."; cout << endl; cout << endl << "examples:" << endl; cout << endl << " any2many -I 2010/lem10_his_0123.root -c ROOT ASCII -rebin 25"; - cout << endl << " Will take the LEM ROOT file '2010/lem10_his_0123.root' rebin it with 25 and convert it to ASCII."; - cout << endl << " The output file name will be lem10_his_0123.ascii, and the file will be saved in the current directory."; - cout << endl << " any2many -i 123 137 -c PSI-BIN MUD -t d[yyyy]/deltat_tdc_gps_[rrrr].bin [rrrrrr].msr -y 2001"; - cout << endl << " Will take the run 123 and 137, will generate the input file names d2001/deltat_tdc_gps_0123.bin and"; - cout << endl << " d2001/deltat_tdc_gps_0137.bin, and output file names 000123.msr and 000137.msr"; - cout << endl << " any2many -i 100-117 -c PSI-MDU ASCII -t d[yyyy]/deltat_tdc_alc_[rrrr].mdu [rrr].ascii -y 2011 -s"; - cout << endl << " Will take the runs 100 through 117 and convert the PSI-MDU input files to ASCII output and instead of"; - cout << endl << " saving them into a file, they will be spit to the standard output."; + cout << endl << " Will take the LEM ROOT file '2010/lem10_his_0123.root' rebin it with 25"; + cout << endl << " and convert it to ASCII. The output file name will be"; + cout << endl << " lem10_his_0123.ascii, and the file will be saved in the current directory." << endl; + cout << endl << " any2many -i 123 137 -c PSI-BIN MUD -t d[yyyy]/deltat_tdc_gps_[rrrr].bin \\"; + cout << endl << " [rrrrrr].msr -y 2001"; + cout << endl << " Will take the run 123 and 137, will generate the input file names:"; + cout << endl << " d2001/deltat_tdc_gps_0123.bin and d2001/deltat_tdc_gps_0137.bin, and"; + cout << endl << " output file names 000123.msr and 000137.msr" << endl; + cout << endl << " any2many -i 100-117 -c PSI-MDU ASCII -t d[yyyy]/deltat_tdc_alc_[rrrr].mdu \\"; + cout << endl << " [rrr].ascii -y 2011 -s"; + cout << endl << " Will take the runs 100 through 117 and convert the PSI-MDU input files to"; + cout << endl << " ASCII output and instead of saving them into a file, they will be spit to"; + cout << endl << " the standard output." << endl; + cout << endl << " any2many -i 100-117 -c NEXUS ROOT -t d[yyyy]/psi_gps_[rrrr].nexus \\"; + cout << endl << " psi_[yyyy]_gps_[rrrr].root -z b psi_gps_run_100to117"; + cout << endl << " Will take the runs 100 through 117 and convert the PSI-NEXUS input files"; + cout << endl << " to ROOT output. Afterwards these new files will be collected in a"; + cout << endl << " compressed archive psi_gps_run_100to117.tar.bz2." << endl; cout << endl << endl; } @@ -135,6 +157,7 @@ int main(int argc, char *argv[]) // init info structure info.useStandardOutput = false; info.rebin = 1; + info.compressionTag = 0; // no compression as default // call any2many without arguments if (argc == 1) { @@ -339,6 +362,32 @@ int main(int argc, char *argv[]) break; } } + + // filter out if compression is whished + if (strstr(argv[i], "-z")) { + if (i+2 < argc) { + if ((argv[i+1][0] == '-') || (argv[i+2][0] == '-')) { + cerr << endl << ">> any2many **ERROR** found invalid template in option '-t'" << endl; + show_syntax = true; + break; + } + if (argv[i+1][0] == 'g') { + info.compressionTag = 1; + } else if (argv[i+1][0] == 'b') { + info.compressionTag = 2; + } else { + cerr << endl << ">> any2many **ERROR** found in option '-z' compression tag '" << argv[i+1] << "' which is not supported." << endl; + show_syntax = true; + break; + } + info.compressFileName = argv[i+2]; + i += 2; // shift argument position + } else { + cerr << endl << ">> any2many **ERROR** found option '-z' with missing arguments" << endl; + show_syntax = true; + break; + } + } } /* @@ -355,6 +404,11 @@ cout << endl << "debug> info.outPath=" << info.outPath; cout << endl << "debug> info.rebin=" << info.rebin; cout << endl << "debug> info.inTemplate=" << info.inTemplate; cout << endl << "debug> info.outTemplate=" << info.outTemplate; +cout << endl << "debug> info.compressionTag=" << info.compressionTag; +cout << endl << "debug> info.compressFileName=" << info.compressFileName; +cout << endl << "debug> info.outFileList="; +for (unsigned int i=0; ioutFormat.CompareTo("psi-mdu", TString::kIgnoreCase)) outTag = A2M_PSIMDU; + else if (!fAny2ManyInfo->outFormat.CompareTo("mud",TString::kIgnoreCase)) + outTag = A2M_MUD; else if (!fAny2ManyInfo->outFormat.CompareTo("nexus", TString::kIgnoreCase)) outTag = A2M_NEXUS; else if (!fAny2ManyInfo->outFormat.CompareTo("wkm", TString::kIgnoreCase)) @@ -440,6 +442,86 @@ Bool_t PRunDataHandler::ReadWriteFilesList() } + // check if compression is wished + if (fAny2ManyInfo->compressionTag > 0) { + TString fln = fAny2ManyInfo->compressFileName; + + // currently system call is used, which means this is only running under Linux and Mac OS X but not under Windows + char cmd[256]; + if (fAny2ManyInfo->outFileList.size() == 1) { + if (fAny2ManyInfo->compressionTag == 1) // gzip + fln += TString(".tar.gz"); + else // bzip2 + fln += TString(".tar.bz2"); + if (fAny2ManyInfo->compressionTag == 1) // gzip + sprintf(cmd, "tar -zcf %s %s", fln.Data(), fAny2ManyInfo->outFileList[0].Data()); + else // bzip2 + sprintf(cmd, "tar -jcf %s %s", fln.Data(), fAny2ManyInfo->outFileList[0].Data()); + system(cmd); + } else { + fln += TString(".tar"); + for (UInt_t i=0; ioutFileList.size(); i++) { + if (i==0) { + sprintf(cmd, "tar -cf %s %s", fln.Data(), fAny2ManyInfo->outFileList[i].Data()); + } else { + sprintf(cmd, "tar -rf %s %s", fln.Data(), fAny2ManyInfo->outFileList[i].Data()); + } + system(cmd); + } + if (fAny2ManyInfo->compressionTag == 1) // gzip + sprintf(cmd, "gzip %s", fln.Data()); + else + sprintf(cmd, "bzip2 -z %s", fln.Data()); + system(cmd); + } + + // check if the compressed file shall be streamed to the stdout + if (fAny2ManyInfo->useStandardOutput) { + // stream file to stdout + ifstream is; + int length=1024; + char *buffer; + + is.open(fln.Data(), ios::binary); + if (!is.is_open()) { + cerr << endl << "PRunDataHandler::ReadWriteFilesList(): **ERROR** Couldn't open the file for streaming." << endl; + remove(fln.Data()); + return false; + } + + // get length of file + is.seekg(0, ios::end); + length = is.tellg(); + is.seekg(0, ios::beg); + + if (length == -1) { + cerr << endl << "PRunDataHandler::ReadWriteFilesList(): **ERROR** Couldn't determine the file size." << endl; + remove(fln.Data()); + return false; + } + + // allocate memory + buffer = new char [length]; + + // read data as a block + while (!is.eof()) { + is.read(buffer, length); + cout.write(buffer, length); + } + + is.close(); + + delete [] buffer; + + // delete temporary root file + remove(fln.Data()); + } + + // remove all the converted files + for (UInt_t i=0; ioutFileList.size(); i++) + remove(fAny2ManyInfo->outFileList[i].Data()); + } + return true; } @@ -690,6 +772,7 @@ Bool_t PRunDataHandler::FileExistsCheck(const Int_t idx) if (idx == -1) { // single input file name fln = fAny2ManyInfo->inFileName; +cout << endl << "debug> fln=" << fln << endl; } else { // run file list entry shall be handled // check for input/output templates if ((fAny2ManyInfo->inTemplate.Length() == 0) || (fAny2ManyInfo->outTemplate.Length() == 0)) { @@ -710,7 +793,8 @@ Bool_t PRunDataHandler::FileExistsCheck(const Int_t idx) // check if the file is in the local directory if (gSystem->AccessPathName(fln) != true) { // found in the local dir - pathName = TString("./")+fln; +// pathName = TString("./")+fln; + pathName = fln; } // check if the file is found in the directory given in the startup file if (pathName.CompareTo("???") == 0) { // not found in local directory search @@ -2717,12 +2801,12 @@ Bool_t PRunDataHandler::WriteRootFile(TString fln) cout << endl << ">> PRunDataHandler::WriteRootFile(): writing a root data file ... " << endl; // generate output file name if needed - if (!fAny2ManyInfo->useStandardOutput) { + if (!fAny2ManyInfo->useStandardOutput || (fAny2ManyInfo->compressionTag > 0)) { if (fln.Length() == 0) { Int_t start = fRunPathName.Last('/'); Int_t end = fRunPathName.Last('.'); - if ((start == -1) || (end == -1)) { - cout << endl << ">> PRunDataHandler::WriteAsciiFile(): **ERROR** couldn't generate the output file name ..." << endl; + if (end == -1) { + cerr << endl << ">> PRunDataHandler::WriteRootFile(): **ERROR** couldn't generate the output file name ..." << endl; return false; } // cut out the filename (get rid of the extension, and the path) @@ -2737,6 +2821,8 @@ Bool_t PRunDataHandler::WriteRootFile(TString fln) } else { fln.Prepend(fAny2ManyInfo->outPath); } + // keep the file name if compression is whished + fAny2ManyInfo->outFileList.push_back(fln); } else { fln = TString("__tmp.root"); } @@ -2829,7 +2915,7 @@ Bool_t PRunDataHandler::WriteRootFile(TString fln) // write file TFile *fout = new TFile(fln, "RECREATE", fln); if (fout == 0) { - cout << endl << "PRunDataHandler::WriteRootFile(): **ERROR** Couldn't create ROOT file '" << fln << "'" << endl; + cerr << endl << "PRunDataHandler::WriteRootFile(): **ERROR** Couldn't create ROOT file '" << fln << "'" << endl; return false; } @@ -2848,7 +2934,7 @@ Bool_t PRunDataHandler::WriteRootFile(TString fln) delete header; // check if root file shall be streamed to stdout - if (fAny2ManyInfo->useStandardOutput) { + if (fAny2ManyInfo->useStandardOutput && (fAny2ManyInfo->compressionTag == 0)) { // stream file to stdout ifstream is; int length=1024; @@ -2856,7 +2942,7 @@ Bool_t PRunDataHandler::WriteRootFile(TString fln) is.open(fln.Data(), ios::binary); if (!is.is_open()) { - cout << endl << "PRunDataHandler::WriteRootFile(): **ERROR** Couldn't open the root-file for streaming." << endl; + cerr << endl << "PRunDataHandler::WriteRootFile(): **ERROR** Couldn't open the root-file for streaming." << endl; remove(fln.Data()); return false; } @@ -2867,7 +2953,7 @@ Bool_t PRunDataHandler::WriteRootFile(TString fln) is.seekg(0, ios::beg); if (length == -1) { - cout << endl << "PRunDataHandler::WriteRootFile(): **ERROR** Couldn't determine the root-file size." << endl; + cerr << endl << "PRunDataHandler::WriteRootFile(): **ERROR** Couldn't determine the root-file size." << endl; remove(fln.Data()); return false; } @@ -2930,8 +3016,8 @@ Bool_t PRunDataHandler::WriteWkmFile(TString fln) if (fln.Length() == 0) { Int_t start = fRunPathName.Last('/'); Int_t end = fRunPathName.Last('.'); - if ((start == -1) || (end == -1)) { - cout << endl << ">> PRunDataHandler::WriteWkmFile(): **ERROR** couldn't generate the output file name ..." << endl; + if (end == -1) { + cerr << endl << ">> PRunDataHandler::WriteWkmFile(): **ERROR** couldn't generate the output file name ..." << endl; return false; } // cut out the filename (get rid of the extension, and the path) @@ -2946,12 +3032,14 @@ Bool_t PRunDataHandler::WriteWkmFile(TString fln) } else { fln.Prepend(fAny2ManyInfo->outPath); } + // keep the file name if compression is whished + fAny2ManyInfo->outFileList.push_back(fln); // write ascii file ofstream fout; streambuf* strm_buffer = 0; - if (!fAny2ManyInfo->useStandardOutput) { + if (!fAny2ManyInfo->useStandardOutput || (fAny2ManyInfo->compressionTag > 0)) { // open data-file fout.open(fln.Data(), ofstream::out); if (!fout.is_open()) { @@ -3022,7 +3110,7 @@ Bool_t PRunDataHandler::WriteWkmFile(TString fln) } } - if (!fAny2ManyInfo->useStandardOutput) { + if (!fAny2ManyInfo->useStandardOutput || (fAny2ManyInfo->compressionTag > 0)) { // restore old output buffer cout.rdbuf(strm_buffer); @@ -3082,7 +3170,168 @@ Bool_t PRunDataHandler::WritePsiMduFile(TString fln) */ Bool_t PRunDataHandler::WriteMudFile(TString fln) { - cout << endl << ">> PRunDataHandler::WriteMudFile(): will write a mud data file. Not yet implemented ... " << endl; + if (!fAny2ManyInfo->useStandardOutput) + cout << endl << ">> PRunDataHandler::WriteMudFile(): writing a mud data file ... " << endl; + + // generate output file name if needed + if (!fAny2ManyInfo->useStandardOutput || (fAny2ManyInfo->compressionTag > 0)) { + if (fln.Length() == 0) { + Int_t start = fRunPathName.Last('/'); + Int_t end = fRunPathName.Last('.'); + if (end == -1) { + cerr << endl << ">> PRunDataHandler::WriteMudFile(): **ERROR** couldn't generate the output file name ..." << endl; + return false; + } + // cut out the filename (get rid of the extension, and the path) + Char_t str1[1024], str2[1024]; + strncpy(str1, fRunPathName.Data(), sizeof(str1)); + for (Int_t i=0; ioutPath + str2 + ".msr"; + } else { + fln.Prepend(fAny2ManyInfo->outPath); + } + // keep the file name if compression is whished + fAny2ManyInfo->outFileList.push_back(fln); + } else { + fln = TString("__tmp.msr"); + } + + // generate the mud data file + int fd = MUD_openWrite((char*)fln.Data(), MUD_FMT_TRI_TD_ID); + if (fd == -1) { + cerr << endl << ">> PRunDataHandler::WriteMudFile(): **ERROR** couldn't open mud data file for write ..." << endl; + return false; + } + + // generate header information + char dummy[32], info[128]; + strcpy(dummy, "???"); + MUD_setRunDesc(fd, MUD_SEC_GEN_RUN_DESC_ID); + MUD_setExptNumber(fd, 0); + MUD_setRunNumber(fd, fData[0].GetRunNumber()); + MUD_setElapsedSec(fd, 0); + MUD_setTimeBegin(fd, 0); + MUD_setTimeEnd(fd, 0); + MUD_setTitle(fd, (char *)fData[0].GetRunTitle()->Data()); + MUD_setLab(fd, dummy); + MUD_setArea(fd, dummy); + MUD_setMethod(fd, (char *)fData[0].GetSetup()->Data()); + MUD_setApparatus(fd, dummy); + MUD_setInsert(fd, dummy); + MUD_setSample(fd, dummy); + MUD_setOrient(fd, dummy); + MUD_setDas(fd, dummy); + MUD_setExperimenter(fd, dummy); + sprintf(info, "%lf+-%lf (K)", fData[0].GetTemperature(0), fData[0].GetTempError(0)); + MUD_setTemperature(fd, info); + sprintf(info, "%lf", fData[0].GetField()); + MUD_setField(fd, info); + + // generate the histograms + MUD_setHists(fd, MUD_GRP_TRI_TD_HIST_ID, fData[0].GetNoOfHistos()); + + UInt_t *data, dataSize = fData[0].GetDataBin(0)->size()/fAny2ManyInfo->rebin + 1; + data = new UInt_t[dataSize]; + if (data == 0) { + cerr << endl << ">> PRunDataHandler::WriteMudFile(): **ERROR** couldn't allocate memory for the data ..." << endl; + MUD_closeWrite(fd); + return false; + } + + UInt_t noOfEvents = 0, ival = 0, k = 0; + for (UInt_t i=0; isize(); j++) { + if ((j != 0) && (j % fAny2ManyInfo->rebin == 0)) { + data[k] = ival; + noOfEvents += ival; + k++; + ival = 0; + } + ival += static_cast(fData[0].GetDataBin(i)->at(j)); + } + + // feed data relevant information + // the numbering of the histograms start from '1', hence i+1 needed!! + MUD_setHistType(fd, i+1, MUD_GRP_TRI_TD_HIST_ID); + MUD_setHistNumBytes(fd, i+1, sizeof(data)); + MUD_setHistNumBins(fd, i+1, dataSize); + MUD_setHistBytesPerBin(fd, i+1, 0); + MUD_setHistFsPerBin(fd, i+1, static_cast(1.0e6*fAny2ManyInfo->rebin*fData[0].GetTimeResolution())); // time resolution is given in (ns) + if (fData[0].GetT0Size() > i) { + MUD_setHistT0_Ps(fd, i+1, static_cast(1.0e3*fData[0].GetTimeResolution()*((fData[0].GetT0(i)+fAny2ManyInfo->rebin/2)/fAny2ManyInfo->rebin))); + MUD_setHistT0_Bin(fd, i+1, static_cast(fData[0].GetT0(i)/fAny2ManyInfo->rebin)); + } else { + MUD_setHistT0_Ps(fd, i+1, 0); + MUD_setHistT0_Bin(fd, i+1, 0); + } + MUD_setHistGoodBin1(fd, i+1, 0); + MUD_setHistGoodBin2(fd, i+1, 0); + MUD_setHistBkgd1(fd, i+1, 0); + MUD_setHistBkgd2(fd, i+1, 0); + MUD_setHistNumEvents(fd, i+1, (UINT32)noOfEvents); + MUD_setHistTitle(fd, i+1, dummy); + REAL64 timeResolution = (fAny2ManyInfo->rebin*fData[0].GetTimeResolution())/1.0e9; // ns -> s + MUD_setHistSecondsPerBin(fd, i+1, timeResolution); + + MUD_setHistData(fd, i+1, data); + } + + MUD_closeWrite(fd); + + delete [] data; + + // check if mud file shall be streamed to stdout + if (fAny2ManyInfo->useStandardOutput && (fAny2ManyInfo->compressionTag == 0)) { + // stream file to stdout + ifstream is; + int length=1024; + char *buffer; + + is.open(fln.Data(), ios::binary); + if (!is.is_open()) { + cerr << endl << "PRunDataHandler::WriteMudFile(): **ERROR** Couldn't open the mud-file for streaming." << endl; + remove(fln.Data()); + return false; + } + + // get length of file + is.seekg(0, ios::end); + length = is.tellg(); + is.seekg(0, ios::beg); + + if (length == -1) { + cerr << endl << "PRunDataHandler::WriteMudFile(): **ERROR** Couldn't determine the mud-file size." << endl; + remove(fln.Data()); + return false; + } + + // allocate memory + buffer = new char [length]; + + // read data as a block + while (!is.eof()) { + is.read(buffer, length); + cout.write(buffer, length); + } + + is.close(); + + delete [] buffer; + + // delete temporary root file + remove(fln.Data()); + } + return true; } @@ -3100,14 +3349,15 @@ Bool_t PRunDataHandler::WriteMudFile(TString fln) */ Bool_t PRunDataHandler::WriteAsciiFile(TString fln) { - cout << endl << ">> PRunDataHandler::WriteAsciiFile(): writing an ascii data file... " << endl; + if (!fAny2ManyInfo->useStandardOutput) + cout << endl << ">> PRunDataHandler::WriteAsciiFile(): writing an ascii data file... " << endl; // generate output file name if (fln.Length() == 0) { Int_t start = fRunPathName.Last('/'); Int_t end = fRunPathName.Last('.'); - if ((start == -1) || (end == -1)) { - cout << endl << ">> PRunDataHandler::WriteAsciiFile(): **ERROR** couldn't generate the output file name ..." << endl; + if (end == -1) { + cerr << endl << ">> PRunDataHandler::WriteAsciiFile(): **ERROR** couldn't generate the output file name ..." << endl; return false; } // cut out the filename (get rid of the extension, and the path) @@ -3122,12 +3372,14 @@ Bool_t PRunDataHandler::WriteAsciiFile(TString fln) } else { fln.Prepend(fAny2ManyInfo->outPath); } + // keep the file name if compression is whished + fAny2ManyInfo->outFileList.push_back(fln); // write ascii file ofstream fout; streambuf* strm_buffer = 0; - if (!fAny2ManyInfo->useStandardOutput) { + if (!fAny2ManyInfo->useStandardOutput || (fAny2ManyInfo->compressionTag > 0)) { // open data-file fout.open(fln.Data(), ofstream::out); if (!fout.is_open()) { @@ -3214,7 +3466,7 @@ Bool_t PRunDataHandler::WriteAsciiFile(TString fln) cout << endl; - if (!fAny2ManyInfo->useStandardOutput) { + if (!fAny2ManyInfo->useStandardOutput || (fAny2ManyInfo->compressionTag > 0)) { // restore old output buffer cout.rdbuf(strm_buffer); @@ -3486,12 +3738,15 @@ TString PRunDataHandler::FileNameFromTemplate(TString &fileNameTemplate, Int_t r Int_t runLength = 0; // find position and length of the year tag + Bool_t foundLeft = false, foundRight = false; for (Int_t i=0; i 4294967295.0e-15 ) return( 0 ); - return( MUD_setHistFsPerBin( fd, num, (1.0e15 * (UINT32)secondsPerBin ) ) ); + return( MUD_setHistFsPerBin( fd, num, (UINT32)(1.0e15 * secondsPerBin ) ) ); } diff --git a/src/include/PMusr.h b/src/include/PMusr.h index 34237ac2..eb97ecf9 100644 --- a/src/include/PMusr.h +++ b/src/include/PMusr.h @@ -568,17 +568,20 @@ typedef struct { *

Holds the informations for the any2many converter program */ typedef struct { - Bool_t useStandardOutput; ///< flag showing if the converted shall be sent to the standard output - TString inFormat; ///< holds the information about the input data file format - TString outFormat; ///< holds the information about the output data file format - TString inTemplate; ///< holds the input file template - TString outTemplate; ///< holds the output file template - TString year; ///< holds the information about the year to be used - PIntVector runList; ///< holds the run number list to be converted - TString inFileName; ///< holds the file name of the input data file - TString outFileName; ///< holds the file name of the output data file - TString outPath; ///< holds the output path - UInt_t rebin; ///< holds the number of bins to be packed + Bool_t useStandardOutput; ///< flag showing if the converted shall be sent to the standard output + TString inFormat; ///< holds the information about the input data file format + TString outFormat; ///< holds the information about the output data file format + TString inTemplate; ///< holds the input file template + TString outTemplate; ///< holds the output file template + TString year; ///< holds the information about the year to be used + PIntVector runList; ///< holds the run number list to be converted + TString inFileName; ///< holds the file name of the input data file + TString outFileName; ///< holds the file name of the output data file + PStringVector outFileList; ///< holds the out path/file name + TString outPath; ///< holds the output path + UInt_t rebin; ///< holds the number of bins to be packed + UInt_t compressionTag; ///< 0=no compression, 1=gzip compression, 2=bzip2 compression + TString compressFileName; ///< holds the name of the outputfile name in case of compression is used } PAny2ManyInfo; #endif // _PMUSR_H_