// Uncomment to display debugging infos
//#define ALIEVETRDTRACKLIST_DEBUG
-#include "AliEveTRDTrackList.h"
-
-#include <EveDet/AliEveTRDTrackListEditor.h>
-#include <AliTRDReconstructor.h>
#include <TFile.h>
#include <TFunction.h>
#include <TH1.h>
#include <TSystem.h>
#include <TTree.h>
#include <TTreeStream.h>
+#include <TMethodCall.h>
+
+#include <AliTRDReconstructor.h>
+
+#include <EveDet/AliEveTRDTrackList.h>
+#include <EveDet/AliEveTRDTrackList.h>
+#include <EveDet/AliEveTRDTrackListEditor.h>
+
+#include <qaRec/AliTRDrecoTask.h>
+#include <qaRec/run.h>
ClassImp(AliEveTRDTrackList)
if(gSystem->AccessPathName(Form("%s/.trdQArec" , gSystem->Getenv("HOME")))) gSystem->Exec("mkdir $HOME/.trdQArec");
gSystem->SetBuildDir(Form("%s/.trdQArec", gSystem->Getenv("HOME")));
- AddStandardMacros();
+ AddStandardContent();
}
//______________________________________________________
for (UInt_t ind = 0; ind < fkMaxMacroNameLength && ind < strlen(nameC) - 2; ind++) name[ind] = nameC[ind];
// Check, if files exists
- FILE* fp = 0;
-
- fp = fopen(pathname, "rb");
- if (fp != 0)
- {
+ FILE* fp = 0x0;
+ if((fp = fopen(pathname, "rb"))){
fclose(fp);
- fp = 0;
- }
- else return NOT_EXIST_ERROR;
+ fp = 0x0;
+ } else return NOT_EXIST_ERROR;
// Clean up root, load the desired macro and then check the type of the macro
- gROOT->Reset();
+ // A.B. gROOT->Reset();
- if (forceReload) gROOT->ProcessLineSync(Form(".L %s++", pathname));
- else gROOT->ProcessLineSync(Form(".L %s+", pathname));
+ gROOT->ProcessLineSync(Form(".L %s+%c", pathname, forceReload ? '+' : ' '));
AliEveTRDTrackListMacroType type = GetMacroType(name, kFALSE);
// Clean up again
- gROOT->Reset();
+ // A.B. gROOT->Reset();
// Has not the correct signature!
if (type == kUnknown) return SIGNATURE_ERROR;
- Int_t returnValue = WARNING;
-
// Only add macro, if it is not already in the list
- if (fMacroList->GetValue(name) == 0)
- {
- if (AddMacroFast(path, name, type)) returnValue = SUCCESS;
- else returnValue = WARNING;
+ Int_t returnValue = WARNING;
+ if(fMacroList->GetValue(name) == 0) {
+ returnValue = AddMacroFast(path, name, type) ? SUCCESS : ERROR;
}
-
return returnValue;
}
}
//______________________________________________________
-void AliEveTRDTrackList::AddStandardMacros()
+void AliEveTRDTrackList::AddStandardContent()
{
// Adds standard macros to the macro list.
// -> If the file does not exist, nothing happens. So if you want to handle this,
// use the return value of AddMacro (NOT_EXIST_ERROR is returned, if file does not exist)
// (-> You can also check for other return values (see AddMacro(...)))
- AddMacro("$(ALICE_ROOT)/TRD/qaRec/macros", "clusterSelection.C");
- AddMacro("$(ALICE_ROOT)/TRD/qaRec/macros", "chargeDistr.C");
- AddMacro("$(ALICE_ROOT)/TRD/qaRec/macros", "clusterResiduals.C");
- AddMacro("$(ALICE_ROOT)/TRD/qaRec/macros", "PH.C");
+
+ if(gSystem->Load("libANALYSIS.so")<0) return;
+ if(gSystem->Load("libTRDqaRec.so")<0) return;
+ AliTRDrecoTask *task = 0x0;
+ TList *fPlots = 0x0;
+ for(Int_t it=0; it<NTRDTASKS; it++){
+ TClass c(fgkTRDtaskClassName[it]);
+ task = (AliTRDrecoTask*)c.New();
+ if(!(fPlots = task->GetPlotFunctors())){
+ AliWarning(Form("No Plot functors defined for task \"%s\"", fgkTRDtaskClassName[it]));
+ delete task;
+ continue;
+ }
+ if(!(task->Histos())){
+ AliWarning(Form("No Ref Histograms defined for task \"%s\"", fgkTRDtaskClassName[it]));
+ delete task;
+ continue;
+ }
+
+ // export task to CINT and add functions
+ gROOT->ProcessLine(Form("%s* %s = (%s*)0x%lx;", fgkTRDtaskClassName[it], task->GetName(), fgkTRDtaskClassName[it], (void*)task));
+ TIter iter(fPlots); TMethodCall *m = 0x0;
+ while((m = dynamic_cast<TMethodCall*>(iter()))){
+ AddMacroFast("", Form("%s->%s", task->GetName(), m->GetMethodName()), kSingleTrackHisto);
+ }
+ }
}
//______________________________________________________
if (procIterator->GetEntries() <= 0) return kTRUE;
// Clear root
- gROOT->Reset();
+ // A.B. gROOT->Reset();
// Clear old data and re-allocate
- if (fDataTree == 0) fDataTree = new TTreeSRedirector(Form("/tmp/TRD.TrackListMacroData_%s.root",
- gSystem->Getenv("USER")));
- if (!fDataTree)
- {
- Error("Apply process macros", Form("File \"/tmp/TRD.TrackListMacroData_%s.root\" could not be accessed properly!",
- gSystem->Getenv("USER")));
+ if (fDataTree == 0x0){
+ TDirectory *cwd = gDirectory;
+ fDataTree = new TTreeSRedirector(Form("/tmp/TRD.TrackListMacroData_%s.root", gSystem->Getenv("USER")));
+ cwd->cd();
+ }
+ if (!fDataTree){
+ Error("Apply process macros", Form("File \"/tmp/TRD.TrackListMacroData_%s.root\" could not be accessed properly!", gSystem->Getenv("USER")));
return kFALSE;
}
- if (fDataFromMacroList != 0)
- {
+ if (fDataFromMacroList != 0) {
fDataFromMacroList->Delete();
delete fDataFromMacroList;
}
Char_t** procCmds = 0;
AliEveTRDTrackListMacroType* mProcType = 0;
- if (procIterator->GetEntries() > 0)
- {
+ if (procIterator->GetEntries() > 0) {
procCmds = new Char_t*[procIterator->GetEntries()];
mProcType = new AliEveTRDTrackListMacroType[procIterator->GetEntries()];
}
Char_t** selCmds = 0;
AliEveTRDTrackListMacroType* mSelType = 0;
- if (selIterator->GetEntries() > 0)
- {
+ if (selIterator->GetEntries() > 0) {
selCmds = new Char_t*[selIterator->GetEntries()];
mSelType = new AliEveTRDTrackListMacroType[selIterator->GetEntries()];
}
AliEveTRDTrack* track1 = 0;
AliEveTRDTrack* track2 = 0;
- TH1* returnedHist = 0x0;
// Collect the commands for each process macro and add them to "data-from-list"
- for (Int_t i = 0; i < procIterator->GetEntries(); i++)
- {
+ for (Int_t i = 0; i < procIterator->GetEntries(); i++){
procCmds[i] = new Char_t[(fkMaxMacroPathNameLength + fkMaxApplyCommandLength)];
memset(procCmds[i], '\0', sizeof(Char_t) * (fkMaxMacroNameLength + fkMaxApplyCommandLength));
macro = (TMacroData*)fMacroList->GetValue(procIterator->At(i)->GetTitle());
- if (!macro)
- {
+ if (!macro){
Error("Apply process macros",
- Form("Macro list is corrupted: Macro \"%s\" is not registered!", procIterator->At(i)->GetTitle()));
+ Form("Macro list is corrupted: Macro \"%s\" is not registered!",
+ procIterator->At(i)->GetTitle()));
continue;
}
// Find the type of the process macro
macroType = macro->GetType();
- if (macroType == kSingleTrackHisto || macroType == kCorrelTrackHisto)
- {
+ if (macroType == kSingleTrackHisto || macroType == kCorrelTrackHisto){
mProcType[i] = macroType;
numHistoMacros++;
// Create the command
// Add to "data-from-list" -> Mark as a histo macro with the substring "(histo macro)"
fDataFromMacroList->Add(new TObjString(Form("%s (histo macro)", macro->GetName())));
- }
- else if (macroType == kSingleTrackAnalyse || macroType == kCorrelTrackAnalyse)
- {
+ } else if (macroType == kSingleTrackAnalyse || macroType == kCorrelTrackAnalyse) {
mProcType[i] = macroType;
// Create the command
sprintf(procCmds[i], macro->GetCmd());
// Add to "data-from-list"
fDataFromMacroList->Add(new TObjString(macro->GetName()));
- }
- else
- {
+ } else {
Error("Apply process macros",
- Form("Macro list corrupted: Macro \"%s/%s.C\" is not registered as a process macro!",
- macro->GetPath(), macro->GetName()));
+ Form("Macro list corrupted: Macro \"%s/%s.C\" is not registered as a process macro!",
+ macro->GetPath(), macro->GetName()));
mProcType[i] = kUnknown;
}
}
// Collect the commands for each selection macro and add them to "data-from-list"
- for (Int_t i = 0; i < selIterator->GetEntries(); i++)
- {
+ for (Int_t i = 0; i < selIterator->GetEntries(); i++){
selCmds[i] = new Char_t[(fkMaxMacroPathNameLength + fkMaxApplyCommandLength)];
memset(selCmds[i], '\0', sizeof(Char_t) * (fkMaxMacroNameLength + fkMaxApplyCommandLength));
macro = (TMacroData*)fMacroList->GetValue(selIterator->At(i)->GetTitle());
- if (!macro)
- {
+ if (!macro){
Error("Apply process macros",
- Form("Macro list is corrupted: Macro \"%s\" is not registered!", selIterator->At(i)->GetTitle()));
+ Form("Macro list is corrupted: Macro \"%s\" is not registered!",
+ selIterator->At(i)->GetTitle()));
continue;
}
macroType = macro->GetType();
// Single track select macro
- if (macroType == kSingleTrackSelect)
- {
+ if (macroType == kSingleTrackSelect) {
// Has already been processed by ApplySTSelectionMacros(...)
mSelType[i] = macroType;
}
// Correlated tracks select macro
- else if (macroType == kCorrelTrackSelect)
- {
+ else if (macroType == kCorrelTrackSelect) {
mSelType[i] = macroType;
// Create the command
sprintf(selCmds[i], macro->GetCmd());
- }
- else
- {
+ } else {
Error("Apply process macros",
- Form("Macro list corrupted: Macro \"%s/%s.C\" is not registered as a selection macro!",
- macro->GetPath(), macro->GetName()));
+ Form("Macro list corrupted: Macro \"%s/%s.C\" is not registered as a selection macro!",
+ macro->GetPath(), macro->GetName()));
mSelType[i] = kUnknown;
}
}
// Allocate memory for the histograms
if (numHistoMacros > 0) histos = new TH1*[numHistoMacros];
- for (Int_t i = 0; i < numHistoMacros; i++) histos[i] = 0;
+ for (Int_t i = 0; i < numHistoMacros; i++) histos[i] = 0x0;
- // Walk through the list of tracks
- for (TEveElement::List_i iter = this->BeginChildren(); iter != this->EndChildren(); ++iter)
- {
- track1 = dynamic_cast<AliEveTRDTrack*>(*iter);
- if (!track1) continue;
-
+ //////////////////////////////////
+ // WALK THROUGH THE LIST OF TRACKS
+ //////////////////////////////////
+ for (TEveElement::List_i iter = this->BeginChildren(); iter != this->EndChildren(); ++iter){
+ if(!(track1 = dynamic_cast<AliEveTRDTrack*>(*iter))) continue;
+
// Skip tracks that have not been selected
if (!track1->GetRnrState()) continue;
- track1->ExportToCINT((Text_t*)"automaticTrack");
// Cast to AliTRDtrackV1
+ gROOT->ProcessLineSync(Form("AliEveTRDTrack *automaticTrack = (AliEveTRDTrack*)0x%xl;", track1));
gROOT->ProcessLineSync("AliTRDtrackV1* automaticTrackV1_1 = (AliTRDtrackV1*)automaticTrack->GetUserData();");
// Collect data for each macro
- for (Int_t i = 0, histoIndex = 0; i < procIterator->GetEntries(); i++)
- {
+ for (Int_t i = 0, histoIndex = 0; i < procIterator->GetEntries(); i++){
// Single track histo
- if (mProcType[i] == kSingleTrackHisto)
- {
- returnedHist = (TH1*)gROOT->ProcessLineSync(procCmds[i]);
- if (returnedHist != 0x0)
- {
- if (histos[histoIndex] == 0) histos[histoIndex] = returnedHist;
- else
- {
- histos[histoIndex]->Add((const TH1*)returnedHist);
- delete returnedHist;
- returnedHist = 0;
- }
- }
- histoIndex++;
- }
- // Correlated tracks histo
- else if (mProcType[i] == kCorrelTrackHisto)
- {
+ if (mProcType[i] == kSingleTrackHisto){
+ histos[histoIndex++] = (TH1*)gROOT->ProcessLineSync(procCmds[i]);
+ // Correlated tracks histo
+ } else if (mProcType[i] == kCorrelTrackHisto) {
// Loop over all pairs behind the current one - together with the other loop this will be a loop
// over all pairs. We have a pair of tracks, if and only if both tracks of the pair are selected (Rnr-state)
// and are not equal.
iter2++;
for ( ; iter2 != this->EndChildren(); ++iter2)
{
- track2 = dynamic_cast<AliEveTRDTrack*>(*iter2);
+ if(!(track2 = dynamic_cast<AliEveTRDTrack*>(*iter2))) continue;
- if (!track2) continue;
-
// Skip tracks that have not been selected
if (!track2->GetRnrState()) continue;
- track2->ExportToCINT((Text_t*)"automaticTrack");
// Cast to AliTRDtrackV1
+ gROOT->ProcessLineSync(Form("AliEveTRDTrack *automaticTrack = (AliEveTRDTrack*)0x%xl;", track2));
gROOT->ProcessLineSync("AliTRDtrackV1* automaticTrackV1_2 = (AliTRDtrackV1*)automaticTrack->GetUserData();");
// Select track by default (so it will be processed, if there are no correlated tracks selection macros!)
selectedByCorrSelMacro = kTRUE;
- for (Int_t j = 0; j < selIterator->GetEntries(); j++)
- {
- if (mSelType[j] == kCorrelTrackSelect)
- {
+ for (Int_t j = 0; j < selIterator->GetEntries(); j++){
+ if (mSelType[j] == kCorrelTrackSelect){
selectedByCorrSelMacro = (Bool_t)gROOT->ProcessLineSync(selCmds[j]);
if (!selectedByCorrSelMacro) break;
}
// If the pair has not been selected by the correlated tracks selection macros, skip it!
if (!selectedByCorrSelMacro) continue;
- returnedHist = (TH1*)gROOT->ProcessLineSync(procCmds[i]);
- if (returnedHist != 0x0)
- {
- if (histos[histoIndex] == 0) histos[histoIndex] = returnedHist;
- else
- {
- histos[histoIndex]->Add((const TH1*)returnedHist);
-
- delete returnedHist;
- returnedHist = 0;
- }
- }
+ histos[histoIndex] = (TH1*)gROOT->ProcessLineSync(procCmds[i]);
}
histoIndex++;
}
// Single track analyse
- else if (mProcType[i] == kSingleTrackAnalyse)
- {
+ else if (mProcType[i] == kSingleTrackAnalyse) {
// Create data pointers in CINT, execute the macro and get the data
gROOT->ProcessLineSync("Double_t* results = 0;");
gROOT->ProcessLineSync("Int_t n = 0;");
Double_t* results = (Double_t*)gROOT->ProcessLineSync("results;");
Int_t nResults = (Int_t)gROOT->ProcessLineSync("n;");
- if (results == 0)
- {
+ if (results == 0) {
Error("Apply macros", Form("Error reading data from macro \"%s\"", procIterator->At(i)->GetTitle()));
continue;
}
- for (Int_t resInd = 0; resInd < nResults; resInd++)
- {
+ for (Int_t resInd = 0; resInd < nResults; resInd++){
(*fDataTree) << Form("TrackData%d", i) << Form("Macro%d=", i) << results[resInd] << (Char_t*)"\n";
}
results = 0;
}
// Correlated tracks analyse
- else if (mProcType[i] == kCorrelTrackAnalyse)
- {
+ else if (mProcType[i] == kCorrelTrackAnalyse){
// Loop over all pairs behind the current one - together with the other loop this will be a loop
// over all pairs. We have a pair of tracks, if and only if both tracks of the pair are selected (Rnr-state)
// and are not equal.
TEveElement::List_i iter2 = iter;
iter2++;
- for ( ; iter2 != this->EndChildren(); ++iter2)
- {
- track2 = dynamic_cast<AliEveTRDTrack*>(*iter2);
-
- if (!track2) continue;
+ for ( ; iter2 != this->EndChildren(); ++iter2) {
+ if(!(track2 = dynamic_cast<AliEveTRDTrack*>(*iter2))) continue;
// Skip tracks that have not been selected
if (!track2->GetRnrState()) continue;
- track2->ExportToCINT((Text_t*)"automaticTrack");
// Cast to AliTRDtrackV1
+ gROOT->ProcessLineSync(Form("AliEveTRDTrack *automaticTrack = (AliEveTRDTrack*)0x%xl;", track2));
gROOT->ProcessLineSync("AliTRDtrackV1* automaticTrackV1_2 = (AliTRDtrackV1*)automaticTrack->GetUserData();");
// Select track by default (so it will be processed, if there are no correlated tracks selection macros!)
selectedByCorrSelMacro = kTRUE;
- for (Int_t j = 0; j < selIterator->GetEntries(); j++)
- {
- if (mSelType[j] == kCorrelTrackSelect)
- {
+ for (Int_t j = 0; j < selIterator->GetEntries(); j++) {
+ if (mSelType[j] == kCorrelTrackSelect) {
selectedByCorrSelMacro = (Bool_t)gROOT->ProcessLineSync(selCmds[j]);
if (!selectedByCorrSelMacro) break;
}
Double_t* results = (Double_t*)gROOT->ProcessLineSync("results;");
Int_t nResults = (Int_t)gROOT->ProcessLineSync("n;");
- if (results == 0)
- {
+ if (results == 0) {
Error("Apply macros", Form("Error reading data from macro \"%s\"", procIterator->At(i)->GetTitle()));
continue;
}
- for (Int_t resInd = 0; resInd < nResults; resInd++)
- {
+ for (Int_t resInd = 0; resInd < nResults; resInd++) {
(*fDataTree) << Form("TrackData%d", i) << Form("Macro%d=", i) << results[resInd] << (Char_t*)"\n";
}
}
}
- for (Int_t i = 0, histoIndex = 0; i < procIterator->GetEntries() && histoIndex < numHistoMacros; i++)
- {
- if (mProcType[i] == kSingleTrackHisto || mProcType[i] == kCorrelTrackHisto)
- {
+ for (Int_t i = 0, histoIndex = 0; i < procIterator->GetEntries() && histoIndex < numHistoMacros; i++) {
+ if (mProcType[i] == kSingleTrackHisto || mProcType[i] == kCorrelTrackHisto) {
// Might be empty (e.g. no tracks have been selected)!
- if (histos[histoIndex] != 0)
- {
+ if (histos[histoIndex]) {
(*fDataTree) << Form("TrackData%d", i) << Form("Macro%d=", i) << histos[histoIndex] << (Char_t*)"\n";
}
histoIndex++;
histos = 0;
// Clear root
- gROOT->Reset();
+ // A.B. gROOT->Reset();
// If there is data, select the first data set
if (procIterator->GetEntries() > 0) SETBIT(fHistoDataSelected, 0);
Bool_t selectedByMacro = kFALSE;
// Clear root
- gROOT->Reset();
+ // A.B. gROOT->Reset();
// Select all tracks at first. A track is then deselect, if at least one selection macro
// returns kFALSE for this track
// Enable all tracks (Note: EnableListElements(..) will call "ElementChanged", which will cause unforeseen behavior!)
- for (TEveElement::List_i iter = this->BeginChildren(); iter != this->EndChildren(); ++iter)
- {
- ((TEveElement*)(*iter))->SetRnrState(kTRUE);
- }
+ for (TEveElement::List_i iter = this->BeginChildren(); iter != this->EndChildren(); ++iter) ((TEveElement*)(*iter))->SetRnrState(kTRUE);
SetRnrState(kTRUE);
- for (Int_t i = 0; i < iterator->GetEntries(); i++)
- {
+ for (Int_t i = 0; i < iterator->GetEntries(); i++){
macro = (TMacroData*)fMacroList->GetValue(iterator->At(i)->GetTitle());
- if (!macro)
- {
+ if (!macro){
Error("Apply selection macros",
Form("Macro list is corrupted: Macro \"%s\" is not registered!", iterator->At(i)->GetTitle()));
continue;
macroType = macro->GetType();
// Single track select macro
- if (macroType == kSingleTrackSelect)
- {
+ if (macroType == kSingleTrackSelect){
// Walk through the list of tracks
for (TEveElement::List_i iter = this->BeginChildren(); iter != this->EndChildren(); ++iter)
{
// If the track has already been deselected, nothing is to do here
if (!track1->GetRnrState()) continue;
- track1->ExportToCINT((Text_t*)"automaticTrack");
// Cast to AliTRDtrackV1
+ gROOT->ProcessLineSync(Form("AliEveTRDTrack *automaticTrack = (AliEveTRDTrack*)0x%xl;", track1));
gROOT->ProcessLineSync("AliTRDtrackV1* automaticTrackV1_1 = (AliTRDtrackV1*)automaticTrack->GetUserData();");
selectedByMacro = (Bool_t)gROOT->ProcessLineSync(macro->GetCmd());
track1->SetRnrState(selectedByMacro && track1->GetRnrState());
}
}
// Correlated tracks select macro
- else if (macroType == kCorrelTrackSelect)
- {
+ else if (macroType == kCorrelTrackSelect){
// Will be processed in ApplyProcessMacros(...)
continue;
- }
- else
- {
+ } else {
Error("Apply selection macros",
- Form("Macro list corrupted: Macro \"%s/%s.C\" is not registered as a selection macro!",
- macro->GetPath(), macro->GetName()));
+ Form("Macro list corrupted: Macro \"%s/%s.C\" is not registered as a selection macro!",
+ macro->GetPath(), macro->GetName()));
}
}
// Clear root
- gROOT->Reset();
+ // A.B. gROOT->Reset();
}
//______________________________________________________
AliEveTRDTrackListMacroType type = kUnknown;
// Re-do the check of the macro type
- if (!UseList)
- {
+ if (!UseList){
// Single track select macro or single track histo macro?
TFunction* f = gROOT->GetGlobalFunctionWithPrototype(name, "const AliTRDtrackV1*", kTRUE);
if (f != 0x0)
#define SIGNATURE_ERROR -1
#define NOT_EXIST_ERROR -2
+#define ERROR -3
#define WARNING 0
#define SUCCESS 1
Int_t AddMacro(const Char_t* path, const Char_t* name, Bool_t forceReload = kFALSE);
Bool_t AddMacroFast(const Char_t* path, const Char_t* name, AliEveTRDTrackListMacroType type);
- virtual void AddStandardMacros();
+ virtual void AddStandardContent();
Bool_t ApplyProcessMacros(const TList* selIterator, const TList* procIterator);
void ApplySTSelectionMacros(const TList* iterator);
#include <TROOT.h>
#include <TSystem.h>
#include <TGTextEntry.h>
+#include <TGTextEdit.h>
+#include <TGComboBox.h>
#include <TGTextView.h>
#include <TH1.h>
#include <TTreeStream.h>
frbColor(new TGRadioButton*[3]),
frbTrack(new TGRadioButton*[3]),
fbBrowse(0),
+ fbNew(0),
fbApplyMacros(0),
fbRemoveMacros(0),
fbDrawHisto(0),
// Functionality for adding macros
- fMainFrame = CreateEditorTabSubFrame("Apply macros");
+ fMainFrame = CreateEditorTabSubFrame("Process");
fLabel1 = new TGLabel(fMainFrame,"Add macro(s):");
fMainFrame->AddFrame(fLabel1);
fbBrowse->SetToolTipText("Browse the macro you want to add");
fbBrowse->Connect("Clicked()", "AliEveTRDTrackListEditor", this, "BrowseMacros()");
fBrowseFrame->AddFrame(fbBrowse);
+
+ fbNew = new TGTextButton(fBrowseFrame, "New");
+ fbNew->SetToolTipText("Start macro creation wizzard");
+ fbNew->Connect("Clicked()", "AliEveTRDTrackListEditor", this, "NewMacros()");
+ fBrowseFrame->AddFrame(fbNew);
fMainFrame->AddFrame(fBrowseFrame);
fLine1 = new TGHorizontal3DLine(fMainFrame, 194, 8);
fLine2 = new TGHorizontal3DLine(fMainFrame, 194, 8);
fMainFrame->AddFrame(fLine2, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 8, 2));
- fLabel3 = new TGLabel(fMainFrame,"Process macros:");
+ fLabel3 = new TGLabel(fMainFrame,"Process plugins:");
fMainFrame->AddFrame(fLabel3);
ftlMacroList = new TGListBox(fMainFrame);
fLine3 = new TGHorizontal3DLine(fMainFrame, 194, 8);
fMainFrame->AddFrame(fLine3, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 8, 2));
- fbApplyMacros = new TGTextButton(fMainFrame, "Apply selected macro(s)");
- fbApplyMacros->SetToolTipText("Apply all selected macros to the tracklist -> A data file will be generated");
+ fbApplyMacros = new TGTextButton(fMainFrame, "Apply plugin(s)");
+ fbApplyMacros->SetToolTipText("Apply all selected macros/class functins to the list of tracks -> A data file will be generated");
fbApplyMacros->Connect("Clicked()", "AliEveTRDTrackListEditor", this, "ApplyMacros()");
fbApplyMacros->SetRightMargin(12);
fMainFrame->AddFrame(fbApplyMacros);
- fbRemoveMacros = new TGTextButton(fMainFrame, "Remove selected macro(s)");
- fbRemoveMacros->SetToolTipText("Remove the selected macro(s) from the list(s)");
+ fbRemoveMacros = new TGTextButton(fMainFrame, "Remove plugin(s)");
+ fbRemoveMacros->SetToolTipText("Remove the selected macros/class functions from the list(s)");
fbRemoveMacros->Connect("Clicked()", "AliEveTRDTrackListEditor", this, "RemoveMacros()");
fMainFrame->AddFrame(fbRemoveMacros);
// Stuff for displaying histograms
- fHistoFrame = CreateEditorTabSubFrame("Histograms");
+ fHistoFrame = CreateEditorTabSubFrame("Results");
fHistoFrame->SetMapSubwindows(kTRUE);
- fLabel4 = new TGLabel(fHistoFrame,"Data from applied macros:");
+ fLabel4 = new TGLabel(fHistoFrame,"Data from plugins:");
fHistoFrame->AddFrame(fLabel4);
fHistoSubFrame = new TGVerticalFrame(fHistoFrame);
fLine4 = new TGHorizontal3DLine(fHistoFrame, 194, 8);
fHistoFrame->AddFrame(fLine4, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 8, 2));
- fbDrawHisto = new TGTextButton(fHistoFrame, "Draw histogram");
+ fbDrawHisto = new TGTextButton(fHistoFrame, "Draw projections");
fbDrawHisto->SetToolTipText("Uses the data file created by the last \"Apply selected macro(s)\".\nClick here to display the data histograms of the selected macros.\nSelect multiple macros to create multi-dimensional plots.\nHisto macros cannot be used for multi-dimensional plots!");
fbDrawHisto->Connect("Clicked()", "AliEveTRDTrackListEditor", this, "DrawHistos()");
fHistoFrame->AddFrame(fbDrawHisto);
AliEveEventManager::GetMaster()->Connect("NewEventLoaded()", "AliEveTRDTrackListEditor", this, "HandleNewEventLoaded()");
// Handle the signal "Selected" (another tab has been selected)
- GetGedEditor()->GetTab()->Connect("Selected(Int_t)", "AliEveTRDTrackListEditor",
- this, "HandleTabChangedToIndex(Int_t)");
+ GetGedEditor()->GetTab()->Connect("Selected(Int_t)", "AliEveTRDTrackListEditor", this, "HandleTabChangedToIndex(Int_t)");
}
//______________________________________________________
}
//______________________________________________________
-void AliEveTRDTrackListEditor::AddMacro(const Char_t* path, const Char_t* name)
+void AliEveTRDTrackListEditor::AddMacro(const Char_t* name, const Char_t* path)
{
// Adds the macro path/name to the macro list. A warning is provided, if there is
// something wrong, e.g. if the macro does not have the correct signature.
-
Int_t result = fM->AddMacro(path, name);
switch (result)
new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Warning", "Macro is already in list (won't be added again)!",
kMBIconExclamation, kMBOk);
break;
+ case ERROR:
+ new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error", "Fail to load the macro (check messages in the terminal)!",
+ kMBIconExclamation, kMBOk);
+ break;
case SIGNATURE_ERROR:
new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error",
"Macro has not the signature of...\n...a single track selection macro: Bool_t YourMacro(const AliTRDtrackV1*)\n...a correlated tracks selection macro: Bool_t YourMacro(const AliTRDtrackV1*, const AliTRDtrackV1*)\n...a single track analyse macro: void YourMacro(const AliTRDtrackV1*, Double_t*&, Int_t&)\n...a correlated tracks analyse macro: void YourMacro(const AliTRDtrackV1*, const AliTRDtrackV1*, Double_t*&, Int_t&)\n...a single track histo macro: TH1* YourMacro(const AliTRDtrackV1*)\n...a correlated tracks histo macro: TH1* YourMacro(const AliTRDtrackV1*, const AliTRDtrackV1*)",
if (success && procIterator->GetEntries() > 0)
{
// Set focus on "Histograms" tab
- GetGedEditor()->GetTab()->SetTab("Histograms");
+ GetGedEditor()->GetTab()->SetTab("Results");
DrawHistos();
}
}
}
+//______________________________________________________
+void AliEveTRDTrackListEditor::NewMacros()
+{
+ // Start the macro creation wizzard.
+ // thanks to Jacek Otwinowski<J.Otwinowski@GSI.DE> for this suggestion
+
+ AliEveTRDMacroWizzard *wizz = new AliEveTRDMacroWizzard();
+ wizz->Connect("Done(Char_t*)", "AliEveTRDTrackListEditor", this, "AddMacro(Char_t*)");
+}
+
+
//______________________________________________________
void AliEveTRDTrackListEditor::BrowseMacros()
{
// Delete '"' at the end
name[strlen(name)] = '\0';
- AddMacro(fFileInfo->fIniDir, name + 1);
+ AddMacro(name + 1, fFileInfo->fIniDir);
iter = (TObjString*)fFileInfo->fFileNamesList->After(iter);
}
}
sprintf(pathname, "./%s", fteField->GetText());
fteField->SetText(pathname);
- AddMacro(".", name);
+ AddMacro(name);
if (name != 0) delete name;
name = 0;
}
strncpy(path, fteField->GetText(), strlen(fteField->GetText()) - strlen(name));
// Ignore the slash "/" in name
- AddMacro(path, name + 1);
+ AddMacro(name + 1, path);
if (path != 0) delete path;
path = 0;
// Toggle selected item
fM->SetMacroListSelection(ind, !fM->MacroListIsSelected(ind));
}
+
+
+/////////////////////////////////////////////////
+ClassImp(AliEveTRDMacroWizzard)
+
+//______________________________________________________
+AliEveTRDMacroWizzard::AliEveTRDMacroWizzard(const TGWindow* p)
+ :TGMainFrame(p ? p : gClient->GetRoot(), 10, 10, kMainFrame | kVerticalFrame)
+ ,fText(0x0)
+ ,fCombo(0x0)
+ ,fTextEdit(0x0)
+{
+ const Int_t width = 300;
+
+ // horizontal frame
+ TGHorizontalFrame *fFrameName = new TGHorizontalFrame(this, 10, 10, kHorizontalFrame);
+ TGLabel *fLabel = new TGLabel(fFrameName, "Name*");
+ fLabel->SetTextJustify(36);
+ fLabel->SetMargins(0,0,0,0);
+ fLabel->SetWrapLength(-1);
+ fFrameName->AddFrame(fLabel, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
+
+ fText = new TGTextEntry(fFrameName);
+ fText->SetMaxLength(255);
+ fText->SetAlignment(kTextLeft);
+ fText->SetText("");
+ fText->Resize(width, fText->GetDefaultHeight());
+ fFrameName->AddFrame(fText, new TGLayoutHints(kLHintsRight | kLHintsTop,2,2,2,2));
+
+
+ // horizontal frame
+ TGHorizontalFrame *fFrameComment = new TGHorizontalFrame(this,10,10,kHorizontalFrame);
+ fLabel = new TGLabel(fFrameComment, "Comment");
+ fLabel->SetTextJustify(36);
+ fLabel->SetMargins(0,0,0,0);
+ fLabel->SetWrapLength(-1);
+ fFrameComment->AddFrame(fLabel, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
+
+ fTextEdit = new TGTextEdit(fFrameComment, width, 5*fText->GetDefaultHeight());
+ fFrameComment->AddFrame(fTextEdit, new TGLayoutHints(kLHintsRight | kLHintsTop,2,2,2,2));
+
+ // horizontal frame
+ TGHorizontalFrame *fFrameType = new TGHorizontalFrame(this,10,10,kHorizontalFrame);
+ fLabel = new TGLabel(fFrameType, "Type*");
+ fLabel->SetTextJustify(36);
+ fLabel->SetMargins(0,0,0,0);
+ fLabel->SetWrapLength(-1);
+ fFrameType->AddFrame(fLabel, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
+
+ fCombo = new TGComboBox(fFrameType, -1, kHorizontalFrame | kSunkenFrame | kDoubleBorder | kOwnBackground);
+ fCombo->AddEntry("Single Track Selection", AliEveTRDTrackList::kSingleTrackSelect);
+ fCombo->AddEntry("Pair Tracks Selection", AliEveTRDTrackList::kCorrelTrackSelect);
+ fCombo->AddEntry("Single Track Analyse", AliEveTRDTrackList::kSingleTrackAnalyse);
+ fCombo->AddEntry("Single Track Histo", AliEveTRDTrackList::kSingleTrackHisto);
+ fCombo->AddEntry("Pair Tracks Analyse", AliEveTRDTrackList::kCorrelTrackAnalyse);
+ fCombo->AddEntry("Pair Tracks Histo", AliEveTRDTrackList::kCorrelTrackHisto);
+ fCombo->Select(-1);
+ fCombo->Resize(width, fText->GetDefaultHeight());
+ fFrameType->AddFrame(fCombo, new TGLayoutHints(kLHintsRight | kLHintsTop,2,2,2,2));
+
+
+ // horizontal frame
+ TGHorizontalFrame *fFrameText = new TGHorizontalFrame(this,10,10,kHorizontalFrame);
+ fLabel = new TGLabel(fFrameText, "(*) Mandatory fields");
+ fLabel->SetTextJustify(36);
+ fLabel->SetMargins(0,0,0,0);
+ fLabel->SetWrapLength(-1);
+ fFrameText->AddFrame(fLabel, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
+
+ // put things together
+ AddFrame(fFrameName, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandX,2,2,2,2));
+ AddFrame(fFrameComment, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandX,2,2,2,2));
+ AddFrame(fFrameType, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandX,2,2,2,2));
+
+ TGHorizontal3DLine *fLine = new TGHorizontal3DLine(this, 281, 2);
+ AddFrame(fLine, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandX,2,2,2,2));
+ AddFrame(fFrameText, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandX,2,2,2,2));
+
+
+ SetWindowName("TRD Macro Wizzard");
+ SetMWMHints(kMWMDecorAll,
+ kMWMFuncAll,
+ kMWMInputModeless);
+ MapSubwindows();
+
+ Resize(GetDefaultSize());
+ MapWindow();
+
+ // Do the linking
+ fCombo->Connect("Selected(Int_t)", "AliEveTRDMacroWizzard", this, "Create(Int_t)");
+}
+
+Char_t *fIncludes =
+"#if !defined(__CINT__) || defined(__MAKECINT__)\n"
+"#include <TROOT.h>\n"
+"#include <TH1.h>\n"
+"#include <TRD/AliTRDgeometry.h>\n"
+"#include <TRD/AliTRDcluster.h>\n"
+"#include <TRD/AliTRDseedV1.h>\n"
+"#include <TRD/AliTRDtrackV1.h>\n"
+"#endif\n";
+
+Char_t *fMacroTemplate[7] = {
+""
+," if (!track) return kFALSE;\n"
+
+," n = 0;\n"
+" r=0x0;\n"
+" if (!track) return;\n"
+
+," if (!track) return 0x0;\n"
+" TH1* h = 0x0;\n"
+" if(!(h = (TH1*)gROOT->FindObject(\"h\"))){\n"
+" h = new TH1(\"h\", \"Title\", n, xmin, xmax);\n"
+" h->GetXaxis()->SetTitle("");\n"
+" h->GetYaxis()->SetTitle("");\n"
+" } else h->Reset();\n"
+
+," if (!track) return kFALSE;\n"
+" if (!track2) return kFALSE;\n"
+
+," n = 0;\n"
+" r=0x0;\n"
+" if (!track) return;\n"
+" if (!track2) return;\n"
+
+," if (!track) return 0x0;\n"
+" if (!track2) return 0x0;\n"
+" TH1* h = 0x0;\n"
+" if(!(h = (TH1*)gROOT->FindObject(\"h\"))){\n"
+" h = new TH1(\"h\", \"Title\", n, xmin, xmax);\n"
+" h->GetXaxis()->SetTitle("");\n"
+" h->GetYaxis()->SetTitle("");\n"
+" } else h->Reset();\n"
+};
+//______________________________________________________
+void AliEveTRDMacroWizzard::Create(Int_t typ)
+{
+ const Char_t *name = fText->GetText();
+ if(strcmp(name,"")==0){
+ AliInfo("Please specify a name for your macro.");
+ fCombo->Select(-1);
+ return;
+ }
+
+ FILE* fp = 0x0;
+ if(!(fp = fopen(Form("%s.C", name), "wt"))){
+ AliInfo("Couldn't create macro file.");
+ fCombo->Select(-1);
+ return;
+ }
+
+ TGText *comment = fTextEdit->GetText();
+ Char_t *line = 0x0; Int_t iline = 0;
+ while((line = comment->GetLine(TGLongPosition(0,iline++), 200))) fprintf(fp, "// %s\n", line);
+
+ fprintf(fp, "\n%s\n", fIncludes);
+
+ switch(typ){
+ case AliEveTRDTrackList::kSingleTrackSelect:
+ fprintf(fp, "Bool_t %s(const AliTRDtrackV1 *track)\n", name);
+ break;
+ case AliEveTRDTrackList::kCorrelTrackSelect:
+ fprintf(fp, "Bool_t %s(const AliTRDtrackV1 *track, const AliTRDtrackV1 *track2)\n", name);
+ break;
+ case AliEveTRDTrackList::kSingleTrackAnalyse:
+ fprintf(fp, "void %s(const AliTRDtrackV1 *track, Double_t*& r, Int_t& n)\n", name);
+ break;
+ case AliEveTRDTrackList::kSingleTrackHisto:
+ fprintf(fp, "TH1* %s(const AliTRDtrackV1 *track)\n", name);
+ break;
+ case AliEveTRDTrackList::kCorrelTrackAnalyse:
+ fprintf(fp, "void %s(const AliTRDtrackV1 *track, const AliTRDtrackV1 *track2, Double_t*& r, Int_t& n)\n", name);
+ break;
+ case AliEveTRDTrackList::kCorrelTrackHisto:
+ fprintf(fp, "TH1* %s(const AliTRDtrackV1 *track, const AliTRDtrackV1 *track2)\n", name);
+ break;
+ default:
+ AliInfo(Form("Unknown typ[%d]", typ));
+ fclose(fp);
+ gSystem->Exec(Form("rm -f %s.C", name));
+ fCombo->Select(-1);
+ return;
+ }
+
+ fprintf(fp, "{\n%s\n", fMacroTemplate[typ]);
+ fprintf(fp, "// add your own code here\n\n\n}\n");
+ fclose(fp);
+ Done(Form("%s.C", name));
+ CloseWindow();
+}
// access the data. //
//////////////////////////////////////////////////////////////////////////
+#ifndef ROOT_TGedFrame
#include <TGedFrame.h>
+#endif
+
+#ifndef ROOT_TGFrame
+#include <TGFrame.h>
+#endif
class AliEveTRDTrack;
class AliEveTRDTrackList;
AliEveTRDTrackListEditor(const TGWindow* p = 0, Int_t width = 170, Int_t height = 30,
UInt_t options = kChildFrame, Pixel_t back = GetDefaultFrameBackground());
virtual ~AliEveTRDTrackListEditor();
-
virtual void SetModel(TObject* obj);
- void AddMacro(const Char_t* path, const Char_t* name);
- void ApplyMacros();
- void BrowseMacros();
- void CloseTabs();
- void DrawHistos();
- Int_t GetNSelectedHistograms() const;
- void HandleMacroPathSet();
- void HandleNewEventLoaded();
- void HandleTabChangedToIndex(Int_t);
- void RemoveMacros();
- void SaveMacroList(TMap* list);
- void SetTrackColor(Int_t ind);
- void SetTrackModel(Int_t ind);
- void UpdateDataFromMacroListSelection();
- void UpdateHistoList();
- void UpdateMacroList();
- void UpdateMacroListSelection(Int_t ind);
+ void AddMacro(const Char_t* name, const Char_t* path = ".");
+ void ApplyMacros();
+ void BrowseMacros();
+ void CloseTabs();
+ void DrawHistos();
+ Int_t GetNSelectedHistograms() const;
+ void HandleMacroPathSet();
+ void HandleNewEventLoaded();
+ void HandleTabChangedToIndex(Int_t);
+ void NewMacros();
+ void RemoveMacros();
+ void SaveMacroList(TMap* list);
+ void SetTrackColor(Int_t ind);
+ void SetTrackModel(Int_t ind);
+ void UpdateDataFromMacroListSelection();
+ void UpdateHistoList();
+ void UpdateMacroList();
+ void UpdateMacroListSelection(Int_t ind);
protected:
AliEveTRDTrackList* fM; // Model object
TGRadioButton** frbTrack; // Radio buttons for the track model
TGTextButton* fbBrowse; // "Browse" button
+ TGTextButton* fbNew; // "New" button
TGTextButton* fbApplyMacros; // "Apply macros" button
TGTextButton* fbRemoveMacros; // "Remove macros" button
TGTextButton* fbDrawHisto; // "Draw histogram" button
ClassDef(AliEveTRDTrackListEditor, 0); // Editor for AliEveTRDTrackList.
};
+class TGTextEdit;
+class TGComboBox;
+class AliEveTRDMacroWizzard : public TGMainFrame
+{
+public:
+ AliEveTRDMacroWizzard(const TGWindow* p = 0);
+ void Create(Int_t typ);
+ void Done(Char_t *macro)
+ { Emit("Done(Char_t*)", macro); } //*SIGNAL*
+private:
+ AliEveTRDMacroWizzard(const AliEveTRDMacroWizzard&);
+ AliEveTRDMacroWizzard& operator=(const AliEveTRDMacroWizzard&);
+
+ TGTextEntry *fText;
+ TGComboBox *fCombo;
+ TGTextEdit *fTextEdit;
+
+ ClassDef(AliEveTRDMacroWizzard, 0); // Helper class to create macro templates
+};
+
#endif
#pragma link C++ class AliEveTRDTrack+;
#pragma link C++ class AliEveTRDTrackList+;
#pragma link C++ class AliEveTRDTrackListEditor+;
+#pragma link C++ class AliEveTRDMacroWizzard+;
// TOF
#pragma link C++ class AliEveTOFDigitsInfo+;
--- /dev/null
+void trd_tracks(TEveElement *cont = 0)
+{
+
+ // Link data containers
+ AliESDfriend *eventESDfriend = 0x0;
+ if(!(eventESDfriend = AliEveEventManager::AssertESDfriend())){
+ Warning("trd_tracks", "AliESDfriend not found");
+ return 0x0;
+ }
+
+ AliESDEvent* esd = AliEveEventManager::AssertESD();
+
+ AliEveEventManager::AssertGeometry();
+
+ AliMagFMaps *field = new AliMagFMaps("Maps","Maps", 2, 1., 10., AliMagFMaps::k5kG);
+ AliTracker::SetFieldMap(field, kTRUE);
+
+ AliTRDReconstructor *reco = new AliTRDReconstructor();
+ reco->SetRecoParam(AliTRDrecoParam::GetLowFluxParam());
+ reco->SetOption("!nn");
+
+ AliEveTRDTrackList *tracks = new AliEveTRDTrackList("TRD Tracks");
+ for (Int_t n=0; n<esd->GetNumberOfTracks(); n++){
+ AliESDtrack* esdTrack = esd->GetTrack(n);
+ AliESDfriendTrack *friendTrack = eventESDfriend->GetTrack(n);
+
+ TObject *cal = 0x0;
+ Int_t ical = 0;
+ while(cal = friendTrack->GetCalibObject(ical++)){
+ if(strcmp(cal->IsA()->GetName(), "AliTRDtrackV1") != 0) continue;
+ AliTRDtrackV1 *trackObj = dynamic_cast<AliTRDtrackV1 *>(cal);
+ trackObj->SetReconstructor(reco);
+ AliEveTRDTrack *trackEve = new AliEveTRDTrack(trackObj);
+ tracks->AddElement(trackEve);
+ trackEve->SetESDstatus(esdTrack->GetStatus());
+ }
+ }
+
+ tracks->SetTitle(Form("Tracks %d", tracks->NumChildren()));
+ tracks->StampObjProps();
+ gEve->AddElement(tracks, cont);
+
+ gEve->Redraw3D();
+
+ TGLViewer *v = gEve->GetGLViewer();
+ v->SetCurrentCamera(TGLViewer::kCameraOrthoXOY);
+ ((TGLOrthoCamera&)v->CurrentCamera()).SetEnableRotate(kTRUE);
+ v->UpdateScene();
+
+ return;
+}