GammaWare  Head Version for release 0.9
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
adf/Macros/GANIL/SetupWatchers.C
Go to the documentation of this file.
1 /***************************************************************************
2  * Copyright (c) IPNL, IN2P3, CNRS *
3  * Contibutor(s) : *
4  * Olivier Stezowski stezow(AT)ipnl.in2p3.fr [2014] *
5  * *
6  * This program is free software; you can redistribute it and/or modify *
7  * it under the terms of the GNU General Public License as published by *
8  * the Free Software Foundation; either version 2 of the License, or *
9  * (at your option) any later version. *
10  * *
11  * This program is distributed in the hope that it will be useful, *
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14  * GNU General Public License for more details. *
15  * *
16  * You should have received a copy of the GNU General Public License *
17  * along with this program; if not, write to the *
18  * Free Software Foundation, Inc., *
19  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
20  ***************************************************************************/
21 
22 
23 #if !defined(__CINT__)
24 
25 #include "WatchersConfig.h"
26 
27 // GW
28 #include "FrameDispatcher.h"
29 
30 // Watchers
31 #include "WatcherClient.h"
32 #include "ADFWatchers.h"
33 #include "KeyWatchers.h"
34 #include "CrystalWatchers.h"
35 #include "PSAWatchers.h"
36 #include "TrackedWatchers.h"
37 #include "EventPSAWatchers.h"
38 #include "EventWatchers.h"
39 #include "MetaWatchers.h"
40 
42 //#include "GANILWatchers.h"
43 
44 using namespace Gw;
45 using namespace ADF;
46 
48 const char *GetWN(const char *name, const char *ext)
49 {
50  return Form("%s%s",name,ext);
51 }
52 
54 void DoTSRateCollector(TTask *top_task, TSRateCollector *collector)
55 {
56  TTask *task; FrameDispatcher *fd; TSRate *ts_rate;
57 
58  // loop on task to get FrameDispatchers
59  TIter next(top_task->GetListOfTasks());
60  while ( (task = (TTask *)next()) ) {
61  if ( task == collector )
62  continue;
63  fd = dynamic_cast<FrameDispatcher *> (task);
64  if ( fd ) {
65  TIter next_w(fd->GetListOfTasks());
66  while ( (task = (TTask *)next_w()) ) {
67  ts_rate = dynamic_cast<TSRate *> (task);
68  if ( ts_rate ) {
69  collector->AddHook(ts_rate,fd->GetName());
70  }
71  }
72  }
73  }
74 }
75 
77 {
78  AgataFrameTrigger *trig = new AgataFrameTrigger("ADF");
79  trig->Add(FactoryItem("Agata","agata",Version(4,0)), FactoryItem("Agata","agata",Version(0,0)));
80  trig->Universal(true);
81 
82  return trig;
83 }
84 
86 /*
87  i
88 */
89 Bool_t SetupWatchers(const char *df_type, FrameDispatcher *fd, const char *ext = "")
90 {
91  Bool_t ok = false; TString DFtype = df_type;
92 
93  // ANY KIND OF DATA FLOW
94  // ADF ----------------------------------------------------------------
95  // General to any kind of data flow, based on the key part of the frame
96  if ( DFtype.Contains("ADF") ) {
97 
99  fd->SetTrigger(trig);
100 
101  // Just dump the frames in a file for decoding ... not active by default !
102  //fd->GetDirectory()->cd(); Watcher *dumper = new Dumper();
103  //dumper->SetActive(false);
104  //fd->Add(dumper);
105 
106  fd->Add<KeyWatcher>("AgataKey","AgataKeys Watcher using an universal trigger");
107 
108  ok = true;
109  }
110  // ADF -----------------------------------------------------------------
111 
112  // LOCAL LEVEL PROCESSING
113  // Crystal -------------------------------------------------------------
114  // to analyse output data flow at the crystal level
115  if ( DFtype.Contains("CRYSTAL") && ! DFtype.Contains("CCRYSTAL") ) {
116 
117  // It defines triggers on crystal frames
118  AgataFrameTrigger *trig = AgataFrameTrigger::Build("Crystal", "data:crystal");
119  // main trigger for the Dispatcher, delete by fd
120  fd->SetTrigger(trig);
121 
122  // watcher to displays all signals
123  fd->Add<CrystalSpectra>(GetWN("Crystal_Spectra_",ext),Form("Display the data for the %s crystal at the producer level",ext));
124 
125  fd->Add<KeyWatcher>(GetWN("Crystal_Keys_",ext),Form("AgataKeys Watcher for the %s crystal at the producer level",ext));
126 
127 
128  ok = true;
129  }
130  // Crystal -------------------------------------------------------------
131  // Calibrated Crystal --------------------------------------------------
132  // to analyse output data flow at the pre-processing level
133  if ( DFtype.Contains("CCRYSTAL") ) {
134 
135  // It defines triggers on crystal frames
136  AgataFrameTrigger *trig = AgataFrameTrigger::Build("CCrystal", "data:ccrystal");
137 
138  // main trigger for the Dispatcher, delete by fd
139  fd->SetTrigger(trig);
140 
141  // watcher to displays all signals
142  fd->Add<CCrystalSpectra>(GetWN("CCrystal_Spectra_",ext),Form("Display the calibrated data for the %s crystal at the preprocessing level",ext));
143 
144  fd->Add<KeyWatcher>(GetWN("CCrystal_Keys_",ext),Form("AgataKeys Watcher for the %s crystal at the preprocessing level",ext));
145 
146  ok = true;
147  }
148  // Crystal -------------------------------------------------------------
149  // PSA -----------------------------------------------------------------
150  if ( DFtype.Contains("PSA") ) {
151 
152  // It defines a trigger on a psa frame
153  AgataFrameTrigger *trig = AgataFrameTrigger::Build("PSA", "data:psa");
154  // main trigger for the Dispatcher
155  fd->SetTrigger(trig);
156 
157  // 3D view of Hits in a crystal
158  fd->Add<PSACrystal>(GetWN("PsaHits_",ext),"Hits in a Crystal");
159 
160  fd->Add<KeyWatcher>(GetWN("Psa_Keys_",ext),Form("AgataKeys Watcher for the %s crystal at psa level",ext));
161 
162  ok = true;
163  }
164  // PSA -------------------------------------------------------------------
165  // RANC0 -----------------------------------------------------------------
166  // output of the ancillary producer or Filter
167  if ( DFtype.Contains("RANC0") ) {
168 
169  // define WatcherClient for a specific trigger
170  // it defines a trigger on an ancilary frame
171  AgataFrameTrigger *trig =
172  AgataFrameTrigger::Build("RANC0", "data:ranc0");
173  fd->SetTrigger(trig);
174 
175  // watcher to keep rates
176  // fd->Add<MFMWatcher>(GetWN("MFMWatcher",ext),"To check the MFM Content");
177 #ifdef HAS_VAMOS
178 // TTreeMaster *rootmaster = fd->Add<TTreeMaster>("TreeMaster","Own the tree");
179 // VAMOSWatcher *vw = rootmaster->Add<VAMOSWatcher>("GVWInterface","See Spectra in Out/VAMOS_Spectra.root");
180 // vw->InitVAMOS(0,"Out/VAMOS_Spectra.root");
181 #endif
182  fd->Add<KeyWatcher>("Vamos_Keys","AgataKeys Watcher for the ancilary level");
183 
184  ok = true;
185  }
186  // RANC0 -----------------------------------------------------------------
187  // END LOCAL LEVEL PROCESSING
188 
189  // GLOBAL LEVEL PROCESSING
190  // EB Level //
191  if ( DFtype.Contains("EB") ) {
192 
193  // It defines a trigger on an event:data:psa Frame
194  AgataFrameTrigger *trig = AgataFrameTrigger::Build("EventPSA", "event:data event:data:psa" );
195 // AgataFrameTrigger *trig = AgataFrameTrigger::Build("EventPSA", "event:data event:data:psa" );
196 
197  fd->SetTrigger(trig);
198 
199  fd->Add<EBWatcher>(GetWN("EventBuilder",ext),"Display Agata spectra at the event builder level");
200 
201 // fd->Add<TimeCheckBuilder>(GetWN("TimeCheckBuilder",ext),"Check linearity of crystal values");
202 
203  fd->Add<KeyWatcher>("EventBuilder_Keys","AgataKeys Watcher at the event builder level");
204 
205  ok = true;
206  }
207  // MERGER Level //
208  if ( DFtype.Contains("MERGER") ) {
209 
210  AgataFrameTrigger *trig = AgataFrameTrigger::Build("Event", "event:data event:data:psa data:ranc0");
211 
212  // set the main trigger to coincidences between ancillary et gammas
213  fd->SetTrigger(trig);
214 /*
215 #ifdef HAS_GANIL
216 // fd->Add<MFMWatcher>(GetWN("MFMWatcher",ext),"To check the MFM Content");
217 
218  TTreeMaster *rootmaster = fd->Add<TTreeMaster>("TreeMaster","Own the tree");
219  rootmaster->Add<RawMFMTree>("RawMFMTree","Branch on Raw MFM");
220 
221  VAMOSWatcher *vw = rootmaster->Add<VAMOSWatcher>("GVWInterface","Branch managed by the VAMOS librarie");
222  vw->InitVAMOS(0,Form("Out/VAMOS_Spectra.root"));
223 
224 // rootmaster->AddWatcher<VAMOSVertexBuilder>(GetWN("VAMOSVertexBuilder",ext),"To Compute a vertex from VAMOS library");
225 
226  fd->Add<VAMOSVertexBuilder>("VAMOSVertexBuilder","Check Doppler as computed by VAMOS");
227 
228  VertexBuilder *fVertexBuilder = VertexBuilder::theCurrentVertexBuilder();
229  fVertexBuilder->SetVertex();
230  fd->Add<GlobalDC>("CheckGlobalDoppler","Check Doppler as computed by VAMOS");
231 
232  fd->Add<AGATAVAMOSCoinc>("AGATAVAMOSCoinc","Check some coincidences spectra between VAMOS and AGATA");
233 #endif
234 */
235  fd->Add<KeyWatcher>("Merger_Keys","AgataKeys Watcher at the merger level",trig);
236 
237  ok = true;
238  }
239  // TRACKING Level //
240  if ( DFtype.Contains("TRACKING") && !DFtype.Contains("TRACKING_DB")) {
241 
242  bool EventDataConfiguration = true;
243 
244  AgataFrameTrigger *TriggerTracking = 0x0;
246 
247 #ifdef HAS_VAMOS
248  if(EventDataConfiguration)
249  TriggerTracking = AgataFrameTrigger::Build("TRACKING", "event:data data:ranc0 event:data:psa data:tracked");
250  else
251  TriggerTracking= AgataFrameTrigger::Build("TRACKING", "data:tracked");
252 #else
253  if(EventDataConfiguration)
254  TriggerTracking = AgataFrameTrigger::Build("TRACKING", "event:data event:data:psa data:tracked");
255  else
256  TriggerTracking= AgataFrameTrigger::Build("TRACKING", "data:tracked");
257 #endif
258 
259  fd->SetTrigger(TriggerTracking);
260 
261  fd->Add<TrackingWatcher>("Tracking","Display Agata spectra at the tracking level",TriggerTracking);
262 
263 // VertexInterface *vertex = VertexBuilder::theCurrentVertexBuilder()->GetVertex();
264 // vertex->SetPosition (0, 0, 0);
265 // vertex->SetBeta(0.0963);
266 
267  fd->Add<KeyWatcher>("Tracking_Keys","AgataKeys Watcher at the tracking level",TriggerTracking);
268  fd->Add<KeyWatcher>("All_Keys","Universal AgataKeys Watcher",UnivTrig);
269 
270  ok = true;
271  }
272  // TRACKING Level //
273  if ( DFtype.Contains("TRACKING_DB") ) {
274 
275  bool EventDataConfiguration = true;
276 
277  AgataFrameTrigger *TriggerTracking = 0x0;
279 
280 
281 #ifdef HAS_VAMOS
282  if(EventDataConfiguration)
283  TriggerTracking = AgataFrameTrigger::Build("TRACKING", "event:data data:ranc0 event:data:psa data:tracked");
284  else
285  TriggerTracking= AgataFrameTrigger::Build("TRACKING", "data:tracked");
286 #else
287  if(EventDataConfiguration)
288  TriggerTracking = AgataFrameTrigger::Build("TRACKING", "event:data event:data:psa data:tracked");
289  else
290  TriggerTracking= AgataFrameTrigger::Build("TRACKING", "data:tracked");
291 #endif
292 
293  fd->SetTrigger(TriggerTracking);
294 
295  fd->Add<KeyWatcher>("All_Keys","Universal AgataKeys Watcher",UnivTrig);
296  AgataFrameTrigger *VamosOnly = AgataFrameTrigger::Build("TRACKING", "event:data data:ranc0 !event:data:psa !data:tracked");
297  AgataFrameTrigger *AgataOnly = AgataFrameTrigger::Build("TRACKING", "event:data !data:ranc0 event:data:psa data:tracked");
298  fd->Add<KeyWatcher>("Tracking_Keys_Normal","AgataKeys Watcher at the tracking level",TriggerTracking);
299  fd->Add<KeyWatcher>("Tracking_Keys_Vamos","AgataKeys Watcher at the tracking level",VamosOnly);
300  fd->Add<KeyWatcher>("Tracking_Keys_AGATA","AgataKeys Watcher at the tracking level",AgataOnly);
301 
302  ok = true;
303  }
304  return ok;
305 }
306 
307 // META -------------------------------------------------------------
308 // meta data frame
309 /*
310 if ( DFtype.Contains("META") ) {
311 
312  // define WatcherClient for a specific trigger
313  AgataFrameTrigger *trig = AgataFrameTrigger::Build("Vertex", "meta:vertex" );
314  fd->SetTrigger(trig);
315 
316  // just to keep a global vertex frame.
317  fd->Add<VertexWatcher>("GSource","To get a Global Vertex");
318  // recoil velocity distribution
319  fd->Add<GlobalDC>("GRecoil","Recoil velocity distribution");
320 
321  ok = true;
322 }
323  */
324 // META ----------------------------------------------------------------
325 
326 #endif
327 
328 
329 
330 
331 
const char * GetWN(const char *name, const char *ext)
Build the Watcher name adding an extension.
void AddHook(Watcher *, const char *)
Add a timestamp rate.
virtual SharedFP * Add(const FactoryItem &key_item, const FactoryItem &frame_item, bool iscons=true, const Char_t *option="")
Add a frame to the list of required frames.
Definition: Trigger.h:492
Watcher to keep last TS values.
Process a buffer, trigg and dispachs the work to sub-watchers.
Bool_t SetupWatchers(const char *df_type, FrameDispatcher *fd, const char *ext="")
It shows how to set up the watchers for different kind of data flow.
virtual Bool_t SetTrigger(ADF::DFTrigger *)
This is the default trigger for any added watcher.
Watcher_T * Add(const Char_t *name, const Char_t *title, ADF::DFTrigger *t=0x0)
allocate a new watcher so that it creates corectly its directory under the dispatcher directory ...
Base class for version numbers.
Definition: Version.h:38
AgataFrameTrigger * GetUniversalTrigger()
void DoTSRateCollector(TTask *top_task, TSRateCollector *collector)
browse all dispatchers to look for TSRate Watcher and add them to the rate collector ...
To be used for Agata Data Flow.
Definition: Trigger.h:462
! Show rates (counts) per Crystal *!
Crystal spectra watcher class.
void Universal(Bool_t b=true)
Set this trigger as universal or not.
Definition: Trigger.h:130
Base class that described an item in a Factory.
Definition: FactoryItem.h:52
compute histograms for several TSRate