1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
18 //-----------------------------------------------------------------------------
19 /// \class AliMUONTriggerGUI
20 /// Graphical User Interface utility class for the MUON trigger detector
21 /// It creates, after initialisation with a data file, a sensitive map
22 /// of the trigger boards
23 /// \author Bogdan Vulpescu, LPC Clermont-Ferrand
24 //-----------------------------------------------------------------------------
26 #include "AliMUONTriggerGUI.h"
27 #include "AliMUONTriggerGUIboard.h"
28 #include "AliMUONTriggerGUIdimap.h"
29 #include "AliMUONTriggerGUIbdmap.h"
31 #include "AliMpDDLStore.h"
32 #include "AliMpSegmentation.h"
33 #include "AliMpVSegmentation.h"
34 #include "AliMpTriggerSegmentation.h"
35 #include "AliMpIntPair.h"
37 #include "AliMpDEManager.h"
38 #include "AliMpDEIterator.h"
40 #include "AliMUONGeometryTransformer.h"
41 #include "AliMUONTriggerCrateStore.h"
42 #include "AliMUONLocalTriggerBoard.h"
43 #include "AliMUONTriggerElectronics.h"
44 #include "AliMUONCalibrationData.h"
45 #include "AliMUONMCDataInterface.h"
46 #include "AliMUONDigitStoreV1.h"
47 #include "AliMUONDigitStoreV2R.h"
48 #include "AliMUONTriggerStoreV1.h"
49 #include "AliMUONLocalTrigger.h"
50 #include "AliMUONRawWriter.h"
51 #include "AliMUONDigitMaker.h"
52 #include "AliMUONGlobalTrigger.h"
56 #include "AliRunLoader.h"
57 #include "AliCDBManager.h"
58 #include "AliRawDataHeaderSim.h"
59 #include "AliRawReader.h"
64 #include <TApplication.h>
65 #include <TGDimension.h>
68 #include <TGTextEntry.h>
71 #include <TGImageMap.h>
72 #include <TGTextBuffer.h>
75 ClassImp(AliMUONTriggerGUI)
78 //__________________________________________________________________________
79 AliMUONTriggerGUI::AliMUONTriggerGUI(Int_t runNumber)
110 fTriggerProcessor(0),
117 fCurrentRawEvent(-1),
121 /// main GUI frame of the trigger monitor
130 fFileName = new TString("");
131 fEvString = new TString("");
132 fPath = new TString("");
134 fDigitStore = new AliMUONDigitStoreV2R;
135 fDigitStore->Create();
137 fTriggerStore = new AliMUONTriggerStoreV1;
138 fTriggerStore->Create();
140 fRawDigitStore = new AliMUONDigitStoreV1;
141 fRawDigitStore->Create();
143 fRawTriggerStore = new AliMUONTriggerStoreV1;
144 fRawTriggerStore->Create();
146 fCDBManager = AliCDBManager::Instance();
147 fCDBManager->SetDefaultStorage("local://$ALICE_ROOT");
148 fCDBManager->SetRun(runNumber);
149 AliMpCDB::LoadDDLStore();
150 fCalibrationData = new AliMUONCalibrationData(runNumber);
152 fTriggerProcessor = new AliMUONTriggerElectronics(fCalibrationData);
156 fMain = new TGMainFrame(gClient->GetRoot(), 750, 420);
157 fMain->Connect("CloseWindow()", "AliMUONTriggerGUI", this, "CloseWindow()");
161 TGMenuBar *menuBar = new TGMenuBar(fMain);
165 TGPopupMenu *menuFile = new TGPopupMenu(gClient->GetRoot());
166 //menuFile->AddLabel("");
168 menuFile->AddEntry("Run input", kMFILERUN);
169 menuFile->AddEntry("Control", kMFILECNTRL);
170 menuFile->AddEntry("Exit", kMFILEEXIT);
172 menuFile->Connect("Activated(Int_t)", "AliMUONTriggerGUI", this, "HandleMenu(Int_t)");
176 TGPopupMenu *menuCircuit = new TGPopupMenu(gClient->GetRoot());
177 //menuCircuit->AddLabel("");
179 menuCircuit->AddEntry("Open", kMCIRCUITOPEN);
181 menuCircuit->Connect("Activated(Int_t)", "AliMUONTriggerGUI", this, "HandleMenu(Int_t)");
185 TGPopupMenu *menuMap = new TGPopupMenu(gClient->GetRoot());
186 //menuMap->AddLabel("");
188 menuMap->AddEntry("Digits map", kMMAPDIGITS);
189 menuMap->AddEntry("Reset digits", kMRESETDIGITS);
191 menuMap->Connect("Activated(Int_t)", "AliMUONTriggerGUI", this,
192 "HandleMenu(Int_t)");
196 TGPopupMenu *menuTrigger = new TGPopupMenu(gClient->GetRoot());
198 TGPopupMenu *menuTriggerD = new TGPopupMenu(gClient->GetRoot());
199 TGPopupMenu *menuTriggerT = new TGPopupMenu(gClient->GetRoot());
200 TGPopupMenu *menuTriggerF = new TGPopupMenu(gClient->GetRoot());
202 menuTrigger->AddPopup("Digit store", menuTriggerD);
203 menuTrigger->AddSeparator();
204 menuTrigger->AddPopup("Trigger store",menuTriggerT);
205 menuTrigger->AddSeparator();
206 menuTrigger->AddPopup("Front End Test", menuTriggerF);
207 menuTrigger->AddSeparator();
209 menuTriggerD->AddEntry("Create", kMDSTORE);
210 menuTriggerD->AddEntry("Print", kMDSTOREP);
211 menuTriggerD->AddEntry("Clear", kMDSTORECL);
212 menuTriggerT->AddEntry("Create", kMTSTORE);
213 menuTriggerT->AddEntry("Print", kMTSTOREP);
214 menuTriggerT->AddEntry("Clear", kMTSTORECL);
215 menuTriggerF->AddEntry("On", kMFETON);
216 menuTriggerF->AddEntry("Off", kMFETOFF);
217 menuTriggerF->AddEntry("Reg On", kMFETREGON);
218 menuTriggerF->AddEntry("Reg Off",kMFETREGOFF);
219 menuTrigger->AddEntry("Write raw data", kMTRAWDATA);
221 menuTrigger->Connect("Activated(Int_t)", "AliMUONTriggerGUI", this, "HandleMenu(Int_t)");
223 // Add menus to the menu bar
225 menuBar->AddPopup("File", menuFile,
226 new TGLayoutHints(kLHintsTop | kLHintsLeft, 5,5,2,2)
229 menuBar->AddPopup("Maps", menuMap,
230 new TGLayoutHints(kLHintsTop | kLHintsLeft, 5,5,2,2)
233 menuBar->AddPopup("Circuit", menuCircuit,
234 new TGLayoutHints(kLHintsTop | kLHintsLeft, 5,5,2,2)
237 menuBar->AddPopup("TriggerDSET", menuTrigger,
238 new TGLayoutHints(kLHintsTop | kLHintsLeft, 5,5,2,2)
241 // Add menu bar to the main frame
243 fMain->AddFrame(menuBar,
244 new TGLayoutHints(kLHintsTop |
252 fImageMap = new TGImageMap(fMain,"$ALICE_ROOT/MUON/data/guimap.gif");
254 fImageMap->Connect("RegionClicked(Int_t)", "AliMUONTriggerGUI", this, "OpenBoard(Int_t)");
256 fImageMap->SetToolTipText("Map of the local boards as seen from the I.P.");
258 // Add image map to the main frame
260 fMain->AddFrame(fImageMap);
261 fMain->SetWindowName("Map of the local boards as seen from the I.P.");
263 // Resize the main frame
265 TGDimension size = fMain->GetDefaultSize();
268 fMain->MapSubwindows();
272 fBoardsInit = kFALSE;
278 //__________________________________________________________________________
279 void AliMUONTriggerGUI::HandleMenu(Int_t id)
281 /// handles entry numbers in the available menus (EMenuIdentifiers)
283 TGCompositeFrame *runInput1, *runInput2, *runInput3;
284 TGCompositeFrame *control1, *control2, *circuit1, *circuit2;
285 TGCompositeFrame *fetregon1, *fetregon2;
286 TGCompositeFrame *fetregoff1, *fetregoff2;
287 TGLabel *runL1, *runL2, *circuitL1, *fetregonL1, *fetregoffL1;
288 TGTextEntry *runText1, *runText2, *circuitText1;
289 TGTextEntry *fetregonText1, *fetregoffText1;
290 TGTextButton *runApply1, *runApply2, *runCancel;
291 TGTextButton *controlClose, *nextEvent, *previousEvent, *skipToEvent;
292 TGTextButton *circuitCancel, *circuitOpen;
293 TGTextButton *fetregonCancel, *fetregoffCancel;
294 TGTextButton *fetregonRun, *fetregoffRun;
308 fRunInput = new TGTransientFrame(gClient->GetRoot(), fMain, 400, 200);
309 fRunInput->Connect("CloseWindow()", "AliMUONTriggerGUI", this, "CloseRunInput()");
310 fRunInput->DontCallClose(); // to avoid double deletions.
312 // use hierarchical cleaning
313 fRunInput->SetCleanup(kDeepCleanup);
315 fRunInput->SetWindowName("Input file and event number");
317 // input galice and event number frames
319 runInput1 = new TGCompositeFrame(fRunInput, 400, 200, kHorizontalFrame);
320 runInput2 = new TGCompositeFrame(fRunInput, 400, 200, kHorizontalFrame);
324 runL1 = new TGLabel(runInput1, new TGString("Full file path:"));
325 runL2 = new TGLabel(runInput2, new TGString("Event number:"));
329 runText1 = new TGTextEntry(runInput1, fTxtBuffer1 = new TGTextBuffer(100));
331 runText1->SetToolTipText("Enter the path to galice.root or the raw data file (root)");
332 runText1->Resize(300, runText1->GetDefaultHeight());
334 // event number text entry
336 runText2 = new TGTextEntry(runInput2, fTxtBuffer2 = new TGTextBuffer(5));
338 fEvString->Form("%d",0);
339 fTxtBuffer2->AddText(0,fEvString->Data());
341 runText2->SetToolTipText("Enter the first event number to start with");
342 runText2->Resize(300, runText2->GetDefaultHeight());
344 // add to galice frame
346 runInput1->AddFrame(runL1,
347 new TGLayoutHints(kLHintsLeft |
352 runInput1->AddFrame(runText1,
353 new TGLayoutHints(kLHintsRight |
358 // add to event number frame
360 runInput2->AddFrame(runL2,
361 new TGLayoutHints(kLHintsLeft |
366 runInput2->AddFrame(runText2,
367 new TGLayoutHints(kLHintsRight |
372 // add input frames to main input frame
374 fRunInput->AddFrame(runInput1,
375 new TGLayoutHints(kLHintsTop | kLHintsExpandX, 2, 2, 3, 0));
377 fRunInput->AddFrame(runInput2,
378 new TGLayoutHints(kLHintsTop | kLHintsExpandX, 2, 2, 3, 0));
380 // frame with buttons
382 runInput3 = new TGCompositeFrame(fRunInput, 400, 200, kHorizontalFrame);
386 runApply1 = new TGTextButton(runInput3, "Apply (galice)", 1);
387 runApply1->Connect("Clicked()", "AliMUONTriggerGUI", this, "DoRunGalApply()");
388 runApply1->SetToolTipText("Apply changes (galice input)");
390 runApply2 = new TGTextButton(runInput3, "Apply (raw)", 1);
391 runApply2->Connect("Clicked()", "AliMUONTriggerGUI", this, "DoRunRawApply()");
392 runApply2->SetToolTipText("Apply changes (raw data input)");
394 runCancel = new TGTextButton(runInput3, "Cancel", 2);
395 runCancel->Connect("Clicked()", "AliMUONTriggerGUI", this, "DoRunCancel()");
396 runCancel->SetToolTipText("Cancel changes");
400 runInput3->AddFrame(runApply1,
401 new TGLayoutHints(kLHintsTop |
406 runInput3->AddFrame(runApply2,
407 new TGLayoutHints(kLHintsTop |
412 runInput3->AddFrame(runCancel,
413 new TGLayoutHints(kLHintsTop |
418 // add to the main input frame
420 fRunInput->AddFrame(runInput3,
421 new TGLayoutHints(kLHintsTop |
426 fRunInput->MapSubwindows();
428 fRunInput->MapWindow();
434 // control main frame
436 fControl = new TGTransientFrame(gClient->GetRoot(), fMain, 50, 50);
437 fControl->Connect("CloseWindow()", "AliMUONTriggerGUI", this, "CloseControl()");
438 fControl->DontCallClose(); // to avoid double deletions.
440 // use hierarchical cleaning
441 fControl->SetCleanup(kDeepCleanup);
443 fControl->SetWindowName("Run controls");
445 // frame to hold buttons
447 control1 = new TGCompositeFrame(fControl, 50, 50, kVerticalFrame);
451 controlClose = new TGTextButton(control1, "Close", 1);
452 controlClose->Connect("Clicked()", "AliMUONTriggerGUI", this, "DoControlClose()");
453 //controlClose->Resize(300, controlClose->GetDefaultHeight());
455 nextEvent = new TGTextButton(control1, "Next event", 2);
456 nextEvent->Connect("Clicked()", "AliMUONTriggerGUI", this, "DoNextEvent()");
458 previousEvent = new TGTextButton(control1, "Previous event", 3);
459 previousEvent->Connect("Clicked()", "AliMUONTriggerGUI", this, "DoPreviousEvent()");
461 // frame to hold event skip
463 control2 = new TGCompositeFrame(fControl, 50, 50, kHorizontalFrame);
465 // skip to event text field
467 fSkipToEventTxt = new TGTextEntry(control2, fTxtBuffer2 = new TGTextBuffer(5));
469 fTxtBuffer2->AddText(0,fEvString->Data());
471 // skip to event button
473 skipToEvent = new TGTextButton(control2, "Skip to event", 1);
474 skipToEvent->Connect("Clicked()", "AliMUONTriggerGUI", this, "DoSkipToEvent()");
476 // add to event skip frame
478 control2->AddFrame(fSkipToEventTxt,
479 new TGLayoutHints(kLHintsTop |
484 control2->AddFrame(skipToEvent,
485 new TGLayoutHints(kLHintsTop |
492 control1->AddFrame(controlClose,
493 new TGLayoutHints(kLHintsBottom |
498 control1->AddFrame(nextEvent,
499 new TGLayoutHints(kLHintsBottom |
504 control1->AddFrame(previousEvent,
505 new TGLayoutHints(kLHintsBottom |
510 // add to the main frame
512 fControl->AddFrame(control1,
513 new TGLayoutHints(kLHintsBottom |
519 fControl->AddFrame(control2,
520 new TGLayoutHints(kLHintsTop |
525 fControl->MapSubwindows();
527 fControl->MapWindow();
536 fDiMap = new AliMUONTriggerGUIdimap(fBoards,gClient->GetRoot(), fMain, 400, 200);
537 fDiMap->SetLoader(fLoader);
538 fDiMap->SetMCDataInterface(fMCDataInterface);
539 fDiMap->SetRawDigitStore(fRawDigitStore);
540 fDiMap->DrawAllMaps();
541 } else if (!fDiMap->IsOn()) {
542 fDiMap = new AliMUONTriggerGUIdimap(fBoards,gClient->GetRoot(), fMain, 400, 200);
543 fDiMap->SetLoader(fLoader);
544 fDiMap->SetMCDataInterface(fMCDataInterface);
545 fDiMap->SetRawDigitStore(fRawDigitStore);
546 fDiMap->DrawAllMaps();
553 Int_t number, over, pos;
554 for (Int_t ib = 0; ib < kNBoards; ib++) {
555 AliMUONTriggerGUIboard *board = GetBoard(ib);
556 board->ClearXDigits();
557 board->ClearYDigits();
559 number = board->GetNumber();
560 pos = board->GetPosition();
561 over = board->GetYOver();
562 for (Int_t io = 1; io <= over; io++) {
563 if (io == pos) continue;
564 board = GetBoard(number+io-pos);
565 board->ClearYDigits();
573 fCircuit = new TGTransientFrame(gClient->GetRoot(), fMain, 50, 50);
574 fCircuit->Connect("CloseWindow()", "AliMUONTriggerGUI", this, "CloseCircuit()");
575 fCircuit->DontCallClose(); // to avoid double deletions.
577 // use hierarchical cleaning
578 fCircuit->SetCleanup(kDeepCleanup);
580 fCircuit->SetWindowName("Board circuit");
584 circuit1 = new TGCompositeFrame(fCircuit, 400, 200, kHorizontalFrame);
585 circuit2 = new TGCompositeFrame(fCircuit, 400, 200, kHorizontalFrame);
589 circuitL1 = new TGLabel(circuit1, new TGString("Circuit number:"));
593 circuitText1 = new TGTextEntry(circuit1, fTxtCircuit = new TGTextBuffer(10));
596 circuitCancel = new TGTextButton(circuit2, "Cancel", 1);
597 circuitCancel->Connect("Clicked()", "AliMUONTriggerGUI", this, "DoCircuitCancel()");
598 //circuitCancel->Resize(100, circuitCancel->GetDefaultHeight());
600 circuitOpen = new TGTextButton(circuit2, "Open", 2);
601 circuitOpen->Connect("Clicked()", "AliMUONTriggerGUI", this, "DoCircuitOpen()");
602 //circuitOpen->Resize(100, circuitOpen->GetDefaultHeight());
606 circuit1->AddFrame(circuitL1,
607 new TGLayoutHints(kLHintsLeft |
612 circuit1->AddFrame(circuitText1,
613 new TGLayoutHints(kLHintsRight |
618 circuit2->AddFrame(circuitCancel,
619 new TGLayoutHints(kLHintsBottom |
624 circuit2->AddFrame(circuitOpen,
625 new TGLayoutHints(kLHintsBottom |
630 fCircuit->AddFrame(circuit1,
631 new TGLayoutHints(kLHintsTop | kLHintsExpandX, 2, 2, 3, 0));
633 fCircuit->AddFrame(circuit2,
634 new TGLayoutHints(kLHintsTop | kLHintsExpandX, 2, 2, 3, 0));
636 fCircuit->MapSubwindows();
638 fCircuit->MapWindow();
655 CreateTriggerStore();
667 WriteTriggerRawData();
680 fFETRegOn = new TGTransientFrame(gClient->GetRoot(), fMain, 50, 50);
681 fFETRegOn->Connect("CloseWindow()", "AliMUONTriggerGUI", this, "CloseFETRegOn()");
682 fFETRegOn->DontCallClose(); // to avoid double deletions.
684 // use hierarchical cleaning
685 fFETRegOn->SetCleanup(kDeepCleanup);
687 fFETRegOn->SetWindowName("FET ON regional crate");
691 fetregon1 = new TGCompositeFrame(fFETRegOn, 400, 200, kHorizontalFrame);
692 fetregon2 = new TGCompositeFrame(fFETRegOn, 400, 200, kHorizontalFrame);
696 fetregonL1 = new TGLabel(fetregon1, new TGString("Regional crate name:"));
700 fetregonText1 = new TGTextEntry(fetregon1, fTxtFETRegOn = new TGTextBuffer(10));
703 fetregonCancel = new TGTextButton(fetregon2, "Cancel", 1);
704 fetregonCancel->Connect("Clicked()", "AliMUONTriggerGUI", this, "DoFETRegOnCancel()");
705 //fetregonCancel->Resize(100, fetregonCancel->GetDefaultHeight());
707 fetregonRun = new TGTextButton(fetregon2, "Run FET", 2);
708 fetregonRun->Connect("Clicked()", "AliMUONTriggerGUI", this, "DoFETRegOnRun()");
709 //fetregonRun->Resize(100, fetregonRun->GetDefaultHeight());
713 fetregon1->AddFrame(fetregonL1,
714 new TGLayoutHints(kLHintsLeft |
719 fetregon1->AddFrame(fetregonText1,
720 new TGLayoutHints(kLHintsRight |
725 fetregon2->AddFrame(fetregonCancel,
726 new TGLayoutHints(kLHintsBottom |
731 fetregon2->AddFrame(fetregonRun,
732 new TGLayoutHints(kLHintsBottom |
737 fFETRegOn->AddFrame(fetregon1,
738 new TGLayoutHints(kLHintsTop | kLHintsExpandX, 2, 2, 3, 0));
740 fFETRegOn->AddFrame(fetregon2,
741 new TGLayoutHints(kLHintsTop | kLHintsExpandX, 2, 2, 3, 0));
743 fFETRegOn->MapSubwindows();
745 fFETRegOn->MapWindow();
751 fFETRegOff = new TGTransientFrame(gClient->GetRoot(), fMain, 50, 50);
752 fFETRegOff->Connect("CloseWindow()", "AliMUONTriggerGUI", this, "CloseFETRegOff()");
753 fFETRegOff->DontCallClose(); // to avoid double deletions.
755 // use hierarchical cleaning
756 fFETRegOff->SetCleanup(kDeepCleanup);
758 fFETRegOff->SetWindowName("FET OFF regional crate");
762 fetregoff1 = new TGCompositeFrame(fFETRegOff, 400, 200, kHorizontalFrame);
763 fetregoff2 = new TGCompositeFrame(fFETRegOff, 400, 200, kHorizontalFrame);
767 fetregoffL1 = new TGLabel(fetregoff1, new TGString("Regional crate name:"));
771 fetregoffText1 = new TGTextEntry(fetregoff1, fTxtFETRegOff = new TGTextBuffer(10));
774 fetregoffCancel = new TGTextButton(fetregoff2, "Cancel", 1);
775 fetregoffCancel->Connect("Clicked()", "AliMUONTriggerGUI", this, "DoFETRegOffCancel()");
776 //fetregoffCancel->Resize(100, fetregoffCancel->GetDefaultHeight());
778 fetregoffRun = new TGTextButton(fetregoff2, "Run FET", 2);
779 fetregoffRun->Connect("Clicked()", "AliMUONTriggerGUI", this, "DoFETRegOffRun()");
780 //fetregoffRun->Resize(100, fetregoffRun->GetDefaultHeight());
784 fetregoff1->AddFrame(fetregoffL1,
785 new TGLayoutHints(kLHintsLeft |
790 fetregoff1->AddFrame(fetregoffText1,
791 new TGLayoutHints(kLHintsRight |
796 fetregoff2->AddFrame(fetregoffCancel,
797 new TGLayoutHints(kLHintsBottom |
802 fetregoff2->AddFrame(fetregoffRun,
803 new TGLayoutHints(kLHintsBottom |
808 fFETRegOff->AddFrame(fetregoff1,
809 new TGLayoutHints(kLHintsTop | kLHintsExpandX, 2, 2, 3, 0));
811 fFETRegOff->AddFrame(fetregoff2,
812 new TGLayoutHints(kLHintsTop | kLHintsExpandX, 2, 2, 3, 0));
814 fFETRegOff->MapSubwindows();
815 fFETRegOff->Resize();
816 fFETRegOff->MapWindow();
821 printf("Menu item %d selected\n", id);
828 //__________________________________________________________________________
829 void AliMUONTriggerGUI::CloseRunInput() const
831 /// close the run input frame
837 //__________________________________________________________________________
838 void AliMUONTriggerGUI::CloseError() const
840 /// close the error frame
846 //__________________________________________________________________________
847 void AliMUONTriggerGUI::CloseControl() const
849 /// close the event control frame
853 //gSystem->Exec("cd $PWD/mtrun; aliroot -b -q mtsim.C");
857 //__________________________________________________________________________
858 void AliMUONTriggerGUI::CloseCircuit() const
860 /// close the circuit frame
866 //__________________________________________________________________________
867 void AliMUONTriggerGUI::CloseFETRegOn() const
869 /// close the FET regional on frame
875 //__________________________________________________________________________
876 void AliMUONTriggerGUI::CloseFETRegOff() const
878 /// close the FET regional off frame
884 //__________________________________________________________________________
885 void AliMUONTriggerGUI::CloseWindow()
887 /// close the main frame and exit aplication
890 delete fMCDataInterface;
892 gApplication->Terminate();
896 //__________________________________________________________________________
897 void AliMUONTriggerGUI::DoRunGalApply()
899 /// apply changes in the run control frame for galice input
902 printf("This is a run with raw data input.\n");
906 TString es = TString(fTxtBuffer2->GetString());
909 printf("Galice input = %s event = %d \n",fTxtBuffer1->GetString(),fEvent);
911 TString error = TString("");;
913 fPath->Form("%s",fTxtBuffer1->GetString());
914 fFileName->Form("%s",fTxtBuffer1->GetString());
916 if (gSystem->AccessPathName(fFileName->Data()) || !fFileName->EndsWith(".root")) {
918 error.Append("No galice file: ");
919 error.Append(fFileName->Data());
920 DoErrorGUI(error.Data());
924 TFile *ftest = new TFile(fFileName->Data(),"READ");
925 AliRun *galice = (AliRun*)ftest->Get("gAlice");
931 error.Append("No gAlice in file: ");
932 error.Append(fFileName->Data());
933 DoErrorGUI(error.Data());
944 delete fMCDataInterface;
947 fRunLoader = AliRunLoader::Open(fFileName->Data(),"MUONFolder","READ");
949 if (fRunLoader == 0x0) {
951 DoErrorGUI("No run loader !");
955 fRunLoader->LoadgAlice();
956 gAlice = fRunLoader->GetAliRun();
957 fEventsPerRun = AliRunLoader::Instance()->GetNumberOfEvents();
959 fLoader = fRunLoader->GetLoader("MUONLoader");
960 fRunLoader->GetEvent(fEvent);
962 fMCDataInterface = new AliMUONMCDataInterface(fFileName->Data());
964 fRunInput->SendCloseMessage();
971 if (fDiMap->IsOn()) {
972 fDiMap->SetLoader(fLoader);
973 fDiMap->SetMCDataInterface(fMCDataInterface);
983 //__________________________________________________________________________
984 void AliMUONTriggerGUI::DoRunRawApply()
986 /// apply changes in the run control frame for raw date input
988 if (fControlOn) DoControlClose();
990 if (fRunLoader != 0) {
991 printf("This is a run with galice input.\n");
995 TString es = TString(fTxtBuffer2->GetString());
998 printf("Raw data input = %s event = %d \n",fTxtBuffer1->GetString(),fEvent);
1000 TString error = TString("");;
1002 fPath->Form("%s",fTxtBuffer1->GetString());
1003 fFileName->Form("%s",fTxtBuffer1->GetString());
1005 if (gSystem->AccessPathName(fFileName->Data()) || !fFileName->EndsWith(".root")) {
1007 error.Append("No raw data file: ");
1008 error.Append(fFileName->Data());
1009 DoErrorGUI(error.Data());
1013 if (fRawReader == 0) {
1014 fRawReader = AliRawReader::Create(fFileName->Data());
1017 fRawReader = AliRawReader::Create(fFileName->Data());
1019 if (fRawReader == 0) {
1020 error.Append("Not a valid raw data file: ");
1021 error.Append(fFileName->Data());
1022 DoErrorGUI(error.Data());
1026 fRawReader->GotoEvent(fEvent);
1027 fCurrentRawEvent = fEvent;
1029 AliMUONDigitMaker digitMaker;
1030 digitMaker.SetMakeTriggerDigits(kTRUE);
1031 digitMaker.Raw2Digits(fRawReader,fRawDigitStore,fRawTriggerStore);
1033 fRunInput->SendCloseMessage();
1040 if (fDiMap->IsOn()) {
1041 fDiMap->SetRawDigitStore(fRawDigitStore);
1051 //__________________________________________________________________________
1052 void AliMUONTriggerGUI::DoRunCancel()
1054 /// cancel the changes in the run control frame
1056 fRunInput->SendCloseMessage();
1060 //__________________________________________________________________________
1061 void AliMUONTriggerGUI::DoErrorGUI(const Char_t *wt)
1063 /// show an error message in a new frame
1065 fError = new TGTransientFrame(gClient->GetRoot(), fMain, 50, 50);
1066 fError->Connect("CloseWindow()", "AliMUONTriggerGUI", this, "CloseError()");
1067 fError->DontCallClose(); // to avoid double deletions.
1069 // use hierarchical cleaning
1070 fError->SetCleanup(kDeepCleanup);
1072 fError->SetWindowName("Error !");
1074 TGCompositeFrame *fW = new TGCompositeFrame(fError, 50, 50, kVerticalFrame);
1076 TGTextButton *fErrorOK = new TGTextButton(fW, "&Ok", 1);
1077 fErrorOK->Connect("Clicked()", "AliMUONTriggerGUI", this, "DoErrorOK()");
1079 fW->AddFrame(fErrorOK,
1080 new TGLayoutHints(kLHintsBottom |
1085 TGLabel *fWL = new TGLabel(fW, new TGString(wt));
1088 new TGLayoutHints(kLHintsTop |
1093 fError->AddFrame(fW,
1094 new TGLayoutHints(kLHintsLeft |
1099 fError->MapSubwindows();
1101 fError->MapWindow();
1105 //__________________________________________________________________________
1106 void AliMUONTriggerGUI::DoNextEvent()
1108 /// load next event from the file
1110 TString error = TString("");
1113 if (fEvent < (fEventsPerRun-1)) {
1115 fRunLoader->GetEvent(fEvent);
1117 fEvString->Form("%d",fEvent);
1118 fTxtBuffer2->RemoveText(0,5);
1119 fTxtBuffer2->AddText(0,fEvString->Data());
1120 fSkipToEventTxt->SetFocus();
1123 error.Form("Only %d event(s) in the run !",fEventsPerRun);
1124 DoErrorGUI(error.Data());
1127 if (fRawReader->NextEvent()) {
1130 AliMUONDigitMaker digitMaker;
1131 digitMaker.SetMakeTriggerDigits(kTRUE);
1132 digitMaker.Raw2Digits(fRawReader,fRawDigitStore,fRawTriggerStore);
1134 fEvString->Form("%d",fCurrentRawEvent);
1135 fTxtBuffer2->RemoveText(0,5);
1136 fTxtBuffer2->AddText(0,fEvString->Data());
1137 fSkipToEventTxt->SetFocus();
1145 //__________________________________________________________________________
1146 void AliMUONTriggerGUI::DoPreviousEvent()
1148 /// load previous event from the input file
1150 TString error = TString("");
1155 fRunLoader->GetEvent(fEvent);
1157 fEvString->Form("%d",fEvent);
1158 fTxtBuffer2->RemoveText(0,5);
1159 fTxtBuffer2->AddText(0,fEvString->Data());
1160 fSkipToEventTxt->SetFocus();
1163 error.Form("Already at event 0 !");
1164 DoErrorGUI(error.Data());
1167 if (fCurrentRawEvent > 0) {
1169 fRawReader->GotoEvent(fCurrentRawEvent);
1171 AliMUONDigitMaker digitMaker;
1172 digitMaker.SetMakeTriggerDigits(kTRUE);
1173 digitMaker.Raw2Digits(fRawReader,fRawDigitStore,fRawTriggerStore);
1175 fEvString->Form("%d",fCurrentRawEvent);
1176 fTxtBuffer2->RemoveText(0,5);
1177 fTxtBuffer2->AddText(0,fEvString->Data());
1178 fSkipToEventTxt->SetFocus();
1186 //__________________________________________________________________________
1187 void AliMUONTriggerGUI::DoSkipToEvent()
1189 /// skip to event -input- from the input file
1191 TString error = TString("");
1193 TString es = TString(fTxtBuffer2->GetString());
1197 if (fEvent < 0 || fEvent > (fEventsPerRun-1)) {
1198 error.Form("Event number out of range !");
1199 DoErrorGUI(error.Data());
1201 fRunLoader->GetEvent(fEvent);
1204 if (fRawReader->GotoEvent(fEvent)) {
1205 fCurrentRawEvent = fEvent;
1207 AliMUONDigitMaker digitMaker;
1208 digitMaker.SetMakeTriggerDigits(kTRUE);
1209 digitMaker.Raw2Digits(fRawReader,fRawDigitStore,fRawTriggerStore);
1211 fEvString->Form("%d",fCurrentRawEvent);
1212 fTxtBuffer2->RemoveText(0,5);
1213 fTxtBuffer2->AddText(0,fEvString->Data());
1214 fSkipToEventTxt->SetFocus();
1221 //__________________________________________________________________________
1222 void AliMUONTriggerGUI::DoErrorOK()
1224 /// close the error frame
1226 fError->SendCloseMessage();
1230 //__________________________________________________________________________
1231 void AliMUONTriggerGUI::DoControlClose()
1233 /// close the event control frame
1235 fControl->SendCloseMessage();
1236 fControlOn = kFALSE;
1240 //__________________________________________________________________________
1241 void AliMUONTriggerGUI::DoCircuitCancel()
1243 /// close the circuit frame
1245 fCircuit->SendCloseMessage();
1249 //__________________________________________________________________________
1250 void AliMUONTriggerGUI::DoFETRegOnCancel()
1252 /// close the FET regional on window
1254 fFETRegOn->SendCloseMessage();
1258 //__________________________________________________________________________
1259 void AliMUONTriggerGUI::DoFETRegOffCancel()
1261 /// close the FET regional off window
1263 fFETRegOff->SendCloseMessage();
1267 //__________________________________________________________________________
1268 void AliMUONTriggerGUI::DoFETRegRun(Int_t onoff)
1270 /// FET ON/OFF for the regional crate
1274 crateName = TString(fTxtFETRegOn->GetString());
1276 crateName = TString(fTxtFETRegOff->GetString());
1278 AliMUONTriggerGUIboard *board;
1281 for (Int_t ib = 0; ib < kNBoards; ib++) {
1282 board = (AliMUONTriggerGUIboard*)fBoards->At(ib);
1283 if (strcmp(board->GetCrateName(),crateName.Data()) != 0) continue;
1289 //__________________________________________________________________________
1290 void AliMUONTriggerGUI::DoFETRegOnRun()
1292 /// FET ON for the regional crate
1295 fFETRegOn->SendCloseMessage();
1299 //__________________________________________________________________________
1300 void AliMUONTriggerGUI::DoFETRegOffRun()
1302 /// FET ON for the regional crate
1305 fFETRegOff->SendCloseMessage();
1309 //__________________________________________________________________________
1310 void AliMUONTriggerGUI::DoCircuitOpen()
1314 TString cs = TString(fTxtCircuit->GetString());
1315 Int_t icirc = cs.Atoi();
1317 AliMUONTriggerGUIboard *board;
1319 for (Int_t ib = 0; ib < kNBoards; ib++) {
1321 board = GetBoard(ib);
1323 if (board->GetIdCircuit() == icirc) {
1328 if (fDiMap->IsOn()) {
1329 fDiMap->SelectBoard(ib);
1333 fCircuit->SendCloseMessage();
1341 //__________________________________________________________________________
1342 AliMUONTriggerGUIboard* AliMUONTriggerGUI::GetBoard(Int_t id) const
1344 /// return board with "id"
1346 if (fBoards == 0) return 0;
1347 void * b = fBoards->UncheckedAt(id);
1348 if (b == 0) return 0;
1350 return (AliMUONTriggerGUIboard*)b;
1354 //__________________________________________________________________________
1355 void AliMUONTriggerGUI::OpenBoard(Int_t id)
1357 /// open board with "id" in a new frame
1359 AliMUONTriggerGUIboard *board = GetBoard(id);
1360 UShort_t status = board->GetStatus();
1361 board->SetOpen(kTRUE);
1363 AliMUONTriggerGUIbdmap *bf;
1366 bf = new AliMUONTriggerGUIbdmap(gClient->GetRoot(), fMain, 400, 200);
1368 if (status & kGood) {
1369 sprintf(text,"%s (Circuit %4d) status : working",
1370 board->GetBoardName(),board->GetIdCircuit());
1373 if (status & kWithProblems) {
1374 sprintf(text,"%s (Circuit %4d) status : has problems...",
1375 board->GetBoardName(),board->GetIdCircuit());
1378 if (status & kNotWorking) {
1379 sprintf(text,"%s (Circuit %4d) status : not working",
1380 board->GetBoardName(),board->GetIdCircuit());
1383 if (status & kUnknown) {
1384 sprintf(text,"%s (Circuit %4d) status : unknown",
1385 board->GetBoardName(),board->GetIdCircuit());
1389 bf->SetBoard(Boards(),id);
1390 bf->SetLoader(fLoader);
1391 bf->SetCrateManager(fCrateManager);
1392 bf->SetMCDataInterface(fMCDataInterface);
1393 bf->SetRawDigitStore(fRawDigitStore);
1394 bf->SetRawTriggerStore(fRawTriggerStore);
1400 if (fDiMap->IsOn()) {
1401 fDiMap->SelectBoard(id);
1407 //__________________________________________________________________________
1408 void AliMUONTriggerGUI::Init()
1410 /// initialize the main GUI frame
1417 AliMUONTriggerGUIboard *board;
1418 for (Int_t ib = 0; ib < kNBoards; ib++) {
1419 board = GetBoard(ib);
1425 //__________________________________________________________________________
1426 void AliMUONTriggerGUI::InitBoards()
1428 /// create board objects and define the sensitive regions in the image map
1430 fBoardsInit = kTRUE;
1433 if (fCrateManager == 0x0) {
1434 fCrateManager = new AliMUONTriggerCrateStore();
1435 fCrateManager->ReadFromFile(fCalibrationData);
1438 // create boards geometry from the mapping
1439 AliMUONTriggerGUIboard *board;
1440 for (Int_t ib = 0; ib < kNBoards; ib++) {
1441 Boards()->Add(new AliMUONTriggerGUIboard());
1444 // circuit number to board number in array
1445 Int_t cIdtobId[235];
1449 Int_t manuIdPrev, ich, idet, boardIdTmp = -1;
1450 for (Int_t chamber = 0; chamber < kNMT; chamber++) {
1451 for ( it.First(); ! it.IsDone(); it.Next() ) {
1453 if (it.CurrentDEId()/100 < 11) continue;
1455 ich = it.CurrentDEId()/100 - 11;
1456 if (ich != chamber) continue;
1457 idet = it.CurrentDEId()%100;
1459 const AliMpVSegmentation* seg0 = AliMpSegmentation::Instance()->GetMpSegmentation(it.CurrentDEId(), AliMp::kCath0);
1460 const AliMpVSegmentation* seg1 = AliMpSegmentation::Instance()->GetMpSegmentation(it.CurrentDEId(), AliMp::kCath1);
1464 for (Int_t ix = 0; ix <= seg0->MaxPadIndexX(); ix++) {
1465 for (Int_t iy = 0; iy <= seg0->MaxPadIndexY(); iy++) {
1466 AliMpIntPair indices(ix,iy);
1467 AliMpPad pad = seg0->PadByIndices(indices,kFALSE);
1468 if (pad.IsValid()) {
1469 AliMpIntPair loc = pad.GetLocation(0);
1470 Int_t manuId = loc.GetFirst();
1471 if (manuId != manuIdPrev) {
1472 AliMpLocalBoard *mpboard = AliMpDDLStore::Instance()->GetLocalBoard(manuId);
1473 manuIdPrev = manuId;
1477 boardId = cIdtobId[manuId];
1479 board = GetBoard(boardId);
1480 if (board->GetNumber() == -1)
1481 board->SetNumber(boardId);
1482 if (board->GetDetElemId() == -1)
1483 board->SetDetElemId(idet);
1484 if (!strcmp(board->GetBoardName(),""))
1485 board->SetBoardName(mpboard->GetName());
1486 cIdtobId[manuId] = boardId;
1488 GetBoard(boardId)->AddPadX(pad,ich);
1491 } // end plane 0 (x-strips)
1495 for (Int_t ix = 0; ix <= seg1->MaxPadIndexX(); ix++) {
1496 for (Int_t iy = 0; iy <= seg1->MaxPadIndexY(); iy++) {
1497 AliMpIntPair indices(ix,iy);
1498 AliMpPad pad = seg1->PadByIndices(indices,kFALSE);
1499 if (pad.IsValid()) {
1500 Int_t nloc = pad.GetNofLocations();
1501 for (Int_t iloc = 0; iloc < nloc; iloc++) {
1502 AliMpIntPair loc = pad.GetLocation(iloc);
1503 Int_t manuId = loc.GetFirst();
1504 if (manuId != manuIdPrev) {
1505 manuIdPrev = manuId;
1506 boardIdTmp = cIdtobId[manuId];
1508 GetBoard(boardIdTmp)->AddPadY(pad,ich);
1512 } // end plane 1 (y-strips)
1514 } // end det elem loop
1515 } // end chamber loop
1517 for (Int_t ib = 0; ib < kNBoards; ib++) {
1518 board = GetBoard(ib);
1519 board->MakeGeometry();
1520 AliMUONLocalTriggerBoard* b = fCrateManager->LocalBoard(board->GetIdCircuit());
1521 board->SetCrateName((b->GetCrate()).Data());
1524 // create the sensitive map
1526 Int_t nPixelX = 700;
1527 Int_t nPixelY = 676;
1529 Int_t nPixelBorderX = 40; // to guess...
1530 Int_t nPixelBorderY = 40; // to guess...
1533 Float_t boardsX = 2*257.00; // cm
1534 Float_t boardsY = 2*306.61; // cm
1536 UShort_t status = 1;
1537 Float_t xc, yc, xw, yw;
1546 // regions for the image map (from MT11)
1548 for (Int_t ib = 0; ib < kNBoards; ib++) {
1550 board = GetBoard(ib);
1553 board->SetStatus(status);
1555 xc = board->GetXCenter(0);
1556 yc = board->GetYCenter(0);
1557 xw = board->GetXWidth(0);
1558 yw = board->GetYWidth(0);
1560 x = (Int_t)(nPixelX/2 + xc * (nPixelX - 2*nPixelBorderX)/boardsX);
1561 y = (Int_t)(nPixelY/2 - yc * (nPixelY - 2*nPixelBorderY)/boardsY);
1566 w = (UInt_t)(xw*(nPixelX-2*nPixelBorderX)/boardsX);
1567 h = (UInt_t)(yw*(nPixelY-2*nPixelBorderY)/boardsY);
1581 reg = new TGRegion(5,xp,yp);
1582 fImageMap->AddRegion(*reg, ib);
1584 sprintf(text,"%s (crate %s circuit %3d, number %3d)",board->GetBoardName(),board->GetCrateName(),board->GetIdCircuit(),board->GetNumber());
1585 fImageMap->SetToolTipText(ib, text);
1587 // Set coordinates of strips boxes
1589 SetStripBoxes(board);
1591 //board->PrintBoard();
1597 //__________________________________________________________________________
1598 void AliMUONTriggerGUI::SetStripBoxes(AliMUONTriggerGUIboard *board)
1600 /// set coordinates of strip boxes
1602 AliMUONGeometryTransformer transformer;
1603 transformer.LoadGeometryData("transform.dat");
1605 const AliMpVSegmentation* seg;
1609 Int_t chamber, detElemId, maxX, maxY;
1610 Float_t xpmin, xpmax, ypmin, ypmax;
1611 Float_t xg1, xg2, yg1, yg2, zg1;
1612 Float_t xlocal1, xlocal2, ylocal1, ylocal2;
1613 Float_t xCenter, yCenter, xWidth, yWidth;
1615 for (Int_t i = 0; i < kNMT; i++) {
1619 xCenter = board->GetXCenter(i);
1620 yCenter = board->GetYCenter(i);
1621 xWidth = board->GetXWidth(i);
1622 yWidth = board->GetYWidth(i);
1624 for ( it.First(chamber-1); ! it.IsDone(); it.Next() ) {
1626 detElemId = it.CurrentDEId();
1628 if (detElemId%100 != board->GetDetElemId()) continue;
1630 /*---------- y-pads cath = 1 ----------*/
1632 seg = AliMpSegmentation::Instance()->GetMpSegmentation(detElemId, AliMp::kCath1);
1634 maxX = seg->MaxPadIndexX();
1635 maxY = seg->MaxPadIndexY();
1637 for (Int_t ix = 0; ix <= maxX; ix++) {
1638 for (Int_t iy = 0; iy <= maxY; iy++) {
1640 pad = seg->PadByIndices(AliMpIntPair(ix,iy),kFALSE);
1642 if (!pad.IsValid()) continue;
1644 // get the pad position and dimensions
1645 xlocal1 = pad.Position().X();
1646 ylocal1 = pad.Position().Y();
1647 xlocal2 = pad.Dimensions().X();
1648 ylocal2 = pad.Dimensions().Y();
1650 transformer.Local2Global(detElemId, xlocal1, ylocal1, 0, xg1, yg1, zg1);
1651 // (no transformation for pad dimensions)
1655 // transform in the monitor coordinate system
1667 Int_t iX1, iX2, iY, ixDig;
1668 iX1 = board->GetYSix1();
1669 iX2 = board->GetYSix2();
1670 iY = board->GetYSiy();
1671 if (ix >= iX1 && ix <= iX2 && iy == iY) {
1673 ypmin = -0.5*yWidth;
1674 ypmax = +0.5*yWidth;
1678 board->SetYDigBox(i,ixDig,(Double_t)xpmin,(Double_t)ypmin,
1679 (Double_t)xpmax,(Double_t)ypmax);
1686 /*---------- x-pads cath = 0 ----------*/
1688 seg = AliMpSegmentation::Instance()->GetMpSegmentation(detElemId, AliMp::kCath0);
1690 maxX = seg->MaxPadIndexX();
1691 maxY = seg->MaxPadIndexY();
1693 for (Int_t ix = 0; ix <= maxX; ix++) {
1694 for (Int_t iy = 0; iy <= maxY; iy++) {
1696 pad = seg->PadByIndices(AliMpIntPair(ix,iy),kFALSE);
1698 if (!pad.IsValid()) continue;
1700 // get the pad position and dimensions
1701 xlocal1 = pad.Position().X();
1702 ylocal1 = pad.Position().Y();
1703 xlocal2 = pad.Dimensions().X();
1704 ylocal2 = pad.Dimensions().Y();
1706 transformer.Local2Global(detElemId, xlocal1, ylocal1, 0, xg1, yg1, zg1);
1707 // (no transformation for pad dimensions)
1711 // transform in the monitor coordinate system
1723 Int_t iX, iY1, iY2, iyDig;
1724 iX = board->GetXSix();
1725 iY1 = board->GetXSiy1();
1726 iY2 = board->GetXSiy2();
1727 if (ix == iX && iy >= iY1 && iy <= iY2) {
1731 board->SetXDigBox(i,iyDig,(Double_t)xpmin,(Double_t)ypmin,
1732 (Double_t)xpmax,(Double_t)ypmax);
1745 //__________________________________________________________________________
1746 void AliMUONTriggerGUI::CreateDigitStore()
1748 /// create memory resident digits store with set strips
1750 Int_t nstripX, nstripY, detElemId, charge, ix, iy, iX1, iY1;
1751 Int_t cathode, maxX, maxY;
1752 Int_t manuId, manuChannel;
1753 const AliMpVSegmentation* seg;
1755 AliMUONTriggerGUIboard* board;
1758 for (Int_t ib = 0; ib < kNBoards; ib++) {
1760 board = (AliMUONTriggerGUIboard*)fBoards->At(ib);
1761 if (board == 0) continue;
1763 nstripX = board->GetNStripX();
1764 nstripY = board->GetNStripY();
1765 for (Int_t ichamber = 11; ichamber <= 14; ichamber++) {
1767 detElemId = ichamber * 100 + board->GetDetElemId();
1770 for (Int_t isx = 0; isx < nstripX; isx++) {
1772 charge = (Int_t)board->GetXDig(ichamber-11,isx);
1773 if (charge == 0) continue;
1774 ix = board->GetXSix();
1775 iY1 = board->GetXSiy1();
1777 seg = AliMpSegmentation::Instance()->GetMpSegmentation(detElemId, AliMp::GetCathodType(cathode));
1778 maxX = seg->MaxPadIndexX();
1779 maxY = seg->MaxPadIndexY();
1780 if (ix > maxX) printf("Index x > maximum!\n");
1781 if (iy > maxY) printf("Index y > maximum!\n");
1782 pad = seg->PadByIndices(AliMpIntPair(ix,iy),kTRUE);
1783 manuId = pad.GetLocation(0).GetFirst();
1784 manuChannel = pad.GetLocation(0).GetSecond();
1786 dig = fDigitStore->Add(detElemId,manuId,manuChannel,cathode,AliMUONVDigitStore::kAllow);
1787 dig->SetCharge(charge);
1788 dig->SetPadXY(ix,iy);
1789 //printf("Cathode 0: ix %3d iy %3d manuId %3d manuChannel %3d \n",ix,iy,manuId,manuChannel);
1795 for (Int_t isy = 0; isy < nstripY; isy++) {
1797 charge = board->GetYDig(ichamber-11,isy);
1798 if (charge == 0) continue;
1799 iX1 = board->GetYSix1();
1801 iy = board->GetYSiy();
1802 seg = AliMpSegmentation::Instance()->GetMpSegmentation(detElemId, AliMp::GetCathodType(cathode));
1803 maxX = seg->MaxPadIndexX();
1804 maxY = seg->MaxPadIndexY();
1805 if (ix > maxX) printf("Index x > maximum!\n");
1806 if (iy > maxY) printf("Index y > maximum!\n");
1807 pad = seg->PadByIndices(AliMpIntPair(ix,iy),kTRUE);
1808 manuId = pad.GetLocation(0).GetFirst();
1809 manuChannel = pad.GetLocation(0).GetSecond();
1811 dig = fDigitStore->Add(detElemId,manuId,manuChannel,cathode,AliMUONVDigitStore::kAllow);
1812 dig->SetCharge(charge);
1813 dig->SetPadXY(ix,iy);
1814 //printf("Cathode 1: ix %3d iy %3d manuId %3d manuChannel %3d \n",ix,iy,manuId,manuChannel);
1824 //__________________________________________________________________________
1825 void AliMUONTriggerGUI::PrintDigitStore() const
1827 /// Print the digits created in the GUI
1829 const AliMpVSegmentation* seg;
1831 Int_t ix, iy, charge, detElemId, cathode;
1834 for (Int_t i = 0; i < kNMT; i++) {
1838 AliMpIntPair deRange = AliMpDEManager::GetDetElemIdRange(chamber-1);
1839 TIter next(fDigitStore->CreateIterator(deRange.GetFirst(),deRange.GetSecond()));
1840 AliMUONVDigit *mdig;
1842 while ( ( mdig = static_cast<AliMUONVDigit*>(next())) )
1844 cathode = mdig->Cathode();
1848 detElemId = mdig->DetElemId();
1849 charge = (Int_t)mdig->Charge();
1851 seg = AliMpSegmentation::Instance()->GetMpSegmentation(detElemId, AliMp::GetCathodType(cathode));
1852 pad = seg->PadByIndices(AliMpIntPair(ix,iy),kTRUE);
1853 AliMpIntPair ind = pad.GetIndices();
1855 printf("Digit: detElemId %4d cath %1d ix %2d iy %3d charge %1d \n",detElemId,cathode,ix,iy,charge);
1863 //__________________________________________________________________________
1864 void AliMUONTriggerGUI::CreateTriggerStore()
1866 /// Process the DSET digit store and fill the trigger store
1868 if (fDigitStore->GetSize() == 0) {
1869 printf("The digit store is empty...\n");
1874 AliMUONVDigitStore *digitStore = static_cast<AliMUONVDigitStore*>(fDigitStore);
1876 fTriggerProcessor->Digits2Trigger(*digitStore,*fTriggerStore);
1880 //__________________________________________________________________________
1881 void AliMUONTriggerGUI::PrintTriggerStore() const
1883 /// Print the trigger output for DSET digits store
1885 if (!fTStoreOn) return;
1887 TIter next(fTriggerStore->CreateLocalIterator());
1889 UShort_t x2m, x2u, x2d;
1890 Int_t loStripX, loStripY, loDev, loCircuit, iStripX, iStripY, loLpt, loHpt;
1891 AliMUONLocalTrigger *mlt;
1892 while ( ( mlt = static_cast<AliMUONLocalTrigger*>(next()) ) )
1894 loCircuit = mlt->LoCircuit();
1896 AliMUONLocalTriggerBoard* ltb = fCrateManager->LocalBoard(loCircuit);
1897 x2d = ltb->GetSwitch(0);
1898 x2m = ltb->GetSwitch(1);
1899 x2u = ltb->GetSwitch(2);
1901 loStripX = mlt->LoStripX();
1902 loStripY = mlt->LoStripY();
1903 loDev = mlt->LoDev();
1904 loLpt = mlt->LoLpt();
1905 loHpt = mlt->LoHpt();
1907 iStripX = loStripX/2;
1908 if ((x2u == 1 || x2m == 1 || x2d == 1) && x2m == 1) {
1909 iStripY = loStripY/2;
1914 printf("Circ %3d Xs %2d Ys %2d Dev %2d Lpt %1d Hpt %1d \n",loCircuit,loStripX,loStripY,loDev,loLpt,loHpt);
1916 AliMUONGlobalTrigger *globalTrigger = fTriggerStore->Global();
1917 globalTrigger->Print();
1923 //__________________________________________________________________________
1924 void AliMUONTriggerGUI::WriteTriggerRawData()
1926 /// Write raw data (DATE and ROOT) for the trigger store from
1927 /// the DSET digit store
1930 printf("The trigger store is empty... \n");
1936 AliMUONRawWriter *rawWriter = new AliMUONRawWriter();
1937 AliRawDataHeaderSim header;
1938 rawWriter->SetHeader(header);
1939 rawWriter->Digits2Raw(0,fTriggerStore);
1943 // raw data (ddl) to date
1944 // AliSimulation::ConvertRawFilesToDate
1947 char dateFileName[256];
1948 sprintf(dateFileName,"TriggerGUI.date");
1949 sprintf(command, "dateStream -c -s -D -o %s -# %d -C -run %d",
1950 dateFileName, 1, 0);
1951 FILE* pipe = gSystem->OpenPipe(command, "w");
1953 UInt_t detectorPattern = 0;
1954 fprintf(pipe, "GDC DetectorPattern %u\n", detectorPattern);
1958 // loop over detectors and DDLs
1959 for (Int_t iDet = 0; iDet < AliDAQ::kNDetectors; iDet++) {
1960 for (Int_t iDDL = 0; iDDL < AliDAQ::NumberOfDdls(iDet); iDDL++) {
1962 Int_t ddlID = AliDAQ::DdlID(iDet,iDDL);
1963 Int_t ldcID = Int_t(ldc + 0.0001);
1964 ldc += AliDAQ::NumberOfLdcs(iDet) / AliDAQ::NumberOfDdls(iDet);
1966 char rawFileName[256];
1967 sprintf(rawFileName, "%s",AliDAQ::DdlFileName(iDet,iDDL));
1968 // check existence and size of raw data file
1969 FILE* file = fopen(rawFileName, "rb");
1970 if (!file) continue;
1971 fseek(file, 0, SEEK_END);
1972 unsigned long size = ftell(file);
1974 if (!size) continue;
1976 if (ldcID != prevLDC) {
1977 fprintf(pipe, " LDC Id %d\n", ldcID);
1980 fprintf(pipe, " Equipment Id %d Payload %s\n", ddlID, rawFileName);
1983 Int_t result = gSystem->ClosePipe(pipe);
1985 // raw data (date) to root
1986 // AliSimulation::ConvertDateToRoot
1988 char rootFileName[256];
1989 sprintf(rootFileName,"TriggerGUI.root");
1992 const Int_t kDBSize = 2000000000;
1993 const Int_t kTagDBSize = 1000000000;
1994 const Bool_t kFilter = kFALSE;
1995 const Int_t kCompression = 1;
1997 char* path = gSystem->Which(gSystem->Getenv("PATH"), "alimdc");
1999 printf("the program alimdc was not found\n");
2005 printf("converting DATE file %s to root file %s \n",
2006 dateFileName, rootFileName);
2008 const char* rawDBFS[2] = { "/tmp/mdc1", "/tmp/mdc2" };
2009 const char* tagDBFS = "/tmp/mdc1/tags";
2011 // User defined file system locations
2012 if (gSystem->Getenv("ALIMDC_RAWDB1"))
2013 rawDBFS[0] = gSystem->Getenv("ALIMDC_RAWDB1");
2014 if (gSystem->Getenv("ALIMDC_RAWDB2"))
2015 rawDBFS[1] = gSystem->Getenv("ALIMDC_RAWDB2");
2016 if (gSystem->Getenv("ALIMDC_TAGDB"))
2017 tagDBFS = gSystem->Getenv("ALIMDC_TAGDB");
2019 gSystem->Exec(Form("rm -rf %s",rawDBFS[0]));
2020 gSystem->Exec(Form("rm -rf %s",rawDBFS[1]));
2021 gSystem->Exec(Form("rm -rf %s",tagDBFS));
2023 gSystem->Exec(Form("mkdir %s",rawDBFS[0]));
2024 gSystem->Exec(Form("mkdir %s",rawDBFS[1]));
2025 gSystem->Exec(Form("mkdir %s",tagDBFS));
2027 result = gSystem->Exec(Form("alimdc %d %d %d %d %s",
2028 kDBSize, kTagDBSize, kFilter, kCompression,
2030 gSystem->Exec(Form("mv %s/*.root %s", rawDBFS[0], rootFileName));
2032 gSystem->Exec(Form("rm -rf %s",rawDBFS[0]));
2033 gSystem->Exec(Form("rm -rf %s",rawDBFS[1]));
2034 gSystem->Exec(Form("rm -rf %s",tagDBFS));
2038 //__________________________________________________________________________
2039 void AliMUONTriggerGUI::FETboard(Int_t ib, Int_t amp)
2041 /// Front End test set all strips for board with index "ib"
2042 /// AliMUONTriggerGUIbdmap::DoDigits()
2044 AliMUONTriggerGUIboard *board;
2045 AliMUONTriggerGUIboard *btmp;
2046 Int_t pos, over, number, nStripX, nStripY;
2048 board = (AliMUONTriggerGUIboard*)fBoards->At(ib);
2049 if (board == 0) return;
2051 nStripX = board->GetXSiy2() - board->GetXSiy1() + 1;
2052 nStripY = board->GetYSix2() - board->GetYSix1() + 1;
2054 number = board->GetNumber();
2055 pos = board->GetPosition();
2056 over = board->GetYOver();
2058 for (Int_t imt = 0; imt < kNMT; imt++) {
2060 for (Int_t ix = 0; ix < nStripX; ix++) {
2061 board->SetDigitX(imt,ix,amp);
2064 for (Int_t iy = 0; iy < nStripY; iy++) {
2065 board->SetDigitY(imt,iy,amp);
2067 // extended y-strips
2068 for (Int_t io = 1; io <= over; io++) {
2069 if (io == pos) continue;
2070 btmp = (AliMUONTriggerGUIboard*)fBoards->UncheckedAt(number+io-pos);
2071 btmp->SetDigitY(imt,iy,amp);
2080 //__________________________________________________________________________
2081 void AliMUONTriggerGUI::FET(Int_t onoff)
2083 /// Front End test set all strips for all boards
2084 /// AliMUONTriggerGUIbdmap::DoDigits()
2088 for (Int_t ib = 0; ib < kNBoards; ib++) {
2094 //__________________________________________________________________________
2095 void AliMUONTriggerGUI::ClearDigitStore()
2097 /// Clear the DSET digit store
2099 fDigitStore->Clear();
2103 //__________________________________________________________________________
2104 void AliMUONTriggerGUI::ClearTriggerStore()
2106 /// Clear the trigger store from the DSET digit store
2108 fTriggerStore->Clear();