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