// Uncomment to display debugging infos
//#define ALIEVETRDTRACKLIST_DEBUG
+#include <AliLog.h>
#include <TFile.h>
#include <TFunction.h>
#include <TH1.h>
#include <TROOT.h>
#include <TSystem.h>
#include <TTree.h>
-#include <TTreeStream.h>
+//#include <TTreeStream.h>
#include <TMethodCall.h>
#include <AliTRDReconstructor.h>
#include <../PWGPP/TRD/AliTRDpwgppHelper.h>
ClassImp(AliEveTRDTrackList)
+TFile *AliEveTRDTrackList::fgData(NULL);
///////////////////////////////////////////////////////////
///////////// AliEveTRDTrackList ////////////////////////
///////////////////////////////////////////////////////////
AliEveTRDTrackList::AliEveTRDTrackList(const Text_t* n, const Text_t* t, Bool_t doColor):
TEveElementList(n, t, doColor),
- fEditor(0x0),
- fDataFromMacroList(0x0),
- fMacroList(0x0),
- fDataTree(0x0),
+ fEditor(NULL),
+ fDataFromMacroList(NULL),
+ fMacroList(NULL),
fHistoDataSelected(0),
fMacroListSelected(0),
fSelectedTab(1), // Standard tab: "Apply macros" (index 1)
delete fDataFromMacroList;
fDataFromMacroList = 0;
}
- if (fDataTree != 0)
- {
- delete fDataTree;
- fDataTree = 0;
- }
if (fMacroList != 0)
{
fMacroList->DeleteAll();
for (UInt_t ind = 0; ind < fkMaxMacroNameLength && ind < strlen(nameC) - 2; ind++) name[ind] = nameC[ind];
// Check, if files exists
- FILE* fp = 0x0;
+ FILE* fp = NULL;
if((fp = fopen(pathname, "rb"))){
fclose(fp);
- fp = 0x0;
+ fp = NULL;
} else return NOT_EXIST_ERROR;
// Clean up root, load the desired macro and then check the type of the macro
// A.B. gROOT->Reset();
// Clear old data and re-allocate
- if (!fDataTree){
+ TTree *treeSingle(NULL), *treeCorrel(NULL);
+ Double_t singleTrackOut[100][10], correlTrackOut[100][10];
+// if (!fgData){
TDirectory *cwd = gDirectory;
- fDataTree = new TTreeSRedirector(Form("/tmp/TRD.TrackListMacroData_%s.root", gSystem->Getenv("USER")));
+ fgData = TFile::Open(Form("/tmp/TRD.TrackListMacroData_%s.root", gSystem->Getenv("USER")), "RECREATE");
+ treeSingle = new TTree("sTrack", "Data from single track processing");
+ treeCorrel = new TTree("cTrack", "Data from correlated track processing");
cwd->cd();
- }
- if (!fDataTree){
+/* } else {
+ TDirectory *cwd = gDirectory;
+ fgData = TFile::Open(Form("/tmp/TRD.TrackListMacroData_%s.root", gSystem->Getenv("USER")), "APPEND");
+ treeSingle = (TTree*)fgData->Get("sTrack");
+ treeCorrel = (TTree*)fgData->Get("cTrack");
+ cwd->cd();
+ }*/
+ if (!treeSingle || !treeCorrel){
Error("Apply process macros", "File \"/tmp/TRD.TrackListMacroData_%s.root\" could not be accessed properly!", gSystem->Getenv("USER"));
return kFALSE;
}
TMacroData* macro(NULL);
+ TString* procName = new TString[procIterator->GetEntries()];
TString* procCmds = new TString[procIterator->GetEntries()];
AliEveTRDTrackListMacroType* mProcType = new AliEveTRDTrackListMacroType[procIterator->GetEntries()];
numHistoMacros++;
// Create the command
procCmds[i] = macro->GetCmd();
+ procName[i] = macro->GetName();
// 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())));
+ //fDataFromMacroList->Add(new TObjString(Form("%s (histo macro)", macro->GetName())));
} else if (macroType == kSingleTrackAnalyse || macroType == kCorrelTrackAnalyse) {
mProcType[i] = macroType;
// Create the command
procCmds[i] = macro->GetCmd();
-
- // Add to "data-from-list"
- fDataFromMacroList->Add(new TObjString(macro->GetName()));
+ procName[i] = macro->GetName();
} else {
Error("Apply process macros",
"Macro list corrupted: Macro \"%s/%s.C\" is not registered as a process macro!",
macro = (TMacroData*)fMacroList->GetValue(selIterator->At(i)->GetTitle());
if (!macro){
- Error("Apply process macros",
- "Macro list is corrupted: Macro \"%s\" is not registered!",
- selIterator->At(i)->GetTitle());
+ AliError(Form("Macro list is corrupted: Macro \"%s\" is not registered!", selIterator->At(i)->GetTitle()));
continue;
}
for (Int_t i = 0, histoIndex = 0; i < procIterator->GetEntries(); i++){
// Single track histo
if (mProcType[i] == kSingleTrackHisto){
- if(histos) histos[histoIndex++] = (TH1*)gROOT->ProcessLineSync(procCmds[i]);
- // Correlated tracks histo
- } else if (mProcType[i] == kCorrelTrackHisto) {
+ if(!histos) continue;
+ histos[histoIndex] = (TH1*)gROOT->ProcessLineSync(procCmds[i]);
+ if(!fDataFromMacroList->FindObject(histos[histoIndex]->GetName())) {
+ AliInfo(Form("Registering histo[%s] for cmd[%s]", histos[histoIndex]->GetName(), procName[i].Data()));
+ fDataFromMacroList->Add(new TObjString(histos[histoIndex]->GetName()));
+ }
+ histoIndex++;
+ } else if (mProcType[i] == kCorrelTrackHisto) { // CORRELATED TRACKS HISTO
// 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.
// all correlated tracks selection macros.
TEveElement::List_i iter2 = iter;
iter2++;
- for ( ; iter2 != this->EndChildren(); ++iter2)
- {
+ for ( ; iter2 != this->EndChildren(); ++iter2){
if(!(track2 = dynamic_cast<AliEveTRDTrack*>(*iter2))) continue;
// Skip tracks that have not been selected
if (!selectedByCorrSelMacro) continue;
if(histos) histos[histoIndex] = (TH1*)gROOT->ProcessLineSync(procCmds[i]);
- }
+ } // End loop correl tracks
histoIndex++;
- }
- // Single track analyse
- else if (mProcType[i] == kSingleTrackAnalyse) {
+ } else if (mProcType[i] == kSingleTrackAnalyse) { // SINGLE TRACK ANALYSE
// Create data pointers in CINT, execute the macro and get the data
- gROOT->ProcessLineSync("Double_t* results = 0;");
+ gROOT->ProcessLineSync("Double_t results[10] = {0}, *presults=&results[0];");
gROOT->ProcessLineSync("Int_t n = 0;");
gROOT->ProcessLineSync(procCmds[i]);
- Double_t* results = (Double_t*)gROOT->ProcessLineSync("results;");
Int_t nResults = (Int_t)gROOT->ProcessLineSync("n;");
-
- if (results == 0) {
- Error("Apply macros", "Error reading data from macro \"%s\"", procIterator->At(i)->GetTitle());
+ if (!nResults) {
+ AliError(Form("Error reading data from macro \"%s\"", procName[i].Data()));
continue;
}
- for (Int_t resInd = 0; resInd < nResults; resInd++){
- (*fDataTree) << Form("TrackData%d", i) << Form("Macro%d=", i) << results[resInd] << (Char_t*)"\n";
+ if(nResults>10){
+ AliWarning(Form("Macro \"%s\" returns %d values. Limit set to 10.", procName[i].Data(), nResults));
+ nResults=10;
}
-
- delete results;
- results = 0;
- }
- // Correlated tracks analyse
- else if (mProcType[i] == kCorrelTrackAnalyse){
+ TBranch *b(treeSingle->GetBranch(procName[i].Data()));
+ if(!b) {
+ AliInfo(Form("Building branch[%s]", procName[i].Data()));
+ b = treeSingle->Branch(procName[i].Data(), singleTrackOut[i], Form("%s[%d]/D", procName[i].Data(), nResults));
+ // Add to "data-from-list"
+ for(Int_t ir(0); ir<nResults; ir++) fDataFromMacroList->Add(new TObjString(Form("%s[%d]", procName[i].Data(), ir)));
+ }
+ for (Int_t resInd = 0; resInd < nResults; resInd++, gROOT->ProcessLineSync("presults++;")){
+ Double_t *pres = (Double_t*)gROOT->ProcessLineSync("presults;");
+ singleTrackOut[i][resInd] = *pres;
+ }
+ } else if (mProcType[i] == kCorrelTrackAnalyse){ // CORRELATED TRACKS ANALYSE
// 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.
if (!selectedByCorrSelMacro) continue;
// Create data pointers in CINT, execute the macro and get the data
- gROOT->ProcessLineSync("Double_t* results = 0;");
+ gROOT->ProcessLineSync("Double_t results[10] = {0}, *presults=&results[0];");
gROOT->ProcessLineSync("Int_t n = 0;");
gROOT->ProcessLineSync(procCmds[i]);
- Double_t* results = (Double_t*)gROOT->ProcessLineSync("results;");
Int_t nResults = (Int_t)gROOT->ProcessLineSync("n;");
-
- if (results == 0) {
- Error("Apply macros", "Error reading data from macro \"%s\"", procIterator->At(i)->GetTitle());
+ if (!nResults) {
+ AliError(Form("Error reading data from macro \"%s\"", procName[i].Data()));
continue;
}
- for (Int_t resInd = 0; resInd < nResults; resInd++) {
- (*fDataTree) << Form("TrackData%d", i) << Form("Macro%d=", i) << results[resInd] << (Char_t*)"\n";
+ if(nResults>10){
+ AliWarning(Form("Macro \"%s\" returns %d values. Limit set to 10.", procName[i].Data(), nResults));
+ nResults=10;
}
-
- delete results;
- results = 0;
- }
- }
- }
- }
-
+ TBranch *b(treeCorrel->GetBranch(procName[i].Data()));
+ if(!b) {
+ AliInfo(Form("Building branch[%s]", procName[i].Data()));
+ b = treeCorrel->Branch(procName[i].Data(), correlTrackOut[i], Form("%s[%d]/D", procName[i].Data(), nResults));
+ // Add to "data-from-list"
+ for(Int_t ir(0); ir<nResults; ir++) fDataFromMacroList->Add(new TObjString(Form("%s[%d]", procName[i].Data(), ir)));
+ }
+ for (Int_t resInd = 0; resInd < nResults; resInd++, gROOT->ProcessLineSync("presults++;")){
+ Double_t *pres = (Double_t*)gROOT->ProcessLineSync("presults;");
+ correlTrackOut[i][resInd] = *pres;
+ }
+ b->Fill();
+ } // End loop correl tracks
+ } // End if correl macros
+ } // End loop all macro
+ treeSingle->Fill();
+ treeCorrel->Fill();
+ } // End loop single tracks
+
+ fgData->cd();
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]) {
- (*fDataTree) << Form("TrackData%d", i) << Form("Macro%d=", i) << histos[histoIndex] << (Char_t*)"\n";
- }
- histoIndex++;
- }
+ if (mProcType[i] != kSingleTrackHisto && mProcType[i] != kCorrelTrackHisto) continue;
+ // Might be empty (e.g. no tracks have been selected)!
+ if(histos[histoIndex]) histos[histoIndex]->Write();
+ histoIndex++;
}
+ treeSingle->Write();
+ treeCorrel->Write();
+ fgData->Close();
- if (fDataTree) delete fDataTree;
- fDataTree = NULL;
-
- if (procCmds) delete [] procCmds;
- procCmds = NULL;
- if (mProcType) delete [] mProcType;
- mProcType = NULL;
+ if (procName) delete [] procName; procName = NULL;
+ if (procCmds) delete [] procCmds; procCmds = NULL;
+ if (mProcType) delete [] mProcType; mProcType = NULL;
- if (selCmds) delete [] selCmds;
- selCmds = NULL;
- if (mSelType) delete [] mSelType;
- mSelType = NULL;
+ if (selCmds) delete [] selCmds; selCmds = NULL;
+ if (mSelType) delete [] mSelType; mSelType = NULL;
- if (histos) delete [] histos;
- histos = NULL;
+ if (histos) delete [] histos; histos = NULL;
// Clear root
// A.B. gROOT->Reset();
if (!UseList){
// Single track select macro or single track histo macro?
TFunction* f = gROOT->GetGlobalFunctionWithPrototype(name, "const AliTRDtrackV1*", kTRUE);
- if (f != 0x0)
+ if (f != NULL)
{
// Some additional check (is the parameter EXACTLY of the desired type?)
- if (strstr(f->GetMangledName(), "oPconstsPAliTRDtrackV1mUsP") != 0x0)
+ if (strstr(f->GetMangledName(), "oPconstsPAliTRDtrackV1mUsP") != NULL)
{
// Single track select macro?
if (!strcmp(f->GetReturnTypeName(), "Bool_t"))
}
}
// Single track analyse macro?
- else if ((f = gROOT->GetGlobalFunctionWithPrototype(name, "const AliTRDtrackV1*, Double_t*&, Int_t&", kTRUE))
- != 0x0)
+ else if ((f = gROOT->GetGlobalFunctionWithPrototype(name, "const AliTRDtrackV1*, Double_t*, Int_t&", kTRUE))
+ != NULL)
{
if (!strcmp(f->GetReturnTypeName(), "void"))
{
// Some additional check (are the parameters EXACTLY of the desired type?)
- if (strstr(f->GetMangledName(), "oPconstsPAliTRDtrackV1mUsP") != 0x0 &&
- strstr(f->GetMangledName(), "cODouble_tmUaNsP") != 0x0 &&
- strstr(f->GetMangledName(), "cOInt_taNsP") != 0x0)
+ if (strstr(f->GetMangledName(), "oPconstsPAliTRDtrackV1mUsP") != NULL &&
+ strstr(f->GetMangledName(), "cODouble_tmUsP") != NULL &&
+ strstr(f->GetMangledName(), "cOInt_taNsP") != NULL)
{
type = kSingleTrackAnalyse;
}
}
// Correlated tracks select macro or correlated tracks histo macro?
else if ((f = gROOT->GetGlobalFunctionWithPrototype(name, "const AliTRDtrackV1*, const AliTRDtrackV1*", kTRUE))
- != 0x0)
+ != NULL)
{
// Some additional check (is the parameter EXACTLY of the desired type?)
- if (strstr(f->GetMangledName(), "oPconstsPAliTRDtrackV1mUsP") != 0x0 &&
- strstr(f->GetMangledName(), "cOconstsPAliTRDtrackV1mUsP") != 0x0)
+ if (strstr(f->GetMangledName(), "oPconstsPAliTRDtrackV1mUsP") != NULL &&
+ strstr(f->GetMangledName(), "cOconstsPAliTRDtrackV1mUsP") != NULL)
{
// Correlated track select macro?
if (!strcmp(f->GetReturnTypeName(), "Bool_t"))
}
// Correlated tracks analyse macro?
else if ((f = gROOT->GetGlobalFunctionWithPrototype(name,
- "const AliTRDtrackV1*, const AliTRDtrackV1*, Double_t*&, Int_t&", kTRUE))
- != 0x0)
+ "const AliTRDtrackV1*, const AliTRDtrackV1*, Double_t*, Int_t&", kTRUE))
+ != NULL)
{
if (!strcmp(f->GetReturnTypeName(), "void"))
{
// Some additional check (is the parameter EXACTLY of the desired type?)
- if (strstr(f->GetMangledName(), "oPconstsPAliTRDtrackV1mUsP") != 0x0 &&
- strstr(f->GetMangledName(), "cOconstsPAliTRDtrackV1mUsP") != 0x0 &&
- strstr(f->GetMangledName(), "cODouble_tmUaNsP") != 0x0 &&
- strstr(f->GetMangledName(), "cOInt_taNsP") != 0x0)
+ if (strstr(f->GetMangledName(), "oPconstsPAliTRDtrackV1mUsP") != NULL &&
+ strstr(f->GetMangledName(), "cOconstsPAliTRDtrackV1mUsP") != NULL &&
+ strstr(f->GetMangledName(), "cODouble_tmUsP") != NULL &&
+ strstr(f->GetMangledName(), "cOInt_taNsP") != NULL)
{
type = kCorrelTrackAnalyse;
}
// Walk through the list of tracks
- AliEveTRDTrack* track = 0x0;
+ AliEveTRDTrack* track = NULL;
for (TEveElement::List_i iter = this->BeginChildren(); iter != this->EndChildren(); ++iter)
{
if (!(track = dynamic_cast<AliEveTRDTrack*>(*iter))) continue;
// access the data. //
//////////////////////////////////////////////////////////////////////////
+#include <AliLog.h>
#include <EveDet/AliEveTRDData.h>
#include <EveDet/AliEveTRDTrackList.h>
#include "AliEveTRDTrackListEditor.h"
-
#include <EveBase/AliEveEventManager.h>
#include <AliTRDReconstructor.h>
#include <AliTRDtrackV1.h>
+
#include <TGButton.h>
#include <TCanvas.h>
#include <TEveBrowser.h>
fFileTypes[2] = (Char_t*)"ROOT macros"; fFileTypes[3] = (Char_t*)"*.C";
fFileTypes[4] = 0; fFileTypes[5] = 0;
fFileInfo->fFileTypes = (const Char_t**)fFileTypes;
+ fFileInfo->fIniDir = (Char_t*)"$ALICE_ROOT/PWGPP/TRD/macros/EVE";
fFileInfo->fFileTypeIdx = 2;
fFileInfo->fMultipleSelection = kTRUE;
// Accesses the temporary data file created by the last call of ApplyMacros() and draws
// histograms according to the selection in the "Histograms"-tab.
- Int_t nHistograms = GetNSelectedHistograms();
- if (nHistograms <= 0)
- {
- new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error",
- "No data selected. Please select the data you want to plot!", kMBIconExclamation, kMBOk);
+// Int_t nHistograms = GetNSelectedHistograms();
+// if (nHistograms<=0 || nHistograms>3) {
+// new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error",
+// Form("Number of selected projections [%d] outside range [1-3]!", nHistograms), kMBIconExclamation, kMBOk);
+// return;
+// }
+
+ TFile* file(NULL);
+ if (!(file=TFile::Open(Form("/tmp/TRD.TrackListMacroData_%s.root", gSystem->Getenv("USER")), "READ"))) {
+ AliError(Form("Cannot open file \"/tmp/TRD.TrackListMacroData_%s.root\"",
+ gSystem->Getenv("USER")));
+ new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error - Draw histograms",
+ Form("Cannot open file \"/tmp/TRD.TrackListMacroData_%s.root\"", gSystem->Getenv("USER")),
+ kMBIconExclamation, kMBOk);
return;
}
- if (nHistograms > 3)
- {
- new TGMsgBox(gClient->GetRoot(), GetMainFrame(),
- "Error", "Only histograms with up to 3 dimensions supported. Please select 1,2 or 3 data macros!",
+ TTree *ts(NULL), *tc(NULL);
+ if (!(ts=(TTree*)file->Get("sTrack"))) {
+ AliError(Form("Cannot find tree \"sTrack\" in file \"/tmp/TRD.TrackListMacroData_%s.root\"",
+ gSystem->Getenv("USER")));
+ new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error - Draw histograms",
+ Form("Cannot find tree \"sTrack\" in file \"/tmp/TRD.TrackListMacroData_%s.root\"", gSystem->Getenv("USER")),
kMBIconExclamation, kMBOk);
return;
}
-
- // Check, if a histo macro shall be drawn
- Int_t indexOfHistoMacro = -1;
- Int_t selectedChecked = 0;
- for (Int_t j = 0; j < fM->fDataFromMacroList->GetEntries(); j++)
- {
- if (fCheckButtons[j]->TGButton::GetState() == kButtonDown)
- {
- selectedChecked++;
-
- // Histo macro? -> To check this, look for the substring "(histo macro)"
- if (strstr(fM->fDataFromMacroList->At(j)->GetName(), "(histo macro)") != 0)
- {
- // Is also another macro selected?
- if (nHistograms > 1)
- {
- // Histo macros cannot(!) be correlated!
- new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error - Draw histograms",
- "Histo macros (return value \"TH1*\") cannot be combined with other macros",
- kMBIconExclamation, kMBOk);
- return;
- }
-
- // Mark this histo macro for drawing
- indexOfHistoMacro = j;
-
- // Have all selected macros been checked? -> If yes, we are done with this
- if (selectedChecked == nHistograms) break;
- }
- }
- }
-
- TFile* file = new TFile(Form("/tmp/TRD.TrackListMacroData_%s.root", gSystem->Getenv("USER")), "READ");
- if (!file)
- {
- Error("Draw histograms", "Cannot open file \"/tmp/TRD.TrackListMacroData_%s.root\"",
- gSystem->Getenv("USER"));
- new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error - Draw histograms",
- Form("Cannot open file \"/tmp/TRD.TrackListMacroData_%s.root\"", gSystem->Getenv("USER")),
+ if (!(tc=(TTree*)file->Get("cTrack"))) {
+ AliError(Form("Cannot find tree \"cTrack\" in file \"/tmp/TRD.TrackListMacroData_%s.root\"",
+ gSystem->Getenv("USER")));
+ new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error - Draw histograms",
+ Form("Cannot find tree \"cTrack\" in file \"/tmp/TRD.TrackListMacroData_%s.root\"", gSystem->Getenv("USER")),
kMBIconExclamation, kMBOk);
return;
}
-
- TTree* t = 0;
- TTree* tFriend1 = 0;
- TTree* tFriend2 = 0;
-
- Int_t indexOfMacro1 = 0;
- Int_t indexOfMacro2 = 0;
- Int_t indexOfMacro3 = 0;
-
- // Variable for the loop below -> Will be set to aborting value, if a histo macro is drawn
- Int_t i = 0;
-
- // Draw histo macro?
- if (indexOfHistoMacro >= 0)
- {
- if ((t = (TTree*)file->Get(Form("TrackData%d", indexOfHistoMacro))))
- {
- SetDrawingToHistoCanvasTab();
-
- TH1* myHist = 0;
- t->SetBranchAddress(Form("Macro%d", indexOfHistoMacro), &myHist);
- t->GetEntry(0);
- if (myHist != 0) myHist->Draw();
- else
- {
- Error("Draw histograms", "No histogram for histo macro \"%s\" found!",
- fM->fDataFromMacroList->At(indexOfHistoMacro)->GetName());
- new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error - Draw histograms",
- Form("No histogram for histo macro \"%s\" found!",
- fM->fDataFromMacroList->At(indexOfHistoMacro)->GetName()), kMBIconExclamation, kMBOk);
-
- }
- UpdateHistoCanvasTab();
- }
- else
- {
- Error("Draw histograms", "No data for histo macro \"%s\" found!\nMaybe no tracks have been selected.",
- fM->fDataFromMacroList->At(indexOfHistoMacro)->GetName());
- new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error - Draw histograms",
- Form("No data for histo macro \"%s\" found!\nMaybe no tracks have been selected.",
- fM->fDataFromMacroList->At(indexOfHistoMacro)->GetName()), kMBIconExclamation, kMBOk);
- }
-
- // Skip the loop below
- i = fM->fDataFromMacroList->GetEntries();
+ // Close any potential tab left from previous plottings
+ TGTab *tab(gEve->GetBrowser()->GetTab(1)); TGTabElement *tt(NULL);
+ TString vs; Int_t canvas(0), singleSelected(0);
+ while((tt=tab->GetTabTab(1))){
+ AliDebug(1, Form("Deleting tab[%s]", tt->GetString()));
+ tab->CloseTab(1); // trick. always close second tab due to internal renumbering inside TGTab
}
-
- // Load the trees in succession and remember the entries -> Plot the analyse macros
- for ( ; i < fM->fDataFromMacroList->GetEntries(); i++)
- {
- if (fCheckButtons[i]->TGButton::GetState() == kButtonDown)
- {
- if (t == 0)
- {
- indexOfMacro1 = i;
- if (!(t = (TTree*)file->Get(Form("TrackData%d", i))))
- {
- Error("Draw histograms", "No data for macro \"%s\" found!\nMaybe no tracks have been selected.",
- fM->fDataFromMacroList->At(i)->GetName());
- new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error - Draw histograms",
- Form("No data for macro \"%s\" found!\nMaybe no tracks have been selected.",
- fM->fDataFromMacroList->At(i)->GetName()), kMBIconExclamation, kMBOk);
- break;
- }
-
- // 1d histogram
- if (nHistograms == 1)
- {
- SetDrawingToHistoCanvasTab();
-
- t->Draw(Form("Macro%d", indexOfMacro1), "1");
- ((TH1*)gPad->GetPrimitive("htemp"))->SetTitle(Form("%s;%s",
- fM->fDataFromMacroList->At(indexOfMacro1)->GetName(),
- fM->fDataFromMacroList->At(indexOfMacro1)->GetName()));
- UpdateHistoCanvasTab();
-
- break;
- }
+ // Check, if a histo macro shall be drawn
+ canvas=0;
+ TH1* myHist(NULL); TBranch *b(NULL);
+ for (Int_t j = 0; j < fM->fDataFromMacroList->GetEntries(); j++) {
+ if (fCheckButtons[j]->TGButton::GetState() != kButtonDown) continue;
+ TString s(fCheckButtons[j]->GetTitle()); Int_t idx(s.Index('['));
+ // Histo macro
+ if(idx<0) {
+ if (!(myHist = (TH1*)file->Get(s.Data()))) {
+ AliError(Form("No histo[%s] found !", s.Data()));
+ new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error - Draw histograms",
+ Form("No histo[%s] found !", s.Data()), kMBIconExclamation, kMBOk);
+ } else {
+ SetDrawingToHistoCanvasTab(++canvas);
+ myHist->DrawCopy();
+ UpdateHistoCanvasTab(canvas);
}
- else if (tFriend1 == 0)
- {
- indexOfMacro2 = i;
- if (!(tFriend1 = (TTree*)file->Get(Form("TrackData%d", i))))
- {
- Error("Draw histograms", "No data for macro \"%s\" found!\nMaybe no tracks have been selected.",
- fM->fDataFromMacroList->At(i)->GetName());
- new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error - Draw histograms",
- Form("No data for macro \"%s\" found!\nMaybe no tracks have been selected.",
- fM->fDataFromMacroList->At(i)->GetName()),
- kMBIconExclamation, kMBOk);
- break;
- }
-
- // 2d histogram
- if (nHistograms == 2)
- {
- SetDrawingToHistoCanvasTab();
-
- t->AddFriend(tFriend1);
- t->Draw(Form("Macro%d:Macro%d", indexOfMacro1, indexOfMacro2), "1");
- ((TH1*)gPad->GetPrimitive("htemp"))->SetTitle(Form("%s - %s;%s;%s",
- fM->fDataFromMacroList->At(indexOfMacro2)->GetName(),
- fM->fDataFromMacroList->At(indexOfMacro1)->GetName(),
- fM->fDataFromMacroList->At(indexOfMacro2)->GetName(),
- fM->fDataFromMacroList->At(indexOfMacro1)->GetName()));
-
- UpdateHistoCanvasTab();
-
- break;
+ } else {
+ TString ss=s(0, idx);
+ if (!(b = ts->GetBranch(ss.Data()))) {
+ AliError(Form("No data for macro \"%s\" found !", ss.Data()));
+ new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error - Draw tree",
+ Form("No data for macro \"%s\" found !",
+ ss.Data()), kMBIconExclamation, kMBOk);
+ continue;
+ } else {
+ if(!singleSelected){
+ vs=s;
+ singleSelected++;
+ } else if(singleSelected<3){
+ vs+=":";vs+=s;
+ singleSelected++;
+ } else {
+ AliError(Form("Variable \"%s\" can no longer be attached to plot !", s.Data()));
}
- }
- // 3d histogram
- else
- {
- indexOfMacro3 = i;
- if (!(tFriend2 = (TTree*)file->Get(Form("TrackData%d", i))))
- {
- Error("Draw histograms", "No data for macro \"%s\" found!\nMaybe no tracks have been selected.",
- fM->fDataFromMacroList->At(i)->GetName());
- new TGMsgBox(gClient->GetRoot(), GetMainFrame(), "Error - Draw histograms",
- Form("No data for macro \"%s\" found!\nMaybe no tracks have been selected.",
- fM->fDataFromMacroList->At(i)->GetName()), kMBIconExclamation, kMBOk);
- break;
- }
-
- SetDrawingToHistoCanvasTab();
-
- t->AddFriend(tFriend1);
- t->AddFriend(tFriend2);
- t->Draw(Form("Macro%d:Macro%d:Macro%d", indexOfMacro1, indexOfMacro2, indexOfMacro3), "1");
- ((TH1*)gPad->GetPrimitive("htemp"))->SetTitle(Form("%s - %s - %s;%s;%s;%s",
- fM->fDataFromMacroList->At(indexOfMacro3)->GetName(),
- fM->fDataFromMacroList->At(indexOfMacro2)->GetName(),
- fM->fDataFromMacroList->At(indexOfMacro1)->GetName(),
- fM->fDataFromMacroList->At(indexOfMacro3)->GetName(),
- fM->fDataFromMacroList->At(indexOfMacro2)->GetName(),
- fM->fDataFromMacroList->At(indexOfMacro1)->GetName()));
-
- UpdateHistoCanvasTab();
-
- break;
}
}
}
+ if(singleSelected){
+ SetDrawingToHistoCanvasTab(++canvas);
+ ts->Draw(vs.Data());
+ UpdateHistoCanvasTab(canvas);
+ }
- if (t != 0) delete t;
- t = 0;
- if (tFriend1 != 0) delete tFriend1;
- tFriend1 = 0;
- if (tFriend2 != 0) delete tFriend2;
- tFriend2 = 0;
file->Close("R");
delete file;
- file = 0;
+ file = NULL;
}
//______________________________________________________
}
//______________________________________________________
-void AliEveTRDTrackListEditor::SetDrawingToHistoCanvasTab()
+void AliEveTRDTrackListEditor::SetDrawingToHistoCanvasTab(Int_t canvas)
{
// Sets gPad to the tab with the name of the current AliEveTRDTrackList. If this tab does
// not exist, it will be created. Otherwise, it is re-used.
// If the tab with the canvas has been closed, the canvas will be deleted.
// So, if there is no tab, set the canvas pointer to zero and recreate it in a new tab.
- if (fHistoCanvas != 0)
- {
- if (gEve->GetBrowser()->GetTab(1)->SetTab(fHistoCanvasName->GetString()) == 0)
- {
- fHistoCanvas = 0;
- }
- }
- if (!fHistoCanvas)
- {
- fHistoCanvas = gEve->AddCanvasTab(fM->GetName());
- }
-
- gPad = fHistoCanvas;
+ AliDebug(1, Form("Build Tab[%s_%d]", fM->GetName(), canvas));
+ fHistoCanvas = gEve->AddCanvasTab(Form("%s_%d", fM->GetName(), canvas));
+ fHistoCanvas->SetName(Form("c_%d", canvas));
+ fHistoCanvas->cd();
}
//______________________________________________________
}
//______________________________________________________
-void AliEveTRDTrackListEditor::UpdateHistoCanvasTab()
+void AliEveTRDTrackListEditor::UpdateHistoCanvasTab(Int_t canvas)
{
// Updates the histogram and the corresponding tab (including titles).
// Update name of the tab (tab has been set to current tab!)
- fHistoCanvasName->SetString(fM->GetName());
+ //fHistoCanvasName->SetString(Form("%s_%d", fM->GetName(), canvas));
// Use a copy of fHistoCanvasName!! -> If the user closes a tab manually, the TGString
// will be deleted -> Error might occur, when accessing the pointer
- gEve->GetBrowser()->GetTab(1)->GetCurrentTab()->SetText(new TGString(fHistoCanvasName));
+ //gEve->GetBrowser()->GetTab(canvas)->GetCurrentTab()->SetText(new TGString(fHistoCanvasName));
// Switch tabs to force redrawing
- gEve->GetBrowser()->GetTab(1)->SetTab(0);
- gEve->GetBrowser()->GetTab(1)->SetTab(fHistoCanvasName->GetString());
+ TGTab *tab(gEve->GetBrowser()->GetTab(1));
+ if(tab->GetCurrent() != canvas){
+ AliError(Form("Curent tab[%s] tabId[%d] mismatch %d", tab->GetCurrentTab()->GetString(), tab->GetCurrent(), canvas));
+ return;
+ }
+ if(!tab->SetTab(canvas)){
+ AliError(Form("Failed updating tab[%d]", canvas));
+ return;
+ }
+ fHistoCanvas->Modified();
fHistoCanvas->Update();
}