Temporary: do not link AliHLTMUON.so
[u/mrichter/AliRoot.git] / ANALYSIS / AliXMLCollection.cxx
CommitLineData
d08133e6 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15
16/* $Id$ */
17
18//-----------------------------------------------------------------
19// Implementation of the AliXMLCollection class
20// This is the class that creates XML collections after querying the tags
21// Origin: Panos Christakoglou, UOA-CERN, Panos.Christakoglou@cern.ch
22//-----------------------------------------------------------------
23
24//ROOT
25#include <Riostream.h>
26#include <TEntryList.h>
27#include <TList.h>
28#include <TMap.h>
29#include <TObjArray.h>
30#include <TObjString.h>
31#include <TString.h>
32#include <TXMLEngine.h>
33
34#include "AliXMLCollection.h"
35
36ClassImp(AliXMLCollection)
37
38//___________________________________________________________________________
39 AliXMLCollection::AliXMLCollection() :
40 TGridCollection(),
41 fXmlFile(),
42 fEventList(0),
43 fEventListIter(0),
44 fCurrent(0),
45 fCollectionName(),
46 fout() {
47 //Default constructor
48}
49
50//___________________________________________________________________________
51AliXMLCollection::AliXMLCollection(const char *localcollectionfile) {
52 // Create Alien event collection, by reading collection for the specified
53 // file.
54
55 fXmlFile = localcollectionfile;
56 fEventList = new TList();
57 fEventList->SetOwner(kTRUE);
58 fEventListIter = new TIter(fEventList);
59 fCurrent = 0;
60 if (localcollectionfile!=0) {
61 ParseXML();
62 }
63}
64
65//___________________________________________________________________________
66AliXMLCollection::AliXMLCollection(const AliXMLCollection& collection):
67 TGridCollection(collection),
68 fXmlFile(collection.fXmlFile),
69 fCollectionName(collection.fCollectionName) {
70 //copy constructor
71
72 if (collection.fEventList) fEventList = new TList();
73 if (collection.fEventListIter) fEventListIter = new TIter(fEventList);
74 if (collection.fCurrent) fCurrent = 0;
75}
76
77//___________________________________________________________________________
78AliXMLCollection::~AliXMLCollection() {
79 //Destructor
80 if(fEventList) delete fEventList;
81 if(fEventListIter) delete fEventListIter;
82}
83
84//___________________________________________________________________________
85Bool_t AliXMLCollection::WriteHeader() {
86 //Creates the xml output file
87
88 TString xmlName = fCollectionName;
89 xmlName += ".xml";
90
91 TString collectionHeader = "<collection name=";
92 collectionHeader += "\"";
93 collectionHeader += fCollectionName;
94 collectionHeader += "\"";
95 collectionHeader += ">";
96
97 // Open the output stream
98 fout.open(xmlName);
99 fout<<"<?xml version=\"1.0\"?>\n";
100 fout<<"<alien>\n";
101 fout<<" "<<collectionHeader<<"\n";
102
103 return kTRUE;
104}
105
106//___________________________________________________________________________
107Bool_t AliXMLCollection::WriteBody(Int_t counter, const char* guid, const char* lfn, const char* turl, TEntryList *list) {
108 //Writes the body of the xml collection
109 TString listline;
110 for(Int_t i = 0; i < list->GetN(); i++) {
111 listline += list->GetEntry(i);
112 listline += ",";
113 }
114 listline = listline(0,listline.Length()-1);
115
116 TString line0 = "<event name=\"";
117 line0 += counter;
118 line0 += "\">";
119
120 TString line1 = "<file name=\"AliESDs.root\" ";
121 line1 += "guid=\"";
122 line1 += guid;
123 line1 += "\" ";
124 line1 += "lfn=\"";
125 line1 += lfn;
126 line1 += "\" ";
127 line1 += "turl=\"";
128 line1 += turl;
129 line1 += "\" ";
130 line1 += "evlist=\"";
131 line1 += listline;
132 line1 += "\"";
133 line1 += " />";
134
135 fout<<" "<<line0<<"\n";
136 fout<<" "<<line1<<"\n";
137 fout<<" </event>\n";
138
139 return kTRUE;
140}
141
142//___________________________________________________________________________
143Bool_t AliXMLCollection::Export() {
144 //Closes the stream
145 fout<<" "<<"</collection>\n";
146 fout<<"</alien>\n";
147
148 fout.close();
149
150 return kTRUE;
151}
152
153//___________________________________________________________________________
154void AliXMLCollection::Reset() {
155 // Reset file iterator.
156
157 fEventListIter->Reset();
158 fCurrent = 0;
159}
160
161//___________________________________________________________________________
162TMap *AliXMLCollection::Next() {
163 // Return next event file map.
164
165 fCurrent = (TMap*)fEventListIter->Next();
166 return fCurrent;
167}
168
169//___________________________________________________________________________
170const char *AliXMLCollection::GetTURL(const char* filename) const {
171 // Get a file's transport URL (TURL). Returns 0 in case of error.
172
173 if (fCurrent) {
174 TMap *obj = (TMap*)fCurrent->GetValue(filename);
175 if (obj) {
176 if (obj->GetValue("turl")) {
177 return ( ((TObjString*)obj->GetValue("turl"))->GetName());
178 }
179 }
180 }
181 Error("GetTURL","cannot get TURL of file %s",filename);
182 return 0;
183}
184
185//___________________________________________________________________________
186const char *AliXMLCollection::GetGUID(const char* filename) const {
187 // Get a file's transport UID. Returns 0 in case of error.
188
189 if (fCurrent) {
190 TMap *obj = (TMap*)fCurrent->GetValue(filename);
191 if (obj) {
192 if (obj->GetValue("guid")) {
193 return ( ((TObjString*)obj->GetValue("guid"))->GetName());
194 }
195 }
196 }
197 Error("GetGUID","cannot get GUID of file %s",filename);
198 return 0;
199}
200
201//___________________________________________________________________________
202TEntryList *AliXMLCollection::GetEventList(const char *filename) const {
203 // Get a file's event list. Returns 0 in case of error.
204
205 if (fCurrent) {
206 TMap *obj = (TMap *) fCurrent->GetValue(filename);
207 if (obj) {
208 if (obj->GetValue("evlist")) {
209 return ((TEntryList *) obj->GetValue("evlist"));
210 }
211 }
212 }
213 Error("GetEvList", "cannot get evelist of file %s", filename);
214 return 0;
215}
216
217//___________________________________________________________________________
218Bool_t AliXMLCollection::Remove(TMap * map) {
219 // Return next event file map.
220 if (fEventList->Remove(map)) {
221 return kTRUE;
222 } else {
223 return kFALSE;
224 }
225}
226
227//___________________________________________________________________________
228const char *AliXMLCollection::GetLFN(const char* ) const {
229 // Get a file's LFN. Returns 0 in case of error.
230
231 if (fCurrent) {
232 TMap *obj = (TMap *) fCurrent->GetValue("");
233 if (obj) {
234 if (obj->GetValue("lfn")) {
235 return (((TObjString *) obj->GetValue("lfn"))->GetName());
236 }
237 }
238 }
239 Error("GetLFN", "cannot get LFN");
240 return 0;
241}
242
243//__________________________________________________________________________
244Bool_t AliXMLCollection::OverlapCollection(AliXMLCollection * comparator) {
245 // return kTRUE if comparator overlaps with this
246 if ((!comparator)) return kFALSE;
247
248 loopagain:
249 // loop over col1 and try to find it in col2
250 this->Reset();
251 // loop over all elements in reference (=this)
252 TMap *overlapmap;
253 while ((overlapmap = this->Next())) {
254 comparator->Reset();
255 Bool_t found = kFALSE;
256 // try to find in the comparator collection
257 while ((comparator->Next())) {
258 TString s1 = this->GetLFN("");
259 TString s2 = comparator->GetLFN("");
260 if (s1 == s2) {
261 found = kTRUE;
262 break;
263 }
264 }
265 if (!found) {
266 this->Remove(overlapmap);
267 goto loopagain;
268 }
269 }
270 return kTRUE;
271}
272
273//___________________________________________________________________________
274AliXMLCollection *AliXMLCollection::Open(const char *localcollectionfile) {
275 // Static method used to create an Alien event collection, by reading
276 // collection for the specified file.
277
278 AliXMLCollection *collection = new AliXMLCollection(localcollectionfile);
279 return collection;
280}
281
282//___________________________________________________________________________
283void AliXMLCollection::ParseXML() {
284 // Parse event file collection XML file.
285
286 TXMLEngine xml;
287
288 XMLDocPointer_t xdoc = xml.ParseFile(fXmlFile);
289 if (!xdoc) {
290 Error("ParseXML","cannot parse the xml file %s",fXmlFile.Data());
291 return;
292 }
293
294 XMLNodePointer_t xalien = xml.DocGetRootElement(xdoc);
295 if (!xalien) {
296 Error("ParseXML","cannot find the <alien> tag in %s",fXmlFile.Data());
297 return;
298 }
299
300 XMLNodePointer_t xcollection = xml.GetChild(xalien);
301 if (!xcollection) {
302 Error("ParseXML","cannot find the <collection> tag in %s",fXmlFile.Data());
303 return;
304 }
305
306 XMLNodePointer_t xevent = xml.GetChild(xcollection);;
307 if (!xevent) {
308 Error("ParseXML","cannot find the <event> tag in %s",fXmlFile.Data());
309 return;
310 }
311 if (!xevent) return;
312
313 do {
314 if (xml.GetAttr(xevent, "name")) {
315 TMap *files = new TMap();
316
317 // files
318 XMLNodePointer_t xfile = xml.GetChild(xevent);
319 if (!xfile) continue;
320
321 Bool_t firstfile=kTRUE;
322 do {
323 // here we have an event file
324 // get the attributes;
325 xml.GetAttr(xfile, "lfn");
326 xml.GetAttr(xfile, "turl");
327
328 TMap *attributes = new TMap();
329 TObjString *oname = new TObjString(xml.GetAttr(xfile,"name"));
330 TObjString *oturl = new TObjString(xml.GetAttr(xfile,"turl"));
331 TObjString *olfn = new TObjString(xml.GetAttr(xfile,"lfn"));
332 TObjString *oguid = new TObjString(xml.GetAttr(xfile,"guid"));
333 TObjString *oevlist = new TObjString(xml.GetAttr(xfile, "evlist"));
334 printf("Collection: %s - The Eventlist is %s\n",fXmlFile.Data(),oevlist->GetName());
335 if (oevlist->GetName() != "") {
336 TEntryList *xmlevlist = new TEntryList(oturl->GetName(), oguid->GetName());
337 TString stringevlist = oevlist->GetName();
338 TObjArray *evlist = stringevlist.Tokenize(",");
339 for (Int_t n = 0; n < evlist->GetEntries(); n++) xmlevlist->Enter(atol(((TObjString *) evlist->At(n))->GetName()));
340 attributes->Add(new TObjString("evlist"), xmlevlist);
341 }
342
343 attributes->Add(new TObjString("name"),oname);
344 attributes->Add(new TObjString("turl"),oturl);
345 attributes->Add(new TObjString("lfn"),olfn);
346 attributes->Add(new TObjString("guid"),oguid);
347 files->Add(new TObjString(xml.GetAttr(xfile,"name")) , attributes);
348
349 // we add the first file always as a file without name to the map
350 if (firstfile) {
351 files->Add(new TObjString(""),attributes);
352 firstfile=kFALSE;
353 }
354 } while ((xfile = xml.GetNext(xfile)));
355 fEventList->Add(files);
356 }
357 } while ((xevent = xml.GetNext(xevent)));
358}
359