1 ///////////////////////////////////////////////////////
3 // Basic class for Performance/Calibration TRD tasks
5 // It performs generic tasks like :
6 // - data file manegment
7 // - reference container management
8 // - debug container management
9 // - interaction with AliAnalysisManager
10 // - Plot functor loop
12 // Author: Alexandru Bercuci <A.Bercuci@gsi.de>, 10/09/2008
14 /////////////////////////////////////////////////////////
18 #include "TMethodCall.h"
19 #include "TMethodArg.h"
26 #include "TObjArray.h"
27 #include "TDirectory.h"
28 #include "TTreeStream.h"
31 #include "AliAnalysisTask.h"
33 #include "AliTRDrecoTask.h"
35 ClassImp(AliTRDrecoTask)
37 TList* AliTRDrecoTask::fgTrendPoint(NULL);
38 TTreeSRedirector* AliTRDrecoTask::fgDebugStream(NULL);
39 //_______________________________________________________
40 AliTRDrecoTask::AliTRDrecoTask()
50 // Default constructor
53 //_______________________________________________________
54 AliTRDrecoTask::AliTRDrecoTask(const char *name, const char *title)
55 : AliAnalysisTaskSE(name)
64 // Constructor for all derived performance tasks
67 DefineInput (1, TObjArray::Class()); // track list
68 DefineOutput(1, TObjArray::Class()); // histogram list
71 //_______________________________________________________
72 AliTRDrecoTask::~AliTRDrecoTask()
75 // Generic task destructor
77 AliDebug(2, Form(" Ending task %s[%s]", GetName(), GetTitle()));
84 fPlotFuncList->Delete();
90 if(fContainer->IsOwner()) fContainer->Delete();
96 TFile::Open("TRD.PerformanceTrend.root", "UPDATE");
97 fgTrendPoint->Write();
104 //_______________________________________________________
105 void AliTRDrecoTask::ConnectInputData(Option_t *)
108 // Connect input data
110 AliAnalysisTaskSE::ConnectInputData();
111 fTracks = dynamic_cast<TObjArray *>(GetInputData(1));
114 //_______________________________________________________
115 void AliTRDrecoTask::UserExec(Option_t *)
117 // Loop over Plot functors published by particular tasks
120 AliWarning("No functor list defined for the reference plots");
124 if(!fTracks->GetEntriesFast()) return;
125 else AliDebug(2, Form("Tracks[%d] for %s", fTracks->GetEntriesFast(), GetName()));
127 AliTRDtrackInfo *trackInfo = NULL;
128 TIter plotIter(fPlotFuncList);
129 TObjArrayIter trackIter(fTracks);
130 while((trackInfo = dynamic_cast<AliTRDtrackInfo*>(trackIter()))){
131 fkTrack = trackInfo->GetTrack();
132 fkMC = trackInfo->GetMCinfo();
133 fkESD = trackInfo->GetESDinfo();
135 TMethodCall *plot = NULL;
137 while((plot=dynamic_cast<TMethodCall*>(plotIter()))){
141 PostData(1, fContainer);
144 //_______________________________________________________
145 Bool_t AliTRDrecoTask::GetRefFigure(Int_t /*ifig*/)
147 AliWarning("Retrieving reference figures not implemented.");
151 //_______________________________________________________
152 Bool_t AliTRDrecoTask::PutTrendValue(const Char_t *name, Double_t val)
154 // Generic publisher for trend values
157 fgTrendPoint = new TList();
158 fgTrendPoint->SetOwner();
160 fgTrendPoint->AddLast(new TNamed(Form("%s_%s", GetName(), name), Form("%f", val)));
164 //_______________________________________________________
165 void AliTRDrecoTask::InitFunctorList()
167 // Initialize list of functors
169 TClass *c = this->IsA();
172 TIter methIter(c->GetListOfMethods());
173 while((m=dynamic_cast<TMethod*>(methIter()))){
174 TString name(m->GetName());
175 if(!name.BeginsWith("Plot")) continue;
176 if(!fPlotFuncList) fPlotFuncList = new TList();
177 fPlotFuncList->AddLast(new TMethodCall(c, (const char*)name, ""));
181 //_______________________________________________________
182 Bool_t AliTRDrecoTask::Load(const Char_t *filename)
184 // Generic container loader
186 if(!TFile::Open(filename)){
187 AliWarning(Form("Couldn't open file %s.", filename));
191 if(!(o = (TObjArray*)gFile->Get(GetName()))){
192 AliWarning("Missing histogram container.");
195 fContainer = (TObjArray*)o->Clone(GetName());
200 //________________________________________________________
201 Bool_t AliTRDrecoTask::Save(TObjArray * const results){
203 // Store the output graphs in a ROOT file
204 // Input TObject array will not be written as Key to the file,
205 // only content itself
208 TDirectory *cwd = gDirectory;
209 if(!TFile::Open(Form("TRD.Result%s.root", GetName()), "RECREATE")) return kFALSE;
211 TIterator *iter = results->MakeIterator();
212 TObject *inObject = NULL, *outObject = NULL;
213 while((inObject = iter->Next())){
214 outObject = inObject->Clone();
215 outObject->Write(NULL, TObject::kSingleKey);
218 gFile->Close(); delete gFile;
223 //_______________________________________________________
224 Bool_t AliTRDrecoTask::PostProcess()
226 // To be implemented by particular tasks
228 AliWarning("Post processing of reference histograms not implemented.");
232 //_______________________________________________________
233 void AliTRDrecoTask::SetDebugLevel(Int_t level)
235 // Generic debug handler
237 AliAnalysisTaskSE::SetDebugLevel(level);
239 TDirectory *savedir = gDirectory;
240 fgDebugStream = new TTreeSRedirector("TRD.DebugPerformance.root");
245 //____________________________________________________________________
246 void AliTRDrecoTask::Terminate(Option_t *)
253 delete fgDebugStream;
254 fgDebugStream = NULL;
256 if(HasPostProcess()) PostProcess();
259 //________________________________________________________
260 void AliTRDrecoTask::Adjust(TF1 *f, TH1 * const h)
262 // Helper function to avoid duplication of code
263 // Make first guesses on the fit parameters
265 // find the intial parameters of the fit !! (thanks George)
266 Int_t nbinsy = Int_t(.5*h->GetNbinsX());
268 for(Int_t jbin=nbinsy-4; jbin<=nbinsy+4; jbin++) sum+=h->GetBinContent(jbin); sum/=9.;
269 f->SetParLimits(0, 0., 3.*sum);
270 f->SetParameter(0, .9*sum);
272 f->SetParLimits(1, -.2, .2);
273 f->SetParameter(1, -0.1);
275 f->SetParLimits(2, 0., 4.e-1);
276 f->SetParameter(2, 2.e-2);
277 if(f->GetNpar() <= 4) return;
279 f->SetParLimits(3, 0., sum);
280 f->SetParameter(3, .1*sum);
282 f->SetParLimits(4, -.3, .3);
283 f->SetParameter(4, 0.);
285 f->SetParLimits(5, 0., 1.e2);
286 f->SetParameter(5, 2.e-1);