]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MONITOR/AliMonitorProcess.cxx
New class to generate fake gain runs (Laurent)
[u/mrichter/AliRoot.git] / MONITOR / AliMonitorProcess.cxx
CommitLineData
04fa961a 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
18///////////////////////////////////////////////////////////////////////////////
19// //
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. //
25// //
26///////////////////////////////////////////////////////////////////////////////
27
024a7e64 28#include <TFile.h>
a64a06d6 29#include <TGrid.h>
30#include <TGridResult.h>
31#include <TMessage.h>
32#include <TROOT.h>
33#include <TServerSocket.h>
34#include <TSocket.h>
04fa961a 35
7ba8900c 36#include "AliLog.h"
b6a3610d 37#include "AliESD.h"
a64a06d6 38#include "AliITSclustererV2.h"
7d62fb64 39#include "AliITSgeom.h"
a64a06d6 40#include "AliITStrackerV2.h"
41#include "AliLoader.h"
42#include "AliMonitorHLT.h"
43#include "AliMonitorHLTHough.h"
44#include "AliMonitorITS.h"
04fa961a 45#include "AliMonitorProcess.h"
46#include "AliMonitorTPC.h"
04fa961a 47#include "AliMonitorV0s.h"
48#include "AliRawReaderRoot.h"
04fa961a 49#include "AliRun.h"
50#include "AliTPC.h"
51#include "AliTPCclustererMI.h"
52#include "AliTPCtrackerMI.h"
04fa961a 53#include "AliV0vertexer.h"
a64a06d6 54
4aa41877 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>
a64a06d6 66#include <AliLevel3.h>
04fa961a 67
43073eba 68ClassImp(AliMonitorProcess)
04fa961a 69
70
c4bd737c 71const Int_t AliMonitorProcess::fgkPort = 9327;
04fa961a 72
73
74//_____________________________________________________________________________
807ee5a3 75AliMonitorProcess::AliMonitorProcess(
76#if ROOT_VERSION_CODE <= 199169 // 3.10/01
77 const char* /*alienHost*/,
78#else
79 const char* alienHost,
80#endif
81 const char* alienDir,
0cf7de2b 82 const char* selection,
83 const char* fileNameGalice):
84 fSelection(selection),
85 fGrid(NULL),
86 fAlienDir(alienDir),
87 fRunLoader(NULL),
88 fTPCParam(NULL),
89 fITSgeom(NULL),
90 fLogicalFileName(""),
91 fFileName(""),
92 fHLT(NULL),
93 fHLTHough(NULL),
94
95 fRunNumber(0),
96 fSubRunNumber(0),
97 fNEvents(0),
98 fNEventsMin(1),
99 fWriteHistoList(kFALSE),
100
101 fTopFolder(NULL),
102 fMonitors(),
103 fFile(NULL),
104 fTree(NULL),
105
106 fServerSocket(NULL),
107 fSockets(),
108 fDisplaySocket(NULL),
109
110 fStatus(kStopped),
111 fStopping(kFALSE),
112
113 fInterruptHandler(NULL)
04fa961a 114{
115// initialize the monitoring process and the monitor histograms
116
0cf7de2b 117 fSelection = selection;
118
807ee5a3 119#if ROOT_VERSION_CODE <= 199169 // 3.10/01
04fa961a 120 fGrid = TGrid::Connect("alien", gSystem->Getenv("USER"));
807ee5a3 121#else
122 fGrid = TGrid::Connect(alienHost, gSystem->Getenv("USER"));
123#endif
04fa961a 124 if (!fGrid || fGrid->IsZombie() || !fGrid->IsConnected()) {
125 delete fGrid;
7ba8900c 126 AliFatal("could not connect to alien");
04fa961a 127 }
807ee5a3 128#if ROOT_VERSION_CODE <= 199169 // 3.10/01
04fa961a 129 fGrid->cd(alienDir);
807ee5a3 130#endif
04fa961a 131
132 fRunLoader = AliRunLoader::Open(fileNameGalice);
43073eba 133 if (!fRunLoader) AliFatal(Form("could not get run loader from file %s",
7ba8900c 134 fileNameGalice));
04fa961a 135
136 fRunLoader->CdGAFile();
137 fTPCParam = AliTPC::LoadTPCParam(gFile);
7ba8900c 138 if (!fTPCParam) AliFatal("could not load TPC parameters");
04fa961a 139
140 fRunLoader->LoadgAlice();
141 gAlice = fRunLoader->GetAliRun();
7ba8900c 142 if (!gAlice) AliFatal("no gAlice object found");
7d62fb64 143 fITSgeom = (AliITSgeom*)gDirectory->Get("AliITSgeom");
7ba8900c 144 if (!fITSgeom) AliFatal("could not load ITS geometry");
04fa961a 145
0cf7de2b 146 // Init TPC parameters for HLT
4aa41877 147 Bool_t isinit=AliHLTTransform::Init(const_cast<char*>(fileNameGalice),kTRUE);
1899848d 148 if(!isinit){
7ba8900c 149 AliFatal("Could not create transform settings, please check log for error messages!");
1899848d 150 }
04fa961a 151
152 fTopFolder = new TFolder("Monitor", "monitor histograms");
153 fTopFolder->SetOwner(kTRUE);
154
0cf7de2b 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));
04fa961a 160
161 for (Int_t iMonitor = 0; iMonitor < fMonitors.GetEntriesFast(); iMonitor++) {
162 ((AliMonitor*) fMonitors[iMonitor])->CreateHistos(fTopFolder);
163 }
164
165 TIterator* iFolder = fTopFolder->GetListOfFolders()->MakeIterator();
166 while (TFolder* folder = (TFolder*) iFolder->Next()) folder->SetOwner(kTRUE);
167 delete iFolder;
168
169 fFile = TFile::Open("monitor_tree.root", "RECREATE");
170 if (!fFile || !fFile->IsOpen()) {
7ba8900c 171 AliFatal("could not open file for tree");
04fa961a 172 }
173 fTree = new TTree("MonitorTree", "tree for monitoring");
174 for (Int_t iMonitor = 0; iMonitor < fMonitors.GetEntriesFast(); iMonitor++) {
175 ((AliMonitor*) fMonitors[iMonitor])->CreateBranches(fTree);
176 }
177 gROOT->cd();
178
c4bd737c 179 fServerSocket = new TServerSocket(fgkPort, kTRUE);
04fa961a 180 fServerSocket->SetOption(kNoBlock, 1);
04fa961a 181 CheckForConnections();
46c62a26 182
183 fInterruptHandler = new AliMonitorInterruptHandler(this);
184 gSystem->AddSignalHandler(fInterruptHandler);
04fa961a 185}
186
c4bd737c 187//_____________________________________________________________________________
188AliMonitorProcess::AliMonitorProcess(const AliMonitorProcess& process) :
0cf7de2b 189 TObject(process),
190
191 fSelection(""),
192 fGrid(NULL),
193 fAlienDir(""),
194 fRunLoader(NULL),
195 fTPCParam(NULL),
196 fITSgeom(NULL),
197 fLogicalFileName(""),
198 fFileName(""),
199 fHLT(NULL),
200 fHLTHough(NULL),
201
202 fRunNumber(0),
203 fSubRunNumber(0),
204 fNEvents(0),
205 fNEventsMin(1),
206 fWriteHistoList(kFALSE),
207
208 fTopFolder(NULL),
209 fMonitors(),
210 fFile(NULL),
211 fTree(NULL),
212
213 fServerSocket(NULL),
214 fSockets(),
215 fDisplaySocket(NULL),
216
217 fStatus(kStopped),
218 fStopping(kFALSE),
219
220 fInterruptHandler(NULL)
221
c4bd737c 222{
7ba8900c 223 AliFatal("copy constructor not implemented");
c4bd737c 224}
225
226//_____________________________________________________________________________
43073eba 227AliMonitorProcess& AliMonitorProcess::operator = (const AliMonitorProcess&
c4bd737c 228 /*process*/)
229{
7ba8900c 230 AliFatal("assignment operator not implemented");
c4bd737c 231 return *this;
232}
233
04fa961a 234//_____________________________________________________________________________
235AliMonitorProcess::~AliMonitorProcess()
236{
237// clean up
238
239 fMonitors.Delete();
240 delete fTopFolder;
241 delete fRunLoader;
242
243 delete fServerSocket;
244 fSockets.Delete();
245 delete fDisplaySocket;
246
807ee5a3 247#if ROOT_VERSION_CODE <= 199169 // 3.10/01
04fa961a 248 fGrid->Close();
807ee5a3 249#endif
04fa961a 250 delete fGrid;
251
252 fFile->Close();
253 delete fFile;
254 gSystem->Unlink("monitor_tree.root");
97d6eb66 255
97d6eb66 256 delete fHLT;
4a69f9c7 257 delete fHLTHough;
46c62a26 258
259 gSystem->RemoveSignalHandler(fInterruptHandler);
260 delete fInterruptHandler;
04fa961a 261}
262
263
264//_____________________________________________________________________________
265const char* AliMonitorProcess::GetRevision()
266{
267 return "$Revision$";
268}
269
270
1899848d 271//_____________________________________________________________________________
272void AliMonitorProcess::SetStatus(EStatus status)
273{
c4bd737c 274// set the current status and process system events
275
1899848d 276 fStatus = status;
277 gSystem->ProcessEvents();
278}
279
280
04fa961a 281//_____________________________________________________________________________
282void AliMonitorProcess::Run()
283{
43073eba 284// run the monitor process:
04fa961a 285// check for a raw data file, process the raw data file and delete it
286
287 fStopping = kFALSE;
288
289 while (!fStopping) {
1899848d 290 SetStatus(kWaiting);
04fa961a 291 while (!CheckForNewFile()) {
292 CheckForConnections();
1899848d 293 SetStatus(kWaiting);
04fa961a 294 if (fStopping) break;
295 gSystem->Sleep(10);
296 }
297 if (fStopping) break;
298
299 ProcessFile();
300 }
301
302 WriteHistos();
303
304 fStopping = kFALSE;
1899848d 305 SetStatus(kStopped);
04fa961a 306}
307
308
309//_____________________________________________________________________________
310void AliMonitorProcess::Stop()
311{
312// set the fStopping flag to terminate the monitor process after the current
313// event was processed
314
1899848d 315 if (GetStatus() != kStopped) fStopping = kTRUE;
04fa961a 316}
317
318
319//_____________________________________________________________________________
320void AliMonitorProcess::ProcessFile(const char* fileName)
321{
322// create a file with monitor histograms for a single file
323
1899848d 324 if (GetStatus() != kStopped) {
7ba8900c 325 AliError("ProcessFile can not be called"
326 " while the monitor process is running");
04fa961a 327 return;
328 }
329
330 fFileName = fileName;
331 Int_t nEventMin = fNEventsMin;
332 fNEventsMin = 1;
333 ProcessFile();
334 WriteHistos();
335 fNEventsMin = nEventMin;
1899848d 336 SetStatus(kStopped);
04fa961a 337}
338
339
340//_____________________________________________________________________________
341Bool_t AliMonitorProcess::CheckForNewFile()
342{
343// check whether a new file was registered in alien
344
43073eba 345#if ROOT_VERSION_CODE < ROOT_VERSION(5,0,0)
807ee5a3 346#if ROOT_VERSION_CODE <= 199169 // 3.10/01
04fa961a 347 TGridResult* result = fGrid->Ls();
807ee5a3 348#else
46c62a26 349 TDatime datime;
f2421e84 350 char dirName[256];
351 sprintf(dirName, "%s/adc-%d", fAlienDir.Data(), datime.GetDate());
46c62a26 352 char findName[256];
f2421e84 353 sprintf(findName, "*.root");
354 Grid_ResultHandle_t handle = fGrid->Find(dirName, findName);
807ee5a3 355 if (!handle) {
43073eba 356 AliError(Form("could not open alien directory %s",
7ba8900c 357 dirName));
807ee5a3 358 return kFALSE;
359 }
360 TGridResult* result = fGrid->CreateGridResult(handle);
361#endif
04fa961a 362 Long_t maxDate = -1;
363 Long_t maxTime = -1;
364 TString fileName;
365
807ee5a3 366#if ROOT_VERSION_CODE <= 199169 // 3.10/01
04fa961a 367 while (const char* entry = result->Next()) {
807ee5a3 368#else
369 while (Grid_Result_t* resultEntry = result->Next()) {
370 const char* entry = resultEntry->name.c_str();
371#endif
58c5356d 372 if (strrchr(entry, '/')) entry = strrchr(entry, '/')+1;
04fa961a 373 // entry = host_date_time.root
374 TString entryCopy(entry);
375 char* p = const_cast<char*>(entryCopy.Data());
6ad9b9d5 376 if (!strtok(p, "_") || !p) continue; // host name
97d6eb66 377 char* dateStr = strtok(NULL, "_");
04fa961a 378 if (!dateStr || !p) continue;
97d6eb66 379 char* timeStr = strtok(NULL, ".");
04fa961a 380 if (!timeStr || !p) continue;
381 Long_t date = atoi(dateStr);
382 Long_t time = atoi(timeStr);
383
384 if ((date > maxDate) || ((date == maxDate) && (time > maxTime))) {
385 maxDate = date;
386 maxTime = time;
387 fileName = entry;
388 }
389 }
390
807ee5a3 391 delete result;
04fa961a 392 if (maxDate < 0) return kFALSE; // no files found
393 if (fLogicalFileName.CompareTo(fileName) == 0) return kFALSE; // no new file
394
395 fLogicalFileName = fileName;
807ee5a3 396#if ROOT_VERSION_CODE <= 199169 // 3.10/01
397 result = fGrid->GetPhysicalFileNames(fLogicalFileName.Data());
398 fFileName = result->Next();
399#else
f2421e84 400 fileName = dirName + ("/" + fLogicalFileName);
7834b4c7 401 handle = fGrid->GetPhysicalFileNames(fileName.Data());
807ee5a3 402 if (!handle) {
43073eba 403 AliError(Form("could not get physical file names for %s",
7ba8900c 404 fileName.Data()));
807ee5a3 405 return kFALSE;
406 }
407 result = fGrid->CreateGridResult(handle);
7834b4c7 408 result->Reset();
807ee5a3 409 Grid_Result_t* resultEntry = result->Next();
410 if (!resultEntry) {
43073eba 411 AliError(Form("could not get physical file names for %s",
7ba8900c 412 fileName.Data()));
807ee5a3 413 return kFALSE;
414 }
389567d6 415 fFileName = resultEntry->name2.c_str();
79956349 416 fFileName.ReplaceAll("castor:/", "rfio:/");
807ee5a3 417#endif
418 delete result;
43073eba 419#else
420 Error("CheckForNewFile", "needs to be ported to new TGrid");
421#endif
04fa961a 422 return kTRUE;
423}
424
425//_____________________________________________________________________________
426Bool_t AliMonitorProcess::ProcessFile()
427{
428// loop over all events in the raw data file, run the reconstruction
429// and fill the monitor histograms
430
431 Int_t nEvents = GetNumberOfEvents(fFileName);
432 if (nEvents <= 0) return kFALSE;
43073eba 433 AliDebug(1, Form("found %d event(s) in file %s",
7ba8900c 434 nEvents, fFileName.Data()));
0cf7de2b 435 if (IsSelected("HLTConfMap")) CreateHLT(fFileName);
436 if (IsSelected("HLTHough")) CreateHLTHough(fFileName);
04fa961a 437
438 // loop over the events
439 for (Int_t iEvent = 0; iEvent < nEvents; iEvent++) {
46c62a26 440 CheckForConnections();
1899848d 441 SetStatus(kReading);
04fa961a 442 fRunLoader->SetEventNumber(0);
443 AliRawReaderRoot rawReader(fFileName, iEvent);
444 if (fStopping) break;
445 if (rawReader.GetRunNumber() != fRunNumber) {
446 WriteHistos();
447 StartNewRun();
448 fRunNumber = rawReader.GetRunNumber();
449 fEventNumber[0] = rawReader.GetEventId()[0];
450 fEventNumber[1] = rawReader.GetEventId()[1];
451 fSubRunNumber = 0;
452 if (fStopping) break;
453 }
454
9edda74b 455 // monitor only central physics events
456 if (rawReader.GetType() != 7) continue;
457 if ((rawReader.GetAttributes()[0] & 0x02) == 0) continue;
43073eba 458 AliInfo(Form("run: %d event: %d %d\n", rawReader.GetRunNumber(),
7ba8900c 459 rawReader.GetEventId()[0], rawReader.GetEventId()[1]));
9edda74b 460
b6a3610d 461 AliESD esd;
0cf7de2b 462 if (IsSelected("TPC")) {
463 CheckForConnections();
464 if (!ReconstructTPC(&rawReader, &esd)) return kFALSE;
465 if (fStopping) break;
466 }
467 if (IsSelected("ITS")) {
468 CheckForConnections();
469 if (!ReconstructITS(&rawReader, &esd)) return kFALSE;
470 if (fStopping) break;
471 }
472 if (IsSelected("V0s")) {
473 CheckForConnections();
474 if (!ReconstructV0s(&esd)) return kFALSE;
475 if (fStopping) break;
476 }
477 if (IsSelected("HLTConfMap")) {
478 CheckForConnections();
479 if (!ReconstructHLT(iEvent)) return kFALSE;
480 if (fStopping) break;
481 }
482 if (IsSelected("HLTHough")) {
483 CheckForConnections();
484 if (!ReconstructHLTHough(iEvent)) return kFALSE;
485 if (fStopping) break;
486 }
04fa961a 487
488 if (fDisplaySocket) fDisplaySocket->Send("new event");
489
7ba8900c 490 AliDebug(1, "filling histograms...");
04fa961a 491 for (Int_t iMonitor = 0; iMonitor < fMonitors.GetEntriesFast(); iMonitor++) {
46c62a26 492 CheckForConnections();
493 SetStatus(kFilling);
43073eba 494 ((AliMonitor*) fMonitors[iMonitor])->FillHistos(fRunLoader, &rawReader,
b6a3610d 495 &esd);
04fa961a 496 if (fStopping) break;
497 }
498 if (fStopping) break;
499
7ba8900c 500 AliDebug(1, "updating histograms...");
46c62a26 501 CheckForConnections();
1899848d 502 SetStatus(kUpdating);
04fa961a 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()) {
507 histo->Update();
508 }
509 delete iHisto;
510 }
511 delete iFolder;
512 if (fStopping) break;
513
7ba8900c 514 AliDebug(1, "filling the tree...");
04fa961a 515 fTree->Fill();
516
7ba8900c 517 AliDebug(1, "broadcasting histograms...");
04fa961a 518 CheckForConnections();
519 BroadcastHistos();
520
521 fNEvents++;
522 if (fStopping) break;
523 }
524
0cf7de2b 525 if (fHLT) {
526 delete fHLT;
527 fHLT = NULL;
528 }
529 if (fHLTHough) {
530 delete fHLTHough;
531 fHLTHough = NULL;
532 }
97d6eb66 533
04fa961a 534 return kTRUE;
535}
536
537//_____________________________________________________________________________
538void AliMonitorProcess::Reset()
539{
540// write the current histograms to a file and reset them
541
542 if (fSubRunNumber == 0) fSubRunNumber++;
543 WriteHistos();
544 StartNewRun();
545 fSubRunNumber++;
546}
547
548
549//_____________________________________________________________________________
c4bd737c 550UInt_t AliMonitorProcess::GetEventPeriodNumber() const
04fa961a 551{
552// get the period number from the event id
553
554 return (fEventNumber[1] >> 4);
555}
556
557//_____________________________________________________________________________
c4bd737c 558UInt_t AliMonitorProcess::GetEventOrbitNumber() const
04fa961a 559{
560// get the orbit number from the event id
561
562 return ((fEventNumber[1] & 0x000F) << 20) + (fEventNumber[0] >> 12);
563}
564
565//_____________________________________________________________________________
c4bd737c 566UInt_t AliMonitorProcess::GetEventBunchNumber() const
04fa961a 567{
568// get the bunch number from the event id
569
570 return (fEventNumber[0] % 0x0FFF);
571}
572
573//_____________________________________________________________________________
c4bd737c 574Int_t AliMonitorProcess::GetNumberOfEvents(const char* fileName) const
04fa961a 575{
576// determine the number of events in the given raw data file
577
578 Int_t nEvents = -1;
579
580 TFile* file = TFile::Open(fileName);
581 if (!file || !file->IsOpen()) {
7ba8900c 582 AliError(Form("could not open file %s", fileName));
04fa961a 583 if (file) delete file;
584 return -1;
585 }
586
587 TTree* tree = (TTree*) file->Get("RAW");
588 if (!tree) {
7ba8900c 589 AliError("could not find tree with raw data");
04fa961a 590 } else {
591 nEvents = (Int_t) tree->GetEntries();
592 }
593 file->Close();
594 delete file;
595
596 return nEvents;
597}
598
599//_____________________________________________________________________________
b6a3610d 600Bool_t AliMonitorProcess::ReconstructTPC(AliRawReader* rawReader, AliESD* esd)
04fa961a 601{
602// find TPC clusters and tracks
603
1899848d 604 SetStatus(kRecTPC);
04fa961a 605
606 AliLoader* tpcLoader = fRunLoader->GetLoader("TPCLoader");
607 if (!tpcLoader) {
7ba8900c 608 AliError("no TPC loader found");
04fa961a 609 return kFALSE;
610 }
611 gSystem->Unlink("TPC.RecPoints.root");
04fa961a 612
613 // cluster finder
7ba8900c 614 AliDebug(1, "reconstructing clusters...");
04fa961a 615 tpcLoader->LoadRecPoints("recreate");
616 AliTPCclustererMI clusterer(fTPCParam);
617 tpcLoader->MakeRecPointsContainer();
618 clusterer.SetOutput(tpcLoader->TreeR());
619 clusterer.Digits2Clusters(rawReader);
620 tpcLoader->WriteRecPoints("OVERWRITE");
621
622 // track finder
7ba8900c 623 AliDebug(1, "reconstructing tracks...");
b6a3610d 624 AliTPCtrackerMI tracker(fTPCParam);
625 tracker.LoadClusters(tpcLoader->TreeR());
626 tracker.Clusters2Tracks(esd);
627 tracker.UnloadClusters();
04fa961a 628 tpcLoader->UnloadRecPoints();
b6a3610d 629
04fa961a 630 return kTRUE;
631}
632
633//_____________________________________________________________________________
b6a3610d 634Bool_t AliMonitorProcess::ReconstructITS(AliRawReader* rawReader, AliESD* esd)
04fa961a 635{
636// find ITS clusters and tracks
637
1899848d 638 SetStatus(kRecITS);
04fa961a 639
640 AliLoader* itsLoader = fRunLoader->GetLoader("ITSLoader");
641 if (!itsLoader) {
7ba8900c 642 AliError("no ITS loader found");
04fa961a 643 return kFALSE;
644 }
04fa961a 645 gSystem->Unlink("ITS.RecPoints.root");
04fa961a 646
647 // cluster finder
7ba8900c 648 AliDebug(1, "reconstructing clusters...");
04fa961a 649 itsLoader->LoadRecPoints("recreate");
79c75366 650 AliITSclustererV2 clusterer(0);
04fa961a 651 itsLoader->MakeRecPointsContainer();
652 clusterer.Digits2Clusters(rawReader);
653
654 // track finder
7ba8900c 655 AliDebug(1, "reconstructing tracks...");
e341247d 656 AliITStrackerV2 tracker(0);
04fa961a 657 tracker.LoadClusters(itsLoader->TreeR());
b6a3610d 658 tracker.Clusters2Tracks(esd);
04fa961a 659 tracker.UnloadClusters();
04fa961a 660
661 itsLoader->UnloadRecPoints();
04fa961a 662 return kTRUE;
663}
664
665//_____________________________________________________________________________
b6a3610d 666Bool_t AliMonitorProcess::ReconstructV0s(AliESD* esd)
04fa961a 667{
668// find V0s
669
1899848d 670 SetStatus(kRecV0s);
04fa961a 671
04fa961a 672 // V0 finder
7ba8900c 673 AliDebug(1, "reconstructing V0s...");
04fa961a 674 AliV0vertexer vertexer;
b6a3610d 675 vertexer.Tracks2V0vertices(esd);
04fa961a 676
04fa961a 677 return kTRUE;
678}
679
97d6eb66 680//_____________________________________________________________________________
97d6eb66 681void AliMonitorProcess::CreateHLT(const char* fileName)
682{
1899848d 683
97d6eb66 684// create the HLT (Level3) object
685
686 if (fHLT) delete fHLT;
687
688 char name[256];
689 strcpy(name, fileName);
690 fHLT = new AliLevel3(name);
691 fHLT->Init("./", AliLevel3::kRaw, 1);
692
524a85e8 693 fHLT->SetClusterFinderParam(-1, -1, kTRUE);
43073eba 694
c4bd737c 695 Int_t phiSegments = 50;
696 Int_t etaSegments = 100;
97d6eb66 697 Int_t trackletlength = 3;
524a85e8 698 Int_t tracklength = 20;//40 or 5
97d6eb66 699 Int_t rowscopetracklet = 2;
524a85e8 700 Int_t rowscopetrack = 10;
c4bd737c 701 Double_t minPtFit = 0;
524a85e8 702 Double_t maxangle = 0.1745;
97d6eb66 703 Double_t goodDist = 5;
524a85e8 704 Double_t maxphi = 0.1;
705 Double_t maxeta = 0.1;
1899848d 706 Double_t hitChi2Cut = 15;//100 or 15
707 Double_t goodHitChi2 = 5;//20 or 5
708 Double_t trackChi2Cut = 10;//50 or 10
43073eba 709 fHLT->SetTrackerParam(phiSegments, etaSegments,
97d6eb66 710 trackletlength, tracklength,
711 rowscopetracklet, rowscopetrack,
c4bd737c 712 minPtFit, maxangle, goodDist, hitChi2Cut,
97d6eb66 713 goodHitChi2, trackChi2Cut, 50, maxphi, maxeta, kTRUE);
43073eba 714
715 fHLT->WriteFiles("./hlt/");
97d6eb66 716}
c6ba6205 717
718//_____________________________________________________________________________
719void AliMonitorProcess::CreateHLTHough(const char* fileName)
720{
721
722// create the HLT Hough transform (L3Hough) object
723
724 if (fHLTHough) delete fHLTHough;
725
726 char name[256];
727 strcpy(name, fileName);
728
4aa41877 729 fHLTHough = new AliHLTHough();
4a69f9c7 730 fHLTHough->SetThreshold(4);
8aad0cd3 731 fHLTHough->SetTransformerParams(140,150,0.5,-1);
732 fHLTHough->SetPeakThreshold(9000,-1);// or 6000
4a69f9c7 733 fHLTHough->Init("./", kFALSE, 50, kFALSE,0,name);
c6ba6205 734 fHLTHough->SetAddHistograms();
4a69f9c7 735 // fHLTHough->GetMaxFinder()->SetThreshold(14000);
c6ba6205 736
737}
97d6eb66 738
739//_____________________________________________________________________________
0cf7de2b 740Bool_t AliMonitorProcess::ReconstructHLT(Int_t iEvent)
97d6eb66 741{
742// run the HLT cluster and track finder
743
1899848d 744 SetStatus(kRecHLT);
97d6eb66 745
97d6eb66 746 gSystem->Exec("rm -rf hlt");
747 gSystem->MakeDirectory("hlt");
748 if (!fHLT) return kFALSE;
749
750 fHLT->ProcessEvent(0, 35, iEvent);
751
752 // remove the event number from the file names
753 char command[256];
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);
762 return kTRUE;
97d6eb66 763}
764
c6ba6205 765//_____________________________________________________________________________
0cf7de2b 766Bool_t AliMonitorProcess::ReconstructHLTHough(Int_t iEvent)
c6ba6205 767{
768// run the HLT Hough transformer
769
770 SetStatus(kRecHLT);
771
4a69f9c7 772 gSystem->Exec("rm -rf hlt/hough");
773 gSystem->MakeDirectory("hlt/hough");
774 gSystem->Exec("rm -rf hlt/fitter");
775 gSystem->MakeDirectory("hlt/fitter");
c6ba6205 776 if (!fHLTHough) return kFALSE;
777
778 // fHLTHough->Process(0, 35);
779 // Loop over TPC sectors and process the data
780 for(Int_t i=0; i<=35; i++)
781 {
782 fHLTHough->ReadData(i,iEvent);
783 fHLTHough->Transform();
784 // if(fHLTHough->fAddHistograms)
785 fHLTHough->AddAllHistograms();
786 fHLTHough->FindTrackCandidates();
4a69f9c7 787 fHLTHough->AddTracks();
c6ba6205 788 }
4a69f9c7 789 fHLTHough->WriteTracks("./hlt/hough");
790
791 // Run cluster fitter
4aa41877 792 AliHLTClusterFitter *fitter = new AliHLTClusterFitter("./hlt");
4a69f9c7 793
794 // Set debug flag for the cluster fitter
795 // fitter->Debug();
796
797 // Setting fitter parameters
798 fitter->SetInnerWidthFactor(1,1.5);
799 fitter->SetOuterWidthFactor(1,1.5);
800 fitter->SetNmaxOverlaps(5);
43073eba 801
4a69f9c7 802 //fitter->SetChiSqMax(5,kFALSE); //isolated clusters
803 fitter->SetChiSqMax(5,kTRUE); //overlapping clusters
804
4aa41877 805 Int_t rowrange[2] = {0,AliHLTTransform::GetNRows()-1};
4a69f9c7 806
807 // Takes input from global hough tracks produced by HT
808 fitter->LoadSeeds(rowrange,kFALSE,iEvent);
809
8aad0cd3 810 UInt_t ndigits;
811
4a69f9c7 812 for(Int_t islice = 0; islice <= 35; islice++)
813 {
4aa41877 814 for(Int_t ipatch = 0; ipatch < AliHLTTransform::GetNPatches(); ipatch++)
4a69f9c7 815 {
4a69f9c7 816 // Read digits
b934a9ae 817 fHLTHough->GetMemHandler(ipatch)->Free();
8aad0cd3 818 fHLTHough->GetMemHandler(ipatch)->Init(islice,ipatch);
4aa41877 819 AliHLTDigitRowData *digits = (AliHLTDigitRowData *)fHLTHough->GetMemHandler(ipatch)->AliAltroDigits2Memory(ndigits,iEvent);
8aad0cd3 820
821 fitter->Init(islice,ipatch);
4a69f9c7 822 fitter->SetInputData(digits);
823 fitter->FindClusters();
824 fitter->WriteClusters();
825 }
826 }
827
828 // Refit of the clusters
4aa41877 829 AliHLTVertex vertex;
4a69f9c7 830 //The seeds are the input tracks from circle HT
4aa41877 831 AliHLTTrackArray *tracks = fitter->GetSeeds();
832 AliHLTFitter *ft = new AliHLTFitter(&vertex,1);
4a69f9c7 833
4a69f9c7 834 ft->LoadClusters("./hlt/fitter/",iEvent,kFALSE);
835 for(Int_t i=0; i<tracks->GetNTracks(); i++)
836 {
4aa41877 837 AliHLTTrack *track = tracks->GetCheckedTrack(i);
4a69f9c7 838 if(!track) continue;
8aad0cd3 839 if(track->GetNHits() < 20) continue;
4a69f9c7 840 ft->SortTrackClusters(track);
841 ft->FitHelix(track);
f2421e84 842 track->UpdateToFirstPoint();
4a69f9c7 843 }
844 delete ft;
43073eba 845
4a69f9c7 846 //Write the final tracks
8aad0cd3 847 fitter->WriteTracks(20);
4a69f9c7 848
849 delete fitter;
29504bd3 850
851 // remove the event number from the file names
852 char command[256];
4a69f9c7 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);
29504bd3 858 gSystem->Exec(command);
c6ba6205 859 return kTRUE;
c6ba6205 860}
04fa961a 861
862//_____________________________________________________________________________
863Bool_t AliMonitorProcess::WriteHistos()
864{
43073eba 865// write the monitor tree and the monitor histograms to the file
04fa961a 866// "monitor_<run number>[_<sub_run_number>].root"
867// if at least fNEventsMin events were monitored
868
1899848d 869 SetStatus(kWriting);
04fa961a 870
871 // rename tree file and create a new one
872 fFile->cd();
873 fTree->Write();
874 fFile->Close();
875 delete fFile;
876
877 char fileName[256];
878 sprintf(fileName, "monitor_tree_%d.root", fRunNumber);
879 if (fSubRunNumber > 0) {
880 sprintf(fileName, "monitor_tree_%d_%d.root", fRunNumber, fSubRunNumber);
881 }
882 if (fNEvents < fNEventsMin) {
883 gSystem->Unlink("monitor_tree.root");
884 } else {
885 gSystem->Rename("monitor_tree.root", fileName);
886 }
887
888 fFile = TFile::Open("monitor_tree.root", "RECREATE");
889 if (!fFile || !fFile->IsOpen()) {
7ba8900c 890 AliFatal("could not open file for tree");
04fa961a 891 }
892 fTree = new TTree("MonitorTree", "tree for monitoring");
893 for (Int_t iMonitor = 0; iMonitor < fMonitors.GetEntriesFast(); iMonitor++) {
894 ((AliMonitor*) fMonitors[iMonitor])->CreateBranches(fTree);
895 }
896 gROOT->cd();
897
898 // write the histograms
899 if (fNEvents < fNEventsMin) return kTRUE;
900
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()) {
906 histo->ResetList();
907 }
908 delete iHisto;
909 }
910 delete iFolder;
911 }
912
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);
917 }
918 TFile* file = TFile::Open(fileName, "recreate");
919 if (!file || !file->IsOpen()) {
7ba8900c 920 AliError(Form("could not open file %s", fileName));
04fa961a 921 result = kFALSE;
922 } else {
923 fTopFolder->Write();
924 file->Close();
925 }
926 if (file) delete file;
927
928 return result;
929}
930
931//_____________________________________________________________________________
932void AliMonitorProcess::StartNewRun()
933{
934// reset the histograms for a new run
935
1899848d 936 SetStatus(kResetting);
04fa961a 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()) {
941 histo->Reset();
942 }
943 delete iHisto;
944 }
945 delete iFolder;
946
947 fNEvents = 0;
948}
949
950
951//_____________________________________________________________________________
952void AliMonitorProcess::CheckForConnections()
953{
954// check if new clients want to connect and add them to the list of sockets
955
04fa961a 956 TSocket* socket;
957 while ((socket = fServerSocket->Accept()) != (TSocket*)-1) {
54a41755 958 socket->SetOption(kNoBlock, 1);
04fa961a 959 char socketType[256];
46c62a26 960 if (socket->Recv(socketType, 255) <= 0) {
961 gSystem->Sleep(1000);
962 if (socket->Recv(socketType, 255) <= 0) {
04fa961a 963 TInetAddress adr = socket->GetInetAddress();
7ba8900c 964 AliError(Form("no socket type received - "
965 "disconnect client: %s (%s), port %d",
966 adr.GetHostName(), adr.GetHostAddress(), adr.GetPort()));
46c62a26 967 delete socket;
968 continue;
04fa961a 969 }
46c62a26 970 }
971 if (strcmp(socketType, "client") == 0) {
972 fSockets.Add(socket);
973 TInetAddress adr = socket->GetInetAddress();
7ba8900c 974 AliInfo(Form("new client: %s (%s), port %d",
975 adr.GetHostName(), adr.GetHostAddress(), adr.GetPort()));
46c62a26 976 if (fNEvents > 0) BroadcastHistos(socket);
04fa961a 977 } else if (strcmp(socketType, "display") == 0) {
978 if (fDisplaySocket) {
979 fDisplaySocket->Close();
980 delete fDisplaySocket;
981 }
982 fDisplaySocket = socket;
04fa961a 983 TInetAddress adr = socket->GetInetAddress();
7ba8900c 984 AliInfo(Form("new display: %s (%s), port %d",
985 adr.GetHostName(), adr.GetHostAddress(), adr.GetPort()));
46c62a26 986 } else {
987 TInetAddress adr = socket->GetInetAddress();
7ba8900c 988 AliError(Form("unknown socket type %s - "
989 "disconnect client: %s (%s), port %d", socketType,
990 adr.GetHostName(), adr.GetHostAddress(), adr.GetPort()));
46c62a26 991 delete socket;
992 continue;
04fa961a 993 }
994 }
995
46c62a26 996 // remove finished or invalid clients
04fa961a 997 for (Int_t iSocket = 0; iSocket < fSockets.GetEntriesFast(); iSocket++) {
998 socket = (TSocket*) fSockets[iSocket];
999 if (!socket) continue;
46c62a26 1000 char controlMessage[256];
1001 if (socket->Recv(controlMessage, 255)) {
1002 if (strcmp(controlMessage, "disconnect") == 0) {
1899848d 1003 TInetAddress adr = socket->GetInetAddress();
7ba8900c 1004 AliInfo(Form("disconnect client: %s (%s), port %d",
1005 adr.GetHostName(), adr.GetHostAddress(), adr.GetPort()));
1899848d 1006 delete fSockets.RemoveAt(iSocket);
1007 continue;
1008 }
1009 }
04fa961a 1010 if (!socket->IsValid()) {
1011 // remove invalid sockets from the list
1012 TInetAddress adr = socket->GetInetAddress();
7ba8900c 1013 AliError(Form("disconnect invalid client: %s (%s), port %d",
1014 adr.GetHostName(), adr.GetHostAddress(), adr.GetPort()));
04fa961a 1015 delete fSockets.RemoveAt(iSocket);
1016 }
1017 }
1018 fSockets.Compress();
1019}
1020
1021//_____________________________________________________________________________
46c62a26 1022void AliMonitorProcess::BroadcastHistos(TSocket* toSocket)
04fa961a 1023{
1024// send the monitor histograms to the clients
1025
1899848d 1026 SetStatus(kBroadcasting);
04fa961a 1027 TMessage message(kMESS_OBJECT);
43073eba 1028 message.WriteObject(fTopFolder);
04fa961a 1029
1030 for (Int_t iSocket = 0; iSocket < fSockets.GetEntriesFast(); iSocket++) {
1031 TSocket* socket = (TSocket*) fSockets[iSocket];
1032 if (!socket) continue;
46c62a26 1033 if (toSocket && (socket != toSocket)) continue;
1034
1035 // send control message
1036 if (!socket->IsValid() || (socket->Send("histograms") <= 0)) {
1037 TInetAddress adr = socket->GetInetAddress();
7ba8900c 1038 AliError(Form("connection to client failed - "
1039 "disconnect client: %s (%s), port %d",
1040 adr.GetHostName(), adr.GetHostAddress(), adr.GetPort()));
46c62a26 1041 delete fSockets.RemoveAt(iSocket);
1042 }
1043
1044 // receive control message
1045 char controlMessage[256];
1046 Int_t result = socket->Recv(controlMessage, 255);
1047 if (result <= 0) {
1048 gSystem->Sleep(1000); // wait one second and try again
1049 result = socket->Recv(controlMessage, 255);
1050 }
1051 if (result <= 0) {
1052 TInetAddress adr = socket->GetInetAddress();
7ba8900c 1053 AliError(Form("no response from client - "
1054 "disconnect client: %s (%s), port %d",
1055 adr.GetHostName(), adr.GetHostAddress(), adr.GetPort()));
46c62a26 1056 delete fSockets.RemoveAt(iSocket);
1057 continue;
1058 }
1059 if (strcmp(controlMessage, "ok") != 0) {
1060 TInetAddress adr = socket->GetInetAddress();
7ba8900c 1061 AliError(Form("no \"ok\" message from client - "
1062 "disconnect client: %s (%s), port %d",
1063 adr.GetHostName(), adr.GetHostAddress(), adr.GetPort()));
46c62a26 1064 delete fSockets.RemoveAt(iSocket);
1065 continue;
1066 }
1067
54a41755 1068 socket->SetOption(kNoBlock, 0);
46c62a26 1069 if (socket->Send(message) < 0) {
04fa961a 1070 // remove the socket from the list if there was an error
1071 TInetAddress adr = socket->GetInetAddress();
7ba8900c 1072 AliError(Form("sending histograms failed - "
1073 "disconnect client: %s (%s), port %d",
1074 adr.GetHostName(), adr.GetHostAddress(), adr.GetPort()));
04fa961a 1075 delete fSockets.RemoveAt(iSocket);
54a41755 1076 } else {
46c62a26 1077 gSystem->Sleep(100);
54a41755 1078 socket->SetOption(kNoBlock, 1);
04fa961a 1079 }
1080 }
1081 fSockets.Compress();
1082}
46c62a26 1083
1084
1085//_____________________________________________________________________________
1086AliMonitorProcess::AliMonitorInterruptHandler::AliMonitorInterruptHandler
1087 (AliMonitorProcess* process):
43073eba 1088 TSignalHandler(kSigUser1, kFALSE),
1089 fProcess(process)
46c62a26 1090{
1091// constructor: set process
1092}
1093
46c62a26 1094//_____________________________________________________________________________
43073eba 1095Bool_t AliMonitorProcess::AliMonitorInterruptHandler::Notify()
46c62a26 1096{
1097// interrupt signal -> stop process
1098
7ba8900c 1099 AliInfo("the monitoring process will be stopped.");
43073eba 1100 fProcess->Stop();
46c62a26 1101 return kTRUE;
1102}