GammaWare  Head Version for release 0.9
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
stogs/Watchers/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 #include "ADTree.h"
41 
43 #include "GANILWatchers.h"
44 
45 using namespace Gw;
46 using namespace ADF;
47 
49 const char *GetWN(const char *name, const char *ext)
50 {
51  return Form("%s%s",name,ext);
52 }
53 
55 void DoTSRateCollector(TTask *top_task, TSRateCollector *collector)
56 {
57  TTask *task; FrameDispatcher *fd; TSRate *ts_rate;
58 
59  // loop on task to get FrameDispatchers
60  TIter next(top_task->GetListOfTasks());
61  while ( (task = (TTask *)next()) ) {
62  if ( task == collector )
63  continue;
64  fd = dynamic_cast<FrameDispatcher *> (task);
65  if ( fd ) {
66  TIter next_w(fd->GetListOfTasks());
67  while ( (task = (TTask *)next_w()) ) {
68  ts_rate = dynamic_cast<TSRate *> (task);
69  if ( ts_rate ) {
70  collector->AddHook(ts_rate,fd->GetName());
71  }
72  }
73  }
74  }
75 }
76 
78 {
79  AgataFrameTrigger *trig = new AgataFrameTrigger("ADF");
80  trig->Add(FactoryItem("Agata","agata",Version(4,0)), FactoryItem("Agata","agata",Version(0,0)));
81  trig->Universal(true);
82 
83  return trig;
84 }
85 
87 /*
88  i
89 */
90 Bool_t SetupWatchers(const char *df_type, FrameDispatcher *fd, const char *ext = "")
91 {
92  Bool_t ok = false; TString DFtype = df_type;
93 
94  // ANY KIND OF DATA FLOW
95  // ADF ----------------------------------------------------------------
96  // General to any kind of data flow, based on the key part of the frame
97  if ( DFtype.Contains("ADF") ) {
98 
100  fd->SetTrigger(trig);
101 
102  // Just dump the frames in a file for decoding ... not active by default !
103  //fd->GetDirectory()->cd(); Watcher *dumper = new Dumper();
104  //dumper->SetActive(false);
105  //fd->Add(dumper);
106 
107  fd->Add<KeyWatcher>("AgataKey","AgataKeys Watcher using an universal trigger");
108 
109  ok = true;
110  }
111  // ADF -----------------------------------------------------------------
112 
113  // LOCAL LEVEL PROCESSING
114  // Crystal -------------------------------------------------------------
115  // to analyse output data flow at the crystal level
116  if ( DFtype.Contains("CRYSTAL") && ! DFtype.Contains("CCRYSTAL") ) {
117 
118  // It defines triggers on crystal frames
119  AgataFrameTrigger *trig = AgataFrameTrigger::Build("Crystal", "data:crystal");
120  // main trigger for the Dispatcher, delete by fd
121  fd->SetTrigger(trig);
122 
123  // watcher to displays all signals
124  fd->Add<CrystalSpectra>(GetWN("Crystal_Spectra_",ext),Form("Display the data for the %s crystal at the producer level",ext));
125 
126  fd->Add<KeyWatcher>(GetWN("Crystal_Keys_",ext),Form("AgataKeys Watcher for the %s crystal at the producer level",ext));
127 
128 
129  ok = true;
130  }
131  // Crystal -------------------------------------------------------------
132  // Calibrated Crystal --------------------------------------------------
133  // to analyse output data flow at the pre-processing level
134  if ( DFtype.Contains("CCRYSTAL") ) {
135 
136  // It defines triggers on crystal frames
137  AgataFrameTrigger *trig = AgataFrameTrigger::Build("CCrystal", "data:ccrystal");
138 
139  // main trigger for the Dispatcher, delete by fd
140  fd->SetTrigger(trig);
141 
142  // watcher to displays all signals
143  fd->Add<CCrystalSpectra>(GetWN("CCrystal_Spectra_",ext),Form("Display the calibrated data for the %s crystal at the preprocessing level",ext));
144 
145  fd->Add<KeyWatcher>(GetWN("CCrystal_Keys_",ext),Form("AgataKeys Watcher for the %s crystal at the preprocessing level",ext));
146 
147  ok = true;
148  }
149  // Crystal -------------------------------------------------------------
150  // PSA -----------------------------------------------------------------
151  if ( DFtype.Contains("PSA") ) {
152 
153  // It defines a trigger on a psa frame
154  AgataFrameTrigger *trig = AgataFrameTrigger::Build("PSA", "data:psa");
155  // main trigger for the Dispatcher
156  fd->SetTrigger(trig);
157 
158  // 3D view of Hits in a crystal
159  fd->Add<PSACrystal>(GetWN("PsaHits_",ext),"Hits in a Crystal");
160 
161  fd->Add<KeyWatcher>(GetWN("Psa_Keys_",ext),Form("AgataKeys Watcher for the %s crystal at psa level",ext));
162 
163  ok = true;
164  }
165  // PSA -------------------------------------------------------------------
166  // RANC0 -----------------------------------------------------------------
167  // output of the ancillary producer or Filter
168  if ( DFtype.Contains("RANC0") ) {
169 
170  // define WatcherClient for a specific trigger
171  // it defines a trigger on an ancilary frame
172  AgataFrameTrigger *trig =
173  AgataFrameTrigger::Build("RANC0", "data:ranc0");
174  fd->SetTrigger(trig);
175 
176  // watcher to keep rates
177  fd->Add<MFMWatcher>(GetWN("MFMWatcher",ext),"To check the MFM Content");
178 #ifdef HAS_VAMOS
179  TTreeMaster *rootmaster = fd->Add<TTreeMaster>("TreeMaster","Own the tree");
180  VAMOSWatcher *vw = rootmaster->Add<VAMOSWatcher>("GVWInterface","See Spectra in Out/VAMOS_Spectra.root");
181  vw->InitVAMOS(0,"Out/VAMOS_Spectra.root");
182 #endif
183  fd->Add<KeyWatcher>("Vamos_Keys","AgataKeys Watcher for the ancilary level");
184 
185  ok = true;
186  }
187  // RANC0 -----------------------------------------------------------------
188  // END LOCAL LEVEL PROCESSING
189 
190  // GLOBAL LEVEL PROCESSING
191  // EB Level //
192  if ( DFtype.Contains("EB") ) {
193 
194  // It defines a trigger on an event:data:psa Frame
195  AgataFrameTrigger *trig = AgataFrameTrigger::Build("EventPSA", "event:data:psa" );
196  fd->SetTrigger(trig);
197 
198  fd->Add<EBWatcher>(GetWN("EventBuilder",ext),"Display Agata spectra at the event builder level");
199 
200  // fd->Add<HitsSpectra>(GetWN("HitsSpectra",ext),"Gamma-ray spectra from Hits");
201 
202  fd->Add<KeyWatcher>("EventBuilder_Keys","AgataKeys Watcher at the event builder level");
203 
204  ok = true;
205  }
206  // MERGER Level //
207  if ( DFtype.Contains("MERGER") ) {
208 
209  AgataFrameTrigger *trig = AgataFrameTrigger::Build("Event", "event:data event:data:psa data:ranc0");
210 
211  // set the main trigger to coincidences between ancillary et gammas
212  fd->SetTrigger(trig);
213 
214 #ifdef HAS_GANIL
215 // fd->Add<MFMWatcher>(GetWN("MFMWatcher",ext),"To check the MFM Content");
216 
217  TTreeMaster *rootmaster = fd->Add<TTreeMaster>("TreeMaster","Own the tree");
218  rootmaster->Add<RawMFMTree>("RawMFMTree","Branch on Raw MFM");
219 
220  VAMOSWatcher *vw = rootmaster->Add<VAMOSWatcher>("GVWInterface","Branch managed by the VAMOS librarie");
221  vw->InitVAMOS(0,Form("Out/VAMOS_Spectra.root"));
222 
223 // rootmaster->AddWatcher<VAMOSVertexBuilder>(GetWN("VAMOSVertexBuilder",ext),"To Compute a vertex from VAMOS library");
224 
225  fd->Add<VAMOSVertexBuilder>("VAMOSVertexBuilder","Check Doppler as computed by VAMOS");
226 
228  fVertexBuilder->SetVertex();
229  fd->Add<GlobalDC>("CheckGlobalDoppler","Check Doppler as computed by VAMOS");
230 
231  fd->Add<AGATAVAMOSCoinc>("AGATAVAMOSCoinc","Check some coincidences spectra between VAMOS and AGATA");
232 #endif
233 
234  fd->Add<KeyWatcher>("Merger_Keys","AgataKeys Watcher at the merger level",trig);
235 
236  ok = true;
237  }
238  // TRACKING Level //
239  if ( DFtype.Contains("TRACKING") ) {
240 
241  bool EventDataConfiguration = true;
242 
243  AgataFrameTrigger *TriggerEventBuilder = 0x0;
244  AgataFrameTrigger *TriggerAncilary = 0x0;
245  AgataFrameTrigger *TriggerTracking = 0x0;
247 
248 
249  if(EventDataConfiguration)
250  {
251  TriggerTracking = AgataFrameTrigger::Build("TRACKING", "event:data data:ranc0 event:data:psa data:tracked");
252  TriggerEventBuilder = TriggerTracking;
253  TriggerAncilary = TriggerTracking;
254 
255  }
256  else
257  {
258  TriggerTracking= AgataFrameTrigger::Build("TRACKING", "data:tracked");
259  TriggerEventBuilder = AgataFrameTrigger::Build("TRACKING", "event:data:psa");
260  TriggerAncilary = AgataFrameTrigger::Build("TRACKING", "data:ranc0");
261  }
262 
263  fd->SetTrigger(TriggerTracking);
264 
265  fd->Add<EBWatcher>("EventBuilder","Display Agata spectra at the event builder level",TriggerEventBuilder);
266 
267  TTreeMaster *rootmaster = fd->Add<TTreeMaster>("EvtPsaHits","EvtPsaHits");
268  rootmaster->Add<ADHitTree>("ADHitTree","ADHitTree");
269 
270 
271 #ifdef HAS_VAMOS
272  fd->Add<AGATAVAMOSCoinc>("AGATAVAMOSCoinc","Check some coincidences spectra between VAMOS and AGATA");
273 #endif
274 
275  fd->Add<TrackingWatcher>("Tracking","Display Agata spectra at the tracking level",TriggerTracking);
276 
277  fd->Add<KeyWatcher>("Tracking_Keys_Univ","AgataKeys Watcher at the tracking level",UnivTrig);
278  AgataFrameTrigger *VamosOnly = AgataFrameTrigger::Build("TRACKING", "event:data data:ranc0 !event:data:psa !data:tracked");
279  AgataFrameTrigger *AgataOnly = AgataFrameTrigger::Build("TRACKING", "event:data !data:ranc0 event:data:psa data:tracked");
280  AgataFrameTrigger *Normal = AgataFrameTrigger::Build("TRACKING", "event:data data:ranc0 event:data:psa data:tracked");
281  fd->Add<KeyWatcher>("Tracking_Keys_Normal","AgataKeys Watcher at the tracking level",Normal);
282  fd->Add<KeyWatcher>("Tracking_Keys_Vamos","AgataKeys Watcher at the tracking level",VamosOnly);
283  fd->Add<KeyWatcher>("Tracking_Keys_AGATA","AgataKeys Watcher at the tracking level",AgataOnly);
284 
285 
286  ok = true;
287  }
288 
289  return ok;
290 }
291 
292 // META -------------------------------------------------------------
293 // meta data frame
294 /*
295 if ( DFtype.Contains("META") ) {
296 
297  // define WatcherClient for a specific trigger
298  AgataFrameTrigger *trig = AgataFrameTrigger::Build("Vertex", "meta:vertex" );
299  fd->SetTrigger(trig);
300 
301  // just to keep a global vertex frame.
302  fd->Add<VertexWatcher>("GSource","To get a Global Vertex");
303  // recoil velocity distribution
304  fd->Add<GlobalDC>("GRecoil","Recoil velocity distribution");
305 
306  ok = true;
307 }
308  */
309 // META ----------------------------------------------------------------
310 
311 #endif
312 
313 
314 
315 
316 
Interface for any watcher that is a VertexBuilder.
Watcher that built the spectra expected for a Vertex.
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.
MFMWatcher, to check the structure of the MBS Frame.
Definition: GANILWatchers.h:99
Process a buffer, trigg and dispachs the work to sub-watchers.
Watcher_T * Add(const Char_t *name, const Char_t *title, Short_t do_spectra, Short_t do_tree)
Allocate a watcher in charge of filling one part of the tree ==> Should inherits from TreeBuilder...
virtual Bool_t SetTrigger(ADF::DFTrigger *)
This is the default trigger for any added watcher.
RawMFMTree, branches that contains value/label as written in the MFM Frame.
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 ...
AD ROOT TTree branches for the hit part.
Definition: ADTree.h:129
header file for GANILWatchers.C
AgataFrameTrigger * GetUniversalTrigger()
Base class for version numbers.
Definition: Version.h:38
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.
To be used for Agata Data Flow.
Definition: Trigger.h:462
! Show rates (counts) per Crystal *!
To build some basic VAMOS Spectra and Coincidences with AGATA [Requires Event:data:psa].
void DoTSRateCollector(TTask *top_task, TSRateCollector *collector)
browse all dispatchers to look for TSRate Watcher and add them to the rate collector ...
Watcher to build a tree with branches processed in several watchers.
const char * GetWN(const char *name, const char *ext)
Build the Watcher name adding an extension.
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
static VertexBuilder * theCurrentVertexBuilder()
to get the current VertexWatcher (for other watchers) i.e. the last one registered.