AliXMLParser (Harsh)
authorhristov <hristov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 16 Oct 2013 20:52:08 +0000 (20:52 +0000)
committerhristov <hristov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 16 Oct 2013 20:52:08 +0000 (20:52 +0000)
ANALYSIS/ANALYSISLinkDef.h
ANALYSIS/AliXMLParser.cxx [new file with mode: 0644]
ANALYSIS/AliXMLParser.h [new file with mode: 0644]
ANALYSIS/CMakelibANALYSIS.pkg

index 609a03d..1da75c8 100644 (file)
@@ -14,5 +14,6 @@
 #pragma link C++ class  AliAnalysisStatistics+;
 #pragma link C++ class  AliAnalysisTaskCfg+;
 #pragma link C++ class  AliAnalysisFileDescriptor+;
+#pragma link C++ class  AliXMLParser+;
 
 #endif
diff --git a/ANALYSIS/AliXMLParser.cxx b/ANALYSIS/AliXMLParser.cxx
new file mode 100644 (file)
index 0000000..8fcb03d
--- /dev/null
@@ -0,0 +1,249 @@
+/* 
+Author : Harsh Arora (harsh.arora@cern.ch)
+
+   
+AliXMLParser
+---------
+
+AliXMLParser is a tool to parse XML file from URL or path and store it in trees.
+
+*/
+
+#include "AliXMLParser.h"
+
+#include <Riostream.h>
+#include "TTree.h"
+#include "TBranch.h"
+#include "TWebFile.h"
+#include <iostream>
+#include <cstdlib>
+#include <TList.h>
+#include <TString.h>
+
+using std::cerr;
+using std::cout;
+using std::endl;
+
+ClassImp(AliXMLParser);
+
+AliXMLParser::AliXMLParser():
+   fTreeList(0),
+   fTableTag(0),
+   fInsideTree(kFALSE),
+   fNumTokens(0),
+   fEntries(0),
+   fVal(0),
+   fNumTrees(0),
+   fError(kFALSE)
+{
+   //Default Contructor
+
+   fEntries = new TList();
+   fVal = new TList();
+   fTreeList = new TList();
+   fInsideTree = kFALSE;
+   fNumTrees = 0;
+   fNumTokens = -1;
+   fError = kFALSE;
+
+   fEntries->SetOwner(kTRUE);
+   fVal->SetOwner(kTRUE);
+   fTreeList->SetOwner(kTRUE);
+}
+
+AliXMLParser::AliXMLParser(const AliXMLParser& obj):
+   fTreeList(0),
+   fTableTag(0),
+   fInsideTree(kFALSE),
+   fNumTokens(0),
+   fEntries(0),
+   fVal(0),
+   fNumTrees(0),
+   fError(kFALSE)
+{
+   //Copy Contructor
+   fTreeList = obj.fTreeList;
+   fTableTag = obj.fTableTag;
+   fInsideTree = obj.fInsideTree;
+   fNumTokens = obj.fNumTokens;
+   fEntries = obj.fEntries;
+   fVal = obj.fVal;
+   fNumTrees = obj.fNumTrees;
+   fError = obj.fError;
+}
+
+AliXMLParser& AliXMLParser::operator=(const AliXMLParser& other)
+{
+   //Assignment
+   if(this != &other)
+   {
+      fTreeList = other.fTreeList;
+      fTableTag = other.fTableTag;
+      fInsideTree = other.fInsideTree;
+      fNumTokens = other.fNumTokens;
+      fEntries = other.fEntries;
+      fVal = other.fVal;
+      fNumTrees = other.fNumTrees;
+      fError = other.fError;
+   }
+   return *this;
+}
+
+void AliXMLParser::OnStartDocument() {}
+
+int AliXMLParser::GetEntryIndex(TString entry_name) //Finds the attribute index by name
+{
+   int i;
+   for(i=0;i<=fNumTokens;i++)
+   {
+      if(entry_name.EqualTo(*(TString *)(fEntries->At(i))))
+         return i;
+   }
+   return -1;
+}
+
+void AliXMLParser::OnStartElement(const char *name, const TList *attributes) //Stores Parsed XML in a Tree
+{
+   int n,i;
+   TString tree_symbol = "roottreename";
+   TString var(name);
+   TString temp("");
+   TXMLAttr *attr;
+   TIter next(attributes);
+   TBranch *branch;
+   TTree *curr_tree;
+
+   if((attr = (TXMLAttr*) next()))
+   {
+      if((!fInsideTree) && tree_symbol.EqualTo(attr->GetName())) //If tag found, Enter a new tree
+      {
+         fTableTag = name;
+         fNumTrees++;
+         fTreeList->Add((TObject *)(new TTree(attr->GetValue(),attr->GetValue())));
+         fInsideTree = kTRUE;
+      }
+      else if(fInsideTree)
+      {
+         curr_tree=(TTree *)(fTreeList->At(fNumTrees-1));
+         do
+         {
+            if(!(curr_tree->GetBranch(attr->GetName())))
+          
+            {
+               TString var_type = attr->GetName();
+               var_type += "/C";
+               fNumTokens++;
+
+               fEntries->Add((TObject *)(new TString(attr->GetName())));
+
+               fVal->Add((TObject *)(new TString(temp)));
+
+               //Adding Attributes as branches of TTree
+               branch = curr_tree->Branch(attr->GetName(), (void *)(((TString *)(fVal->At(fNumTokens)))->Data()), var_type);
+               n = curr_tree->GetEntries();
+               if(n > 0)
+               {
+                  (*(TString *)(fVal->At(fNumTokens))) = temp;
+                  for(i=0;i<n;i++)
+                     branch->Fill();
+               }
+
+            }
+
+            (*(TString *)(fVal->At(GetEntryIndex(attr->GetName())))) = attr->GetValue();
+
+           
+         } while ((attr = (TXMLAttr*) next()));
+         curr_tree->Fill(); //Fill the tree with attribute values
+         for(i=0;i<=fNumTokens;i++)
+         {
+            (*(TString *)(fVal->At(i))) = temp;
+         }
+      }
+   }
+}
+
+      
+   
+void AliXMLParser::OnEndElement(const char *name)
+{
+   //if tag closes, re-initialize everything for a new tree
+   if(fTableTag.EqualTo(name))
+   {
+      fInsideTree = kFALSE;
+      fEntries->Clear("nodelete");
+      fVal->Clear("nodelete");
+      fNumTokens=-1;
+   }
+}
+
+void AliXMLParser::OnCharacters(const char *) {} 
+
+void AliXMLParser::OnComment(const char *) {}
+
+void AliXMLParser::OnWarning(const char *warning) 
+{
+   cout << "Warning in XML: " << warning << endl;
+}
+
+void AliXMLParser::OnError(const char *error) 
+{ 
+   fError = kTRUE;
+   cerr << "Error in XML: " << error << endl;
+}
+
+void AliXMLParser::OnFatalError(const char *error)
+{ 
+   fError = kTRUE;
+   cerr << "FatalError in XML: " << error << endl;
+}
+
+void AliXMLParser::OnCdataBlock(const char *, Int_t ) {}
+
+void AliXMLParser::OnEndDocument() {}
+
+AliXMLParser::~AliXMLParser()
+{
+   delete fEntries;
+   delete fVal;
+   delete fTreeList;
+}
+
+
+TList* AliXMLParser::GetTreesFromXML(TString file) //Returns List of Trees by parsing local XML file
+{
+   TSAXParser *saxParser = new TSAXParser();
+   saxParser->ConnectToHandler("AliXMLParser", this);
+   if(!TFile::Open(file)) 
+   {
+      cerr << "File not found" << endl;
+      return 0x0;
+   }
+   saxParser->ParseFile(file);
+   delete saxParser;
+   if (fError) return 0x0;
+   return fTreeList;
+}
+
+TList *AliXMLParser::GetTreesFromURL(TString host) //Returns List of Trees by parsing remote XML file
+{
+   char *buf;
+   int size;
+   TSAXParser *saxParser = new TSAXParser();
+   saxParser->ConnectToHandler("AliXMLParser", this);
+   host += "&filetype=raw";
+   TFile *file = TFile::Open(host);
+   if (!file)
+   {
+      cerr << "Invalid URL" << endl;
+      return 0x0;
+   }
+   size=file->GetSize();
+   buf = (char *)malloc(size+1);
+   file->ReadBuffer(buf, size);
+   saxParser->ParseBuffer(buf,size);
+   delete saxParser;
+   free(buf);
+   if (fError) return 0x0;
+   return fTreeList;
+}
diff --git a/ANALYSIS/AliXMLParser.h b/ANALYSIS/AliXMLParser.h
new file mode 100644 (file)
index 0000000..10e32d7
--- /dev/null
@@ -0,0 +1,69 @@
+/* 
+Author : Harsh Arora (harsh.arora@cern.ch)
+
+   
+AliXMLParser
+---------
+
+AliXMLParser is a tool to parse XML file and store it in trees
+
+*/
+
+#ifndef ALIXMLPARSER_H
+#define ALIXMLPARSER_H
+
+#ifndef ROOT_TList
+#include <TList.h>
+#endif
+
+#ifndef ROOT_TSAXParser
+#include <TSAXParser.h>
+#endif
+
+#ifndef ROOT_TXMLAttr
+#include <TXMLAttr.h>
+#endif
+
+#ifndef ROOT_TString
+#include <TString.h>
+#endif
+
+class AliXMLParser {
+public:
+   AliXMLParser();
+   AliXMLParser(const AliXMLParser& obj);
+   virtual ~AliXMLParser();
+   TList*   GetTreesFromXML(TString file);
+   TList*   GetTreesFromURL(TString host);
+
+//   -------------- Slot Functions -----------
+   void     OnStartDocument();
+   void     OnEndDocument();
+   void     OnStartElement(const char*, const TList*);
+   void     OnEndElement(const char*);
+   void     OnCharacters(const char*);
+   void     OnComment(const char*);
+   void     OnWarning(const char*);
+   void     OnError(const char*);
+   void     OnFatalError(const char*);
+   void     OnCdataBlock(const char*, Int_t);
+//   -----------------------------------------
+
+private:
+   int      GetEntryIndex(TString entry_name); //Reverse search for index of entry by name
+   TList*   fTreeList; //List of Trees made from tables
+   TString  fTableTag; //Identifier for new table
+   Bool_t   fInsideTree; //True if table_tag is identified
+   Int_t    fNumTokens; //Number of Attributes
+   TList*   fEntries; //List of Entries in a table
+   TList*   fVal; //Corresponding values of Entries in a Table
+   Int_t    fNumTrees; //Number of Trees
+   Bool_t   fError; //True if error in XML is encountered
+
+   ClassDef(AliXMLParser,0);
+
+   AliXMLParser& operator=(const AliXMLParser& other);
+};
+
+#endif
index 0788343..fae62d3 100644 (file)
@@ -35,6 +35,7 @@ set ( SRCS
     AliAnalysisGrid.cxx 
     AliAnalysisStatistics.cxx 
     AliAnalysisTaskCfg.cxx
+    AliXMLParser.cxx
     )
 
 string ( REPLACE ".cxx" ".h" HDRS "${SRCS}" )