1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
16 // HFE correction framework container
17 // Contains many single containers
18 // Extra fuctionality like appending added
21 // Markus Fasel <M.Fasel@gsi.de>
26 #include <TCollection.h>
27 #include <THashList.h>
29 #include <TObjArray.h>
30 #include <TObjString.h>
33 #include "AliCFContainer.h"
34 #include "AliHFEcontainer.h"
35 #include "AliHFEtools.h"
37 ClassImp(AliHFEcontainer)
38 ClassImp(AliHFEcontainer::AliHFEvarInfo)
40 //__________________________________________________________________
41 AliHFEcontainer::AliHFEcontainer():
42 TNamed("HFEcontainer", ""),
49 // Default constructor
51 fContainers = new THashList();
54 //__________________________________________________________________
55 AliHFEcontainer::AliHFEcontainer(const Char_t *name):
63 // Default constructor
65 fContainers = new THashList();
68 //__________________________________________________________________
69 AliHFEcontainer::AliHFEcontainer(const Char_t *name, UInt_t nVar):
78 // Setting Number of Variables too
80 fContainers = new THashList();
81 SetNumberOfVariables(nVar);
84 //__________________________________________________________________
85 AliHFEcontainer::AliHFEcontainer(const AliHFEcontainer &ref):
90 fNEvents(ref.fNEvents)
94 // creates a new object with new containers
96 fContainers = new THashList;
97 for(Int_t ien = 0; ien < ref.fContainers->GetEntries(); ien++)
98 fContainers->Add(new AliCFContainer(*dynamic_cast<AliCFContainer *>(ref.fContainers->At(ien))));
100 fVariables = new TObjArray(fNVars);
101 for(UInt_t ivar = 0; ivar < fNVars; ivar++)
102 fVariables->AddAt(new AliHFEvarInfo(*dynamic_cast<AliHFEvarInfo *>(ref.fVariables->UncheckedAt(ivar))), ivar);
106 //__________________________________________________________________
107 AliHFEcontainer &AliHFEcontainer::operator=(const AliHFEcontainer &ref){
109 // Assignment operator
110 // Cleanup old object, create a new one with new containers inside
112 this->~AliHFEcontainer(); // cleanup old object before creating the new onwe
113 TNamed::operator=(ref);
114 fContainers = new THashList();
116 for(Int_t ien = 0; ien < ref.fContainers->GetEntries(); ien++)
117 fContainers->Add(new AliCFContainer(*dynamic_cast<AliCFContainer *>(ref.fContainers->At(ien))));
119 fVariables = new TObjArray(fNVars);
120 for(UInt_t ivar = 0; ivar < fNVars; ivar++)
121 fVariables->AddAt(new AliHFEvarInfo(*dynamic_cast<AliHFEvarInfo *>(ref.fVariables->UncheckedAt(ivar))), ivar);
129 //__________________________________________________________________
130 AliHFEcontainer::~AliHFEcontainer(){
134 fContainers->Delete();
137 fVariables->Delete();
142 //__________________________________________________________________
143 Long64_t AliHFEcontainer::Merge(TCollection *coll){
152 TIterator *iter = coll->MakeIterator();
155 while((o = iter->Next())){
156 AliHFEcontainer *cont = dynamic_cast<AliHFEcontainer *>(o);
159 // Merge the two TObjArrays
161 containers.Add(cont->fContainers);
162 fContainers->Merge(&containers);
164 fNEvents += cont->GetNumberOfEvents();
170 //__________________________________________________________________
171 void AliHFEcontainer::SetNumberOfVariables(UInt_t nVar){
173 // Define the number of variables
174 // Initialize containers for the variable informations
179 fVariables = new TObjArray(nVar);
180 for(UInt_t ivar = 0; ivar < nVar; ivar++)
181 fVariables->AddAt(new AliHFEvarInfo, ivar);
184 //__________________________________________________________________
185 void AliHFEcontainer::CreateContainer(const Char_t *name, const Char_t *title, UInt_t nStep){
187 // Create a new Correction Framework Container and store it
189 if(fContainers->FindObject(name)){
190 AliError(Form("Container %s already exists. Cannot replace it!", name));
194 Int_t *nBins = new Int_t[fNVars];
195 for(UInt_t ivar = 0; ivar < fNVars; ivar++) nBins[ivar] = (dynamic_cast<AliHFEvarInfo *>(fVariables->UncheckedAt(ivar)))->GetNumberOfBins();
196 AliHFEvarInfo *var = NULL;
197 AliCFContainer *cont = new AliCFContainer(name, title, nStep, fNVars, nBins);
198 for(UInt_t ivar = 0; ivar < fNVars; ivar++){
199 var = dynamic_cast<AliHFEvarInfo *>(fVariables->UncheckedAt(ivar));
200 cont->SetBinLimits(ivar, var->GetBinning());
201 cont->SetVarTitle(ivar, var->GetVarName()->Data());
204 fContainers->Add(cont);
205 AliInfo(Form("Container %s created with %d cut steps", name, nStep));
208 //__________________________________________________________________
209 AliCFContainer *AliHFEcontainer::GetCFContainer(const Char_t *name){
211 // Find a given container
213 return dynamic_cast<AliCFContainer *>(fContainers->FindObject(name));
216 //__________________________________________________________________
217 void AliHFEcontainer::FillCFContainer(const Char_t *name, UInt_t step, Double_t *content){
221 AliCFContainer *cont = GetCFContainer(name);
223 cont->Fill(content, step);
226 //__________________________________________________________________
227 AliCFContainer *AliHFEcontainer::MakeMergedCFContainer(const Char_t *name, const Char_t *title, const Char_t* contnames){
229 // Merge CF Container out of several containers
230 // Container names are separated by :
231 // returns a new object which has to be taken care of by the user
234 TObjArray *containers = TString(contnames).Tokenize(":");
235 // we first need the size of the container to be merged
236 Int_t nStepMerged = 0;
237 AliCFContainer *ctemp = NULL;
238 TObjString *cname = NULL;
239 for(Int_t icont = 0; icont < containers->GetEntries(); icont++){
240 cname = dynamic_cast<TObjString *>(containers->At(icont));
241 ctemp = dynamic_cast<AliCFContainer *>(fContainers->FindObject(cname->String().Data()));
243 AliWarning(Form("Container %s not found. It will be unprocessed", cname->String().Data()));
246 nStepMerged += ctemp->GetNStep();
248 AliInfo("Please Ignore the messgae comming from AliCFContainer!");
249 Int_t *dummyBinning = new Int_t[fNVars];
250 for(UInt_t ibin = 0; ibin < fNVars; ibin++) dummyBinning[ibin] = 1;
251 AliCFContainer *cmerged = new AliCFContainer(name, title, nStepMerged, fNVars, dummyBinning);
252 delete [] dummyBinning;
253 // Fill container with content
254 AliInfo("Filling new container");
256 for(Int_t icont = 0; icont < containers->GetEntries(); icont++){
257 cname = dynamic_cast<TObjString *>(containers->At(icont));
258 ctemp = dynamic_cast<AliCFContainer *>(fContainers->FindObject(cname->String().Data()));
260 for(Int_t istep = 0; istep < ctemp->GetNStep(); istep++)
261 cmerged->SetGrid(cstep++, new AliCFGridSparse(*ctemp->GetGrid(istep)));
265 //__________________________________________________________________
266 void AliHFEcontainer::MakeLinearBinning(UInt_t var, UInt_t nBins, Double_t begin, Double_t end){
268 // Set Linear binning for the given container
270 (dynamic_cast<AliHFEvarInfo *>(fVariables->UncheckedAt(var)))->SetBinning(nBins, AliHFEtools::MakeLinearBinning(nBins, begin, end));
273 //__________________________________________________________________
274 void AliHFEcontainer::MakeLogarithmicBinning(UInt_t var, UInt_t nBins, Double_t begin, Double_t end){
276 // Set Logarithmic binning for the given container
278 (dynamic_cast<AliHFEvarInfo *>(fVariables->UncheckedAt(var)))->SetBinning(nBins, AliHFEtools::MakeLogarithmicBinning(nBins, begin, end));
281 //__________________________________________________________________
282 void AliHFEcontainer::SetVariableName(UInt_t var, const Char_t *varname){
286 (dynamic_cast<AliHFEvarInfo *>(fVariables->UncheckedAt(var)))->SetVarName(varname);
289 //__________________________________________________________________
290 Int_t AliHFEcontainer::GetNumberOfCFContainers() const{
292 // Get the number of entries
294 return fContainers->GetEntries();
297 //__________________________________________________________________
298 void AliHFEcontainer::Print(const Option_t *)const{
300 // Print Container Status
302 std::cout << "Container status: " << std::endl;
303 std::cout << "=====================================================\n";
304 std::cout << "Number of variables: " << fNVars << std::endl;
306 UInt_t nVars = fVariables ? fVariables->GetEntriesFast() : 0;
308 std::cout << "Inconsistency in number of Variables [" << fNVars << "|" << nVars << "]" << std::endl;
309 AliHFEvarInfo *var = NULL;
310 for(UInt_t ivar = 0; ivar < fNVars; ivar++){
311 var = dynamic_cast<AliHFEvarInfo *>(fVariables->UncheckedAt(ivar));
312 std::cout << "Variable " << ivar << ": Name: " << var->GetVarName()->Data() << ", Number of Bins: " << var->GetNumberOfBins() << std::endl;
315 std::cout << std::endl;
317 // Print CF Containers:
318 std::cout << "Containers[" << fContainers->GetEntries() << "]: "<< std::endl;
319 std::cout << "=====================================================\n";
320 for(Int_t icont = 0; icont < fContainers->GetEntries(); icont++){
321 AliCFContainer *c = dynamic_cast<AliCFContainer *>(fContainers->At(icont));
322 std::cout << "Name: " << c->GetName() << ", Title: " << c->GetTitle() << std::endl;
323 for(Int_t istep = 0; istep < c->GetNStep(); istep++)
324 std::cout << "Step " << istep << ": Title " << c->GetStepTitle(istep) << std::endl;
325 std::cout << "------------------------------------------------------\n";
327 std::cout << "Number of Events: " << fNEvents << std::endl;
330 //------------------------------------ Content of class AliHFEvarInfo -----------------------------------
331 //__________________________________________________________________
332 AliHFEcontainer::AliHFEvarInfo::AliHFEvarInfo():
337 // Default constructor
338 fBinning = new TArrayD;
339 fVarName = new TString;
342 //__________________________________________________________________
343 AliHFEcontainer::AliHFEvarInfo::AliHFEvarInfo(const Char_t *name):
348 fBinning = new TArrayD;
349 fVarName = new TString(name);
352 //__________________________________________________________________
353 AliHFEcontainer::AliHFEvarInfo::AliHFEvarInfo(const AliHFEvarInfo &ref):
361 fVarName = new TString(*(ref.fVarName));
362 fBinning = new TArrayD(*(ref.fBinning));
365 //__________________________________________________________________
366 AliHFEcontainer::AliHFEvarInfo &AliHFEcontainer::AliHFEvarInfo::operator=(const AliHFEvarInfo &ref){
368 // Assignment operator
370 TObject::operator=(ref);
371 *fVarName = *(ref.fVarName);
372 *fBinning = *(ref.fBinning);
376 //__________________________________________________________________
377 AliHFEcontainer::AliHFEvarInfo::~AliHFEvarInfo(){
385 //__________________________________________________________________
386 void AliHFEcontainer::AliHFEvarInfo::SetVarName(const Char_t *name){
388 // Setter for var name
393 //__________________________________________________________________
394 void AliHFEcontainer::AliHFEvarInfo::SetBinning(UInt_t nBins, Double_t *content){
395 // Setter for binning
397 fBinning->Set(nBins + 1, content);