New class structure
[u/mrichter/AliRoot.git] / HLT / PHOS / OnlineDisplay / AliHLTPHOSOnlineDisplay.cxx
1 /**************************************************************************
2  * This file is property of and copyright by the Experimental Nuclear     *
3  * Physics Group, Dep. of Physics                                         *
4  * University of Oslo, Norway, 2007                                       *
5  *                                                                        * 
6  * Author: Per Thomas Hille <perthi@fys.uio.no> for the ALICE HLT Project.*
7  * Contributors are mentioned in the code where appropriate.              *
8  * Please report bugs to perthi@fys.uio.no                                * 
9  *                                                                        *
10  * Permission to use, copy, modify and distribute this software and its   *
11  * documentation strictly for non-commercial purposes is hereby granted   *
12  * without fee, provided that the above copyright notice appears in all   *
13  * copies and that both the copyright notice and this permission notice   *
14  * appear in the supporting documentation. The authors make no claims     *
15  * about the suitability of this software for any purpose. It is          *
16  * provided "as is" without express or implied warranty.                  *
17  **************************************************************************/
18
19 #ifndef __CINT__
20 # include <stdexcept>
21 # include <TSystem.h>
22 # include <TApplication.h>
23 # include "TStyle.h" 
24 #endif
25
26 #include  "AliHLTPHOSOnlineDisplay.h"
27 #include  "AliHLTDataTypes.h"
28 #include  "AliHLTPHOSRcuCellEnergyDataStruct.h"
29 #include  <vector>
30 #include  "stdio.h"
31 #include <string>
32 #include <sys/ipc.h>
33 #include <errno.h>
34 #include "TH2.h"
35 #include "TCanvas.h"
36 #include "AliHLTPHOSRcuCellAccumulatedEnergyDataStruct.h"
37 #include "AliHLTPHOSCommonDefs.h"
38 #include <iostream>
39 #include "AliHLTPHOSOnlineDisplayEventTab.h"
40 #include "AliHLTPHOSOnlineDisplayCalibTab.h"
41
42 AliHLTPHOSOnlineDisplayEventTab*  AliHLTPHOSOnlineDisplay::fgEventTabPtr       = 0;
43 AliHLTPHOSOnlineDisplayCalibTab*  AliHLTPHOSOnlineDisplay::fgCalibTabPtr       = 0;
44 AliHLTPHOSOnlineDisplayRawTab*    AliHLTPHOSOnlineDisplay::fgRawTabPtr         = 0;
45 AliHLTPHOSOnlineDisplay*          AliHLTPHOSOnlineDisplay::fgInstancePtr       = 0;          /**<The one an only instance of PhosOnlineDisplay*/
46 HOMERReader*                      AliHLTPHOSOnlineDisplay::fgHomerReaderPtr    = 0;          /**<Homer reader that fetches events from the HLT online stream*/
47 HOMERReader*                      AliHLTPHOSOnlineDisplay::fgHomerReadersPtr[MAX_HOSTS];     /**<Homer reader that fetches events from the HLT online stream*/
48 Bool_t                            AliHLTPHOSOnlineDisplay::fgAccumulate        = kFALSE ;    /**<If set to kFALSE reset fgLegoplot between event, kTRUE adds current energies to previous plot*/
49 Bool_t                            AliHLTPHOSOnlineDisplay::fgSyncronize        = kFALSE ;
50 unsigned int                      AliHLTPHOSOnlineDisplay::fgNHosts            = 0;
51 unsigned int                      AliHLTPHOSOnlineDisplay::fgNPorts            = 0;
52 char*                             AliHLTPHOSOnlineDisplay::fgHosts[MAX_HOSTS];
53 short unsigned int*               AliHLTPHOSOnlineDisplay::fgPorts             = 0; 
54 TGTab*                            AliHLTPHOSOnlineDisplay::fTab                = 0;
55
56
57 using namespace std;
58
59
60 AliHLTPHOSOnlineDisplay*
61 AliHLTPHOSOnlineDisplay::Instance(int argc, char** argv) 
62 {
63   if (!fgInstancePtr) fgInstancePtr = new AliHLTPHOSOnlineDisplay(argc, argv);
64   return fgInstancePtr;
65 }
66
67
68 AliHLTPHOSOnlineDisplay::AliHLTPHOSOnlineDisplay()
69 {
70   cout << "ERROR ! level: FATAL, you cannot invoke the onlinedisplay without arguments" << endl;
71 }
72
73
74 AliHLTPHOSOnlineDisplay::AliHLTPHOSOnlineDisplay(int argc, char** argv)
75 {
76   ScanArguments(argc, argv);
77   char **tmp;
78   cout << "creating new PHOS Onlinedisplay" << endl;
79   fgHomerReaderPtr = new  HOMERReader(fgNHosts, (const char**)fgHosts,  fgPorts);
80   cout << "AliHLTPHOSOnlineDisplay::AliHLTPHOSOnlineDisplay: fgHomerReaderPtr =  " <<  fgHomerReaderPtr << endl;
81
82   for(int i = 0; i <fgNHosts; i++)
83     {
84       fgHomerReadersPtr[i] =      new  HOMERReader(fgHosts[i], fgPorts[i]); 
85     }
86  InitDisplay();
87 }
88
89
90 AliHLTPHOSOnlineDisplay::~AliHLTPHOSOnlineDisplay()
91 {
92
93 }
94
95
96 void
97 AliHLTPHOSOnlineDisplay::InitDisplay()
98 {
99   char tmpHistoName[256];
100   char tmpChDtaName[256];
101
102   gStyle->SetPalette(1);
103   fTab = new TGTab(this, 100, 100);
104   TGLayoutHints *fL1 = new TGLayoutHints(kLHintsBottom | kLHintsExpandX |
105                                          kLHintsExpandY, 2, 2, 15, 1);
106   fgEventTabPtr = new  AliHLTPHOSOnlineDisplayEventTab(fTab, fgHomerReaderPtr, fgHomerReadersPtr, fgNHosts);
107   fgCalibTabPtr = new  AliHLTPHOSOnlineDisplayCalibTab(fTab, fgHomerReaderPtr, fgHomerReadersPtr, fgNHosts);
108   fgRawTabPtr   = new  AliHLTPHOSOnlineDisplayRawTab(fTab, fgHomerReaderPtr, fgHomerReadersPtr, fgNHosts);
109
110   AddFrame(fTab, fL1);
111   MapSubwindows();
112   Resize();
113   SetWindowName("online display");
114   MapWindow();
115   MoveResize(100,100,1200,1000);
116 }
117
118
119 int
120 AliHLTPHOSOnlineDisplay::GetNextEvent()
121 {
122   fgEventTabPtr->GetNextEvent();
123 }
124
125
126 int 
127 AliHLTPHOSOnlineDisplay::GetNextEventRaw()
128 {
129   fgRawTabPtr->GetNextEvent();
130 }
131
132
133 int
134 AliHLTPHOSOnlineDisplay::GetHistogram()
135 {
136   fgCalibTabPtr->GetNextEvent(); 
137 }
138
139
140 int
141 AliHLTPHOSOnlineDisplay::ScanArguments(int argc, char** argv)
142 {
143   for(int i=0; i< MAX_HOSTS; i++)
144     {
145       fgHosts[i] = new char[256];
146     }
147
148   fgPorts = new short unsigned[100];
149   Bool_t hostIsSet = kFALSE;
150   Bool_t portIsSet = kFALSE;
151   int iResult=0;
152   TString argument="";
153
154   for (int i=0; i<argc && iResult>=0; i++) 
155     {
156       argument=argv[i];
157       
158       if (argument.IsNull()) 
159         {
160           continue;
161         }
162       
163       if (argument.CompareTo("-sync")==0)
164         {
165           cout << "setting Synchronize to true" << endl;
166           fgSyncronize = kTRUE;
167         }  
168       
169       if (argument.CompareTo("-acc")==0)
170         {
171           cout << "setting Accumulate to true" << endl;
172           fgAccumulate = kTRUE;
173         }  
174       
175       if (argument.CompareTo("-host")==0) 
176         {
177           if(i+1 <= argc)
178             {
179               i++;
180               sprintf(fgHosts[fgNHosts],"%s", argv[i]);
181               fgNHosts ++; 
182               cout <<"fgNHosts set to"<< fgNHosts <<endl;
183               hostIsSet = kTRUE; 
184               if(i+1 <= argc)
185                 {
186                   argument=argv[i+1];
187                   if(argument.CompareTo("-port")==0)
188                   {
189                     i++;
190                     if(i+1 <= argc)
191                       {
192                         i++;
193                         fgPorts[fgNPorts] = atoi(argv[i]);      
194                         cout << "A setting port to   " << fgPorts[fgNPorts]  <<endl; 
195                         fgNPorts ++;
196                         portIsSet = kTRUE;
197                       }
198                   }
199                   else
200                     {
201                       fgPorts[fgNPorts] =  DEFAULT_EVENT_PORT;  
202                       cout << "B setting port to   " << fgPorts[fgNPorts]  <<endl; 
203                       fgNPorts ++;
204                       portIsSet = kTRUE;
205                     }
206                 }
207             }
208         }
209     }
210
211   if(hostIsSet != kTRUE ||  portIsSet != kTRUE)
212     {
213       if(hostIsSet == kFALSE)
214         {
215           printf("\nERROR: no hostname is specified\n");
216         }
217       
218       if( portIsSet == kFALSE)
219         {
220           printf("ERROR: no port spcified\n");
221         }
222       printf("\nYou must specify at least one host \n\n");
223       printf("*****************************************************************\n");
224       printf("\nUsage: ./onlinedisplay  -host  <hostname>   -port  <port>");
225       printf("\n-port is optional, if not set  port 42001 will be used\n");
226       printf("*****************************************************************\n\n\n");
227       iResult = -1;
228     }
229   
230   else
231     {
232       iResult = 0;
233     }
234
235   return iResult;
236 }//end ScanArguments