]>
Commit | Line | Data |
---|---|---|
8449e3e0 | 1 | #include <TFile.h> |
2 | #include <TList.h> | |
3 | #include <TParameter.h> | |
4 | #include <TError.h> | |
5 | #include "AliCorrectionManagerBase.h" | |
6 | ||
fe218435 | 7 | /** |
8 | * Extract corrections from result file | |
9 | * | |
10 | */ | |
8449e3e0 | 11 | struct CorrExtractor |
12 | { | |
fe218435 | 13 | /** |
14 | * Constructor | |
15 | * | |
16 | * @param manager Correction manager | |
17 | */ | |
8449e3e0 | 18 | CorrExtractor(AliCorrectionManagerBase* manager) |
19 | : fFile(0), | |
20 | fTop(0), | |
21 | fOut(""), | |
22 | fRunNo(0), | |
23 | fSys(0), | |
24 | fSNN(0), | |
fe218435 | 25 | fField(999), |
8449e3e0 | 26 | fMC(false), |
27 | fSatellite(false), | |
28 | fManager(manager) | |
29 | {} | |
30 | TCollection* GetCollection(TCollection* p, | |
31 | const TString& name) | |
32 | { | |
33 | TObject* o = 0; | |
34 | if (p == 0) { | |
35 | o = fFile->Get(name); | |
36 | if (!o) { | |
37 | Warning("CorrExtractor", "Object %s not found in file", name.Data()); | |
38 | return 0; | |
39 | } | |
40 | } | |
41 | else { | |
42 | o = p->FindObject(name); | |
43 | if (!o) { | |
44 | Warning("CorrExtractor", "Object %s not found in %s", | |
45 | name.Data(), p->GetName()); | |
46 | return 0; | |
47 | } | |
48 | } | |
49 | if (!o->IsA()->InheritsFrom(TCollection::Class())) { | |
50 | Warning("CorrExtractor", "%s in %s is not a collection, but a %s", | |
51 | name.Data(), (p ? p->GetName() : "file"), o->ClassName()); | |
52 | return 0; | |
53 | } | |
54 | return static_cast<TCollection*>(o); | |
55 | } | |
fe218435 | 56 | /** |
57 | * Find a collection in a file | |
58 | * | |
59 | * @param path Path to collection | |
60 | * | |
61 | * @return Found collection or null | |
62 | */ | |
8449e3e0 | 63 | TCollection* FindCollection(const TString& path) |
64 | { | |
65 | if (path.IsNull()) return 0; | |
66 | TObjArray* tokens = path.Tokenize("/"); | |
67 | TIter next(tokens); | |
68 | TObjString* token = 0; | |
69 | TCollection* p = 0; | |
70 | while ((token = static_cast<TObjString*>(next()))) { | |
71 | const TString& t = token->String(); | |
72 | if (t.IsNull()) continue; | |
73 | p = GetCollection(p, t); | |
74 | if (!p) break; | |
75 | } | |
76 | tokens->Delete(); | |
77 | return p; | |
78 | ||
79 | } | |
fe218435 | 80 | /** |
81 | * Find an object | |
82 | * | |
83 | * @param path Path to object | |
84 | * @param name Name of object | |
85 | * | |
86 | * @return Found object or null | |
87 | */ | |
8449e3e0 | 88 | TObject* FindObject(const TString& path, |
89 | const TString& name) | |
90 | { | |
91 | if (path.IsNull()) { | |
92 | TObject* o = fFile->Get(name); | |
93 | if (!o) { | |
94 | Warning("CorrExtractor", "Object %s not found in file", | |
95 | name.Data()); | |
96 | return 0; | |
97 | } | |
98 | return o; | |
99 | } | |
100 | TCollection* p = FindCollection(path); | |
101 | if (!p) { | |
102 | Warning("CorrExtractor", "Path %s invalid", path.Data()); | |
103 | return 0; | |
104 | } | |
105 | return p->FindObject(name); | |
106 | } | |
fe218435 | 107 | /** |
108 | * Initialize this extactor | |
109 | * | |
110 | * @param fileName File to extract from | |
111 | * @param sumFolder The summed folder | |
112 | * @param out The result folder | |
113 | * | |
114 | * @return true on success | |
115 | */ | |
8449e3e0 | 116 | Bool_t Init(const TString& fileName, |
117 | const TString& sumFolder, | |
118 | const TString& out) | |
119 | { | |
120 | fOut = out; | |
121 | Clear(); | |
122 | ||
123 | fFile = TFile::Open(fileName, "READ"); | |
124 | if (!fFile) { | |
125 | Error("CorrExtractor", "Failed to open \"%s\"", fileName.Data()); | |
126 | Clear(); | |
127 | return false; | |
128 | } | |
129 | TCollection* c = FindCollection(Form("%s/fmdEventInspector", | |
130 | sumFolder.Data())); | |
131 | if (!c) { | |
132 | Error("CorrExtractor", "Couldn't get event inspector list from %s", | |
133 | fileName.Data()); | |
134 | Clear(); | |
135 | return false; | |
136 | } | |
137 | TObject* oSys = c->FindObject("sys"); | |
138 | TObject* oSNN = c->FindObject("sNN"); | |
139 | TObject* oFld = c->FindObject("field"); | |
140 | TObject* oRun = c->FindObject("runNo"); | |
141 | TObject* oSat = c->FindObject("satellite"); | |
fe218435 | 142 | if (oSys && fSys <= 0) fSys = oSys->GetUniqueID(); |
143 | if (oSNN && fSNN <= 0) fSNN = oSNN->GetUniqueID(); | |
144 | if (oFld && fField >= 999) fField = oFld->GetUniqueID(); | |
145 | if (oRun && fRunNo <= 0) fRunNo = oRun->GetUniqueID(); | |
146 | if (oSat) fSatellite = oSat->GetUniqueID(); | |
8449e3e0 | 147 | |
fe218435 | 148 | if (fSys <= 0 || fSys > 3 || fSNN <= 0 || fField >= 999 || fRunNo <= 0 ){ |
8449e3e0 | 149 | Error("CorrExtractor", "Failed to get settings"); |
150 | Clear(); | |
151 | return false; | |
152 | } | |
153 | return true; | |
154 | } | |
fe218435 | 155 | /** |
156 | * Set whether this is MC or not | |
157 | * | |
158 | * @param mc If true, consider this MC | |
159 | */ | |
8449e3e0 | 160 | void SetMC(Bool_t mc=true) { fMC = mc; } |
fe218435 | 161 | /** |
162 | * Extract the stuff | |
163 | * | |
164 | * @param cls Class of object | |
165 | * @param parent Parent folder | |
166 | * | |
167 | * @return | |
168 | */ | |
8449e3e0 | 169 | Bool_t Extract(const TClass* cls, const TString& parent) |
170 | { | |
171 | return Extract(cls->GetName(), parent); | |
172 | } | |
fe218435 | 173 | /** |
174 | * Extract the stuff | |
175 | * | |
176 | * @param objName Object name | |
177 | * @param parent Parent folder | |
178 | * | |
179 | * @return | |
180 | */ | |
8449e3e0 | 181 | Bool_t Extract(const TString& objName, |
182 | const TString& parent="") | |
183 | { | |
184 | if (!fFile) { | |
185 | Warning("Extract", "No file opened"); | |
186 | return false; | |
187 | } | |
188 | TObject* o = FindObject(parent, objName); | |
189 | if (!o) { | |
190 | Warning("Extract", "Object %s not found in collection %s", | |
191 | objName.Data(), parent.Data()); | |
192 | return false; | |
193 | } | |
194 | return fManager->Store(o, | |
195 | fRunNo, | |
196 | fSys, | |
197 | fSNN, | |
198 | fField, | |
199 | fMC, | |
200 | fSatellite, | |
201 | fOut.Data()); | |
202 | } | |
fe218435 | 203 | /** |
204 | * Clear this extractor | |
205 | * | |
206 | */ | |
8449e3e0 | 207 | void Clear() |
208 | { | |
81775aba | 209 | if (!fFile) return; |
210 | fFile->Close(); | |
8449e3e0 | 211 | fFile = 0; |
212 | fTop = 0; | |
213 | fRunNo = 0; | |
214 | fSys = 0; | |
215 | fSNN = 0; | |
81775aba | 216 | fField = 999; |
8449e3e0 | 217 | fMC = false; |
218 | fSatellite = false; | |
219 | } | |
fe218435 | 220 | TFile* fFile; // Our file |
221 | TList* fTop; // Top list | |
222 | TString fOut; // Output | |
223 | ULong_t fRunNo; // Run number | |
224 | UShort_t fSys; // System | |
225 | UShort_t fSNN; // Collision energy in GeV | |
226 | Short_t fField; // L3 field in kG | |
227 | Bool_t fMC; // Simulation flag | |
228 | Bool_t fSatellite; // Satellite interaction flag | |
229 | AliCorrectionManagerBase* fManager; // Correction manager to use | |
8449e3e0 | 230 | }; |
231 | ||
232 | // | |
233 | // EOF | |
234 | // | |
235 | ||
236 |