enhanced functionality (sub dirs, file name format specifiers)
authorrichterm <richterm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 24 Sep 2007 10:04:48 +0000 (10:04 +0000)
committerrichterm <richterm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 24 Sep 2007 10:04:48 +0000 (10:04 +0000)
HLT/BASE/util/AliHLTFileWriter.cxx
HLT/BASE/util/AliHLTFileWriter.h
HLT/BASE/util/AliHLTRootFileWriterComponent.cxx

index 9650e1ea69d951ee9ca650ef101566dfb0ced898..5871f55790a88f568a1fb014edcb10a2341a39df 100644 (file)
@@ -28,6 +28,7 @@ using namespace std;
 #include "AliHLTFileWriter.h"
 #include <TObjArray.h>
 #include <TObjString.h>
+#include <TSystem.h>
 //#include <TMath.h>
 //#include <TFile.h>
 
@@ -43,6 +44,10 @@ AliHLTFileWriter::AliHLTFileWriter()
   fBaseName(""),
   fExtension(""),
   fDirectory(""),
+  fSubDirFormat(""),
+  fIdFormat(""),
+  fSpecFormat(""),
+  fBlcknoFormat(""),
   fCurrentFileName(""),
   fMode(0)
 {
@@ -53,26 +58,6 @@ AliHLTFileWriter::AliHLTFileWriter()
   // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
 }
 
-AliHLTFileWriter::AliHLTFileWriter(const AliHLTFileWriter&)
-  :
-  AliHLTDataSink(),
-  fBaseName(""),
-  fExtension(""),
-  fDirectory(""),
-  fCurrentFileName(""),
-  fMode(0)
-{
-  // see header file for class documentation
-  HLTFatal("copy constructor untested");
-}
-
-AliHLTFileWriter& AliHLTFileWriter::operator=(const AliHLTFileWriter&)
-{ 
-  // see header file for class documentation
-  HLTFatal("assignment operator untested");
-  return *this;
-}
-
 AliHLTFileWriter::~AliHLTFileWriter()
 {
   // see header file for class documentation
@@ -133,6 +118,40 @@ int AliHLTFileWriter::DoInit( int argc, const char** argv )
       if ((bMissingParam=(++i>=argc))) break;
       fDirectory=argv[i];
 
+      // -subdir
+    } else if (argument.BeginsWith("-subdir")) {
+      argument.ReplaceAll("-subdir", "");
+      if (argument.BeginsWith("=")) {
+       fSubDirFormat=argument.Replace(0,1,"");
+      } else {
+       fSubDirFormat="event%03d";
+      }
+
+      // -idfmt
+    } else if (argument.BeginsWith("-idfmt")) {
+      argument.ReplaceAll("-idfmt", "");
+      if (argument.BeginsWith("=")) {
+       fIdFormat=argument.Replace(0,1,"");
+      }
+
+      // -specfmt
+    } else if (argument.BeginsWith("-specfmt")) {
+      argument.ReplaceAll("-specfmt", "");
+      if (argument.BeginsWith("=")) {
+       fSpecFormat=argument.Replace(0,1,"");
+      } else {
+       fSpecFormat="_0x%08x";
+      }
+
+      // -blcknofmt
+    } else if (argument.BeginsWith("-blcknofmt")) {
+      argument.ReplaceAll("-blcknofmt", "");
+      if (argument.BeginsWith("=")) {
+       fBlcknoFormat=argument.Replace(0,1,"");
+      } else {
+       fBlcknoFormat="_0x%02x";
+      }
+
       // -enumeration
     } else if (argument.CompareTo("-enumerate")==0) {
       SetMode(kEnumerate);
@@ -163,6 +182,11 @@ int AliHLTFileWriter::DoInit( int argc, const char** argv )
     iResult=-EINVAL;
   }
   if (iResult>=0) {
+    if (fIdFormat.IsNull() && fSubDirFormat.IsNull()) {
+      // set the default format string for the id if it is not set and
+      // no sub dirs set (the sub dir than contains the id)
+      fIdFormat="_0x%08x";
+    }
     iResult=InitWriter();
   }
 
@@ -233,7 +257,7 @@ int AliHLTFileWriter::DumpEvent( const AliHLTComponentEventData& evtData,
     //HLTDebug("block %d out of %d", n, evtData.fBlockCnt);
     TString filename;
     HLTDebug("dataspec 0x%x", blocks[n].fSpecification);
-    iResult=BuildFileName(evtData.fEventID, n, blocks[n].fDataType, filename);
+    iResult=BuildFileName(evtData.fEventID, n, blocks[n].fDataType, blocks[n].fSpecification, filename);
     ios::openmode filemode=(ios::openmode)0;
     if (fCurrentFileName.CompareTo(filename)==0) {
       // append to the file
@@ -260,7 +284,10 @@ int AliHLTFileWriter::DumpEvent( const AliHLTComponentEventData& evtData,
   return iResult;
 }
 
-int AliHLTFileWriter::BuildFileName(const AliHLTEventID_t eventID, const int blockID, const AliHLTComponentDataType& dataType, TString& filename)
+int AliHLTFileWriter::BuildFileName(const AliHLTEventID_t eventID, const int blockID,
+                                   const AliHLTComponentDataType& dataType,
+                                   const AliHLTUInt32_t specification,
+                                   TString& filename)
 {
   // see header file for class documentation
   int iResult=0;
@@ -268,28 +295,39 @@ int AliHLTFileWriter::BuildFileName(const AliHLTEventID_t eventID, const int blo
   filename="";
   if (!fDirectory.IsNull()) {
     filename+=fDirectory;
-    if (!fDirectory.EndsWith("/"))
+    if (!filename.EndsWith("/"))
       filename+="/";
   }
+  if (!fSubDirFormat.IsNull()) {
+    filename+=Form(fSubDirFormat, eventID);
+    if (!filename.EndsWith("/"))
+      filename+="/";
+  }
+  if (filename.EndsWith("/")) {
+    gSystem->mkdir(filename);
+  }
   if (!fBaseName.IsNull())
     filename+=fBaseName;
   else
     filename+="event";
   if (!CheckMode(kConcatenateEvents)) {
     if (!CheckMode(kEnumerate)) {
-      if (eventID!=kAliHLTVoidEventID) {
-       filename+=Form("_0x%08x", eventID);
+      if (eventID!=kAliHLTVoidEventID && !fIdFormat.IsNull()) {
+       filename+=Form(fIdFormat, eventID);
       }
     } else {
       filename+=Form("_%d", GetEventCount());
     }
   }
   if (blockID>=0 && !CheckMode(kConcatenateBlocks)) {
-    filename+=Form("_0x%x", blockID);
+    if (!fBlcknoFormat.IsNull())
+      filename+=Form(fBlcknoFormat, blockID);
     if (dataType!=kAliHLTVoidDataType) {
       filename+="_";
       filename+=AliHLTComponent::DataType2Text(dataType).data();
     }
+    if (!fSpecFormat.IsNull())
+      filename+=Form(fSpecFormat, specification);
   }
   if (!fExtension.IsNull())
     filename+="." + fExtension;
index 656f7081f356e25561b24bf577f8239db822ef66..df1136a3ab5d47fd2a9d8309f10df7e9be4667d0 100644 (file)
  *      file name base
  * \li -directory    <i> directory  </i> <br>
  *      target directory
+ * \li -subdir[=pattern] <br>
+ *      create sub dir for each event, the format patern can contain printf
+ *      specifiers to print the evntn no into the dir name, default is
+ *      'event%03d' (-subdir w/o additional pattern)
+ * \li -idfmt[=pattern] <br>
+ *      format specifier for the event id in the file name,                <br>
+ *      default: on, default pattern: '_0x%08x'
+ * \li -specfmt[=pattern] <br>
+ *      format specifier for the data specification in the file name       <br>
+ *      default: off, default pattern: '_0x%08x'
+ * \li -blocknofmt[=pattern] <br>
+ *      format specifier for the block no in the file name                 <br>
+ *      default: on, default pattern: '_0x%02x'
  * \li -enumerate <br>
  *      don't use the event number but an event counter beginning from 0
  * \li -concatenate-blocks <br>
  *      the block no, and the block data type in the file name. Currently,
  *      this implies the -concatenate-blocks option.
  *
- * The file name is built from the basename, the event number, the block
- * number and the data type in the format:
+ * By default, file name is built from the basename, the event number, the
+ * block number and the data type in the format:
  * <pre>
- * basename_eventno_blockno_dt
+ * basename_eventno_dt
  * </pre>
  * If the basename was not given, \em 'event' ist used instead. A file
  * extension after the last dot is separated from the basename and appended
  * to the final name.
  *
+ * The naming rule can be changed by the -xxfmt options, which can contain
+ * printf format specifiers in order to print the corresponding variable. E.g.
+ * <pre>
+ * -specfmt             append specification
+ * -subdir=test_%d      store in sub folders
+ * -blcknofmt=_0x%x     format block no in hex
+ * -idfmt=_%04d         print id in 4-digits decimal number
+ * </pre>
+ *
  * The class can be used as a base class for file writers. Additional
  * argument scan can be implemented in @ref ScanArgument which is called
  * for each unknown argument.
@@ -62,10 +84,6 @@ class AliHLTFileWriter : public AliHLTDataSink  {
  public:
   /** standard constructor */
   AliHLTFileWriter();
-  /** not a valid copy constructor, defined according to effective C++ style */
-  AliHLTFileWriter(const AliHLTFileWriter&);
-  /** not a valid assignment op, but defined according to effective C++ style */
-  AliHLTFileWriter& operator=(const AliHLTFileWriter&);
   /** destructor */
   virtual ~AliHLTFileWriter();
 
@@ -132,7 +150,10 @@ class AliHLTFileWriter : public AliHLTDataSink  {
    *                       no type string appanded if @ref kAliHLTVoidDataType
    * @param filename [out] string to receive the file name
    */
-  int BuildFileName(const AliHLTEventID_t eventID, const int blockID, const AliHLTComponentDataType& dataType, TString& filename);
+  int BuildFileName(const AliHLTEventID_t eventID, const int blockID,
+                   const AliHLTComponentDataType& dataType,
+                   const AliHLTUInt32_t specification,
+                   TString& filename);
 
   /**
    * Set a mode flag.
@@ -172,21 +193,35 @@ class AliHLTFileWriter : public AliHLTDataSink  {
 
     /** event enumeration flag */
     kEnumerate = 0x4
+
   };
 
  private:
+  /** copy constructor prohibited */
+  AliHLTFileWriter(const AliHLTFileWriter&);
+  /** assignment operator prohibited */
+  AliHLTFileWriter& operator=(const AliHLTFileWriter&);
+
   /** the basename of the output file */
   TString    fBaseName;                                            // see above
   /** the extension of the output file */
   TString    fExtension;                                           // see above
   /** target directory */
   TString    fDirectory;                                           // see above
+  /** base name of the event sub directories */
+  TString    fSubDirFormat;                                        // see above
+  /** event id format string (when added to file name) */
+  TString    fIdFormat;                                            // see above
+  /** specification format string (when added to file name) */
+  TString    fSpecFormat;                                          // see above
+  /** format string for block no (when added to file name) */
+  TString    fBlcknoFormat;                                        // see above
   /** enumeration format string */
   TString    fCurrentFileName;                                     // see above
 
   /** mode specifier, see @ref TWriterMode */
   Short_t    fMode;                                                // see above
 
-  ClassDef(AliHLTFileWriter, 1)
+  ClassDef(AliHLTFileWriter, 2)
 };
 #endif
index e8da93a1c63b0607ce9df26a59a379234b6437d3..8a3b0e66749e103ede359d3e34c66432b136a32e 100644 (file)
@@ -147,7 +147,7 @@ TFile* AliHLTRootFileWriterComponent::OpenFile(const AliHLTEventID_t eventID, co
   // see header file for class documentation
   TFile* pFile=NULL;
   TString filename("");
-  if ((BuildFileName(eventID, blockID, kAliHLTVoidDataType, filename))>=0 && filename.IsNull()==0) {
+  if ((BuildFileName(eventID, blockID, kAliHLTVoidDataType, 0, filename))>=0 && filename.IsNull()==0) {
     pFile=new TFile(filename, option);
     if (pFile) {
       if (pFile->IsZombie()) {