]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MUON/AliMUONPainterDataSourceFrame.cxx
changed binning
[u/mrichter/AliRoot.git] / MUON / AliMUONPainterDataSourceFrame.cxx
CommitLineData
0145e89a 1/**************************************************************************
2* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3* *
4* Author: The ALICE Off-line Project. *
5* Contributors are mentioned in the code where appropriate. *
6* *
7* Permission to use, copy, modify and distribute this software and its *
8* documentation strictly for non-commercial purposes is hereby granted *
9* without fee, provided that the above copyright notice appears in all *
10* copies and that both the copyright notice and this permission notice *
11* appear in the supporting documentation. The authors make no claims *
12* about the suitability of this software for any purpose. It is *
13* provided "as is" without express or implied warranty. *
14**************************************************************************/
15
16// $Id$
17
b09247a2 18#include <cstdlib>
0145e89a 19#include "AliMUONPainterDataSourceFrame.h"
20
8741815f 21#include "AliLog.h"
fcabdc0c 22#include "AliMUONChamberPainter.h"
23#include "AliMUONMchViewApplication.h"
24#include "AliMUONPainterDataRegistry.h"
0145e89a 25#include "AliMUONPainterDataSourceItem.h"
26#include "AliMUONPainterEnv.h"
27#include "AliMUONPainterHelper.h"
fcabdc0c 28#include "AliMUONPainterMatrix.h"
29#include "AliMUONPainterRegistry.h"
a0dc65b4 30#include "AliMUONRecoParam.h"
ca913045 31#include "AliMUONTrackerConditionDataMaker.h"
b6f591ae 32#include "AliMUONTrackerDataMaker.h"
0b376ef1 33#include "AliRawReader.h"
fcabdc0c 34#include <TCanvas.h>
0145e89a 35#include <TGButton.h>
36#include <TGComboBox.h>
37#include <TGFileDialog.h>
38#include <TGNumberEntry.h>
39#include <TGTextEntry.h>
40#include <TGrid.h>
41#include <TObjArray.h>
42#include <TObjString.h>
fcabdc0c 43#include <TMath.h>
0145e89a 44#include <TRegexp.h>
45#include <TString.h>
46#include <TSystem.h>
47
48///\class AliMUONPainterDataSourceFrame
49///
50/// A complete frame to select and display various data sources to
51/// be displayed : either raw data or OCDB data.
52/// Later on we might add digits and clusters for instance.
53///
54///\author Laurent Aphecetche, Subatech
55
56const char* AliMUONPainterDataSourceFrame::fgkNumberOfDataSourcesKey = "NumberOfDataSources";
57const char* AliMUONPainterDataSourceFrame::fgkDataSourceURIKey = "DataSourceURI.%d";
58
59///\cond CLASSIMP
60ClassImp(AliMUONPainterDataSourceFrame)
61///\endcond
62
63//_____________________________________________________________________________
64AliMUONPainterDataSourceFrame::AliMUONPainterDataSourceFrame(const TGWindow* p, UInt_t w, UInt_t h)
65: TGCompositeFrame(p,w,h,kVerticalFrame),
10eb3d17 66 fRecentSourceSelector(new TGGroupFrame(this,"Recent sources",kHorizontalFrame)),
67 fRawSelector(new TGGroupFrame(this,"Raw file URI",kHorizontalFrame)),
8741815f 68 fRawSelector2(new TGCompositeFrame(fRawSelector,w,h,kVerticalFrame)),
69 fRawSelector21(new TGCompositeFrame(fRawSelector2,w,h,kHorizontalFrame)),
70 fRawSelector22(new TGCompositeFrame(fRawSelector2,w,h,kHorizontalFrame)),
71 fRawSelector23(new TGCompositeFrame(fRawSelector2,w,h,kHorizontalFrame)),
66cdf5b3 72 fCalibrateNoGain(new TGCheckButton(fRawSelector22,"Ped sub")),
73 fCalibrateGainConstantCapa(new TGCheckButton(fRawSelector22,"Ped sub+gain (capa cste)")),
74 fCalibrateGain(new TGCheckButton(fRawSelector22,"Full calib (Ped sub+gain w/ capa)")),
75 fCalibrateEmelecGain(new TGCheckButton(fRawSelector22,"Full calib (Ped sub+inj gain w/ capa)")),
8741815f 76 fHistogramButton(new TGCheckButton(fRawSelector23,"Histogram")),
10eb3d17 77 fHistoMin(new TGNumberEntry(fRawSelector23,0)),
78 fHistoMax(new TGNumberEntry(fRawSelector23,4096)),
a679753e 79 fEventRangeButton(new TGCheckButton(fRawSelector23,"Event range")),
80 fEventMin(new TGNumberEntry(fRawSelector23,-1,10)),
81 fEventMax(new TGNumberEntry(fRawSelector23,-1,10)),
8741815f 82 fRawOCDBPath(new TGTextEntry(fRawSelector22,"")),
10eb3d17 83 fOCDBSelector(new TGGroupFrame(this,"OCDB Path",kHorizontalFrame)),
84 fDataReaders(new TGGroupFrame(this,"Data sources")),
8741815f 85 fFilePath(new TGTextEntry(fRawSelector21,"")),
007e62b2 86 fOCDBPath(new TGTextEntry(fOCDBSelector,"alien://folder=/alice/data/2011/OCDB")),
a679753e 87 fRunSelector(new TGNumberEntry(fOCDBSelector,0,10)),
0145e89a 88 fOCDBTypes(new TGComboBox(fOCDBSelector)),
89 fRecentSources(new TGComboBox(fRecentSourceSelector)),
1286237e 90 fItems(new TObjArray),
91 fACFSelector(new TGGroupFrame(this,"ASCII Calib File",kHorizontalFrame)),
92 fACFPath(new TGTextEntry(fACFSelector,"")),
93 fACFTypes(new TGComboBox(fACFSelector))
0145e89a 94{
95 /// Ctor
96
8f0acce4 97 AliMUONPainterDataRegistry* reg = AliMUONPainterDataRegistry::Instance();
0145e89a 98
49419555 99 reg->Connect("DataMakerWasRegistered(AliMUONVTrackerDataMaker*)",
0145e89a 100 "AliMUONPainterDataSourceFrame",
101 this,
49419555 102 "DataMakerWasRegistered(AliMUONVTrackerDataMaker*)");
0145e89a 103
49419555 104 reg->Connect("DataMakerWasUnregistered(AliMUONVTrackerDataMaker*)",
0145e89a 105 "AliMUONPainterDataSourceFrame",
106 this,
49419555 107 "DataMakerWasUnregistered(AliMUONVTrackerDataMaker*)");
0145e89a 108
109 fItems->SetOwner(kFALSE);
110
111 /// Recent source selection
112
113 AliMUONPainterEnv* env = AliMUONPainterHelper::Instance()->Env();
114
115 Int_t nsources = env->Integer(fgkNumberOfDataSourcesKey);
116
117 for ( Int_t i = 0; i < nsources; ++i )
118 {
119 AddRecentSource(env->String(Form(fgkDataSourceURIKey,i)));
120 }
121
122 fRecentSources->Resize(100,20);
123
124 TGButton* createRecentButton = new TGTextButton(fRecentSourceSelector,"Create data source");
125 createRecentButton->Connect("Clicked()",
126 "AliMUONPainterDataSourceFrame",
127 this,
128 "OpenRecentSource()");
129
130 fRecentSourceSelector->AddFrame(fRecentSources,new TGLayoutHints(kLHintsExpandX | kLHintsTop,5,5,5,5));
131 fRecentSourceSelector->AddFrame(createRecentButton,new TGLayoutHints(kLHintsTop,5,5,5,5));
1286237e 132
0145e89a 133 /// Raw file selection
134
8741815f 135 TGButton* openButton = new TGPictureButton(fRawSelector21,
0145e89a 136 gClient->GetPicture("fileopen.xpm"));
137 openButton->SetToolTipText("Click to open file dialog");
138
8741815f 139 fRawSelector2->AddFrame(fRawSelector21, new TGLayoutHints(kLHintsExpandX,5,5,5,5));
140 fRawSelector2->AddFrame(fRawSelector22, new TGLayoutHints(kLHintsExpandX,5,5,5,5));
141 fRawSelector2->AddFrame(fRawSelector23, new TGLayoutHints(kLHintsExpandX,5,5,5,5));
142
143 fRawSelector21->AddFrame(openButton,new TGLayoutHints(kLHintsTop,5,5,5,5));
144 fRawSelector21->AddFrame(fFilePath, new TGLayoutHints(kLHintsExpandX | kLHintsTop,5,5,5,5));
145
10eb3d17 146 fRawSelector22->AddFrame(fCalibrateNoGain, new TGLayoutHints(kLHintsTop,5,5,5,5));
147 fRawSelector22->AddFrame(fCalibrateGainConstantCapa, new TGLayoutHints(kLHintsTop,5,5,5,5));
148 fRawSelector22->AddFrame(fCalibrateGain, new TGLayoutHints(kLHintsTop,5,5,5,5));
66cdf5b3 149 fRawSelector22->AddFrame(fCalibrateEmelecGain, new TGLayoutHints(kLHintsTop,5,5,5,5));
8741815f 150 fRawSelector22->AddFrame(fRawOCDBPath, new TGLayoutHints(kLHintsExpandX | kLHintsTop,5,5,5,5));
151 fRawOCDBPath->SetEnabled(kFALSE);
0145e89a 152
a679753e 153 fRawSelector23->AddFrame(fHistogramButton,new TGLayoutHints(kLHintsTop,5,5,5,5));
10eb3d17 154 fHistogramButton->Connect("Clicked()","AliMUONPainterDataSourceFrame",this,"HistogramButtonClicked()");
10eb3d17 155 fHistoMin->SetState(kFALSE);
a679753e 156 fHistoMax->SetState(kFALSE);
10eb3d17 157 fRawSelector23->AddFrame(fHistoMin,new TGLayoutHints(kLHintsTop,5,5,5,5));
158 fRawSelector23->AddFrame(fHistoMax,new TGLayoutHints(kLHintsTop,5,5,5,5));
159
a679753e 160
161 fRawSelector23->AddFrame(fEventRangeButton,new TGLayoutHints(kLHintsTop,5,5,5,5));
162 fEventRangeButton->Connect("Clicked()","AliMUONPainterDataSourceFrame",this,"EventRangeButtonClicked()");
163 fEventMin->SetState(kFALSE);
164 fEventMax->SetState(kFALSE);
165
166 fEventMin->SetFormat(TGNumberFormat::kNESInteger);
167 fEventMax->SetFormat(TGNumberFormat::kNESInteger);
168
169 fRawSelector23->AddFrame(fEventMin,new TGLayoutHints(kLHintsTop,5,5,5,5));
170 fRawSelector23->AddFrame(fEventMax,new TGLayoutHints(kLHintsTop,5,5,5,5));
171
8741815f 172 TGButton* createRawButton = new TGTextButton(fRawSelector,"Create data source");
0145e89a 173
8741815f 174 fRawSelector->AddFrame(fRawSelector2, new TGLayoutHints(kLHintsExpandX | kLHintsTop,5,5,5,5));
175 fRawSelector->AddFrame(createRawButton, new TGLayoutHints(kLHintsCenterY,5,5,5,5));
176
10eb3d17 177 fCalibrateNoGain->Connect("Clicked()","AliMUONPainterDataSourceFrame",this,"CalibrateButtonClicked()");
178 fCalibrateGainConstantCapa->Connect("Clicked()","AliMUONPainterDataSourceFrame",this,"CalibrateButtonClicked()");
179 fCalibrateGain->Connect("Clicked()","AliMUONPainterDataSourceFrame",this,"CalibrateButtonClicked()");
66cdf5b3 180 fCalibrateEmelecGain->Connect("Clicked()","AliMUONPainterDataSourceFrame",this,"CalibrateButtonClicked()");
8741815f 181
0145e89a 182 openButton->Connect("Clicked()",
183 "AliMUONPainterDataSourceFrame",
184 this,
185 "OpenFileDialog()");
186
187 createRawButton->Connect("Clicked()",
188 "AliMUONPainterDataSourceFrame",
189 this,
190 "CreateRawDataSource()");
191
192 /// OCDB selection
193
ca913045 194 fOCDBTypes->AddEntry("Config",7);
195 fOCDBTypes->AddEntry("Occupancy",4);
196 fOCDBTypes->AddEntry("HV",3);
7eafe398 197 fOCDBTypes->AddEntry("Pedestals",0);
198 fOCDBTypes->AddEntry("Gains",1);
fef32488 199 fOCDBTypes->AddEntry("StatusMap",5);
200 fOCDBTypes->AddEntry("Status",6);
ca913045 201 fOCDBTypes->AddEntry("Capacitances",2);
6ebcde15 202 fOCDBTypes->AddEntry("RejectList",8);
7eafe398 203 fOCDBTypes->Select(0);
a679753e 204 fOCDBTypes->Resize(80,20);
0145e89a 205
206 TGButton* createOCDBButton = new TGTextButton(fOCDBSelector,"Create data source");
207 createOCDBButton->Connect("Clicked()",
208 "AliMUONPainterDataSourceFrame",
209 this,
210 "CreateOCDBDataSource()");
949b9833 211
212 const char* ocdbToolTip = "Use URL style for either alien or local OCDB (foo://bar). For example :\n"
213 "alien://folder=/alice/data.../OCDB\n"
214 "or\nlocal:///home/user/aliroot (mind the 3 slashes there !)";
215
216 fRawOCDBPath->SetToolTipText(ocdbToolTip);
217 fOCDBPath->SetToolTipText(ocdbToolTip);
218
0145e89a 219 fOCDBSelector->AddFrame(fOCDBPath,new TGLayoutHints(kLHintsExpandX | kLHintsTop,5,5,5,5));
220 fOCDBSelector->AddFrame(fRunSelector,new TGLayoutHints(kLHintsTop,5,5,5,5));
221 fOCDBSelector->AddFrame(fOCDBTypes,new TGLayoutHints(kLHintsExpandX | kLHintsTop,5,5,5,5));
222 fOCDBSelector->AddFrame(createOCDBButton,new TGLayoutHints(kLHintsTop,5,5,5,5));
1286237e 223
224
225 /// ASCII calibration file selection
226
227 TGButton* openButtonACF = new TGPictureButton(fACFSelector,
228 gClient->GetPicture("fileopen.xpm"));
229 openButtonACF->SetToolTipText("Click to open file dialog");
ca913045 230
231 fACFTypes->AddEntry("Config",7);
7eafe398 232 fACFTypes->AddEntry("Occupancy",4);
ca913045 233 fACFTypes->AddEntry("Pedestals",0);
234 fACFTypes->AddEntry("Gains",1);
235 fACFTypes->AddEntry("Capacitances",2);
236 fACFTypes->Select(0);
237 fACFTypes->Resize(100,20);
1286237e 238
239 fACFSelector->AddFrame(openButtonACF,new TGLayoutHints(kLHintsTop,5,5,5,5));
240 fACFSelector->AddFrame(fACFPath, new TGLayoutHints(kLHintsExpandX | kLHintsTop,5,5,5,5));
241 fACFSelector->AddFrame(fACFTypes,new TGLayoutHints(kLHintsExpandX | kLHintsTop,5,5,5,5));
242
243 TGButton* createACFButton = new TGTextButton(fACFSelector,"Create data source");
244 createACFButton->Connect("Clicked()",
245 "AliMUONPainterDataSourceFrame",
246 this,
247 "CreateACFDataSource()");
248
249 openButtonACF->Connect("Clicked()",
250 "AliMUONPainterDataSourceFrame",
251 this,
252 "OpenFileDialogACF()");
253
254 fACFSelector->AddFrame(createACFButton,new TGLayoutHints(kLHintsTop,5,5,5,5));
0145e89a 255
256 AddFrame(fRecentSourceSelector,new TGLayoutHints(kLHintsExpandX,10,10,10,10));
257
258 AddFrame(fRawSelector,new TGLayoutHints(kLHintsExpandX,10,10,10,10));
259
260 AddFrame(fOCDBSelector,new TGLayoutHints(kLHintsExpandX,10,10,10,10));
261
1286237e 262 AddFrame(fACFSelector,new TGLayoutHints(kLHintsExpandX,10,10,10,10));
263
0145e89a 264 AddFrame(fDataReaders, new TGLayoutHints(kLHintsExpandX,10,10,10,10));
265
266}
267
268//_____________________________________________________________________________
269AliMUONPainterDataSourceFrame::~AliMUONPainterDataSourceFrame()
270{
271 /// dtor
272
273 delete fItems;
274}
275
276//_____________________________________________________________________________
277void
278AliMUONPainterDataSourceFrame::AddRecentSource(const char* name)
279{
280 /// Add a source to the list of recently used sources
281
282 TGListBox* lb = fRecentSources->GetListBox();
283
284 for ( Int_t i = 0; i < lb->GetNumberOfEntries(); ++i )
285 {
286 TGTextLBEntry* t = (TGTextLBEntry*)lb->GetEntry(i);
287 TString s(t->GetText()->GetString());
288 if ( s == name )
289 {
290 return;
291 }
292 }
293
294 fRecentSources->AddEntry(name,lb->GetNumberOfEntries());
295 fRecentSources->MapSubwindows();
296 fRecentSources->Layout();
297}
298
8741815f 299//_____________________________________________________________________________
300void
301AliMUONPainterDataSourceFrame::CalibrateButtonClicked()
302{
303 /// Calibrate button was clicked.
304
10eb3d17 305 if ( fCalibrateNoGain->IsOn() ||
306 fCalibrateGainConstantCapa->IsOn() ||
66cdf5b3 307 fCalibrateGain->IsOn() ||
308 fCalibrateEmelecGain->IsOn() )
8741815f 309 {
310 fRawOCDBPath->SetEnabled(kTRUE);
311 fRawOCDBPath->SetFocus();
8741815f 312 }
313 else
314 {
315 fRawOCDBPath->SetEnabled(kFALSE);
10eb3d17 316 }
317}
318
319//_____________________________________________________________________________
320void
321AliMUONPainterDataSourceFrame::HistogramButtonClicked()
322{
323 /// Histogram button was clicked.
324
325 if ( fHistogramButton->IsOn() )
326 {
327 fHistoMin->SetState(kTRUE);
328 fHistoMax->SetState(kTRUE);
329 }
330 else
331 {
332 fHistoMin->SetState(kFALSE);
333 fHistoMax->SetState(kFALSE);
8741815f 334 }
335}
336
a679753e 337//_____________________________________________________________________________
338void
339AliMUONPainterDataSourceFrame::EventRangeButtonClicked()
340{
341 /// EventRange button was clicked.
342
343 if ( fEventRangeButton->IsOn() )
344 {
345 fEventMin->SetState(kTRUE);
346 fEventMax->SetState(kTRUE);
347 }
348 else
349 {
350 fEventMin->SetIntNumber(-1);
351 fEventMax->SetIntNumber(-1);
352 fEventMin->SetState(kFALSE);
353 fEventMax->SetState(kFALSE);
354 }
355}
356
1286237e 357//_____________________________________________________________________________
358void
359AliMUONPainterDataSourceFrame::CreateACFDataSource()
360{
361 /// Create an ACF data source (using information from the widgets)
362
363 TString acfPath = fACFPath->GetText();
364 TGTextLBEntry* t = static_cast<TGTextLBEntry*>(fACFTypes->GetSelectedEntry());
365 TString type = t->GetText()->GetString();
366
367 CreateACFDataSource(acfPath,type);
368
369 fACFPath->SetText("");
370}
371
372
0145e89a 373//_____________________________________________________________________________
374void
375AliMUONPainterDataSourceFrame::CreateOCDBDataSource()
376{
377 /// Create an OCDB data source (using information from the widgets)
378
379 TString cdbPath = fOCDBPath->GetText();
380 Int_t runNumber = fRunSelector->GetIntNumber();
381 TGTextLBEntry* t = static_cast<TGTextLBEntry*>(fOCDBTypes->GetSelectedEntry());
382 TString type = t->GetText()->GetString();
383
bd9314b2 384 CreateOCDBDataSource(cdbPath,runNumber,type);
0145e89a 385}
386
1286237e 387//_____________________________________________________________________________
388void
389AliMUONPainterDataSourceFrame::CreateACFDataSource(const TString& uri)
390{
391 /// Create an ACF data source, given it's URI
392
393 TObjArray* a = uri.Tokenize(";");
394 TString acfPath = static_cast<TObjString*>(a->At(1))->String();
395 TString type = static_cast<TObjString*>(a->At(2))->String();
396
397 CreateACFDataSource(acfPath,type);
398
399 delete a;
400}
401
402
0145e89a 403//_____________________________________________________________________________
404void
405AliMUONPainterDataSourceFrame::CreateOCDBDataSource(const TString& uri)
406{
407 /// Create an OCDB data source, given it's URI
408
409 TObjArray* a = uri.Tokenize(";");
410 TString cdbPath = static_cast<TObjString*>(a->At(1))->String();
411 TString srun = static_cast<TObjString*>(a->At(2))->String();
412 TString type = static_cast<TObjString*>(a->At(3))->String();
413
414 CreateOCDBDataSource(cdbPath,atoi(srun.Data()),type);
415
416 delete a;
417}
418
1286237e 419//_____________________________________________________________________________
420void
fcabdc0c 421AliMUONPainterDataSourceFrame::RegisterDataSource(AliMUONVTrackerDataMaker* reader,
422 const char* dsName)
1286237e 423{
fcabdc0c 424 /// Register a new data source
425
426 if ( reader && reader->IsValid() )
1286237e 427 {
fcabdc0c 428 AliMUONMchViewApplication* app = dynamic_cast<AliMUONMchViewApplication*>(gApplication);
429 if (!app)
430 {
431 AliError("Could not cast application to the expected type ! CHECK THAT !");
432 }
433
8f0acce4 434 AliMUONPainterDataRegistry::Instance()->Register(reader);
1286237e 435
436 AliMUONPainterEnv* env = AliMUONPainterHelper::Instance()->Env();
437
438 Int_t n = env->Integer(fgkNumberOfDataSourcesKey);
439
440 env->Set(fgkNumberOfDataSourcesKey,n+1);
441
fcabdc0c 442 env->Set(Form(fgkDataSourceURIKey,n),dsName);
1286237e 443
444 env->Save();
445
fcabdc0c 446 AddRecentSource(dsName);
447
448 if ( app )
449 {
450
451 TString name(dsName);
452 name.ToUpper();
453
454 if ( name.Contains("PED") )
455 {
456 CreatePedestalCanvases(reader->Data());
457 }
458 }
459 }
460}
461
462//_____________________________________________________________________________
463void
464AliMUONPainterDataSourceFrame::CreatePedestalCanvases(AliMUONVTrackerData* data,
465 Double_t pedMin, Double_t pedMax,
466 Double_t sigmaMin, Double_t sigmaMax)
467{
468 /// Create 4 canvases with the pedestals contained in data
469 /// to show mean and sigma, for bending and non bending, with given limits
470
471 TList matrices;
472
473 AliMUONAttPainter att[2];
474
475 att[0].SetViewPoint(kTRUE,kFALSE);
476 att[0].SetCathode(kFALSE,kFALSE);
477 att[0].SetPlane(kTRUE,kFALSE);
478
479 att[1].SetViewPoint(kTRUE,kFALSE);
480 att[1].SetCathode(kFALSE,kFALSE);
481 att[1].SetPlane(kFALSE,kTRUE);
482
483 for ( Int_t iatt = 0; iatt < 2; ++iatt )
484 {
485 matrices.Add(CreateFullTracker(data,0,pedMin,pedMax,att[iatt]));
486 matrices.Add(CreateFullTracker(data,1,sigmaMin,sigmaMax,att[iatt]));
487 }
488
489 TIter next(&matrices);
490 AliMUONPainterMatrix* matrix;
491
492 Int_t w = TMath::Nint(gClient->GetDisplayWidth()*0.9);
493 Int_t h = TMath::Nint(gClient->GetDisplayHeight()*0.9);
494
495 Int_t x[] = { 0, 0, 20 + w/2, 20 + w/2 };
496 Int_t y[] = { 0, h/2+30, 0, h/2+30 };
497
498 Int_t i(0);
499
500 while ( ( matrix = static_cast<AliMUONPainterMatrix*>(next())) )
501 {
502 TCanvas* c = matrix->CreateCanvas(x[i],y[i],w/2,h/2);
503 c->Draw();
504 c->SaveAs(Form("%s.png",c->GetName()));
505 ++i;
506 }
507}
508
509//_____________________________________________________________________________
510AliMUONPainterMatrix*
511AliMUONPainterDataSourceFrame::CreateFullTracker(AliMUONVTrackerData* data,
512 Int_t dim,
513 Double_t xmin, Double_t xmax,
514 const AliMUONAttPainter& att)
515{
516 /// Generate, draw and register a matrix of 10 painters to show all the tracker
517 /// chambers
518
519 AliMUONPainterMatrix* matrix = new AliMUONPainterMatrix("Tracker",5,2);
520
521 for ( Int_t ichamber = 0; ichamber < 10; ++ichamber )
522 {
523 AliMUONVPainter* painter = new AliMUONChamberPainter(att,ichamber);
524
525 painter->SetResponder("BUSPATCH");
526
527 painter->SetOutlined("*",kFALSE);
528
529 matrix->Adopt(painter);
1286237e 530 }
531
fcabdc0c 532 matrix->SetData("MANU",data,dim);
533 matrix->SetDataRange(xmin,xmax);
534
535 AliMUONPainterRegistry::Instance()->Register(matrix);
536
537 return matrix;
538}
539
540
541//_____________________________________________________________________________
542void
543AliMUONPainterDataSourceFrame::CreateACFDataSource(const TString& acfPath, const TString& type)
544{
545 /// Create an ACF data source for a given (path,type)
546
547 AliMUONVTrackerDataMaker* reader = new AliMUONTrackerConditionDataMaker(acfPath.Data(),
548 type.Data());
549
550 RegisterDataSource(reader,Form("ACF;%s;%s",acfPath.Data(),type.Data()));
1286237e 551}
552
0145e89a 553//_____________________________________________________________________________
554void
555AliMUONPainterDataSourceFrame::CreateOCDBDataSource(const TString& cdbPath,
556 Int_t runNumber,
557 const TString& type)
558{
559 /// Create an OCDB data source for a given (path,runnumber,type) triplet
560
ca913045 561 AliMUONVTrackerDataMaker* reader = new AliMUONTrackerConditionDataMaker(runNumber,
562 cdbPath.Data(),
563 type.Data());
0145e89a 564
fcabdc0c 565 RegisterDataSource(reader,Form("OCDB;%s;%d;%s",cdbPath.Data(),runNumber,type.Data()));
0145e89a 566}
567
568//_____________________________________________________________________________
569void
570AliMUONPainterDataSourceFrame::CreateRawDataSource()
571{
572 /// Create a new raw data source (using info from the widgets)
573
574 TString uri(gSystem->ExpandPathName(fFilePath->GetText()));
b6f591ae 575
576 TString name("RAW");
577 Bool_t fromMemory(kFALSE);
0145e89a 578
b6f591ae 579 if ( uri.Contains(TRegexp("^mem")) )
0145e89a 580 {
b6f591ae 581 fromMemory = kTRUE;
582 }
583 else
584 {
585 if ( gSystem->AccessPathName(uri.Data()) )
586 {
587 AliError(Form("File %s does not exist",uri.Data()));
588 fFilePath->SetText("");
589 return;
590 }
0145e89a 591 }
592
10eb3d17 593 TString calibMode("");
10eb3d17 594
595 if ( fCalibrateGain->IsOn() )
596 {
597 calibMode = "GAIN";
598 name = "CALC";
599 }
600
601 if ( fCalibrateGainConstantCapa->IsOn() )
602 {
603 calibMode = "GAINCONSTANTCAPA";
604 name = "CALG";
605 }
66cdf5b3 606
607 if ( fCalibrateEmelecGain->IsOn() )
608 {
609 calibMode = "INJECTIONGAIN";
610 name = "CALE";
611 }
10eb3d17 612
613 if ( fCalibrateNoGain->IsOn() )
614 {
615 calibMode = "NOGAIN";
616 name = "CALZ";
617 }
618
a679753e 619 uri = Form("%s%s%s;%s;%s;%s;%s;%s;%s;%s",
10eb3d17 620 ( fHistogramButton->IsOn() ? "H":""),
b6f591ae 621 ( fromMemory ? "M" : ""),
10eb3d17 622 name.Data(),uri.Data(),
623 ( strlen(fRawOCDBPath->GetText()) > 0 ? fRawOCDBPath->GetText() : " "),
624 ( calibMode.Length() > 0 ? calibMode.Data() : " "),
625 Form("%e",fHistoMin->GetNumber()),
a679753e 626 Form("%e",fHistoMax->GetNumber()),
627 Form("%d",(Int_t)(fEventMin->GetIntNumber())),
628 Form("%d",(Int_t)(fEventMax->GetIntNumber())));
0145e89a 629
630 if ( CreateRawDataSource(uri) )
631 {
632 fFilePath->SetText("");
633 fRawOCDBPath->SetText("");
634 }
635}
636
637//_____________________________________________________________________________
638Bool_t
639AliMUONPainterDataSourceFrame::CreateRawDataSource(const TString& uri)
640{
641 /// Create a new raw data source, given its URI
642
643 TString filename;
644 TString ocdbPath;
10eb3d17 645 TString calibMode;
646 TString sxmin("0.0");
647 TString sxmax("4096.0");
a679753e 648 TString emin("-1");
649 TString emax("-1");
0145e89a 650
651 TObjArray* a = uri.Tokenize(";");
652
653 filename = static_cast<TObjString*>(a->At(1))->String();
654
655 if ( a->GetLast() > 1 )
656 {
657 ocdbPath = static_cast<TObjString*>(a->At(2))->String();
10eb3d17 658 if ( ocdbPath == " " ) ocdbPath = "";
659 }
660
661 if ( a->GetLast() > 2 )
662 {
663 calibMode = static_cast<TObjString*>(a->At(3))->String();
664 if ( calibMode == " " ) calibMode = "";
665 }
666
667 if ( a->GetLast() > 3 )
668 {
669 sxmin = static_cast<TObjString*>(a->At(4))->String();
670 }
671
672 if ( a->GetLast() > 4 )
673 {
674 sxmax = static_cast<TObjString*>(a->At(5))->String();
0145e89a 675 }
676
a679753e 677 if ( a->GetLast() > 5 )
678 {
679 emin = static_cast<TObjString*>(a->At(6))->String();
680 }
681
682 if ( a->GetLast() > 6 )
683 {
684 emax = static_cast<TObjString*>(a->At(7))->String();
685 }
686
0145e89a 687 AliRawReader* rawReader = 0x0;
688
0b376ef1 689 if ( filename.Contains(TRegexp("^alien")) )
0145e89a 690 {
0b376ef1 691 // insure we've initialized the grid...
692 if (!gGrid)
0145e89a 693 {
0b376ef1 694 TGrid::Connect("alien://");
0145e89a 695 }
0145e89a 696 }
0b376ef1 697
698 rawReader = AliRawReader::Create(filename.Data());
699
700 if (!rawReader)
0145e89a 701 {
0b376ef1 702 AliError(Form("Could not open file %s",filename.Data()));
703 fFilePath->SetText("");
704 return kFALSE;
0145e89a 705 }
0b376ef1 706
10eb3d17 707 /// Basic test to see if the file is correct
708 Bool_t ok = rawReader->NextEvent();
709 if (!ok)
0145e89a 710 {
10eb3d17 711 AliError(Form("File %s does not seem to be a raw data file",filename.Data()));
712 fFilePath->SetText("");
0145e89a 713 return kFALSE;
714 }
715
10eb3d17 716 rawReader->RewindEvents();
717
8741815f 718 AliMUONVTrackerDataMaker* reader(0x0);
719 Bool_t histogram(kFALSE);
720
10eb3d17 721 if ( uri.Contains(TRegexp("^H")) ) histogram = kTRUE;
722
8741815f 723 if ( ocdbPath.Length() > 0 )
724 {
a0dc65b4 725 AliMUONRecoParam* recoParam = AliMUONRecoParam::GetCosmicParam();
726
727 // FIXME: where to get the reco params from in reality ?
728
b6f591ae 729 reader = new AliMUONTrackerDataMaker(recoParam,
730 rawReader,
731 ocdbPath.Data(),
732 calibMode.Data(),
733 histogram,
734 sxmin.Atof(),
735 sxmax.Atof());
8741815f 736 }
737 else
738 {
b6f591ae 739 reader = new AliMUONTrackerDataMaker(rawReader,histogram);
8741815f 740 }
fcabdc0c 741
a679753e 742 reader->SetEventRange(emin.Atoi(),emax.Atoi());
743
0145e89a 744 reader->SetSource(filename.Data());
0145e89a 745
a679753e 746 TString dsName(uri);
747
748 if ( emin.Atoi() <= emax.Atoi() )
749 {
750 // we have an event range
751 if ( emin.Atoi() == emax.Atoi())
752 {
753 dsName += Form("[%d]",emin.Atoi());
754 }
755 else
756 {
757 dsName += Form("[%d,%d]",emin.Atoi(),emax.Atoi());
758 }
759 }
760
761 RegisterDataSource(reader,dsName.Data());
fcabdc0c 762
0145e89a 763 return kTRUE;
764}
765
766//_____________________________________________________________________________
767void
49419555 768AliMUONPainterDataSourceFrame::DataMakerWasRegistered(AliMUONVTrackerDataMaker* reader)
0145e89a 769{
770 /// Update ourselves as a new data reader was created
771
0145e89a 772 AliMUONPainterDataSourceItem* item = new AliMUONPainterDataSourceItem(fDataReaders,100,20,reader);
773
10eb3d17 774 item->Connect("StartRunning()",
775 "AliMUONPainterDataSourceFrame",
776 this,
b0cbe180 777 "StartRunning()");
10eb3d17 778
779 item->Connect("StopRunning()",
780 "AliMUONPainterDataSourceFrame",
781 this,
b0cbe180 782 "StopRunning()");
10eb3d17 783
0145e89a 784 fDataReaders->AddFrame(item);
785
786 fItems->Add(item);
787
788 fDataReaders->MapSubwindows();
789 fDataReaders->Resize();
790}
791
792//_____________________________________________________________________________
793void
57e2ad1a 794AliMUONPainterDataSourceFrame::DataMakerWasUnregistered(const AliMUONVTrackerDataMaker* maker)
0145e89a 795{
49419555 796 /// Update ourselves as a data reader was deleted
0145e89a 797
49419555 798 AliMUONPainterDataSourceItem* theItem(0x0);
10eb3d17 799
49419555 800 TIter next(fItems);
801 AliMUONPainterDataSourceItem* item;
802
803 while ( ( item = static_cast<AliMUONPainterDataSourceItem*>(next()) ) && !theItem )
804 {
805 if ( item->DataMaker() == maker )
806 {
807 theItem = item;
808 }
809 }
810
811 if (!theItem) return;
812
813 fDataReaders->RemoveFrame(theItem);
814 fItems->Remove(theItem);
815 theItem->DestroyWindow();
816 delete theItem;
817
818 fDataReaders->MapSubwindows();
819 fDataReaders->Resize();
820
0145e89a 821}
822
823//_____________________________________________________________________________
824void
825AliMUONPainterDataSourceFrame::OpenFileDialog()
826{
827 /// Open a file dialog to select a file to be read
828
829 TGFileInfo fileInfo;
830
10eb3d17 831 const char* fileTypes[] = {
832 "ROOT files","*.root",
833 "DATE files","*.raw",
834 "All files","*",
835 0,0 };
836
837 fileInfo.fFileTypes = fileTypes;
49419555 838 delete[] fileInfo.fIniDir;
839
840 AliMUONPainterEnv* env = AliMUONPainterHelper::Instance()->Env();
841
842 fileInfo.fIniDir = StrDup(env->String("LastOpenDir","."));
10eb3d17 843
0145e89a 844 new TGFileDialog(gClient->GetRoot(),gClient->GetRoot(),
845 kFDOpen,&fileInfo);
846
0145e89a 847 fFilePath->SetText(gSystem->ExpandPathName(Form("%s",fileInfo.fFilename)));
49419555 848
849 env->Set("LastOpenDir",fileInfo.fIniDir);
850 env->Save();
0145e89a 851}
852
853
1286237e 854//_____________________________________________________________________________
855void
856AliMUONPainterDataSourceFrame::OpenFileDialogACF()
857{
858 /// Open a file dialog to select an ASCII calibration file to be read
859
860 TGFileInfo fileInfo;
861
862 const char* fileTypes[] = {
863 "All files","*",
864 0,0 };
865
866 fileInfo.fFileTypes = fileTypes;
867 delete[] fileInfo.fIniDir;
868
869 AliMUONPainterEnv* env = AliMUONPainterHelper::Instance()->Env();
870
871 fileInfo.fIniDir = StrDup(env->String("LastOpenDirACF","."));
872
873 new TGFileDialog(gClient->GetRoot(),gClient->GetRoot(),
874 kFDOpen,&fileInfo);
875
876 fACFPath->SetText(gSystem->ExpandPathName(Form("%s",fileInfo.fFilename)));
877
878 env->Set("LastOpenDirACF",fileInfo.fIniDir);
879 env->Save();
880}
881
882
0145e89a 883//_____________________________________________________________________________
884void
885AliMUONPainterDataSourceFrame::OpenRecentSource()
886{
887 /// Open one source from the recently used ones
888
889 TGTextLBEntry* t = (TGTextLBEntry*)fRecentSources->GetSelectedEntry();
890
891 TString uri(t->GetText()->GetString());
892
10eb3d17 893 if ( uri.Contains(TRegexp("^RAW")) || uri.Contains(TRegexp("^HRAW")) ||
b6f591ae 894 uri.Contains(TRegexp("^CAL")) || uri.Contains(TRegexp("^HCAL")) ||
895 uri.Contains(TRegexp("^MEM")) )
0145e89a 896 {
897 CreateRawDataSource(uri);
898 }
899 else if ( uri.Contains(TRegexp("^OCDB")) )
900 {
901 CreateOCDBDataSource(uri);
902 }
1286237e 903 else if ( uri.Contains(TRegexp("^ACF")) )
904 {
905 CreateACFDataSource(uri);
906 }
0145e89a 907
908 fRecentSources->Select(-1);
909}
910
10eb3d17 911//_____________________________________________________________________________
912void
b0cbe180 913AliMUONPainterDataSourceFrame::StartRunning()
10eb3d17 914{
915 /// One data source starts running. Disable the Run button of the other ones
b0cbe180 916
917 AliMUONPainterDataSourceItem* item = reinterpret_cast<AliMUONPainterDataSourceItem*> (gTQSender);
918
919 AliInfo("");
920
10eb3d17 921 TIter next(fItems);
922 AliMUONPainterDataSourceItem* o;
923 while ( ( o = static_cast<AliMUONPainterDataSourceItem*>(next()) ) )
924 {
925 if ( o != item )
926 {
927 o->DisableRun();
928 }
929 }
930}
931
932//_____________________________________________________________________________
933void
b0cbe180 934AliMUONPainterDataSourceFrame::StopRunning()
10eb3d17 935{
936 /// One data source stops running. Enable the Run button of all items
b0cbe180 937
10eb3d17 938 TIter next(fItems);
939 AliMUONPainterDataSourceItem* o;
940 while ( ( o = static_cast<AliMUONPainterDataSourceItem*>(next()) ) )
941 {
942 o->EnableRun();
943 }
944}
945