1. Correct inheritance of GetEntryList in AliXMLCollection + bug fix. 2. Extension...
[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
b09247a2 24#include <cstdlib>
d08133e6 25//ROOT
26#include <Riostream.h>
27#include <TEntryList.h>
28#include <TList.h>
29#include <TMap.h>
30#include <TObjArray.h>
31#include <TObjString.h>
32#include <TString.h>
33#include <TXMLEngine.h>
34
35#include "AliXMLCollection.h"
36
37ClassImp(AliXMLCollection)
d08133e6 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//___________________________________________________________________________
26f071d8 51AliXMLCollection::AliXMLCollection(const char *localcollectionfile) :
52 TGridCollection(),
53 fXmlFile(localcollectionfile),
54 fEventList(0),
55 fEventListIter(0),
56 fCurrent(0),
57 fCollectionName(),
58 fout()
59 {
d08133e6 60 // Create Alien event collection, by reading collection for the specified
61 // file.
62
d08133e6 63 fEventList = new TList();
64 fEventList->SetOwner(kTRUE);
65 fEventListIter = new TIter(fEventList);
26f071d8 66
d08133e6 67 if (localcollectionfile!=0) {
68 ParseXML();
69 }
70}
71
72//___________________________________________________________________________
73AliXMLCollection::AliXMLCollection(const AliXMLCollection& collection):
74 TGridCollection(collection),
75 fXmlFile(collection.fXmlFile),
26f071d8 76 fEventList(0),
77 fEventListIter(0),
78 fCurrent(0),
79 fCollectionName(collection.fCollectionName),
80 fout()
81{
d08133e6 82 //copy constructor
83
84 if (collection.fEventList) fEventList = new TList();
85 if (collection.fEventListIter) fEventListIter = new TIter(fEventList);
86 if (collection.fCurrent) fCurrent = 0;
87}
88
89//___________________________________________________________________________
90AliXMLCollection::~AliXMLCollection() {
91 //Destructor
92 if(fEventList) delete fEventList;
93 if(fEventListIter) delete fEventListIter;
94}
95
96//___________________________________________________________________________
97Bool_t AliXMLCollection::WriteHeader() {
98 //Creates the xml output file
99
100 TString xmlName = fCollectionName;
101 xmlName += ".xml";
102
103 TString collectionHeader = "<collection name=";
104 collectionHeader += "\"";
105 collectionHeader += fCollectionName;
106 collectionHeader += "\"";
107 collectionHeader += ">";
108
109 // Open the output stream
110 fout.open(xmlName);
111 fout<<"<?xml version=\"1.0\"?>\n";
112 fout<<"<alien>\n";
113 fout<<" "<<collectionHeader<<"\n";
114
115 return kTRUE;
116}
117
118//___________________________________________________________________________
119Bool_t AliXMLCollection::WriteBody(Int_t counter, const char* guid, const char* lfn, const char* turl, TEntryList *list) {
120 //Writes the body of the xml collection
121 TString listline;
122 for(Int_t i = 0; i < list->GetN(); i++) {
123 listline += list->GetEntry(i);
124 listline += ",";
125 }
126 listline = listline(0,listline.Length()-1);
127
128 TString line0 = "<event name=\"";
129 line0 += counter;
130 line0 += "\">";
131
132 TString line1 = "<file name=\"AliESDs.root\" ";
133 line1 += "guid=\"";
134 line1 += guid;
135 line1 += "\" ";
136 line1 += "lfn=\"";
137 line1 += lfn;
138 line1 += "\" ";
139 line1 += "turl=\"";
140 line1 += turl;
141 line1 += "\" ";
142 line1 += "evlist=\"";
143 line1 += listline;
144 line1 += "\"";
145 line1 += " />";
146
147 fout<<" "<<line0<<"\n";
148 fout<<" "<<line1<<"\n";
149 fout<<" </event>\n";
150
151 return kTRUE;
152}
153
154//___________________________________________________________________________
155Bool_t AliXMLCollection::Export() {
156 //Closes the stream
157 fout<<" "<<"</collection>\n";
158 fout<<"</alien>\n";
159
160 fout.close();
161
162 return kTRUE;
163}
164
165//___________________________________________________________________________
166void AliXMLCollection::Reset() {
167 // Reset file iterator.
168
169 fEventListIter->Reset();
170 fCurrent = 0;
171}
172
173//___________________________________________________________________________
174TMap *AliXMLCollection::Next() {
175 // Return next event file map.
176
177 fCurrent = (TMap*)fEventListIter->Next();
178 return fCurrent;
179}
180
181//___________________________________________________________________________
26f071d8 182const char *AliXMLCollection::GetTURL(const char* filename) {
d08133e6 183 // Get a file's transport URL (TURL). Returns 0 in case of error.
184
185 if (fCurrent) {
186 TMap *obj = (TMap*)fCurrent->GetValue(filename);
187 if (obj) {
188 if (obj->GetValue("turl")) {
189 return ( ((TObjString*)obj->GetValue("turl"))->GetName());
190 }
191 }
192 }
193 Error("GetTURL","cannot get TURL of file %s",filename);
194 return 0;
195}
196
197//___________________________________________________________________________
26f071d8 198const char *AliXMLCollection::GetGUID(const char* filename) {
d08133e6 199 // Get a file's transport UID. Returns 0 in case of error.
200
201 if (fCurrent) {
202 TMap *obj = (TMap*)fCurrent->GetValue(filename);
203 if (obj) {
204 if (obj->GetValue("guid")) {
205 return ( ((TObjString*)obj->GetValue("guid"))->GetName());
206 }
207 }
208 }
209 Error("GetGUID","cannot get GUID of file %s",filename);
210 return 0;
211}
212
213//___________________________________________________________________________
214TEntryList *AliXMLCollection::GetEventList(const char *filename) const {
215 // Get a file's event list. Returns 0 in case of error.
216
217 if (fCurrent) {
218 TMap *obj = (TMap *) fCurrent->GetValue(filename);
219 if (obj) {
220 if (obj->GetValue("evlist")) {
221 return ((TEntryList *) obj->GetValue("evlist"));
222 }
223 }
224 }
225 Error("GetEvList", "cannot get evelist of file %s", filename);
226 return 0;
227}
228
229//___________________________________________________________________________
230Bool_t AliXMLCollection::Remove(TMap * map) {
231 // Return next event file map.
232 if (fEventList->Remove(map)) {
233 return kTRUE;
234 } else {
235 return kFALSE;
236 }
237}
238
239//___________________________________________________________________________
26f071d8 240const char *AliXMLCollection::GetLFN(const char* ) {
d08133e6 241 // Get a file's LFN. Returns 0 in case of error.
242
243 if (fCurrent) {
244 TMap *obj = (TMap *) fCurrent->GetValue("");
245 if (obj) {
246 if (obj->GetValue("lfn")) {
247 return (((TObjString *) obj->GetValue("lfn"))->GetName());
248 }
249 }
250 }
251 Error("GetLFN", "cannot get LFN");
252 return 0;
253}
254
255//__________________________________________________________________________
26f071d8 256Bool_t AliXMLCollection::OverlapCollection(TGridCollection * comparator) {
d08133e6 257 // return kTRUE if comparator overlaps with this
258 if ((!comparator)) return kFALSE;
259
260 loopagain:
261 // loop over col1 and try to find it in col2
262 this->Reset();
263 // loop over all elements in reference (=this)
264 TMap *overlapmap;
265 while ((overlapmap = this->Next())) {
266 comparator->Reset();
267 Bool_t found = kFALSE;
268 // try to find in the comparator collection
269 while ((comparator->Next())) {
270 TString s1 = this->GetLFN("");
271 TString s2 = comparator->GetLFN("");
272 if (s1 == s2) {
273 found = kTRUE;
274 break;
275 }
276 }
277 if (!found) {
278 this->Remove(overlapmap);
279 goto loopagain;
280 }
281 }
282 return kTRUE;
283}
284
285//___________________________________________________________________________
286AliXMLCollection *AliXMLCollection::Open(const char *localcollectionfile) {
287 // Static method used to create an Alien event collection, by reading
288 // collection for the specified file.
289
290 AliXMLCollection *collection = new AliXMLCollection(localcollectionfile);
291 return collection;
292}
293
294//___________________________________________________________________________
295void AliXMLCollection::ParseXML() {
296 // Parse event file collection XML file.
297
298 TXMLEngine xml;
299
300 XMLDocPointer_t xdoc = xml.ParseFile(fXmlFile);
301 if (!xdoc) {
302 Error("ParseXML","cannot parse the xml file %s",fXmlFile.Data());
303 return;
304 }
305
306 XMLNodePointer_t xalien = xml.DocGetRootElement(xdoc);
307 if (!xalien) {
308 Error("ParseXML","cannot find the <alien> tag in %s",fXmlFile.Data());
309 return;
310 }
311
312 XMLNodePointer_t xcollection = xml.GetChild(xalien);
313 if (!xcollection) {
314 Error("ParseXML","cannot find the <collection> tag in %s",fXmlFile.Data());
315 return;
316 }
317
318 XMLNodePointer_t xevent = xml.GetChild(xcollection);;
319 if (!xevent) {
320 Error("ParseXML","cannot find the <event> tag in %s",fXmlFile.Data());
321 return;
322 }
323 if (!xevent) return;
324
325 do {
326 if (xml.GetAttr(xevent, "name")) {
327 TMap *files = new TMap();
328
329 // files
330 XMLNodePointer_t xfile = xml.GetChild(xevent);
331 if (!xfile) continue;
332
333 Bool_t firstfile=kTRUE;
334 do {
335 // here we have an event file
336 // get the attributes;
337 xml.GetAttr(xfile, "lfn");
338 xml.GetAttr(xfile, "turl");
339
340 TMap *attributes = new TMap();
341 TObjString *oname = new TObjString(xml.GetAttr(xfile,"name"));
342 TObjString *oturl = new TObjString(xml.GetAttr(xfile,"turl"));
343 TObjString *olfn = new TObjString(xml.GetAttr(xfile,"lfn"));
344 TObjString *oguid = new TObjString(xml.GetAttr(xfile,"guid"));
345 TObjString *oevlist = new TObjString(xml.GetAttr(xfile, "evlist"));
3d456d99 346 Info("ParseXML","Collection: %s - turl: %s eventlist: %s",
347 fXmlFile.Data(),oturl->GetName(),oevlist->GetName());
348 if (strcmp(oevlist->GetName(),"") != 0) {
d08133e6 349 TEntryList *xmlevlist = new TEntryList(oturl->GetName(), oguid->GetName());
350 TString stringevlist = oevlist->GetName();
351 TObjArray *evlist = stringevlist.Tokenize(",");
352 for (Int_t n = 0; n < evlist->GetEntries(); n++) xmlevlist->Enter(atol(((TObjString *) evlist->At(n))->GetName()));
353 attributes->Add(new TObjString("evlist"), xmlevlist);
354 }
355
356 attributes->Add(new TObjString("name"),oname);
357 attributes->Add(new TObjString("turl"),oturl);
358 attributes->Add(new TObjString("lfn"),olfn);
359 attributes->Add(new TObjString("guid"),oguid);
360 files->Add(new TObjString(xml.GetAttr(xfile,"name")) , attributes);
361
362 // we add the first file always as a file without name to the map
363 if (firstfile) {
364 files->Add(new TObjString(""),attributes);
365 firstfile=kFALSE;
366 }
367 } while ((xfile = xml.GetNext(xfile)));
368 fEventList->Add(files);
369 }
370 } while ((xevent = xml.GetNext(xevent)));
371}
372