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 ///////////////////////////////////////////////////////////////////////////////
20 // This is the class for perfoming the monitoring process. //
21 // It checks if a raw data file exists, loops over the events in the raw //
22 // data file, reconstructs TPC and ITS clusters and tracks, fills the //
23 // monitor histograms and sends the updated histograms to the clients. //
24 // Then the raw data file is deleted and it waits for a new file. //
26 ///////////////////////////////////////////////////////////////////////////////
30 #include <TGridResult.h>
33 #include <TServerSocket.h>
38 #include "AliITSclustererV2.h"
39 #include "AliITSgeom.h"
40 #include "AliITStrackerV2.h"
41 #include "AliLoader.h"
42 #include "AliMonitorHLT.h"
43 #include "AliMonitorHLTHough.h"
44 #include "AliMonitorITS.h"
45 #include "AliMonitorProcess.h"
46 #include "AliMonitorTPC.h"
47 #include "AliMonitorV0s.h"
48 #include "AliRawReaderRoot.h"
51 #include "AliTPCclustererMI.h"
52 #include "AliTPCtrackerMI.h"
53 #include "AliV0vertexer.h"
55 #include <AliHLTStandardIncludes.h>
56 #include <AliHLTMemHandler.h>
57 #include <AliHLTClusterFitter.h>
58 #include <AliHLTFitter.h>
59 #include <AliHLTHough.h>
60 #include <AliHLTHoughBaseTransformer.h>
61 #include <AliHLTStandardIncludes.h>
62 #include <AliHLTTrack.h>
63 #include <AliHLTTrackArray.h>
64 #include <AliHLTTransform.h>
65 #include <AliHLTVertex.h>
66 #include <AliLevel3.h>
68 ClassImp(AliMonitorProcess)
71 const Int_t AliMonitorProcess::fgkPort = 9327;
74 //_____________________________________________________________________________
75 AliMonitorProcess::AliMonitorProcess(
76 #if ROOT_VERSION_CODE <= 199169 // 3.10/01
77 const char* /*alienHost*/,
79 const char* alienHost,
82 const char* selection,
83 const char* fileNameGalice):
84 fSelection(selection),
99 fWriteHistoList(kFALSE),
108 fDisplaySocket(NULL),
113 fInterruptHandler(NULL)
115 // initialize the monitoring process and the monitor histograms
117 fSelection = selection;
119 #if ROOT_VERSION_CODE <= 199169 // 3.10/01
120 fGrid = TGrid::Connect("alien", gSystem->Getenv("USER"));
122 fGrid = TGrid::Connect(alienHost, gSystem->Getenv("USER"));
124 if (!fGrid || fGrid->IsZombie() || !fGrid->IsConnected()) {
126 AliFatal("could not connect to alien");
128 #if ROOT_VERSION_CODE <= 199169 // 3.10/01
132 fRunLoader = AliRunLoader::Open(fileNameGalice);
133 if (!fRunLoader) AliFatal(Form("could not get run loader from file %s",
136 fRunLoader->CdGAFile();
137 fTPCParam = AliTPC::LoadTPCParam(gFile);
138 if (!fTPCParam) AliFatal("could not load TPC parameters");
140 fRunLoader->LoadgAlice();
141 gAlice = fRunLoader->GetAliRun();
142 if (!gAlice) AliFatal("no gAlice object found");
143 fITSgeom = (AliITSgeom*)gDirectory->Get("AliITSgeom");
144 if (!fITSgeom) AliFatal("could not load ITS geometry");
146 // Init TPC parameters for HLT
147 Bool_t isinit=AliHLTTransform::Init(const_cast<char*>(fileNameGalice),kTRUE);
149 AliFatal("Could not create transform settings, please check log for error messages!");
152 fTopFolder = new TFolder("Monitor", "monitor histograms");
153 fTopFolder->SetOwner(kTRUE);
155 if (IsSelected("TPC")) fMonitors.Add(new AliMonitorTPC(fTPCParam));
156 if (IsSelected("ITS")) fMonitors.Add(new AliMonitorITS(fITSgeom));
157 if (IsSelected("V0s")) fMonitors.Add(new AliMonitorV0s);
158 if (IsSelected("HLTConfMap")) fMonitors.Add(new AliMonitorHLT(fTPCParam));
159 if (IsSelected("HLTHough")) fMonitors.Add(new AliMonitorHLTHough(fTPCParam));
161 for (Int_t iMonitor = 0; iMonitor < fMonitors.GetEntriesFast(); iMonitor++) {
162 ((AliMonitor*) fMonitors[iMonitor])->CreateHistos(fTopFolder);
165 TIterator* iFolder = fTopFolder->GetListOfFolders()->MakeIterator();
166 while (TFolder* folder = (TFolder*) iFolder->Next()) folder->SetOwner(kTRUE);
169 fFile = TFile::Open("monitor_tree.root", "RECREATE");
170 if (!fFile || !fFile->IsOpen()) {
171 AliFatal("could not open file for tree");
173 fTree = new TTree("MonitorTree", "tree for monitoring");
174 for (Int_t iMonitor = 0; iMonitor < fMonitors.GetEntriesFast(); iMonitor++) {
175 ((AliMonitor*) fMonitors[iMonitor])->CreateBranches(fTree);
179 fServerSocket = new TServerSocket(fgkPort, kTRUE);
180 fServerSocket->SetOption(kNoBlock, 1);
181 CheckForConnections();
183 fInterruptHandler = new AliMonitorInterruptHandler(this);
184 gSystem->AddSignalHandler(fInterruptHandler);
187 //_____________________________________________________________________________
188 AliMonitorProcess::AliMonitorProcess(const AliMonitorProcess& process) :
197 fLogicalFileName(""),
206 fWriteHistoList(kFALSE),
215 fDisplaySocket(NULL),
220 fInterruptHandler(NULL)
223 AliFatal("copy constructor not implemented");
226 //_____________________________________________________________________________
227 AliMonitorProcess& AliMonitorProcess::operator = (const AliMonitorProcess&
230 AliFatal("assignment operator not implemented");
234 //_____________________________________________________________________________
235 AliMonitorProcess::~AliMonitorProcess()
243 delete fServerSocket;
245 delete fDisplaySocket;
247 #if ROOT_VERSION_CODE <= 199169 // 3.10/01
254 gSystem->Unlink("monitor_tree.root");
259 gSystem->RemoveSignalHandler(fInterruptHandler);
260 delete fInterruptHandler;
264 //_____________________________________________________________________________
265 const char* AliMonitorProcess::GetRevision()
271 //_____________________________________________________________________________
272 void AliMonitorProcess::SetStatus(EStatus status)
274 // set the current status and process system events
277 gSystem->ProcessEvents();
281 //_____________________________________________________________________________
282 void AliMonitorProcess::Run()
284 // run the monitor process:
285 // check for a raw data file, process the raw data file and delete it
291 while (!CheckForNewFile()) {
292 CheckForConnections();
294 if (fStopping) break;
297 if (fStopping) break;
309 //_____________________________________________________________________________
310 void AliMonitorProcess::Stop()
312 // set the fStopping flag to terminate the monitor process after the current
313 // event was processed
315 if (GetStatus() != kStopped) fStopping = kTRUE;
319 //_____________________________________________________________________________
320 void AliMonitorProcess::ProcessFile(const char* fileName)
322 // create a file with monitor histograms for a single file
324 if (GetStatus() != kStopped) {
325 AliError("ProcessFile can not be called"
326 " while the monitor process is running");
330 fFileName = fileName;
331 Int_t nEventMin = fNEventsMin;
335 fNEventsMin = nEventMin;
340 //_____________________________________________________________________________
341 Bool_t AliMonitorProcess::CheckForNewFile()
343 // check whether a new file was registered in alien
345 #if ROOT_VERSION_CODE < ROOT_VERSION(5,0,0)
346 #if ROOT_VERSION_CODE <= 199169 // 3.10/01
347 TGridResult* result = fGrid->Ls();
351 sprintf(dirName, "%s/adc-%d", fAlienDir.Data(), datime.GetDate());
353 sprintf(findName, "*.root");
354 Grid_ResultHandle_t handle = fGrid->Find(dirName, findName);
356 AliError(Form("could not open alien directory %s",
360 TGridResult* result = fGrid->CreateGridResult(handle);
366 #if ROOT_VERSION_CODE <= 199169 // 3.10/01
367 while (const char* entry = result->Next()) {
369 while (Grid_Result_t* resultEntry = result->Next()) {
370 const char* entry = resultEntry->name.c_str();
372 if (strrchr(entry, '/')) entry = strrchr(entry, '/')+1;
373 // entry = host_date_time.root
374 TString entryCopy(entry);
375 char* p = const_cast<char*>(entryCopy.Data());
376 if (!strtok(p, "_") || !p) continue; // host name
377 char* dateStr = strtok(NULL, "_");
378 if (!dateStr || !p) continue;
379 char* timeStr = strtok(NULL, ".");
380 if (!timeStr || !p) continue;
381 Long_t date = atoi(dateStr);
382 Long_t time = atoi(timeStr);
384 if ((date > maxDate) || ((date == maxDate) && (time > maxTime))) {
392 if (maxDate < 0) return kFALSE; // no files found
393 if (fLogicalFileName.CompareTo(fileName) == 0) return kFALSE; // no new file
395 fLogicalFileName = fileName;
396 #if ROOT_VERSION_CODE <= 199169 // 3.10/01
397 result = fGrid->GetPhysicalFileNames(fLogicalFileName.Data());
398 fFileName = result->Next();
400 fileName = dirName + ("/" + fLogicalFileName);
401 handle = fGrid->GetPhysicalFileNames(fileName.Data());
403 AliError(Form("could not get physical file names for %s",
407 result = fGrid->CreateGridResult(handle);
409 Grid_Result_t* resultEntry = result->Next();
411 AliError(Form("could not get physical file names for %s",
415 fFileName = resultEntry->name2.c_str();
416 fFileName.ReplaceAll("castor:/", "rfio:/");
420 Error("CheckForNewFile", "needs to be ported to new TGrid");
425 //_____________________________________________________________________________
426 Bool_t AliMonitorProcess::ProcessFile()
428 // loop over all events in the raw data file, run the reconstruction
429 // and fill the monitor histograms
431 Int_t nEvents = GetNumberOfEvents(fFileName);
432 if (nEvents <= 0) return kFALSE;
433 AliDebug(1, Form("found %d event(s) in file %s",
434 nEvents, fFileName.Data()));
435 if (IsSelected("HLTConfMap")) CreateHLT(fFileName);
436 if (IsSelected("HLTHough")) CreateHLTHough(fFileName);
438 // loop over the events
439 for (Int_t iEvent = 0; iEvent < nEvents; iEvent++) {
440 CheckForConnections();
442 fRunLoader->SetEventNumber(0);
443 AliRawReaderRoot rawReader(fFileName, iEvent);
444 if (fStopping) break;
445 if (rawReader.GetRunNumber() != fRunNumber) {
448 fRunNumber = rawReader.GetRunNumber();
449 fEventNumber[0] = rawReader.GetEventId()[0];
450 fEventNumber[1] = rawReader.GetEventId()[1];
452 if (fStopping) break;
455 // monitor only central physics events
456 if (rawReader.GetType() != 7) continue;
457 if ((rawReader.GetAttributes()[0] & 0x02) == 0) continue;
458 AliInfo(Form("run: %d event: %d %d\n", rawReader.GetRunNumber(),
459 rawReader.GetEventId()[0], rawReader.GetEventId()[1]));
462 if (IsSelected("TPC")) {
463 CheckForConnections();
464 if (!ReconstructTPC(&rawReader, &esd)) return kFALSE;
465 if (fStopping) break;
467 if (IsSelected("ITS")) {
468 CheckForConnections();
469 if (!ReconstructITS(&rawReader, &esd)) return kFALSE;
470 if (fStopping) break;
472 if (IsSelected("V0s")) {
473 CheckForConnections();
474 if (!ReconstructV0s(&esd)) return kFALSE;
475 if (fStopping) break;
477 if (IsSelected("HLTConfMap")) {
478 CheckForConnections();
479 if (!ReconstructHLT(iEvent)) return kFALSE;
480 if (fStopping) break;
482 if (IsSelected("HLTHough")) {
483 CheckForConnections();
484 if (!ReconstructHLTHough(iEvent)) return kFALSE;
485 if (fStopping) break;
488 if (fDisplaySocket) fDisplaySocket->Send("new event");
490 AliDebug(1, "filling histograms...");
491 for (Int_t iMonitor = 0; iMonitor < fMonitors.GetEntriesFast(); iMonitor++) {
492 CheckForConnections();
494 ((AliMonitor*) fMonitors[iMonitor])->FillHistos(fRunLoader, &rawReader,
496 if (fStopping) break;
498 if (fStopping) break;
500 AliDebug(1, "updating histograms...");
501 CheckForConnections();
502 SetStatus(kUpdating);
503 TIterator* iFolder = fTopFolder->GetListOfFolders()->MakeIterator();
504 while (TFolder* folder = (TFolder*) iFolder->Next()) {
505 TIterator* iHisto = folder->GetListOfFolders()->MakeIterator();
506 while (AliMonitorPlot* histo = (AliMonitorPlot*) iHisto->Next()) {
512 if (fStopping) break;
514 AliDebug(1, "filling the tree...");
517 AliDebug(1, "broadcasting histograms...");
518 CheckForConnections();
522 if (fStopping) break;
537 //_____________________________________________________________________________
538 void AliMonitorProcess::Reset()
540 // write the current histograms to a file and reset them
542 if (fSubRunNumber == 0) fSubRunNumber++;
549 //_____________________________________________________________________________
550 UInt_t AliMonitorProcess::GetEventPeriodNumber() const
552 // get the period number from the event id
554 return (fEventNumber[1] >> 4);
557 //_____________________________________________________________________________
558 UInt_t AliMonitorProcess::GetEventOrbitNumber() const
560 // get the orbit number from the event id
562 return ((fEventNumber[1] & 0x000F) << 20) + (fEventNumber[0] >> 12);
565 //_____________________________________________________________________________
566 UInt_t AliMonitorProcess::GetEventBunchNumber() const
568 // get the bunch number from the event id
570 return (fEventNumber[0] % 0x0FFF);
573 //_____________________________________________________________________________
574 Int_t AliMonitorProcess::GetNumberOfEvents(const char* fileName) const
576 // determine the number of events in the given raw data file
580 TFile* file = TFile::Open(fileName);
581 if (!file || !file->IsOpen()) {
582 AliError(Form("could not open file %s", fileName));
583 if (file) delete file;
587 TTree* tree = (TTree*) file->Get("RAW");
589 AliError("could not find tree with raw data");
591 nEvents = (Int_t) tree->GetEntries();
599 //_____________________________________________________________________________
600 Bool_t AliMonitorProcess::ReconstructTPC(AliRawReader* rawReader, AliESD* esd)
602 // find TPC clusters and tracks
606 AliLoader* tpcLoader = fRunLoader->GetLoader("TPCLoader");
608 AliError("no TPC loader found");
611 gSystem->Unlink("TPC.RecPoints.root");
614 AliDebug(1, "reconstructing clusters...");
615 tpcLoader->LoadRecPoints("recreate");
616 AliTPCclustererMI clusterer(fTPCParam);
617 tpcLoader->MakeRecPointsContainer();
618 clusterer.SetOutput(tpcLoader->TreeR());
619 clusterer.Digits2Clusters(rawReader);
620 tpcLoader->WriteRecPoints("OVERWRITE");
623 AliDebug(1, "reconstructing tracks...");
624 AliTPCtrackerMI tracker(fTPCParam);
625 tracker.LoadClusters(tpcLoader->TreeR());
626 tracker.Clusters2Tracks(esd);
627 tracker.UnloadClusters();
628 tpcLoader->UnloadRecPoints();
633 //_____________________________________________________________________________
634 Bool_t AliMonitorProcess::ReconstructITS(AliRawReader* rawReader, AliESD* esd)
636 // find ITS clusters and tracks
640 AliLoader* itsLoader = fRunLoader->GetLoader("ITSLoader");
642 AliError("no ITS loader found");
645 gSystem->Unlink("ITS.RecPoints.root");
648 AliDebug(1, "reconstructing clusters...");
649 itsLoader->LoadRecPoints("recreate");
650 AliITSclustererV2 clusterer(fITSgeom);
651 itsLoader->MakeRecPointsContainer();
652 clusterer.Digits2Clusters(rawReader);
655 AliDebug(1, "reconstructing tracks...");
656 AliITStrackerV2 tracker(fITSgeom);
657 tracker.LoadClusters(itsLoader->TreeR());
658 tracker.Clusters2Tracks(esd);
659 tracker.UnloadClusters();
661 itsLoader->UnloadRecPoints();
665 //_____________________________________________________________________________
666 Bool_t AliMonitorProcess::ReconstructV0s(AliESD* esd)
673 AliDebug(1, "reconstructing V0s...");
674 AliV0vertexer vertexer;
675 vertexer.Tracks2V0vertices(esd);
680 //_____________________________________________________________________________
681 void AliMonitorProcess::CreateHLT(const char* fileName)
684 // create the HLT (Level3) object
686 if (fHLT) delete fHLT;
689 strcpy(name, fileName);
690 fHLT = new AliLevel3(name);
691 fHLT->Init("./", AliLevel3::kRaw, 1);
693 fHLT->SetClusterFinderParam(-1, -1, kTRUE);
695 Int_t phiSegments = 50;
696 Int_t etaSegments = 100;
697 Int_t trackletlength = 3;
698 Int_t tracklength = 20;//40 or 5
699 Int_t rowscopetracklet = 2;
700 Int_t rowscopetrack = 10;
701 Double_t minPtFit = 0;
702 Double_t maxangle = 0.1745;
703 Double_t goodDist = 5;
704 Double_t maxphi = 0.1;
705 Double_t maxeta = 0.1;
706 Double_t hitChi2Cut = 15;//100 or 15
707 Double_t goodHitChi2 = 5;//20 or 5
708 Double_t trackChi2Cut = 10;//50 or 10
709 fHLT->SetTrackerParam(phiSegments, etaSegments,
710 trackletlength, tracklength,
711 rowscopetracklet, rowscopetrack,
712 minPtFit, maxangle, goodDist, hitChi2Cut,
713 goodHitChi2, trackChi2Cut, 50, maxphi, maxeta, kTRUE);
715 fHLT->WriteFiles("./hlt/");
718 //_____________________________________________________________________________
719 void AliMonitorProcess::CreateHLTHough(const char* fileName)
722 // create the HLT Hough transform (L3Hough) object
724 if (fHLTHough) delete fHLTHough;
727 strcpy(name, fileName);
729 fHLTHough = new AliHLTHough();
730 fHLTHough->SetThreshold(4);
731 fHLTHough->SetTransformerParams(140,150,0.5,-1);
732 fHLTHough->SetPeakThreshold(9000,-1);// or 6000
733 fHLTHough->Init("./", kFALSE, 50, kFALSE,0,name);
734 fHLTHough->SetAddHistograms();
735 // fHLTHough->GetMaxFinder()->SetThreshold(14000);
739 //_____________________________________________________________________________
740 Bool_t AliMonitorProcess::ReconstructHLT(Int_t iEvent)
742 // run the HLT cluster and track finder
746 gSystem->Exec("rm -rf hlt");
747 gSystem->MakeDirectory("hlt");
748 if (!fHLT) return kFALSE;
750 fHLT->ProcessEvent(0, 35, iEvent);
752 // remove the event number from the file names
754 sprintf(command, "rename points_%d points hlt/*.raw", iEvent);
755 gSystem->Exec(command);
756 sprintf(command, "rename tracks_tr_%d tracks_tr hlt/*.raw", iEvent);
757 gSystem->Exec(command);
758 sprintf(command, "rename tracks_gl_%d tracks_gl hlt/*.raw", iEvent);
759 gSystem->Exec(command);
760 sprintf(command, "rename tracks_%d tracks hlt/*.raw", iEvent);
761 gSystem->Exec(command);
765 //_____________________________________________________________________________
766 Bool_t AliMonitorProcess::ReconstructHLTHough(Int_t iEvent)
768 // run the HLT Hough transformer
772 gSystem->Exec("rm -rf hlt/hough");
773 gSystem->MakeDirectory("hlt/hough");
774 gSystem->Exec("rm -rf hlt/fitter");
775 gSystem->MakeDirectory("hlt/fitter");
776 if (!fHLTHough) return kFALSE;
778 // fHLTHough->Process(0, 35);
779 // Loop over TPC sectors and process the data
780 for(Int_t i=0; i<=35; i++)
782 fHLTHough->ReadData(i,iEvent);
783 fHLTHough->Transform();
784 // if(fHLTHough->fAddHistograms)
785 fHLTHough->AddAllHistograms();
786 fHLTHough->FindTrackCandidates();
787 fHLTHough->AddTracks();
789 fHLTHough->WriteTracks("./hlt/hough");
791 // Run cluster fitter
792 AliHLTClusterFitter *fitter = new AliHLTClusterFitter("./hlt");
794 // Set debug flag for the cluster fitter
797 // Setting fitter parameters
798 fitter->SetInnerWidthFactor(1,1.5);
799 fitter->SetOuterWidthFactor(1,1.5);
800 fitter->SetNmaxOverlaps(5);
802 //fitter->SetChiSqMax(5,kFALSE); //isolated clusters
803 fitter->SetChiSqMax(5,kTRUE); //overlapping clusters
805 Int_t rowrange[2] = {0,AliHLTTransform::GetNRows()-1};
807 // Takes input from global hough tracks produced by HT
808 fitter->LoadSeeds(rowrange,kFALSE,iEvent);
812 for(Int_t islice = 0; islice <= 35; islice++)
814 for(Int_t ipatch = 0; ipatch < AliHLTTransform::GetNPatches(); ipatch++)
817 fHLTHough->GetMemHandler(ipatch)->Free();
818 fHLTHough->GetMemHandler(ipatch)->Init(islice,ipatch);
819 AliHLTDigitRowData *digits = (AliHLTDigitRowData *)fHLTHough->GetMemHandler(ipatch)->AliAltroDigits2Memory(ndigits,iEvent);
821 fitter->Init(islice,ipatch);
822 fitter->SetInputData(digits);
823 fitter->FindClusters();
824 fitter->WriteClusters();
828 // Refit of the clusters
830 //The seeds are the input tracks from circle HT
831 AliHLTTrackArray *tracks = fitter->GetSeeds();
832 AliHLTFitter *ft = new AliHLTFitter(&vertex,1);
834 ft->LoadClusters("./hlt/fitter/",iEvent,kFALSE);
835 for(Int_t i=0; i<tracks->GetNTracks(); i++)
837 AliHLTTrack *track = tracks->GetCheckedTrack(i);
839 if(track->GetNHits() < 20) continue;
840 ft->SortTrackClusters(track);
842 track->UpdateToFirstPoint();
846 //Write the final tracks
847 fitter->WriteTracks(20);
851 // remove the event number from the file names
853 sprintf(command, "rename tracks_%d tracks hlt/hough/*.raw", iEvent);
854 gSystem->Exec(command);
855 sprintf(command, "rename tracks_%d tracks hlt/fitter/*.raw", iEvent);
856 gSystem->Exec(command);
857 sprintf(command, "rename points_%d points hlt/fitter/*.raw", iEvent);
858 gSystem->Exec(command);
862 //_____________________________________________________________________________
863 Bool_t AliMonitorProcess::WriteHistos()
865 // write the monitor tree and the monitor histograms to the file
866 // "monitor_<run number>[_<sub_run_number>].root"
867 // if at least fNEventsMin events were monitored
871 // rename tree file and create a new one
878 sprintf(fileName, "monitor_tree_%d.root", fRunNumber);
879 if (fSubRunNumber > 0) {
880 sprintf(fileName, "monitor_tree_%d_%d.root", fRunNumber, fSubRunNumber);
882 if (fNEvents < fNEventsMin) {
883 gSystem->Unlink("monitor_tree.root");
885 gSystem->Rename("monitor_tree.root", fileName);
888 fFile = TFile::Open("monitor_tree.root", "RECREATE");
889 if (!fFile || !fFile->IsOpen()) {
890 AliFatal("could not open file for tree");
892 fTree = new TTree("MonitorTree", "tree for monitoring");
893 for (Int_t iMonitor = 0; iMonitor < fMonitors.GetEntriesFast(); iMonitor++) {
894 ((AliMonitor*) fMonitors[iMonitor])->CreateBranches(fTree);
898 // write the histograms
899 if (fNEvents < fNEventsMin) return kTRUE;
901 if (!fWriteHistoList) {
902 TIterator* iFolder = fTopFolder->GetListOfFolders()->MakeIterator();
903 while (TFolder* folder = (TFolder*) iFolder->Next()) {
904 TIterator* iHisto = folder->GetListOfFolders()->MakeIterator();
905 while (AliMonitorPlot* histo = (AliMonitorPlot*) iHisto->Next()) {
913 Bool_t result = kTRUE;
914 sprintf(fileName, "monitor_%d.root", fRunNumber);
915 if (fSubRunNumber > 0) {
916 sprintf(fileName, "monitor_%d_%d.root", fRunNumber, fSubRunNumber);
918 TFile* file = TFile::Open(fileName, "recreate");
919 if (!file || !file->IsOpen()) {
920 AliError(Form("could not open file %s", fileName));
926 if (file) delete file;
931 //_____________________________________________________________________________
932 void AliMonitorProcess::StartNewRun()
934 // reset the histograms for a new run
936 SetStatus(kResetting);
937 TIterator* iFolder = fTopFolder->GetListOfFolders()->MakeIterator();
938 while (TFolder* folder = (TFolder*) iFolder->Next()) {
939 TIterator* iHisto = folder->GetListOfFolders()->MakeIterator();
940 while (AliMonitorPlot* histo = (AliMonitorPlot*) iHisto->Next()) {
951 //_____________________________________________________________________________
952 void AliMonitorProcess::CheckForConnections()
954 // check if new clients want to connect and add them to the list of sockets
957 while ((socket = fServerSocket->Accept()) != (TSocket*)-1) {
958 socket->SetOption(kNoBlock, 1);
959 char socketType[256];
960 if (socket->Recv(socketType, 255) <= 0) {
961 gSystem->Sleep(1000);
962 if (socket->Recv(socketType, 255) <= 0) {
963 TInetAddress adr = socket->GetInetAddress();
964 AliError(Form("no socket type received - "
965 "disconnect client: %s (%s), port %d",
966 adr.GetHostName(), adr.GetHostAddress(), adr.GetPort()));
971 if (strcmp(socketType, "client") == 0) {
972 fSockets.Add(socket);
973 TInetAddress adr = socket->GetInetAddress();
974 AliInfo(Form("new client: %s (%s), port %d",
975 adr.GetHostName(), adr.GetHostAddress(), adr.GetPort()));
976 if (fNEvents > 0) BroadcastHistos(socket);
977 } else if (strcmp(socketType, "display") == 0) {
978 if (fDisplaySocket) {
979 fDisplaySocket->Close();
980 delete fDisplaySocket;
982 fDisplaySocket = socket;
983 TInetAddress adr = socket->GetInetAddress();
984 AliInfo(Form("new display: %s (%s), port %d",
985 adr.GetHostName(), adr.GetHostAddress(), adr.GetPort()));
987 TInetAddress adr = socket->GetInetAddress();
988 AliError(Form("unknown socket type %s - "
989 "disconnect client: %s (%s), port %d", socketType,
990 adr.GetHostName(), adr.GetHostAddress(), adr.GetPort()));
996 // remove finished or invalid clients
997 for (Int_t iSocket = 0; iSocket < fSockets.GetEntriesFast(); iSocket++) {
998 socket = (TSocket*) fSockets[iSocket];
999 if (!socket) continue;
1000 char controlMessage[256];
1001 if (socket->Recv(controlMessage, 255)) {
1002 if (strcmp(controlMessage, "disconnect") == 0) {
1003 TInetAddress adr = socket->GetInetAddress();
1004 AliInfo(Form("disconnect client: %s (%s), port %d",
1005 adr.GetHostName(), adr.GetHostAddress(), adr.GetPort()));
1006 delete fSockets.RemoveAt(iSocket);
1010 if (!socket->IsValid()) {
1011 // remove invalid sockets from the list
1012 TInetAddress adr = socket->GetInetAddress();
1013 AliError(Form("disconnect invalid client: %s (%s), port %d",
1014 adr.GetHostName(), adr.GetHostAddress(), adr.GetPort()));
1015 delete fSockets.RemoveAt(iSocket);
1018 fSockets.Compress();
1021 //_____________________________________________________________________________
1022 void AliMonitorProcess::BroadcastHistos(TSocket* toSocket)
1024 // send the monitor histograms to the clients
1026 SetStatus(kBroadcasting);
1027 TMessage message(kMESS_OBJECT);
1028 message.WriteObject(fTopFolder);
1030 for (Int_t iSocket = 0; iSocket < fSockets.GetEntriesFast(); iSocket++) {
1031 TSocket* socket = (TSocket*) fSockets[iSocket];
1032 if (!socket) continue;
1033 if (toSocket && (socket != toSocket)) continue;
1035 // send control message
1036 if (!socket->IsValid() || (socket->Send("histograms") <= 0)) {
1037 TInetAddress adr = socket->GetInetAddress();
1038 AliError(Form("connection to client failed - "
1039 "disconnect client: %s (%s), port %d",
1040 adr.GetHostName(), adr.GetHostAddress(), adr.GetPort()));
1041 delete fSockets.RemoveAt(iSocket);
1044 // receive control message
1045 char controlMessage[256];
1046 Int_t result = socket->Recv(controlMessage, 255);
1048 gSystem->Sleep(1000); // wait one second and try again
1049 result = socket->Recv(controlMessage, 255);
1052 TInetAddress adr = socket->GetInetAddress();
1053 AliError(Form("no response from client - "
1054 "disconnect client: %s (%s), port %d",
1055 adr.GetHostName(), adr.GetHostAddress(), adr.GetPort()));
1056 delete fSockets.RemoveAt(iSocket);
1059 if (strcmp(controlMessage, "ok") != 0) {
1060 TInetAddress adr = socket->GetInetAddress();
1061 AliError(Form("no \"ok\" message from client - "
1062 "disconnect client: %s (%s), port %d",
1063 adr.GetHostName(), adr.GetHostAddress(), adr.GetPort()));
1064 delete fSockets.RemoveAt(iSocket);
1068 socket->SetOption(kNoBlock, 0);
1069 if (socket->Send(message) < 0) {
1070 // remove the socket from the list if there was an error
1071 TInetAddress adr = socket->GetInetAddress();
1072 AliError(Form("sending histograms failed - "
1073 "disconnect client: %s (%s), port %d",
1074 adr.GetHostName(), adr.GetHostAddress(), adr.GetPort()));
1075 delete fSockets.RemoveAt(iSocket);
1077 gSystem->Sleep(100);
1078 socket->SetOption(kNoBlock, 1);
1081 fSockets.Compress();
1085 //_____________________________________________________________________________
1086 AliMonitorProcess::AliMonitorInterruptHandler::AliMonitorInterruptHandler
1087 (AliMonitorProcess* process):
1088 TSignalHandler(kSigUser1, kFALSE),
1091 // constructor: set process
1094 //_____________________________________________________________________________
1095 Bool_t AliMonitorProcess::AliMonitorInterruptHandler::Notify()
1097 // interrupt signal -> stop process
1099 AliInfo("the monitoring process will be stopped.");