X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=TPC%2FAliTPCCalibViewerGUItime.cxx;h=5a39da7c729f1ea664b8c92f9ae1dee9a9fba07d;hb=f2000e1d75fd693e5e9da7d1b9d29b5c423c9fe2;hp=0eb6b45bf1e5e1b06735d8e880c4e1f943117c18;hpb=892226be1b2a068a93c0c0e38cba1320b3077329;p=u%2Fmrichter%2FAliRoot.git diff --git a/TPC/AliTPCCalibViewerGUItime.cxx b/TPC/AliTPCCalibViewerGUItime.cxx index 0eb6b45bf1e..5a39da7c729 100644 --- a/TPC/AliTPCCalibViewerGUItime.cxx +++ b/TPC/AliTPCCalibViewerGUItime.cxx @@ -19,6 +19,7 @@ // // /////////////////////////////////////////////////////////////////////////////// + #include //Root includes #include @@ -43,6 +44,7 @@ #include #include #include +#include // #include #include @@ -62,7 +64,9 @@ //AliRoot includes #include #include "AliTPCCalibViewerGUI.h" +#include "AliTPCCalibViewer.h" #include "AliTPCcalibDB.h" +#include "AliTPCcalibDButil.h" #include "AliTPCConfigParser.h" #include "AliTPCCalibViewerGUItime.h" @@ -80,13 +84,16 @@ TGCompositeFrame(p,w,h), fCurrentRunDetails(-1), fOutputCacheDir("/tmp"), fDrawString(""), - fConfigFile("$ALICE_ROOT/TPC/CalibMacros/calibVarDescription.txt"), - fConfigParser(0x0), + fConfigFile(""), + fConfigParser(new AliTPCConfigParser), fIsCustomDraw(kFALSE), fRunNumbers(10), fTimeStamps(10), fValuesX(10), fValuesY(10), + fNoGraph(kFALSE), + fGraphLimitEntries(10000), + fMapRefTrees(new TMap), //GUI elements //main canvas Top part, bottom part fContTopBottom(0x0), @@ -94,6 +101,9 @@ TGCompositeFrame(p,w,h), fContLCR(0x0), //content left fContLeft(0x0), + fContDrawOpt(0x0), + fChkDrawOptSame(0x0), + fComboAddDrawOpt(0x0), fContDrawSel(0x0), fContDrawSelSubRunTime(0x0), fRadioXhist(0x0), @@ -121,18 +131,25 @@ TGCompositeFrame(p,w,h), fLblValueXVal(0x0), fLblValueYVal(0x0), fBtnDumpRuns(0x0), + fContAliases(0x0), + fListAliases(0x0), //content bottom fContCustom(0x0), fContCustomCuts(0x0), fLblCustomDraw(0x0), fLblCustomCuts(0x0), fComboCustomDraw(0x0), - fComboCustomCuts(0x0) + fComboCustomCuts(0x0), + fTrashBox(new TObjArray) { // // ctor // + fMapRefTrees->SetOwnerKeyValue(); + fTrashBox->SetOwner(); DrawGUI(p,w,h); + gStyle->SetMarkerStyle(20); + gStyle->SetMarkerSize(0.5); SetInitialValues(); } //______________________________________________________________________________ @@ -140,7 +157,9 @@ AliTPCCalibViewerGUItime::~AliTPCCalibViewerGUItime(){ // // dtor // - + delete fConfigParser; + delete fTrashBox; + delete fMapRefTrees; } //______________________________________________________________________________ void AliTPCCalibViewerGUItime::DrawGUI(const TGWindow */*p*/, UInt_t w, UInt_t h) { @@ -193,7 +212,20 @@ void AliTPCCalibViewerGUItime::DrawGUI(const TGWindow */*p*/, UInt_t w, UInt_t h // ************************* content of fContLeft ************************* // ======================================================================== // --- draw button and tabLeft --- - + // draw options + fContDrawOpt = new TGGroupFrame(fContLeft, "Draw options", kVerticalFrame | kFitWidth | kFitHeight); + fContLeft->AddFrame(fContDrawOpt, new TGLayoutHints(kLHintsExpandX, 0, 0, 10, 0)); + fChkDrawOptSame = new TGCheckButton(fContDrawOpt, "Same"); + fContDrawOpt->AddFrame(fChkDrawOptSame, new TGLayoutHints(kLHintsNormal, 0, 2, 0, 0)); + fChkDrawOptSame->SetToolTipText("Add draw option 'same'"); + // additional draw options combo box + fComboAddDrawOpt = new TGComboBox(fContDrawOpt); + fComboAddDrawOpt->Resize(0, 22); + fComboAddDrawOpt->EnableTextInput(kTRUE); + fContDrawOpt->AddFrame(fComboAddDrawOpt, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 0, 0, 0, 0)); +// fComboAddDrawOpt->Connect("ReturnPressed()", "AliTPCCalibViewerGUI", this, "HandleButtonsGeneral(=14)"); +// fComboAddDrawOpt->Connect("Selected(Int_t)", "AliTPCCalibViewerGUI", this, "DoNewSelection()"); + // draw selection group fContDrawSel = new TGGroupFrame(fContLeft, "Draw selection", kVerticalFrame | kFitWidth | kFitHeight); fContLeft->AddFrame(fContDrawSel, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 10, 0)); @@ -293,7 +325,7 @@ void AliTPCCalibViewerGUItime::DrawGUI(const TGWindow */*p*/, UInt_t w, UInt_t h fLblRunNumber->SetTextJustify(kTextLeft); fContValues->AddFrame(fLblRunNumber, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0)); //run number - fLblRunNumberVal = new TGLabel(fContValues, "00000"); + fLblRunNumberVal = new TGLabel(fContValues, "000000"); fLblRunNumberVal->SetTextJustify(kTextLeft); fContValues->AddFrame(fLblRunNumberVal, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 0, 0, 0, 0)); //time stamp label @@ -325,6 +357,37 @@ void AliTPCCalibViewerGUItime::DrawGUI(const TGWindow */*p*/, UInt_t w, UInt_t h fContRight->AddFrame(fBtnDumpRuns, new TGLayoutHints(kLHintsExpandX, 0, 0, 10, 0)); fBtnDumpRuns->Connect("Clicked()", "AliTPCCalibViewerGUItime", this, "DoDumpRuns()"); fBtnDumpRuns->SetToolTipText("Press to dump the run numbers of the current selection."); + //group frame for value information + fContAliases = new TGGroupFrame(fContRight, "Aliases", kVerticalFrame | kFitWidth | kFitHeight); + fContRight->AddFrame(fContAliases, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 10, 0)); + // list of aliases + fListAliases = new TGListBox(fContAliases); + fContAliases->AddFrame(fListAliases, new TGLayoutHints(kLHintsNormal | kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0)); + fListAliases->Connect("Selected(Int_t)", "AliTPCCalibViewerGUItime", this, "DoNewSelectionAliases()"); +// fListAliases->Resize(0,88); + //buttons + TGCompositeFrame *frame1 = new TGCompositeFrame(fContAliases, 200, 23, kHorizontalFrame | kFitWidth | kFitHeight); + fContAliases->AddFrame(frame1, new TGLayoutHints(kLHintsCenterX | kLHintsExpandX , 0, 0, 0, 0)); + // add button + TGTextButton *btnAdd = new TGTextButton(frame1, "&Add"); + frame1->AddFrame(btnAdd, new TGLayoutHints(kLHintsExpandX, 0, 0, 10, 0)); + btnAdd->Connect("Clicked()", "AliTPCCalibViewerGUItime", this, "DoAddAlias()"); + btnAdd->SetToolTipText("Press to add an alias."); + btnAdd->Resize(0,22); + // del button + TGTextButton *btnDel = new TGTextButton(frame1, "&Del"); + frame1->AddFrame(btnDel, new TGLayoutHints(kLHintsExpandX, 0, 0, 10, 0)); + btnDel->Connect("Clicked()", "AliTPCCalibViewerGUItime", this, "DoDelAlias()"); + btnDel->SetToolTipText("Press to delete the selected alias."); + btnDel->Resize(0,22); + // update button + TGTextButton *btnUp = new TGTextButton(frame1, "&Upd"); + frame1->AddFrame(btnUp, new TGLayoutHints(kLHintsExpandX, 0, 0, 10, 0)); + btnUp->Connect("Clicked()", "AliTPCCalibViewerGUItime", this, "UpdateAliasList()"); + btnUp->SetToolTipText("Press to update the alias list."); + btnUp->Resize(0,22); + + // ========================================================================= // ****************** bottom content of fContTopBottom ********************* @@ -381,42 +444,65 @@ void AliTPCCalibViewerGUItime::SetInitialValues(){ } //______________________________________________________________________________ -void AliTPCCalibViewerGUItime::UseFile(const char* fileName) { +void AliTPCCalibViewerGUItime::UseFile(const char* fileName, const char* treeName) { // // retrieve tree from file // - //TString s=gSystem->GetFromPipe(Form("ls %s",fileName)); - TString s(fileName); + TString s=gSystem->GetFromPipe(Form("ls %s",fileName)); +// TString s(fileName); TObjArray *arr=s.Tokenize("\n"); TIter next(arr); TObject *o=0; if (fTree) delete fTree; - fTree=new TChain("dcs"); + fTree=new TChain(treeName); while ( (o=next()) ){ fTree->AddFile(o->GetName()); } delete arr; + if (!CheckChain()) return; + UseConfigFile(fConfigFile.Data()); + Reload(); + +} +//______________________________________________________________________________ +void AliTPCCalibViewerGUItime::UseChain(TChain *const chain = 0) +{ + // + // + // + fTree=chain; + if (!CheckChain()) return; + //set configuration file + UseConfigFile(fConfigFile.Data()); + Reload(); +} +//______________________________________________________________________________ +Bool_t AliTPCCalibViewerGUItime::CheckChain() +{ + // + // check whether cahin has entries + // decide whether to draw graphs in 2D + // + if (!fTree) return kFALSE; fTree->Lookup(); - if (fTree->GetEntries()==0){ + Long64_t entries=fTree->GetEntries(); + if (entries==0){ AliError("No entries found in chain"); - return; - } -/* TDirectory *save=gDirectory; - if (fFile) delete fFile; - fFile = TFile::Open(fileName); - if (!fFile) return; - if (!fFile->IsOpen()) return; - fTree=(TTree*)fFile->Get("dcs"); - if (!fTree){ - AliError(Form("Could not get tree from file '%s'",fileName)); - return; + return kFALSE; } - save->cd(); - */ - if (fConfigParser) delete fConfigParser; - fConfigParser=new AliTPCConfigParser(gSystem->ExpandPathName(fConfigFile.Data())); - Reload(); - + //check whether to draw graphs + CheckDrawGraph(); + return kTRUE; +} +//______________________________________________________________________________ +void AliTPCCalibViewerGUItime::UseConfigFile(const char* file) +{ + // + // Use 'file' as configuration file + // + fConfigFile=file; + fConfigParser->ParseConfigFileTxt(fConfigFile.Data()); + FillCalibTypes(); } //______________________________________________________________________________ void AliTPCCalibViewerGUItime::FillRunTypes() @@ -429,24 +515,17 @@ void AliTPCCalibViewerGUItime::FillRunTypes() fComboRunType->RemoveAll(); fComboRunType->AddEntry("ALL",id++); fComboRunType->Select(0,kFALSE); + if (!fTree->GetBranch("runType.")) return; TObjString *runType=0x0; Int_t nevets=fTree->GetEntries(); fTree->SetBranchStatus("*",0); fTree->SetBranchStatus("runType.*",1); -// TBranch *branch=fTree->GetBranch("runType."); -// if (!branch) { -// branch->ResetAddress(); -// fTree->SetBranchStatus("*",1); -// return; -// } -// branch->SetAddress(&runType); fTree->SetBranchAddress("runType.",&runType); for (Int_t iev=0;ievGetEntry(iev); TString type=runType->String(); if (!type.IsNull()&&!fComboRunType->FindEntry(type)) fComboRunType->AddEntry(type,id++); } -// branch->ResetAddress(); fTree->ResetBranchAddresses(); fTree->SetBranchStatus("*",1); } @@ -456,7 +535,6 @@ void AliTPCCalibViewerGUItime::FillCalibTypes() // // loop over configuration and fill calibration types // - if (!fConfigParser) return; Int_t id=0; fListCalibType->RemoveAll(); TObject *o=0x0; @@ -482,7 +560,19 @@ void AliTPCCalibViewerGUItime::FillCalibTypes() } } //______________________________________________________________________________ -void AliTPCCalibViewerGUItime::Reload(Int_t first){ +void AliTPCCalibViewerGUItime::CheckDrawGraph() +{ + // + // Check whether to draw graphs in 2D mode based on the number of entries in the chain + // GetEstimate() returns the maximum size of the arrays stored in GetV1()... + // + if (!fTree) return; + fNoGraph=kTRUE; + if (fTree->GetEntries()GetEstimate()) fNoGraph=kFALSE; +} +//______________________________________________________________________________ +void AliTPCCalibViewerGUItime::Reload(Int_t first) +{ // // reload the gui contents, this is needed after the input tree has changed // @@ -539,17 +629,25 @@ void AliTPCCalibViewerGUItime::Reload(Int_t first){ if (!active){ TString s=branchName; if (branchName.EndsWith(".")) s+="*"; - fTree->SetBranchStatus(s.Data(),0); +// fTree->SetBranchStatus(s.Data(),0); continue; } - fListVariables->AddEntry(SubstituteUnderscores(branchTitle.Data()),id); +// fListVariables->AddEntry(SubstituteUnderscores(branchTitle.Data()),id); + fListVariables->AddEntry(branchTitle.Data(),id); ++idCount; } //trick to display modifications - if (!first){ - fListVariables->Resize(fListVariables->GetWidth()-1, fListVariables->GetHeight()); - fListVariables->Resize(fListVariables->GetWidth()+1, fListVariables->GetHeight()); - } + fListVariables->Resize(fListVariables->GetWidth()-1, fListVariables->GetHeight()); + fListVariables->Resize(fListVariables->GetWidth()+1, fListVariables->GetHeight()); +} +//______________________________________________________________________________ +void AliTPCCalibViewerGUItime::AddReferenceTree(const char* treeFileName, const char* refName) +{ + // + // map of reference trees that should always be attached to the CalibViewerGUI + // + fMapRefTrees->Add(new TObjString(refName), new TObjString(treeFileName)); + } //______________________________________________________________________________ const char* AliTPCCalibViewerGUItime::GetDrawString(){ @@ -564,8 +662,10 @@ const char* AliTPCCalibViewerGUItime::GetDrawString(){ id=fListVariables->GetSelectedEntry()->EntryId(); // printf("id: %d\n",id); TString branchName=selectedVariable; - const TObject *key=(*fConfigParser)(id); - if (key) branchName=(*fConfigParser)(id)->GetName(); + if (fConfigParser){ + const TObject *key=(*fConfigParser)(id); + if (key) branchName=(*fConfigParser)(id)->GetName(); + } //treat case of TVector if (branchName.EndsWith(".")){ Int_t par = (Int_t)(fNmbPar->GetNumber()); @@ -579,7 +679,18 @@ const char* AliTPCCalibViewerGUItime::GetDrawString(){ return branchName.Data(); } //______________________________________________________________________________ -const char* AliTPCCalibViewerGUItime::GetCutString(){ +const char* AliTPCCalibViewerGUItime::GetDrawOptionString(){ + // + // get user selected draw options + // + TString drawOpt; + if (fComboAddDrawOpt->GetSelectedEntry()) drawOpt=fComboAddDrawOpt->GetSelectedEntry()->GetTitle(); + if (fChkDrawOptSame->GetState()==kButtonDown && !drawOpt.Contains("same",TString::kIgnoreCase)) + drawOpt+="same"; + return drawOpt.Data(); +} +//______________________________________________________________________________ +void AliTPCCalibViewerGUItime::GetCutString(TString &cutStr){ // // create cut string // @@ -587,107 +698,253 @@ const char* AliTPCCalibViewerGUItime::GetCutString(){ TString runType=""; if (fComboRunType->GetSelectedEntry()) runType=fComboRunType->GetSelectedEntry()->GetTitle(); if (runType!="ALL"&&!runType.IsNull()) cuts+=Form("runType.String().Data()==\"%s\"",runType.Data()); - return cuts.GetTitle(); + cutStr=cuts.GetTitle(); +} +//______________________________________________________________________________ +void AliTPCCalibViewerGUItime::UpdateValueArrays(Bool_t withGraph, const Double_t *xArr) +{ + // + // + // + if (!withGraph){ + fValuesX.ResizeTo(1); + fValuesY.ResizeTo(1); + fRunNumbers.ResizeTo(1); + fTimeStamps.ResizeTo(1); + } else { + const Long64_t nrows=fTree->GetSelectedRows(); + fValuesX.ResizeTo(nrows); + fValuesY.ResizeTo(nrows); + fRunNumbers.ResizeTo(nrows); + fTimeStamps.ResizeTo(nrows); + long long *index=new long long[nrows]; + TMath::Sort(nrows,fTree->GetV2(),index,kFALSE); + for (Long64_t i=0; iGetV3()[index[i]]; + fRunNumbers.GetMatrixArray()[i]=fTree->GetV1()[index[i]]; + fTimeStamps.GetMatrixArray()[i]=fTree->GetV2()[index[i]]; + } + delete [] index; + } +} +//______________________________________________________________________________ +void AliTPCCalibViewerGUItime::GetHistogramTitle(TString &title) +{ + // + // Create string for histogram title + // + + title=fDrawString; + Int_t pos=title.First(">>"); + if (pos>0) title=title(0,pos); +// if (!fIsCustomDraw){ + if (fRadioXrun->GetState()==kButtonDown){ + title+=":Run"; + } else if (fRadioXtime->GetState()==kButtonDown){ + title+=":Date"; + } +// } + TString cuts; + GetCutString(cuts); + TObjArray *arr=title.Tokenize(":"); + TObject *o=0x0; + title+=" {"; + title+=cuts; + title+="}"; + TIter next(arr,kIterBackward); + while ( (o=next()) ){ + TString varName=o->GetName(); + title+=";"; + //substitue variable names with names in configuration file if available + if ((*fConfigParser)()->GetEntries()){ + TString branchName=varName; + Int_t par=0; + if (branchName.Contains('.')) branchName=branchName(0,branchName.First('.')+1); + //chek if a configuration for that branch is available + const TObject *oBranch=(*fConfigParser)(branchName.Data()); + if (oBranch){ + TString branchTitle=fConfigParser->GetData(oBranch,kBranchTitle); + if (!branchTitle.IsNull()){ + //check for TVectorT type branch + //add parameter name if available + if (varName.Contains("fElements")){ + TString parStr=varName(varName.First('[')+1,varName.Length()-varName.First('[')-2); + par=parStr.Atoi(); + branchTitle+=": "; + TString yparname=fConfigParser->GetData(oBranch,par+kParamNames); + if (!yparname.IsNull()){ + branchTitle+=yparname; + } else { + branchTitle+="["; + branchTitle+=par; + branchTitle+="]"; + } + } + } + varName=SubstituteUnderscores(branchTitle.Data()); + } + } + title+=varName; + } + delete arr; +} +//______________________________________________________________________________ +void AliTPCCalibViewerGUItime::AdjustYRange() +{ + // + // + // + TIter nextGraphicObject(fTrashBox); + TObject *o=0x0; + Float_t min=0,max=0; + while ( (o=nextGraphicObject()) ){ + if (o->IsA()==TGraph::Class()){ + TGraph *gr=(TGraph*)o; + if (min==max) { + min=TMath::MinElement(gr->GetN(),gr->GetY()); + max=TMath::MaxElement(gr->GetN(),gr->GetY()); + } else { + Float_t currmin=TMath::MinElement(gr->GetN(),gr->GetY()); + Float_t currmax=TMath::MaxElement(gr->GetN(),gr->GetY()); + if (currmax>max) max=currmax; + if (currminSetMinimum(min); + fCurrentHist->SetMaximum(max); + } } //______________________________________________________________________________ void AliTPCCalibViewerGUItime::DoDraw() { + // + // Draw graphics + // TString drawString=fDrawString; - drawString.Prepend("run:time:"); - TString cutString = GetCutString(); - TString optString = "goff"; + TString cutString; + GetCutString(cutString); + TString optString = GetDrawOptionString(); + Bool_t graphOutput=!fNoGraph; //ttree buffer for V1, V2... too small + graphOutput&=(drawString.First(">>")<0); //histogram output in custom draw + graphOutput&=fRadioXhist->GetState()!=kButtonDown; //histogram drawing selected +// graphOutput&=!(fIsCustomDraw&&!fDrawString.Contains(":")); //custom draw 1D +// graphOutput&=fDrawString.CountChar(':')<2; //custom draw 1D + if (fIsCustomDraw&&fDrawString.Contains(":")) HandleButtonsDrawSel(-kRadioXhist); + if (fIsCustomDraw&&fDrawString.Contains(":")) HandleButtonsDrawSel(-kRadioXhist); + Bool_t drawSame=optString.Contains("same",TString::kIgnoreCase); +// optString+="goff"; + if (graphOutput) { + drawString.Prepend("run:time:"); + optString="goff"; + }else{ +// if (!fIsCustomDraw){ + if (fRadioXrun->GetState()==kButtonDown){ + drawString+=":run"; + } else if (fRadioXtime->GetState()==kButtonDown){ + drawString+=":time"; + } +// } + } TVirtualPad *padsave=gPad; fCanvMain->GetCanvas()->cd(); - //delete old histogram and graph - if (fCurrentGraph) { - delete fCurrentGraph; + //delete old histograms and graphs + if (!drawSame){ + fTrashBox->Delete(); fCurrentGraph=0x0; - //fCurrentHist in case of graph is the interrnal histogram, - // which is deleted by the graph itself. - fCurrentHist=0x0; - } - if (fCurrentHist) { - delete fCurrentHist; fCurrentHist=0x0; } //select data fTree->Draw(drawString.Data(),cutString.Data(),optString.Data()); if (fTree->GetSelectedRows()==-1) return; - fValuesX.ResizeTo(fTree->GetSelectedRows()); - fValuesY.ResizeTo(fTree->GetSelectedRows()); - fRunNumbers.ResizeTo(fTree->GetSelectedRows()); - fTimeStamps.ResizeTo(fTree->GetSelectedRows()); - fValuesY.SetElements(fTree->GetV3()); - fRunNumbers.SetElements(fTree->GetV1()); - fTimeStamps.SetElements(fTree->GetV2()); - TString title=""; + + TString title; + GetHistogramTitle(title); Bool_t drawGraph=kFALSE; - if (fIsCustomDraw){ - if (fDrawString.Contains(":")){ - fValuesX.SetElements(fTree->GetV4()); - TString yname=fDrawString(0,fDrawString.First(':')); - TString xname=fDrawString(fDrawString.First(':')+1,fDrawString.Length()); - title=Form("%s;%s;%s",fDrawString.Data(),xname.Data(),yname.Data()); - drawGraph=kTRUE; - } else { - drawGraph=kFALSE; - } - }else{ + Double_t *xArr=0; + if (graphOutput){ drawGraph=kTRUE; - TString yname=fDrawString.Data(); - if (fConfigParser ){ - Int_t id=fListVariables->GetSelectedEntry()->EntryId(); - if ((*fConfigParser)(id)) yname=fConfigParser->GetData((*fConfigParser)(id),kBranchTitle); - yname=SubstituteUnderscores(yname.Data()); - if (fNmbPar->GetButtonUp()->GetState()!=kButtonDisabled){ - yname+=": "; - Int_t par = (Int_t)(fNmbPar->GetNumber()); - if (fConfigParser && (*fConfigParser)(id)) { - TString yparname=fConfigParser->GetData((*fConfigParser)(id),par+kParamNames); - yparname=SubstituteUnderscores(yparname); - yname+=yparname; - } + if (fIsCustomDraw&&fDrawString.Contains(":")){ +// fValuesX.SetElements(fTree->GetV4()); + xArr=fTree->GetV4(); + }else{ + if (fRadioXrun->GetState()==kButtonDown){ +// fValuesX.SetElements(fTree->GetV1()); + xArr=fTree->GetV1(); + } else if (fRadioXtime->GetState()==kButtonDown){ +// fValuesX.SetElements(fTree->GetV2()); + xArr=fTree->GetV2(); + } else { + drawGraph=kFALSE; } } - if (fRadioXrun->GetState()==kButtonDown){ - fValuesX.SetElements(fTree->GetV1()); - title=Form("%s:Run;Run;%s",fDrawString.Data(),yname.Data()); - } else if (fRadioXtime->GetState()==kButtonDown){ - fValuesX.SetElements(fTree->GetV2()); - title=Form("%s:Time;Time;%s",fDrawString.Data(),yname.Data()); - } else { - drawGraph=kFALSE; - title=Form("%s:%s",fDrawString.Data(),yname.Data()); - } } - //create graph according to selection + if (xArr) UpdateValueArrays(graphOutput, xArr); +// if (graphOutput){ +// if (fIsCustomDraw){ +// if (fDrawString.Contains(":")){ +// fValuesX.SetElements(fTree->GetV4()); +// drawGraph=kTRUE; +// } else { +// drawGraph=kFALSE; +// } +// }else{ +// drawGraph=kTRUE; +// if (fRadioXrun->GetState()==kButtonDown){ +// fValuesX.SetElements(fTree->GetV1()); +// } else if (fRadioXtime->GetState()==kButtonDown){ +// fValuesX.SetElements(fTree->GetV2()); +// } else { +// drawGraph=kFALSE; +// } +// } +// } +//create graph according to selection if (drawGraph){ - fCurrentGraph=new TGraph(fValuesX,fValuesY); - fCurrentGraph->Draw(fIsCustomDraw?"ap":"alp"); - fCurrentHist=fCurrentGraph->GetHistogram(); - fCurrentHist->SetTitle(title.Data()); + TGraph *graph=new TGraph(fValuesX,fValuesY); + TString grDraw="p"; + if (!drawSame) grDraw+="a"; + if (!fIsCustomDraw) grDraw+="l"; + graph->Draw(grDraw.Data()); + graph->SetEditable(kFALSE); + TH1 *hist=graph->GetHistogram(); + hist->SetTitle(title.Data()); + fTrashBox->Add(graph); + graph->SetLineColor(fTrashBox->GetEntries()); + graph->SetMarkerColor(fTrashBox->GetEntries()); + if (!drawSame) { + fCurrentGraph=graph; + fCurrentHist=hist; + } } else { - fCurrentGraph=0x0; - Float_t add=TMath::Abs(fValuesY.Min()*.05); - fCurrentHist=new TH1D("hist",title.Data(),100,fValuesY.Min()-add,fValuesY.Max()+add); - fCurrentHist->FillN(fValuesY.GetNrows(),fValuesY.GetMatrixArray(),0); - fCurrentHist->Draw(); + TH1 *hist=fTree->GetHistogram(); + hist->SetTitle(title.Data()); +// hist->Draw(optString.Data()); + fTrashBox->Add(hist); + hist->SetLineColor(fTrashBox->GetEntries()); + hist->SetMarkerColor(fTrashBox->GetEntries()); + if (!drawSame) fCurrentHist=hist; } //Set time axis if choosen as x-variables - if (fRadioXtime->GetState()==kButtonDown&&!fIsCustomDraw){ +// if (fRadioXtime->GetState()==kButtonDown&&!fIsCustomDraw&&!drawSame){ + if (fRadioXtime->GetState()==kButtonDown&&!drawSame){ TAxis *xaxis=fCurrentHist->GetXaxis(); xaxis->SetTimeFormat("#splitline{%d.%m}{%H:%M}"); xaxis->SetTimeDisplay(1); xaxis->SetLabelOffset(xaxis->GetLabelOffset()*3); xaxis->SetLabelSize(xaxis->GetLabelSize()/1.3); } - if (fCurrentGraph){ - fCurrentGraph->SetEditable(kFALSE); - fCurrentGraph->SetMarkerStyle(20); - fCurrentGraph->SetMarkerSize(0.5); - } + if (!drawSame) { //Set title offset - fCurrentHist->GetYaxis()->SetTitleOffset(1.5); + fCurrentHist->GetYaxis()->SetTitleOffset(1.5); + } else { + //adjust y-range + AdjustYRange(); + } gPad->Modified(); gPad->Update(); padsave->cd(); @@ -709,7 +966,7 @@ void AliTPCCalibViewerGUItime::DoDumpRuns() if (run!=prevRun) std::cout << Form("%d",run) << std::endl; prevRun=run; } - delete sortIndex; + delete [] sortIndex; } //______________________________________________________________________________ void AliTPCCalibViewerGUItime::DoParLimitChange() @@ -737,10 +994,11 @@ void AliTPCCalibViewerGUItime::DoCustomDraw() // // fDrawString=fComboCustomDraw->GetTextEntry()->GetText(); - if (fDrawString.Contains(">>")){ - Warning("DoCustomDraw","Currently no user defined histograms allowed!"); - return; - } +// if (fDrawString.Contains(">>")){ +// Warning("DoCustomDraw","Currently no user defined histograms allowed!"); +// return; +// } + fNmbPar->SetState(kFALSE); fIsCustomDraw=kTRUE; DoDraw(); } @@ -770,12 +1028,18 @@ void AliTPCCalibViewerGUItime::HandleButtonsDrawSel(Int_t id) } Bool_t doDraw=kFALSE; + Bool_t noDraw=kFALSE; + if (id<-1){ + noDraw=kTRUE; + id=TMath::Abs(id); + } switch (id) { case (kRadioXhist): doDraw=(fRadioXtime->GetState()==kButtonDown||fRadioXrun->GetState()==kButtonDown); if (doDraw){ fRadioXrun->SetState(kButtonUp); fRadioXtime->SetState(kButtonUp); + fRadioXhist->SetState(kButtonDown); } break; case (kRadioXrun): @@ -783,6 +1047,7 @@ void AliTPCCalibViewerGUItime::HandleButtonsDrawSel(Int_t id) if (doDraw){ fRadioXhist->SetState(kButtonUp); fRadioXtime->SetState(kButtonUp); + fRadioXrun->SetState(kButtonDown); } break; case (kRadioXtime): @@ -790,10 +1055,11 @@ void AliTPCCalibViewerGUItime::HandleButtonsDrawSel(Int_t id) if (doDraw){ fRadioXrun->SetState(kButtonUp); fRadioXhist->SetState(kButtonUp); + fRadioXtime->SetState(kButtonDown); } break; } - if (doDraw) DoCustomCutsDraw(); + if (doDraw&&!noDraw) DoCustomCutsDraw(); } //______________________________________________________________________________ void AliTPCCalibViewerGUItime::UpdateParName() @@ -803,9 +1069,10 @@ void AliTPCCalibViewerGUItime::UpdateParName() // Int_t par = (Int_t)(fNmbPar->GetNumber()); - TString parName=par; + TString parName=""; Int_t id=fListVariables->GetSelectedEntry()->EntryId(); if (fConfigParser && (*fConfigParser)(id)) parName=fConfigParser->GetData((*fConfigParser)(id),par+kParamNames); + if (parName=="") parName.Form("%d",par); fLblPar->SetText(Form("Parameter: %s",parName.Data())); fDrawString=GetDrawString(); fIsCustomDraw=kFALSE; @@ -860,8 +1127,8 @@ void AliTPCCalibViewerGUItime::UpdateParLimits() return; } // branch->ResetAddress(); - fTree->ResetBranchAddresses(); - fNmbPar->SetNumber(0); + fTree->SetBranchAddress(selectedVariable.Data(),0x0); + if (fNmbPar->GetNumMax()!=maxPar-1) fNmbPar->SetNumber(0); fNmbPar->SetLimitValues(0,maxPar-1); fNmbPar->SetState(kTRUE); UpdateParName(); @@ -875,7 +1142,7 @@ void AliTPCCalibViewerGUItime::MouseMove(Int_t event, Int_t x, Int_t y, TObject UInt_t dd=0,mm=0,yy=0,HH=0,MM=0,SS=0,run=0; Double_t valx=0.,valy=0.; if (!fCurrentGraph) { - fLblRunNumberVal->SetText(Form("%05u",run)); + fLblRunNumberVal->SetText(Form("%06u",run)); fLblRunTimeVal->SetText(Form("%02u.%02u.%04u\n%02u:%02u:%02u",dd,mm,yy,HH,MM,SS)); fLblValueXVal->SetText(Form("%.3e", valx)); fLblValueYVal->SetText(Form("%.3e", valy)); @@ -910,7 +1177,7 @@ void AliTPCCalibViewerGUItime::MouseMove(Int_t event, Int_t x, Int_t y, TObject valx=0.; valy=0.; } - fLblRunNumberVal->SetText(Form("%05u",run)); + fLblRunNumberVal->SetText(Form("%06u",run)); fLblRunTimeVal->SetText(Form("%02u.%02u.%04u\n%02u.%02u.%02u",dd,mm,yy,HH,MM,SS)); if (fIsCustomDraw){ fLblValueXVal->SetText(Form("%.3e", valx)); @@ -938,26 +1205,51 @@ void AliTPCCalibViewerGUItime::SetGuiTree(Int_t run) // retrieve file from this directory if it already exists // + // + //Create and set GUI tree + // //try to find file for run in fOutputCacheDir TString fileName=fOutputCacheDir; if (!fileName.EndsWith("/")) fileName+="/"; fileName+=Form("guiTreeRun_%d.root",run); - TFile f(fileName.Data()); - if (f.IsOpen()){ - f.Close(); - fCalibViewerGUI->Initialize(fileName.Data()); - if (fCalibViewerGUItab) fCalibViewerGUItab->SetText(new TGString(Form("Detail - %05d",run))); - return; + Bool_t load=kTRUE; + if (gSystem->AccessPathName(fileName.Data())){ + load=AliTPCcalibDB::CreateGUITree(run,fileName.Data()); + if (!load){ + fCalibViewerGUI->Reset(); + if (fCalibViewerGUItab) fCalibViewerGUItab->SetText(new TGString(Form("Detail - XXXXX"))); + return; + } } - f.Close(); - Bool_t sucess=AliTPCcalibDB::CreateGUITree(run,fileName.Data()); - if (sucess){ - fCalibViewerGUI->Initialize(fileName.Data()); - if (fCalibViewerGUItab) fCalibViewerGUItab->SetText(new TGString(Form("Detail - %05d",run))); - }else{ - fCalibViewerGUI->Reset(); - if (fCalibViewerGUItab) fCalibViewerGUItab->SetText(new TGString(Form("Detail - XXXXX"))); + fCalibViewerGUI->Initialize(fileName.Data()); + if (fCalibViewerGUItab) fCalibViewerGUItab->SetText(new TGString(Form("Detail - %05d",run))); + + // + //Create and set Reference GUI tree + // + AliTPCcalibDButil util; + util.SetReferenceRun(run); + fileName=fOutputCacheDir; + if (!fileName.EndsWith("/")) fileName+="/"; + fileName+=util.GetGUIRefTreeDefaultName(); + //only update if file does not exist + if (gSystem->AccessPathName(fileName.Data())){ + util.UpdateRefDataFromOCDB(); + util.CreateGUIRefTree(fileName.Data()); + } + + fCalibViewerGUI->GetViewer()->AddReferenceTree(fileName.Data(),"calPads","Ref"); + + // + // Process additional reference trees + // + TIter nextRefTree(fMapRefTrees); + TObject *o=0x0; + //Set static reference data + while ( (o=nextRefTree()) ){ + fCalibViewerGUI->GetViewer()->AddReferenceTree(fMapRefTrees->GetValue(o)->GetName(),"calPads",o->GetName()); } + fCalibViewerGUI->Reload(); } //______________________________________________________________________________ const char* AliTPCCalibViewerGUItime::SubstituteUnderscores(const char* in) @@ -971,8 +1263,69 @@ const char* AliTPCCalibViewerGUItime::SubstituteUnderscores(const char* in) s.ReplaceAll("|{","_{"); return s.Data(); } + +//______________________________________________________________________________ +void AliTPCCalibViewerGUItime::DoNewSelectionAliases() +{ + // + // + // + if (!fTree) return; + TList *l=fTree->GetListOfAliases(); + if (!l) return; + TString selectedVariable=""; + if (!fListAliases->GetSelectedEntry()) return; + selectedVariable = fListAliases->GetSelectedEntry()->GetTitle(); + fDrawString=selectedVariable; + fIsCustomDraw=kFALSE; + DoDraw(); +} +//______________________________________________________________________________ +void AliTPCCalibViewerGUItime::DoAddAlias() +{ + // + // + // + new AliTPCCalibViewerGUItimeAddAliasFrame(gClient->GetRoot(), fContTopBottom, 400, 200, kVerticalFrame, this); +} +//______________________________________________________________________________ +void AliTPCCalibViewerGUItime::DoDelAlias() +{ + // + // + // + if (!fTree) return; + TList *l=fTree->GetListOfAliases(); + if (!l) return; + TString selectedVariable=""; + if (!fListAliases->GetSelectedEntry()) return; + selectedVariable = fListAliases->GetSelectedEntry()->GetTitle(); + l->Remove(l->FindObject(selectedVariable.Data())); + UpdateAliasList(); +} + +//______________________________________________________________________________ +void AliTPCCalibViewerGUItime::UpdateAliasList() +{ + // + // + // + printf("UpdateAliasList\n"); + if (!fTree) return; + TList *l=fTree->GetListOfAliases(); + if (!l) return; + TIter nextAlias(l); + TObject *o; + fListAliases->RemoveAll(); + Int_t id=0; + while( (o=nextAlias()) ){ + fListAliases->AddEntry(o->GetName(),id++); + } + fListAliases->Resize(fListAliases->GetWidth()-1, fListAliases->GetHeight()); + fListAliases->Resize(fListAliases->GetWidth()+1, fListAliases->GetHeight()); +} //______________________________________________________________________________ -TObjArray* AliTPCCalibViewerGUItime::ShowGUI(const char* fileName) { +TObjArray* AliTPCCalibViewerGUItime::ShowGUI(const char* fileName, const char* treeName) { // // Initialize and show GUI for presentation for demonstration purposes // or for fast standalone use @@ -989,7 +1342,8 @@ TObjArray* AliTPCCalibViewerGUItime::ShowGUI(const char* fileName) { AliTPCCalibViewerGUItime* calibViewerTime = new AliTPCCalibViewerGUItime(tabCont1, 1000, 600); tabCont1->AddFrame(calibViewerTime, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0)); - calibViewerTime->UseFile(fileName); + calibViewerTime->SetConfigFileName("$ALICE_ROOT/TPC/CalibMacros/calibVarDescription.txt"); + calibViewerTime->UseFile(fileName, treeName); AliTPCCalibViewerGUI* calibViewer = new AliTPCCalibViewerGUI(tabCont2, 1000, 600, 0); tabCont2->AddFrame(calibViewer, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0)); @@ -1008,3 +1362,163 @@ TObjArray* AliTPCCalibViewerGUItime::ShowGUI(const char* fileName) { return guiArray; } +//______________________________________________________________________________ +TObjArray* AliTPCCalibViewerGUItime::ShowGUI(TChain *chain) { + // + // Initialize and show GUI for presentation for demonstration purposes + // or for fast standalone use + // + TGMainFrame* frmMain = new TGMainFrame(gClient->GetRoot(), 1000, 600); + frmMain->SetWindowName("AliTPCCalibViewer GUItime"); + frmMain->SetCleanup(kDeepCleanup); + + TGTab* tabMain = new TGTab(frmMain, 1000, 600); + frmMain->AddFrame(tabMain, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0)); + + TGCompositeFrame* tabCont1 = tabMain->AddTab("Time"); + + AliTPCCalibViewerGUItime* calibViewerTime = new AliTPCCalibViewerGUItime(tabCont1, 1000, 600); + tabCont1->AddFrame(calibViewerTime, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 0)); + calibViewerTime->UseChain(chain); + + TObjArray *guiArray = new TObjArray(); + guiArray->Add(calibViewerTime); + + frmMain->MapSubwindows(); + frmMain->Resize(); + frmMain->MapWindow(); + + return guiArray; +} + + +//////////////////////////////////////////////////////////////////////// +// +// GUI Alias frame +// +//////////////////////////////////////////////////////////////////////// + + +ClassImp(AliTPCCalibViewerGUItimeAddAliasFrame) + +AliTPCCalibViewerGUItimeAddAliasFrame::AliTPCCalibViewerGUItimeAddAliasFrame(const TGWindow *p, const TGWindow *main, + UInt_t w, UInt_t h, UInt_t options, + AliTPCCalibViewerGUItime *gui, TString strAlias) : + fMain(0x0), + fTxt1(0x0), + fTxt2(0x0), + fGUI(0x0) +{ + fMain = new TGTransientFrame(p, main, w, h, options); + fMain->Connect("CloseWindow()", "AliTPCCalibViewerGUItimeAddAliasFrame", this, "DoCancel()"); + fMain->DontCallClose(); // to avoid double deletions. + + // use hierarchical cleaning + fMain->SetCleanup(kDeepCleanup); + + //layout + TGLayoutHints *l1 = new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX, 2, 2, 2, 2); + TGLayoutHints *l2 = new TGLayoutHints(kLHintsTop | kLHintsRight | kLHintsExpandX, 2, 2, 0, 5); +// TGLayoutHints *l3 = new TGLayoutHints(kLHintsTop | kLHintsRight, 5, 5, 5, 5); + + //input fields + TGCompositeFrame *f1 = new TGCompositeFrame(fMain, 60, 20, kVerticalFrame); + fMain->AddFrame(f1, l1); + TGCompositeFrame *frameName = new TGCompositeFrame(f1); + TGCompositeFrame *frameFormula = new TGCompositeFrame(f1); + f1->AddFrame(frameName,l2); + f1->AddFrame(frameFormula,l2); + TGLabel *lblTxt1 = new TGLabel(frameName, "Name:"); + TGLabel *lblTxt2 = new TGLabel(frameFormula, "Formula:"); + fTxt1 = new TGTextEntry(frameName, new TGTextBuffer(1000)); + fTxt2 = new TGTextEntry(frameFormula, new TGTextBuffer(1000)); + + frameName->AddFrame(lblTxt1, l2); + frameName->AddFrame(fTxt1, l2); + frameFormula->AddFrame(lblTxt2, l2); + frameFormula->AddFrame(fTxt2, l2); + + fTxt1->Resize(350, fTxt1->GetDefaultHeight()); + fTxt2->Resize(350, fTxt2->GetDefaultHeight()); + + //ok and cancel buttons + TGHorizontalFrame *frame = new TGHorizontalFrame(fMain, 60, 20, kFixedWidth); + + TGTextButton *okButton = new TGTextButton(frame, "&Ok", 1); + okButton->Connect("Clicked()", "AliTPCCalibViewerGUItimeAddAliasFrame", this, "DoOK()"); + TGTextButton *cancelButton = new TGTextButton(frame, "&Cancel", 2); + cancelButton->Connect("Clicked()", "AliTPCCalibViewerGUItimeAddAliasFrame", this, "DoCancel()"); + + + frame->AddFrame(okButton, l1); + frame->AddFrame(cancelButton, l1); + + frame->Resize(150, okButton->GetDefaultHeight()); + + fMain->AddFrame(frame, new TGLayoutHints(kLHintsBottom | kLHintsRight, 2, 2, 5, 1)); + + fGUI=gui; + TString aliasName, alias; + if (!strAlias.IsNull()){ + TChain *c=fGUI->GetChain(); + if (c){ + TList *l=c->GetListOfAliases(); + if (l){ + TNamed *d=(TNamed*)l->FindObject(strAlias); + if (d){ + aliasName=d->GetName(); + alias=d->GetTitle(); + } + } + } + }else{ + alias=fGUI->GetCustomDrawString(); + } + fTxt1->SetText(aliasName.Data(),kFALSE); + fTxt2->SetText(alias.Data(),kFALSE); + + fMain->MapSubwindows(); + fMain->Resize(); + + // position relative to the parent's window + fMain->CenterOnParent(); + + fMain->SetWindowName("Alias Editor"); + + fMain->MapWindow(); + +} +//______________________________________________________________________________ +AliTPCCalibViewerGUItimeAddAliasFrame::~AliTPCCalibViewerGUItimeAddAliasFrame() +{ + // + // + // + fMain->DeleteWindow(); // deletes fMain +} +//______________________________________________________________________________ +void AliTPCCalibViewerGUItimeAddAliasFrame::DoOK() +{ + // + // + // + TString aliasName=fTxt1->GetText(); + TString alias=fTxt2->GetText(); + if (!aliasName.IsNull()&&!alias.IsNull()){ + TChain *c=fGUI->GetChain(); + if (c){ + c->SetAlias(aliasName.Data(),alias.Data()); + } + } + fGUI->UpdateAliasList(); + delete this; +} +//______________________________________________________________________________ +void AliTPCCalibViewerGUItimeAddAliasFrame::DoCancel() +{ + // + // + // + delete this; +} +