]>
Commit | Line | Data |
---|---|---|
b2e7f2d6 | 1 | /** |
2 | * Scan a directory (optionally recursive) for data files to add to | |
3 | * the chain. Only ROOT files, and files which name contain the | |
4 | * passed pattern are considered. | |
5 | * | |
6 | * @param dir Directory to scan | |
7 | * @param chain Chain to add data to | |
8 | * @param pattern Pattern that the file name must contain | |
9 | * @param recursive Whether to scan recursively | |
10 | */ | |
11 | void | |
12 | ScanDirectory(TSystemDirectory* dir, TChain* chain, | |
13 | const char* pattern, bool recursive) | |
14 | { | |
15 | // Get list of files, and go back to old working directory | |
16 | TString oldDir(gSystem->WorkingDirectory()); | |
17 | TList* files = dir->GetListOfFiles(); | |
18 | gSystem->ChangeDirectory(oldDir); | |
19 | ||
20 | // Sort list of files and check if we should add it | |
21 | files->Sort(); | |
22 | TIter next(files); | |
23 | TSystemFile* file = 0; | |
24 | while ((file = static_cast<TSystemFile*>(next()))) { | |
25 | TString name(file->GetName()); | |
26 | ||
27 | // Ignore special links | |
28 | if (name == "." || name == "..") continue; | |
29 | ||
30 | // Check if this is a directory | |
31 | if (file->IsDirectory()) { | |
32 | if (recursive) | |
33 | ScanDirectory(static_cast<TSystemDirectory*>(file),chain,recursive); | |
34 | continue; | |
35 | } | |
36 | ||
37 | // If this is not a root file, ignore | |
38 | if (!name.EndsWith(".root")) continue; | |
39 | ||
40 | // If this file does not contain the pattern, ignore | |
41 | if (!name.Contains(pattern)) continue; | |
42 | ||
43 | // Get the path | |
44 | TString data(Form("%s/%s", file->GetTitle(), name.Data())); | |
45 | ||
46 | chain->Add(data); | |
47 | ||
48 | } | |
49 | } | |
50 | ||
51 | /** | |
52 | * Make a chain of specified data | |
53 | * | |
54 | * @param what What data to chain. Possible values are | |
55 | * - ESD Event summary data (AliESD) | |
56 | * - AOD Analysis object data (AliAOD) | |
57 | * - MC Simulation data (galice) | |
58 | * @param datadir Data directory to scan | |
59 | * @param recursive Whether to recurse into sub-directories | |
60 | * | |
61 | * @return Pointer to newly create chain, or null | |
62 | */ | |
63 | TChain* | |
64 | MakeChain(const char* what, const char* datadir, bool recursive=false) | |
65 | { | |
66 | TString w(what); | |
67 | w.ToUpper(); | |
68 | const char* treeName = 0; | |
69 | const char* pattern = 0; | |
70 | if (w.Contains("ESD")) { treeName = "esdTree"; pattern = "AliESD"; } | |
71 | else if (w.Contains("AOD")) { treeName = "aodTree"; pattern = "AliAOD"; } | |
72 | else if (w.Contains("MC")) { treeName = "TE"; pattern = "galice"; } | |
73 | else { | |
74 | Error("MakeChain", "Unknown mode '%s' (not one of ESD,AOD, or MC)", what); | |
75 | return 0; | |
76 | } | |
77 | ||
78 | // --- Our data chain ---------------------------------------------- | |
79 | TChain* chain = new TChain(treeName); | |
80 | ||
81 | // --- Get list of ESDs -------------------------------------------- | |
82 | // Open source directory, and make sure we go back to were we were | |
83 | TString oldDir(gSystem->WorkingDirectory()); | |
84 | TSystemDirectory d(datadir, datadir); | |
85 | ScanDirectory(&d, chain, pattern, recursive); | |
86 | ||
87 | return chain; | |
88 | } |