Line data Source code
1 : //
2 : // MIDAS analyzer example: MIDAS frontend for sending analyzed data back into MIDAS
3 : //
4 : // K.Olchanski
5 : //
6 :
7 : #undef NDEBUG // midas required assert() to be always enabled
8 :
9 : #include <stdio.h>
10 : #include <cassert>
11 :
12 : #include "manalyzer.h"
13 : #include "midasio.h"
14 :
15 : class TMEventFlow : public TAFlowEvent
16 : {
17 : public:
18 : TMEvent fEvent;
19 :
20 0 : TMEventFlow(TAFlowEvent* flow, const TMEvent& event)
21 0 : : TAFlowEvent(flow)
22 : {
23 0 : fEvent = event;
24 0 : }
25 : };
26 :
27 : /*******************************************************************\
28 :
29 : Name: tmfe_example_everything.cxx
30 : Created by: K.Olchanski
31 :
32 : Contents: Example Front end to demonstrate all functions of TMFE class
33 :
34 : \********************************************************************/
35 :
36 :
37 : #include <stdio.h>
38 : #include "tmfe.h"
39 :
40 : class EqAnalyzer :
41 : public TMFeEquipment
42 : {
43 : public:
44 0 : EqAnalyzer(const char* eqname, const char* eqfilename) // ctor
45 0 : : TMFeEquipment(eqname, eqfilename)
46 : {
47 0 : printf("EqAnalyzer::ctor!\n");
48 :
49 : // configure the equipment here:
50 :
51 0 : fEqConfReadConfigFromOdb = false;
52 0 : fEqConfEventID = 100;
53 0 : fEqConfPeriodMilliSec = 0;
54 : //fEqConfWriteEventsToOdb = true;
55 0 : fEqConfBuffer = "ANAA";
56 0 : }
57 :
58 0 : ~EqAnalyzer() // dtor
59 0 : {
60 0 : printf("EqAnalyzer::dtor!\n");
61 0 : }
62 :
63 0 : void HandleUsage()
64 : {
65 0 : printf("EqAnalyzer::HandleUsage!\n");
66 0 : }
67 :
68 0 : TMFeResult HandleInit(const std::vector<std::string>& args)
69 : {
70 0 : printf("EqAnalyzer::HandleInit!\n");
71 0 : fEqConfReadOnlyWhenRunning = false; // overwrite ODB Common RO_RUNNING to false
72 : //fEqConfWriteEventsToOdb = true; // overwrite ODB Common RO_ODB to true
73 : //EqSetStatus("Started...", "white");
74 0 : return TMFeOk();
75 : }
76 : };
77 :
78 : // example frontend
79 :
80 0 : class FeAnalyzer: public TMFrontend
81 : {
82 : public:
83 : };
84 :
85 : /* emacs
86 : * Local Variables:
87 : * tab-width: 8
88 : * c-basic-offset: 3
89 : * indent-tabs-mode: nil
90 : * End:
91 : */
92 :
93 : class ExampleFrontend: public TARunObject
94 : {
95 : public:
96 : EqAnalyzer* fEq = NULL;
97 :
98 : public:
99 0 : ExampleFrontend(TARunInfo* runinfo, EqAnalyzer* eq)
100 0 : : TARunObject(runinfo)
101 : {
102 0 : printf("ExampleFrontend::ctor, run %d, file %s\n", runinfo->fRunNo, runinfo->fFileName.c_str());
103 0 : fModuleName = "ExampleFrontend";
104 0 : fEq = eq;
105 0 : }
106 :
107 0 : ~ExampleFrontend()
108 0 : {
109 0 : printf("ExampleFrontend::dtor!\n");
110 0 : }
111 :
112 0 : TAFlowEvent* Analyze(TARunInfo* runinfo, TMEvent* event, TAFlags* flags, TAFlowEvent* flow)
113 : {
114 0 : printf("ExampleFrontend::Analyze, run %d, event serno %d, id 0x%04x, data size %d\n", runinfo->fRunNo, event->serial_number, (int)event->event_id, event->data_size);
115 :
116 0 : flow = new TMEventFlow(flow, *event);
117 :
118 0 : return flow;
119 : }
120 :
121 0 : TAFlowEvent* AnalyzeFlowEvent(TARunInfo* runinfo, TAFlags* flags, TAFlowEvent* flow)
122 : {
123 0 : printf("ExampleFrontend::AnalyzeFlowEvent, run %d\n", runinfo->fRunNo);
124 :
125 0 : if (!flow)
126 : return flow;
127 :
128 0 : TMEventFlow* ef = flow->Find<TMEventFlow>();
129 :
130 0 : if (!ef)
131 : return flow;
132 :
133 0 : uint32_t anaa_bank[] = { 1, 2, 3, 4 };
134 :
135 0 : ef->fEvent.AddBank("ANAA", TID_UINT32, (const char*)&anaa_bank[0], sizeof(anaa_bank));
136 :
137 0 : ef->fEvent.PrintHeader();
138 :
139 0 : if (fEq) {
140 0 : fEq->EqSendEvent(ef->fEvent.data);
141 0 : fEq->EqWriteStatistics();
142 : }
143 :
144 : return flow;
145 : }
146 : };
147 :
148 : class ExampleFrontendFactory: public TAFactory
149 : {
150 : FeAnalyzer* fFe = NULL;
151 : EqAnalyzer* fEq = NULL;
152 :
153 0 : void Init(const std::vector<std::string> &args)
154 : {
155 0 : printf("ExampleFrontendFactory::Init!\n");
156 :
157 0 : assert(fEq == NULL);
158 :
159 0 : fFe = new FeAnalyzer();
160 0 : fEq = new EqAnalyzer("analyzer", __FILE__);
161 0 : fFe->FeAddEquipment(fEq);
162 :
163 0 : TMFeResult r = fFe->FeInitEquipments(args);
164 :
165 0 : if (r.error_flag) {
166 0 : fprintf(stderr, "Cannot initialize equipments, error message: %s, bye.\n", r.error_message.c_str());
167 0 : fFe->fMfe->Disconnect();
168 0 : exit(1);
169 : }
170 0 : }
171 :
172 0 : void Finish()
173 : {
174 0 : printf("ExampleFrontendFactory::Finish!\n");
175 :
176 : //if (fEq) {
177 : // delete fEq;
178 : // fEq = NULL;
179 : //}
180 0 : if (fFe) {
181 0 : delete fFe;
182 0 : fFe = NULL;
183 : }
184 0 : }
185 :
186 0 : ExampleFrontend* NewRunObject(TARunInfo* runinfo)
187 : {
188 0 : return new ExampleFrontend(runinfo, fEq);
189 : }
190 : };
191 :
192 : static TARegister tar(new ExampleFrontendFactory);
193 :
194 : /* emacs
195 : * Local Variables:
196 : * tab-width: 8
197 : * c-basic-offset: 3
198 : * indent-tabs-mode: nil
199 : * End:
200 : */
|