]>
Commit | Line | Data |
---|---|---|
81775aba | 1 | /** |
2 | * Get a collection from a file directory | |
3 | * | |
4 | * @param dir Parent directory | |
5 | * @param name Name of collection | |
6 | * | |
7 | * @return collection or null | |
8 | */ | |
9 | TCollection* GetCollection(TDirectory* dir, const TString& name) | |
10 | { | |
11 | if (!dir) { | |
12 | Error("GetCollection", "No parent directory for %s", name.Data()); | |
13 | return 0; | |
14 | } | |
15 | TCollection* ret = 0; | |
16 | dir->GetObject(name, ret); | |
17 | if (!ret) { | |
18 | Error("GetCollection", "Couldn't find %s in %s", | |
19 | name.Data(), dir->GetName()); | |
20 | return 0; | |
21 | } | |
22 | return ret; | |
23 | } | |
24 | /** | |
25 | * Get an object from a collection. Optionally, we check that the | |
26 | * type of the possibly found object matches the request. | |
27 | * | |
28 | * @param parent Parent collection | |
29 | * @param name Name of object | |
30 | * @param cls If specified, check that the found object (if any) is of | |
31 | * this class. | |
32 | * | |
33 | * @return Found object (possibly type-checked) or null | |
34 | */ | |
35 | TObject* GetObject(const TCollection* parent, const TString& name, | |
36 | const TClass* cls=0) | |
37 | { | |
38 | if (!parent) { | |
39 | Error("GetObject", "No parent collection for %s", name.Data()); | |
40 | return 0; | |
41 | } | |
42 | TObject* ret = parent->FindObject(name); | |
43 | if (!ret) { | |
44 | Error("GetObject", "Couldn't find %s in %s", | |
45 | name.Data(), parent->GetName()); | |
46 | return 0; | |
47 | } | |
48 | if (cls && !ret->IsA()->InheritsFrom(cls)) { | |
49 | Error("GetObject", "%s in %s is a %s, not a %s", name.Data(), | |
50 | parent->GetName(), ret->ClassName(), cls->GetName()); | |
51 | return 0; | |
52 | } | |
53 | return ret; | |
54 | } | |
55 | /** | |
56 | * Get a collection contained in another collection | |
57 | * | |
58 | * @param parent Parent collection | |
59 | * @param name Name of collection to find | |
60 | * | |
61 | * @return Found collection or null | |
62 | */ | |
63 | TCollection* GetCollection(const TCollection* parent, const TString& name) | |
64 | { | |
65 | TObject* o = GetObject(parent, name, TCollection::Class()); | |
66 | if (!o) return 0; | |
67 | return static_cast<TCollection*>(o); | |
68 | } | |
69 | /** | |
70 | * Re-run the energy loss fitter on a merged output file | |
71 | * | |
72 | * @param input File name of merged output file | |
73 | * @param output If specified, the file the new results are written | |
74 | * to. If this is not specified, it defaults to the name of the input | |
75 | * file with "_rerun" attached to the base name | |
c8b1a7db | 76 | * |
77 | * @param forceSet Forcibly set things | |
78 | * @param input Input file | |
79 | * @param output Output file | |
81775aba | 80 | */ |
e65b8b56 | 81 | void RerunELossFits(Bool_t forceSet=false, |
82 | const TString& input="forward_eloss.root", | |
a19faec0 | 83 | Bool_t shift=true, |
81775aba | 84 | const TString& output="") |
85 | { | |
86 | const char* fwd = "$ALICE_ROOT/PWGLF/FORWARD/analysis2"; | |
87 | gROOT->Macro(Form("%s/scripts/LoadLibs.C", fwd)); | |
88 | ||
e65b8b56 | 89 | TFile* inFile = 0; |
90 | TFile* outFile = 0; | |
91 | TString outName(output); | |
92 | if (outName.IsNull()) { | |
93 | outName = input; | |
94 | outName.ReplaceAll(".root", "_rerun.root"); | |
95 | } | |
a19faec0 | 96 | Bool_t allOk = false; |
81775aba | 97 | try { |
98 | // --- Open input file --------------------------------------------- | |
99 | inFile = TFile::Open(input, "READ"); | |
100 | if (!inFile) | |
101 | throw TString::Format("Failed to open %s", input.Data()); | |
102 | ||
103 | // --- InFiled input collections -------------------------------------- | |
a19faec0 | 104 | TCollection* inFwdSum = GetCollection(inFile, "ForwardELossSums"); |
81775aba | 105 | if (!inFwdSum) throw TString("Cannot proceed without sums"); |
106 | ||
a19faec0 | 107 | TCollection* inFwdRes = GetCollection(inFile, "ForwardELossResults"); |
81775aba | 108 | if (!inFwdRes) throw TString("Cannot proceed with merged list"); |
109 | ||
110 | TCollection* inEFSum = GetCollection(inFwdRes, "fmdEnergyFitter"); | |
111 | if (!inEFSum) throw TString("Cannot proceed without accumulated data"); | |
112 | ||
113 | TCollection* inEFRes = GetCollection(inFwdRes, "fmdEnergyFitter"); | |
114 | if (!inEFRes) throw TString("Cannot proceed without previous results"); | |
115 | ||
81775aba | 116 | // --- Open output file -------------------------------------------- |
81775aba | 117 | outFile = TFile::Open(outName, "RECREATE"); |
118 | if (!outFile) | |
e65b8b56 | 119 | throw TString::Format("Failed to open %s", outName.Data()); |
81775aba | 120 | |
121 | // --- Write copy of sum collection to output -------------------- | |
122 | TCollection* outFwdSum = static_cast<TCollection*>(inFwdSum->Clone()); | |
123 | outFile->cd(); | |
a19faec0 | 124 | outFwdSum->Write(inFwdSum->GetName(), TObject::kSingleKey); |
81775aba | 125 | |
126 | // --- Make our fitter object ------------------------------------ | |
127 | AliFMDEnergyFitter* fitter = new AliFMDEnergyFitter("energy"); | |
a19faec0 | 128 | fitter->SetDoFits(true); |
129 | fitter->SetEnableDeltaShift(shift); | |
130 | fitter->Init(); | |
e65b8b56 | 131 | if (forceSet || !fitter->ReadParameters(inEFSum)) { |
a19faec0 | 132 | Printf("Forced settings"); |
81775aba | 133 | |
e65b8b56 | 134 | const TAxis* etaAxis = static_cast<TAxis*>(GetObject(inEFSum,"etaAxis")); |
135 | if (!etaAxis) throw TString("Cannot proceed without eta axis"); | |
136 | fitter->SetEtaAxis(*etaAxis); | |
137 | ||
138 | // Set maximum energy loss to consider | |
139 | fitter->SetMaxE(15); | |
140 | // Set number of energy loss bins | |
141 | fitter->SetNEbins(500); | |
142 | // Set whether to use increasing bin sizes | |
143 | // fitter->SetUseIncreasingBins(true); | |
144 | // Set whether to do fit the energy distributions | |
145 | fitter->SetDoFits(kTRUE); | |
146 | // Set whether to make the correction object | |
147 | fitter->SetDoMakeObject(kTRUE); | |
148 | // Set the low cut used for energy | |
149 | fitter->SetLowCut(0.4); | |
150 | // Set the number of bins to subtract from maximum of distributions | |
151 | // to get the lower bound of the fit range | |
152 | fitter->SetFitRangeBinWidth(4); | |
153 | // Set the maximum number of landaus to try to fit (max 5) | |
154 | fitter->SetNParticles(5); | |
155 | // Set the minimum number of entries in the distribution before | |
156 | // trying to fit to the data - 10k seems the least we can do | |
157 | fitter->SetMinEntries(10000); | |
158 | // fitter->SetMaxChi2PerNDF(10); | |
159 | // Enable debug | |
160 | } | |
a19faec0 | 161 | fitter->SetDebug(3); |
e65b8b56 | 162 | fitter->SetStoreResiduals(AliFMDEnergyFitter::kResidualSquareDifference); |
a19faec0 | 163 | fitter->SetRegularizationCut(1e6); // Lower by factor 3 |
81775aba | 164 | // Set the number of bins to subtract from maximum of distributions |
165 | // to get the lower bound of the fit range | |
e65b8b56 | 166 | // fitter->SetFitRangeBinWidth(2); |
167 | // Skip all of FMD2 and 3 | |
168 | // fitter->SetSkips(AliFMDEnergyFitter::kFMD2|AliFMDEnergyFitter::kFMD3); | |
81775aba | 169 | |
170 | // --- Now do the fits ------------------------------------------- | |
171 | fitter->Print(); | |
a19faec0 | 172 | outFwdSum->ls("R"); |
81775aba | 173 | fitter->Fit(static_cast<TList*>(outFwdSum)); |
174 | ||
175 | // --- Copy full result folder ----------------------------------- | |
176 | TCollection* outFwdRes = static_cast<TCollection*>(inFwdRes->Clone()); | |
177 | // Remove old fits | |
178 | TCollection* outEFRes = GetCollection(outFwdRes, "fmdEnergyFitter"); | |
179 | outFwdRes->Remove(outEFRes); | |
180 | // Make our new fit results folder, and add it to results folder | |
181 | TCollection* tmp = GetCollection(outFwdSum, "fmdEnergyFitter"); | |
182 | outEFRes = static_cast<TCollection*>(tmp->Clone()); | |
183 | outEFRes->Add(new TNamed("refitted", "Refit of the data")); | |
184 | outFwdRes->Add(outEFRes); | |
185 | ||
186 | // --- Write out new results folder ------------------------------ | |
187 | outFile->cd(); | |
a19faec0 | 188 | outFwdRes->Write(inFwdRes->GetName(), TObject::kSingleKey); |
e65b8b56 | 189 | Printf("Wrote results to \"%s\" (%s)", outName.Data(), outFile->GetName()); |
a19faec0 | 190 | allOk = true; |
81775aba | 191 | } |
192 | catch (const TString& e) { | |
193 | Error("RerunELossFits", e); | |
194 | } | |
195 | if (inFile) inFile->Close(); | |
e65b8b56 | 196 | if (outFile) { |
197 | Printf("Wrote new output to \"%s\"", outName.Data()); | |
198 | outFile->Close(); | |
199 | } | |
81775aba | 200 | |
a19faec0 | 201 | if (allOk) |
202 | gROOT->Macro(Form("%s/corrs/DrawCorrELoss.C(false,false,\"%s\")", | |
203 | fwd, outName.Data())); | |
81775aba | 204 | } |
205 | ||
206 |