1 // Author: Benjamin Hess 29/01/2010
3 /*************************************************************************
4 * Copyright (C) 2009-2010, Alexandru Bercuci, Benjamin Hess. *
5 * All rights reserved. *
6 *************************************************************************/
9 //////////////////////////////////////////////////////////////////////////
11 // AliEveTRDTrackList //
13 // An AliEveTRDTrackList is, in principal, a TEveElementList with some //
14 // sophisticated features. You can add macros to this list, which then //
15 // can be applied to the list of tracks (these tracks can be added to //
16 // the list in the same way as for the TEveElementList). In general, //
17 // please use AddMacro(...) for this purpose. //
18 // Macros that are no longer needed can be removed from the list via //
19 // RemoveSelectedMacros(...).This function takes an iterator of the //
20 // list of macros that are to be removed. //
21 // be removed. An entry looks like: //
22 // The data for each macro consists of path, name, type and the command //
23 // that will be used to apply the macro. This stuff is stored in a map //
24 // which takes the macro name for the key and the above mentioned data //
25 // in a TMacroData-object for the value. //
26 // You can get the macro type via GetMacroType(...). //
27 // With ApplySTSelectionMacros(...) or ApplyProcessMacros(...) //
28 // respectively you can apply the macros to the track list via //
29 // iterators (same style like for RemoveSelectedMacros(...)(cf. above)).//
30 // Selection macros (de-)select macros according to a selection rule //
31 // by setting the rnr-state of the tracks. //
32 // If multiple selection macros are applied, a track is selected, if //
33 // all selection macros select the track. //
34 // Process macros create data or histograms, which will be stored in //
35 // a temporary file. The editor of this class will access this file //
36 // and draw all the stuff within it's DrawHistos() function. The file //
37 // will be deleted by the destructor. //
39 // Currently, the following macro types are supported: //
40 // Selection macros: //
41 // Bool_t YourMacro(const AliTRDtrackV1*); //
42 // Bool_t YourMacro(const AliTRDtrackV1*, const AliTRDtrackV1*); //
45 // void YourMacro(const AliTRDtrackV1*, Double_t*&, Int_t&); //
46 // void YourMacro(const AliTRDtrackV1*, const AliTRDtrackV1*, //
47 // Double_t*&, Int_t&); //
48 // TH1* YourMacro(const AliTRDtrackV1*); //
49 // TH1* YourMacro(const AliTRDtrackV1*, const AliTRDtrackV1*); //
51 // The macros which take 2 tracks are applied to all track pairs //
52 // (whereby BOTH tracks of the pair have to be selected by the single //
53 // track selection macros and have to be unequal, otherwise they will //
54 // be skipped) that have been selected by ALL correlated tracks //
55 // selection macros. The selection macros with 2 tracks do NOT affect //
56 // process macros that process only a single track! //
57 //////////////////////////////////////////////////////////////////////////
60 // Uncomment to display debugging infos
61 //#define ALIEVETRDTRACKLIST_DEBUG
64 #include <TFunction.h>
68 #include <TObjString.h>
72 #include <TTreeStream.h>
73 #include <TMethodCall.h>
75 #include <AliTRDReconstructor.h>
77 #include <EveDet/AliEveTRDTrackList.h>
78 #include <EveDet/AliEveTRDTrackListEditor.h>
80 #include <../PWG1/TRD/AliTRDrecoTask.h>
81 #include <../PWG1/TRD/AliTRDpwg1Helper.h>
83 ClassImp(AliEveTRDTrackList)
85 ///////////////////////////////////////////////////////////
86 ///////////// AliEveTRDTrackList ////////////////////////
87 ///////////////////////////////////////////////////////////
88 AliEveTRDTrackList::AliEveTRDTrackList(const Text_t* n, const Text_t* t, Bool_t doColor):
89 TEveElementList(n, t, doColor),
91 fDataFromMacroList(0x0),
94 fHistoDataSelected(0),
95 fMacroListSelected(0),
96 fSelectedTab(1), // Standard tab: "Apply macros" (index 1)
99 // Creates the AliEveTRDTrackList.
101 // Only accept childs of type AliEveTRDTrack
102 SetChildClass(AliEveTRDTrack::Class());
104 // Allocate memory for the lists and declare them as owners of their contents
105 fDataFromMacroList = new TList();
106 fDataFromMacroList->TCollection::SetOwner(kTRUE);
108 fMacroList = new TMap();
109 // Set map to owner of it's objects to delete them, if they are removed from the map
110 fMacroList->SetOwnerKeyValue(kTRUE, kTRUE);
112 // Set the build directory for AClic
113 if(gSystem->AccessPathName(Form("%s/.trdQArec" , gSystem->Getenv("HOME")))) gSystem->Exec("mkdir $HOME/.trdQArec");
114 gSystem->SetBuildDir(Form("%s/.trdQArec", gSystem->Getenv("HOME")));
116 AddStandardContent();
119 //______________________________________________________
120 AliEveTRDTrackList::~AliEveTRDTrackList()
122 // Frees allocated memory (lists etc.).
124 // Let the editor know that the list will be destroyed -> The editor will save the data
127 fEditor->SaveMacroList(fMacroList);
131 if (fDataFromMacroList != 0)
133 fDataFromMacroList->Delete();
134 delete fDataFromMacroList;
135 fDataFromMacroList = 0;
144 fMacroList->DeleteAll();
148 // Note: gSystem->AccessPathName(...) returns kTRUE, if the access FAILED!
149 if(!gSystem->AccessPathName(Form("/tmp/TRD.TrackListMacroData_%s.root", gSystem->Getenv("USER"))))
150 gSystem->Exec(Form("rm /tmp/TRD.TrackListMacroData_%s.root", gSystem->Getenv("USER")));
153 //______________________________________________________
154 Int_t AliEveTRDTrackList::AddMacro(const Char_t* path, const Char_t* nameC, Bool_t forceReload)
156 // Checks, if the file exists and if the signature is correct.
157 // If these criteria are fullfilled, the library for this macro is built
158 // and the macro is added to the corresponding list.
159 // Supported macro types:
161 // Bool_t YourMacro(const AliTRDtrackV1*)
162 // Bool_t YourMacro(const AliTRDtrackV1*, const AliTRDtrackV1*)
165 // void YourMacro(const AliTRDtrackV1*, Double_t*&, Int_t&)
166 // void YourMacro(const AliTRDtrackV1*, const AliTRDtrackV1*,
167 // Double_t*&, Int_t&)
168 // TH1* YourMacro(const AliTRDtrackV1*)
169 // TH1* YourMacro(const AliTRDtrackV1*, const AliTRDtrackV1*)
171 Char_t pathname[fkMaxMacroPathNameLength];
172 memset(pathname, '\0', sizeof(Char_t) * fkMaxMacroPathNameLength);
174 // Expand the path and create the pathname
175 Char_t* systemPath = gSystem->ExpandPathName(path);
176 snprintf(pathname, fkMaxMacroPathNameLength, "%s/%s", systemPath, nameC);
180 // Delete ".C" from filename
181 Char_t name[fkMaxMacroNameLength];
182 memset(name, '\0', sizeof(Char_t) * fkMaxMacroNameLength);
184 for (UInt_t ind = 0; ind < fkMaxMacroNameLength && ind < strlen(nameC) - 2; ind++) name[ind] = nameC[ind];
186 // Check, if files exists
188 if((fp = fopen(pathname, "rb"))){
191 } else return NOT_EXIST_ERROR;
193 // Clean up root, load the desired macro and then check the type of the macro
194 // A.B. gROOT->Reset();
196 gROOT->ProcessLineSync(Form(".L %s+%c", pathname, forceReload ? '+' : ' '));
198 // We need this line... otherwise, in some cases, there will be problems concerning ACLIC
199 gROOT->ProcessLineSync(Form(".L %s", pathname));
201 AliEveTRDTrackListMacroType type = GetMacroType(name, kFALSE);
204 // A.B. gROOT->Reset();
206 // Has not the correct signature!
207 if (type == kUnknown) return SIGNATURE_ERROR;
209 // Only add macro, if it is not already in the list
210 Int_t returnValue = WARNING;
211 if(fMacroList->GetValue(name) == 0) {
212 returnValue = AddMacroFast(path, name, type) ? SUCCESS : ERROR;
217 //______________________________________________________
218 Bool_t AliEveTRDTrackList::AddMacroFast(const Char_t* path, const Char_t* name, AliEveTRDTrackListMacroType type)
220 // Adds a macro (path/name) to the corresponding list. No checks are performed (file exist,
221 // macro already in list/map, signature correct), no libraries are created!
222 // You can use this function only, if the macro has been added successfully before
223 // (and then maybe was removed). The function is very fast. On success kTRUE is returned, otherwise: kFALSE;
225 Bool_t success = kFALSE;
229 case kSingleTrackSelect:
230 case kCorrelTrackSelect:
231 case kSingleTrackAnalyse:
232 case kSingleTrackHisto:
233 case kCorrelTrackAnalyse:
234 case kCorrelTrackHisto:
235 fMacroList->Add(new TObjString(name), new TMacroData(name, path, type));
237 // We do not know, where the element has been inserted - deselect this list
238 fMacroListSelected = 0;
242 #ifdef ALIEVETRDTRACKLIST_DEBUG
243 // Successfull add will only be displayed in debug mode
244 printf("AliEveTRDTrackList::AddMacroFast: Added macro \"%s/%s\" to the corresponding list\n", path, name);
250 // Error will always be displayed
251 printf("AliEveTRDTrackList::AddMacroFast: ERROR: Could not add macro \"%s/%s\" to the corresponding list\n",
262 //______________________________________________________
263 void AliEveTRDTrackList::AddStandardContent()
265 // Adds standard macros to the macro list.
267 // Add your standard macros here, e.g.:
268 // To add a macro use:
269 // AddMacro("$(ALICE_ROOT)/myFolder", "myMacroName.C");
270 // -> If the file does not exist, nothing happens. So if you want to handle this,
271 // use the return value of AddMacro (NOT_EXIST_ERROR is returned, if file does not exist)
272 // (-> You can also check for other return values (see AddMacro(...)))
274 const Char_t *libs[] = {"libANALYSIS.so", "libANALYSISalice.so", "libTENDER.so", "libPWG1.so"};
275 Int_t nlibs = static_cast<Int_t>(sizeof(libs)/sizeof(Char_t *));
276 for(Int_t ilib=0; ilib<nlibs; ilib++){
277 if(gSystem->Load(libs[ilib]) >= 0) continue;
278 AliError(Form("Fail loading %s.", libs[ilib]));
282 const Char_t *fgkTRDPWG1taskClassName[AliTRDpwg1Helper::kNTRDQATASKS] = {
291 AliTRDrecoTask *task(NULL);
293 for(Int_t it=2; it<AliTRDpwg1Helper::kNTRDQATASKS; it++){
294 TClass c(fgkTRDPWG1taskClassName[it]);
295 task = (AliTRDrecoTask*)c.New();
296 task->SetMCdata(kFALSE);
297 if(!(fPlots = task->GetPlotFunctors())){
298 //AliWarning(Form("No Plot functors defined for task \"%s\"", fgkTRDtaskClassName[it]));
302 if(!(task->Histos())){
303 //AliWarning(Form("No Ref Histograms defined for task \"%s\"", fgkTRDtaskClassName[it]));
308 // export task to CINT and add functions
309 gROOT->ProcessLine(Form("%s* %s = (%s*)%p;", fgkTRDPWG1taskClassName[it], task->GetName(), fgkTRDPWG1taskClassName[it], (void*)task));
310 TIter iter(fPlots); TMethodCall *m = 0x0;
311 while((m = dynamic_cast<TMethodCall*>(iter()))){
312 AddMacroFast("", Form("%s->%s", task->GetName(), m->GetMethodName()), kSingleTrackHisto);
318 //______________________________________________________
319 Bool_t AliEveTRDTrackList::ApplyProcessMacros(const TList* selIterator, const TList* procIterator)
321 // Uses the procIterator (for the selected process macros) to apply the selected macros to the data.
322 // Returns kTRUE on success, otherwise kFALSE. If there no process macros selected, kTRUE is returned
323 // (this is no error!).
324 // The single track process macros are applied to all selected tracks.
325 // The selIterator (for the selected selection macros) will be used to apply the correlated tracks selection
326 // macros to all track pairs (whereby BOTH tracks have to be selected, otherwise they will be skipped).
327 // All track pairs that have been selected by ALL correlated tracks selection macros will be processed by
328 // the correlated tracks process macros.
330 // No process macros need to be processed
331 if (procIterator->GetEntries() <= 0) return kTRUE;
334 // A.B. gROOT->Reset();
336 // Clear old data and re-allocate
338 TDirectory *cwd = gDirectory;
339 fDataTree = new TTreeSRedirector(Form("/tmp/TRD.TrackListMacroData_%s.root", gSystem->Getenv("USER")));
343 Error("Apply process macros", Form("File \"/tmp/TRD.TrackListMacroData_%s.root\" could not be accessed properly!", gSystem->Getenv("USER")));
347 if (fDataFromMacroList != 0) {
348 fDataFromMacroList->Delete();
349 delete fDataFromMacroList;
351 fDataFromMacroList = new TList();
352 fDataFromMacroList->TCollection::SetOwner(kTRUE);
354 fHistoDataSelected = 0;
357 TMacroData* macro = 0;
359 TString* procCmds = new TString[procIterator->GetEntries()];
360 AliEveTRDTrackListMacroType* mProcType = new AliEveTRDTrackListMacroType[procIterator->GetEntries()];
362 TString* selCmds(NULL);
363 AliEveTRDTrackListMacroType* mSelType(NULL);
364 if (selIterator->GetEntries() > 0) {
365 selCmds = new TString[selIterator->GetEntries()];
366 mSelType = new AliEveTRDTrackListMacroType[selIterator->GetEntries()];
369 Bool_t selectedByCorrSelMacro = kFALSE;
371 AliEveTRDTrackListMacroType macroType = kUnknown;
372 Int_t numHistoMacros = 0;
375 AliEveTRDTrack* track1(NULL);
376 AliEveTRDTrack* track2(NULL);
378 // Collect the commands for each process macro and add them to "data-from-list"
379 for (Int_t i = 0; i < procIterator->GetEntries(); i++){
380 macro = (TMacroData*)fMacroList->GetValue(procIterator->At(i)->GetTitle());
383 Error("Apply process macros",
384 Form("Macro list is corrupted: Macro \"%s\" is not registered!",
385 procIterator->At(i)->GetTitle()));
389 #ifdef ALIEVETRDTRACKLIST_DEBUG
390 printf("AliEveTRDTrackList: Checking process macro: %s\n", macro->GetName());
393 // Find the type of the process macro
394 macroType = macro->GetType();
395 if (macroType == kSingleTrackHisto || macroType == kCorrelTrackHisto){
396 mProcType[i] = macroType;
398 // Create the command
399 procCmds[i] = macro->GetCmd();
401 // Add to "data-from-list" -> Mark as a histo macro with the substring "(histo macro)"
402 fDataFromMacroList->Add(new TObjString(Form("%s (histo macro)", macro->GetName())));
403 } else if (macroType == kSingleTrackAnalyse || macroType == kCorrelTrackAnalyse) {
404 mProcType[i] = macroType;
405 // Create the command
406 procCmds[i] = macro->GetCmd();
408 // Add to "data-from-list"
409 fDataFromMacroList->Add(new TObjString(macro->GetName()));
411 Error("Apply process macros",
412 Form("Macro list corrupted: Macro \"%s/%s.C\" is not registered as a process macro!",
413 macro->GetPath(), macro->GetName()));
414 mProcType[i] = kUnknown;
418 // Collect the commands for each selection macro and add them to "data-from-list"
419 for (Int_t i = 0; i < selIterator->GetEntries(); i++){
420 macro = (TMacroData*)fMacroList->GetValue(selIterator->At(i)->GetTitle());
423 Error("Apply process macros",
424 Form("Macro list is corrupted: Macro \"%s\" is not registered!",
425 selIterator->At(i)->GetTitle()));
429 #ifdef ALIEVETRDTRACKLIST_DEBUG
430 printf("AliEveTRDTrackList: Checking selection macro: %s\n", macro->GetName());
433 // Find the type of the process macro
434 macroType = macro->GetType();
436 // Single track select macro
437 if (macroType == kSingleTrackSelect) {
438 // Has already been processed by ApplySTSelectionMacros(...)
439 if(mSelType) mSelType[i] = macroType;
441 // Correlated tracks select macro
442 else if (macroType == kCorrelTrackSelect) {
443 if(mSelType) mSelType[i] = macroType;
445 // Create the command
446 if(selCmds) selCmds[i] = macro->GetCmd();
448 Error("Apply process macros",
449 Form("Macro list corrupted: Macro \"%s/%s.C\" is not registered as a selection macro!",
450 macro->GetPath(), macro->GetName()));
451 if(mSelType) mSelType[i] = kUnknown;
455 // Allocate memory for the histograms
456 if (numHistoMacros > 0) histos = new TH1*[numHistoMacros];
457 memset(histos, 0, numHistoMacros*sizeof(TH1*));
460 //////////////////////////////////
461 // WALK THROUGH THE LIST OF TRACKS
462 //////////////////////////////////
463 for (TEveElement::List_i iter = this->BeginChildren(); iter != this->EndChildren(); ++iter){
464 if(!(track1 = dynamic_cast<AliEveTRDTrack*>(*iter))) continue;
466 // Skip tracks that have not been selected
467 if (!track1->GetRnrState()) continue;
469 // Cast to AliTRDtrackV1
470 gROOT->ProcessLineSync(Form("AliEveTRDTrack *automaticTrack = (AliEveTRDTrack*)%p;", (void*)track1));
471 gROOT->ProcessLineSync("AliTRDtrackV1* automaticTrackV1_1 = (AliTRDtrackV1*)automaticTrack->GetUserData();");
473 // Collect data for each macro
474 for (Int_t i = 0, histoIndex = 0; i < procIterator->GetEntries(); i++){
475 // Single track histo
476 if (mProcType[i] == kSingleTrackHisto){
477 if(histos) histos[histoIndex++] = (TH1*)gROOT->ProcessLineSync(procCmds[i]);
478 // Correlated tracks histo
479 } else if (mProcType[i] == kCorrelTrackHisto) {
480 // Loop over all pairs behind the current one - together with the other loop this will be a loop
481 // over all pairs. We have a pair of tracks, if and only if both tracks of the pair are selected (Rnr-state)
482 // and are not equal.
483 // The correlated tracks process macro will be applied to all pairs that will be additionally selected by
484 // all correlated tracks selection macros.
485 TEveElement::List_i iter2 = iter;
487 for ( ; iter2 != this->EndChildren(); ++iter2)
489 if(!(track2 = dynamic_cast<AliEveTRDTrack*>(*iter2))) continue;
491 // Skip tracks that have not been selected
492 if (!track2->GetRnrState()) continue;
494 // Cast to AliTRDtrackV1
495 gROOT->ProcessLineSync(Form("AliEveTRDTrack *automaticTrack = (AliEveTRDTrack*)%p;", (void*)track2));
496 gROOT->ProcessLineSync("AliTRDtrackV1* automaticTrackV1_2 = (AliTRDtrackV1*)automaticTrack->GetUserData();");
498 // Select track by default (so it will be processed, if there are no correlated tracks selection macros!)
499 selectedByCorrSelMacro = kTRUE;
500 for (Int_t j = 0; j < selIterator->GetEntries(); j++){
501 if (mSelType && mSelType[j] == kCorrelTrackSelect){
502 selectedByCorrSelMacro = (Bool_t)gROOT->ProcessLineSync(selCmds[j]);
503 if (!selectedByCorrSelMacro) break;
507 // If the pair has not been selected by the correlated tracks selection macros, skip it!
508 if (!selectedByCorrSelMacro) continue;
510 if(histos) histos[histoIndex] = (TH1*)gROOT->ProcessLineSync(procCmds[i]);
514 // Single track analyse
515 else if (mProcType[i] == kSingleTrackAnalyse) {
516 // Create data pointers in CINT, execute the macro and get the data
517 gROOT->ProcessLineSync("Double_t* results = 0;");
518 gROOT->ProcessLineSync("Int_t n = 0;");
519 gROOT->ProcessLineSync(procCmds[i]);
520 Double_t* results = (Double_t*)gROOT->ProcessLineSync("results;");
521 Int_t nResults = (Int_t)gROOT->ProcessLineSync("n;");
524 Error("Apply macros", Form("Error reading data from macro \"%s\"", procIterator->At(i)->GetTitle()));
527 for (Int_t resInd = 0; resInd < nResults; resInd++){
528 (*fDataTree) << Form("TrackData%d", i) << Form("Macro%d=", i) << results[resInd] << (Char_t*)"\n";
534 // Correlated tracks analyse
535 else if (mProcType[i] == kCorrelTrackAnalyse){
536 // Loop over all pairs behind the current one - together with the other loop this will be a loop
537 // over all pairs. We have a pair of tracks, if and only if both tracks of the pair are selected (Rnr-state)
538 // and are not equal.
539 // The correlated tracks process macro will be applied to all pairs that will be additionally selected by
540 // all correlated tracks selection macros.
541 TEveElement::List_i iter2 = iter;
544 for ( ; iter2 != this->EndChildren(); ++iter2) {
545 if(!(track2 = dynamic_cast<AliEveTRDTrack*>(*iter2))) continue;
547 // Skip tracks that have not been selected
548 if (!track2->GetRnrState()) continue;
550 // Cast to AliTRDtrackV1
551 gROOT->ProcessLineSync(Form("AliEveTRDTrack *automaticTrack = (AliEveTRDTrack*)%p;", (void*)track2));
552 gROOT->ProcessLineSync("AliTRDtrackV1* automaticTrackV1_2 = (AliTRDtrackV1*)automaticTrack->GetUserData();");
554 // Select track by default (so it will be processed, if there are no correlated tracks selection macros!)
555 selectedByCorrSelMacro = kTRUE;
556 for (Int_t j = 0; j < selIterator->GetEntries(); j++) {
557 if (mSelType && mSelType[j] == kCorrelTrackSelect) {
558 selectedByCorrSelMacro = (Bool_t)gROOT->ProcessLineSync(selCmds[j]);
559 if (!selectedByCorrSelMacro) break;
563 // If the pair has not been selected by the correlated tracks selection macros, skip it!
564 if (!selectedByCorrSelMacro) continue;
566 // Create data pointers in CINT, execute the macro and get the data
567 gROOT->ProcessLineSync("Double_t* results = 0;");
568 gROOT->ProcessLineSync("Int_t n = 0;");
569 gROOT->ProcessLineSync(procCmds[i]);
570 Double_t* results = (Double_t*)gROOT->ProcessLineSync("results;");
571 Int_t nResults = (Int_t)gROOT->ProcessLineSync("n;");
574 Error("Apply macros", Form("Error reading data from macro \"%s\"", procIterator->At(i)->GetTitle()));
577 for (Int_t resInd = 0; resInd < nResults; resInd++) {
578 (*fDataTree) << Form("TrackData%d", i) << Form("Macro%d=", i) << results[resInd] << (Char_t*)"\n";
588 for (Int_t i = 0, histoIndex = 0; i < procIterator->GetEntries() && histoIndex < numHistoMacros; i++) {
589 if (mProcType[i] == kSingleTrackHisto || mProcType[i] == kCorrelTrackHisto) {
590 // Might be empty (e.g. no tracks have been selected)!
591 if (histos[histoIndex]) {
592 (*fDataTree) << Form("TrackData%d", i) << Form("Macro%d=", i) << histos[histoIndex] << (Char_t*)"\n";
598 if (fDataTree) delete fDataTree;
601 if (procCmds) delete [] procCmds;
603 if (mProcType) delete [] mProcType;
606 if (selCmds) delete [] selCmds;
608 if (mSelType) delete [] mSelType;
611 if (histos) delete [] histos;
615 // A.B. gROOT->Reset();
617 // If there is data, select the first data set
618 if (procIterator->GetEntries() > 0) SETBIT(fHistoDataSelected, 0);
620 // Now the data is stored in "/tmp/TRD.TrackListMacroData_$USER.root"
621 // The editor will access this file to display the data
625 //______________________________________________________
626 void AliEveTRDTrackList::ApplySTSelectionMacros(const TList* iterator)
628 // Uses the iterator (for the selected selection macros) to apply the selected macros to the data.
629 // The rnr-states of the tracks are set according to the result of the macro calls (kTRUE, if all
630 // macros return kTRUE for this track, otherwise: kFALSE).
631 // "ST" stands for "single track". This means that only single track selection macros are applied.
632 // Correlated tracks selection macros will be used inside the call of ApplyProcessMacros(...)!
634 TMacroData* macro = 0;
635 AliEveTRDTrackListMacroType macroType = kUnknown;
636 AliEveTRDTrack* track1 = 0;
637 Bool_t selectedByMacro = kFALSE;
640 // A.B. gROOT->Reset();
642 // Select all tracks at first. A track is then deselected, if at least one selection macro
643 // returns kFALSE for this track.
644 // Enable all tracks (Note: EnableListElements(..) will call "ElementChanged", which will cause unforeseen behaviour!)
645 for (TEveElement::List_i iter = this->BeginChildren(); iter != this->EndChildren(); ++iter) ((TEveElement*)(*iter))->SetRnrState(kTRUE);
648 for (Int_t i = 0; i < iterator->GetEntries(); i++){
649 macro = (TMacroData*)fMacroList->GetValue(iterator->At(i)->GetTitle());
652 Error("Apply selection macros",
653 Form("Macro list is corrupted: Macro \"%s\" is not registered!", iterator->At(i)->GetTitle()));
657 #ifdef ALIEVETRDTRACKLIST_DEBUG
658 printf("AliEveTRDTrackList: Applying selection macro: %s\n", macro->GetName());
661 // Determine macro type
662 macroType = macro->GetType();
664 // Single track select macro
665 if (macroType == kSingleTrackSelect){
666 // Walk through the list of tracks
667 for (TEveElement::List_i iter = this->BeginChildren(); iter != this->EndChildren(); ++iter)
669 track1 = dynamic_cast<AliEveTRDTrack*>(*iter);
671 if (!track1) continue;
673 // If the track has already been deselected, nothing is to do here
674 if (!track1->GetRnrState()) continue;
676 // Cast to AliTRDtrackV1
677 gROOT->ProcessLineSync(Form("AliEveTRDTrack *automaticTrack = (AliEveTRDTrack*)%p;", (void*)track1));
678 gROOT->ProcessLineSync("AliTRDtrackV1* automaticTrackV1_1 = (AliTRDtrackV1*)automaticTrack->GetUserData();");
679 selectedByMacro = (Bool_t)gROOT->ProcessLineSync(macro->GetCmd());
680 track1->SetRnrState(selectedByMacro && track1->GetRnrState());
683 // Correlated tracks select macro
684 else if (macroType == kCorrelTrackSelect){
685 // Will be processed in ApplyProcessMacros(...)
688 Error("Apply selection macros",
689 Form("Macro list corrupted: Macro \"%s/%s.C\" is not registered as a selection macro!",
690 macro->GetPath(), macro->GetName()));
695 // A.B. gROOT->Reset();
698 //______________________________________________________
699 AliEveTRDTrackList::AliEveTRDTrackListMacroType AliEveTRDTrackList::GetMacroType(const Char_t* name, Bool_t UseList) const
701 // Returns the type of the corresponding macro.
702 // If "UseList" is kTRUE, the type will be looked up in the internal list (very fast). But if this list
703 // does not exist, you have to use kFALSE for this parameter. Then the type will be determined by the
704 // prototype! NOTE: It is assumed that the macro has been compiled! If not, the return value is not
705 // predictable, but normally will be kUnknown.
706 // Note: AddMacro(Fast) will update the internal list and RemoveMacros respectively.
708 AliEveTRDTrackListMacroType type = kUnknown;
710 // Re-do the check of the macro type
712 // Single track select macro or single track histo macro?
713 TFunction* f = gROOT->GetGlobalFunctionWithPrototype(name, "const AliTRDtrackV1*", kTRUE);
716 // Some additional check (is the parameter EXACTLY of the desired type?)
717 if (strstr(f->GetMangledName(), "oPconstsPAliTRDtrackV1mUsP") != 0x0)
719 // Single track select macro?
720 if (!strcmp(f->GetReturnTypeName(), "Bool_t"))
722 type = kSingleTrackSelect;
724 // single track histo macro?
725 else if (!strcmp(f->GetReturnTypeName(), "TH1*"))
727 type = kSingleTrackHisto;
731 // Single track analyse macro?
732 else if ((f = gROOT->GetGlobalFunctionWithPrototype(name, "const AliTRDtrackV1*, Double_t*&, Int_t&", kTRUE))
735 if (!strcmp(f->GetReturnTypeName(), "void"))
737 // Some additional check (are the parameters EXACTLY of the desired type?)
738 if (strstr(f->GetMangledName(), "oPconstsPAliTRDtrackV1mUsP") != 0x0 &&
739 strstr(f->GetMangledName(), "cODouble_tmUaNsP") != 0x0 &&
740 strstr(f->GetMangledName(), "cOInt_taNsP") != 0x0)
742 type = kSingleTrackAnalyse;
746 // Correlated tracks select macro or correlated tracks histo macro?
747 else if ((f = gROOT->GetGlobalFunctionWithPrototype(name, "const AliTRDtrackV1*, const AliTRDtrackV1*", kTRUE))
750 // Some additional check (is the parameter EXACTLY of the desired type?)
751 if (strstr(f->GetMangledName(), "oPconstsPAliTRDtrackV1mUsP") != 0x0 &&
752 strstr(f->GetMangledName(), "cOconstsPAliTRDtrackV1mUsP") != 0x0)
754 // Correlated track select macro?
755 if (!strcmp(f->GetReturnTypeName(), "Bool_t"))
757 type = kCorrelTrackSelect;
759 // Correlated track histo macro?
760 else if (!strcmp(f->GetReturnTypeName(), "TH1*"))
762 type = kCorrelTrackHisto;
766 // Correlated tracks analyse macro?
767 else if ((f = gROOT->GetGlobalFunctionWithPrototype(name,
768 "const AliTRDtrackV1*, const AliTRDtrackV1*, Double_t*&, Int_t&", kTRUE))
771 if (!strcmp(f->GetReturnTypeName(), "void"))
773 // Some additional check (is the parameter EXACTLY of the desired type?)
774 if (strstr(f->GetMangledName(), "oPconstsPAliTRDtrackV1mUsP") != 0x0 &&
775 strstr(f->GetMangledName(), "cOconstsPAliTRDtrackV1mUsP") != 0x0 &&
776 strstr(f->GetMangledName(), "cODouble_tmUaNsP") != 0x0 &&
777 strstr(f->GetMangledName(), "cOInt_taNsP") != 0x0)
779 type = kCorrelTrackAnalyse;
784 // Use list to look up the macro type
787 TMacroData* macro = 0;
788 macro = (TMacroData*)fMacroList->GetValue(name);
789 if (macro == 0) return kUnknown;
791 type = macro->GetType();
794 case kSingleTrackSelect:
795 case kSingleTrackAnalyse:
796 case kSingleTrackHisto:
797 case kCorrelTrackSelect:
798 case kCorrelTrackAnalyse:
799 case kCorrelTrackHisto:
810 //______________________________________________________
811 void AliEveTRDTrackList::RemoveSelectedMacros(const TList* iterator)
813 // Uses the iterator (for the selected macros) to remove the selected macros from
814 // the corresponding list.
818 for (Int_t i = 0; i < iterator->GetEntries(); i++)
820 entry = (TPair*)fMacroList->FindObject(iterator->At(i)->GetTitle());
824 Error("AliEveTRDTrackList::RemoveSelectedMacros", Form("Macro \"%s\" not found in list!",
825 iterator->At(i)->GetTitle()));
832 Error("AliEveTRDTrackList::RemoveSelectedMacros", Form("Key for macro \"%s\" not found in list!",
833 iterator->At(i)->GetTitle()));
837 // Key and value will be deleted, too, since fMacroList is the owner of them
838 Bool_t rem = fMacroList->DeleteEntry(key);
842 #ifdef ALIEVETRDTRACKLIST_DEBUG
843 printf("AliEveTRDTrackList::RemoveSelectedMacros(): Removed macro: %s\n", iterator->At(i)->GetTitle());
848 Error("AliEveTRDTrackList::RemoveSelectedMacros", Form("Macro \"%s\" could not be removed from the list!",
849 iterator->At(i)->GetTitle()));
854 //______________________________________________________
855 void AliEveTRDTrackList::UpdateTrackStyle(AliEveTRDTrack::AliEveTRDTrackState s, UChar_t ss)
857 // Updates the track style and sets this style for each track.
861 case AliEveTRDTrack::kSource:
862 SETBIT(fSelectedStyle, AliEveTRDTrack::kSource);
864 case AliEveTRDTrack::kPID:
865 CLRBIT(fSelectedStyle, AliEveTRDTrack::kSource);
868 case AliTRDpidUtil::kLQ:
869 CLRBIT(fSelectedStyle, AliEveTRDTrack::kPID);
871 case AliTRDpidUtil::kNN:
872 SETBIT(fSelectedStyle, AliEveTRDTrack::kPID);
876 case AliEveTRDTrack::kTrackCosmics:
877 SETBIT(fSelectedStyle, AliEveTRDTrack::kTrackCosmics);
879 case AliEveTRDTrack::kTrackModel:
880 CLRBIT(fSelectedStyle, AliEveTRDTrack::kTrackCosmics);
883 case AliEveTRDTrack::kRieman:
884 CLRBIT(fSelectedStyle, AliEveTRDTrack::kTrackModel);
886 case AliEveTRDTrack::kKalman:
887 //AliWarning("Kalman fit under testing for the moment.");
888 SETBIT(fSelectedStyle, AliEveTRDTrack::kTrackModel);
895 // Walk through the list of tracks
896 AliEveTRDTrack* track = 0x0;
897 for (TEveElement::List_i iter = this->BeginChildren(); iter != this->EndChildren(); ++iter)
899 if (!(track = dynamic_cast<AliEveTRDTrack*>(*iter))) continue;
901 track->SetStatus(fSelectedStyle);