This commit was generated by cvs2svn to compensate for changes in r13732,
[u/mrichter/AliRoot.git] / EVE / Reve / VSDSelector.cxx
1
2 #include "VSDSelector.h"
3 #include "RGTopFrame.h"
4
5 #include <Reve/Track.h>
6 #include <Reve/PointSet.h>
7
8 #include <Reve/PODs.h>
9 #include <Reve/TTreeTools.h>
10
11 #include <TEventList.h>
12 #include <TGLabel.h>
13 #include <TGXYLayout.h>
14 #include <TGClient.h>
15
16 using namespace Reve;
17
18 using Reve::Exc_t;
19
20 VSDSelector::VSDSelector(TGListTree* lt, TGCompositeFrame *tFrame)
21 {
22   fListTree = lt;
23
24   //create gui
25   TGGroupFrame *gframe = new TGGroupFrame(tFrame, "Options", kVerticalFrame);
26   TGLayoutHints* lh0 = new TGLayoutHints(kLHintsTop | kLHintsLeft |  kLHintsExpandX | kLHintsExpandY  , 5, 5, 5, 5);
27   gframe->SetTitlePos(TGGroupFrame::kRight); // right aligned
28   tFrame->AddFrame(gframe, lh0);
29
30   
31   TGXYLayout* xyl = new TGXYLayout(gframe);
32   gframe->SetLayoutManager(xyl);
33   xyl->Layout();
34
35   TGXYLayoutHints* lh;
36   Float_t x,y;
37   y  = 0.;
38
39   UInt_t wH = 2;
40   UInt_t labelw = 15;
41   UInt_t entryw = 39;
42   UInt_t butw  = 10;
43  
44   x = 2.;
45   y = 2.;
46   {
47     // particles
48     TGLabel* label = new TGLabel(gframe, "ParticleSelection");
49     label->Resize(labelw, wH);
50     label->SetTextJustify(kTextLeft | kTextCenterY);
51     lh = new TGXYLayoutHints(x, y, labelw, wH,0);  lh->SetPadLeft(2); lh->SetPadRight(2);
52     gframe->AddFrame(label,lh);
53     x += labelw ;
54   
55     mParticleSelection = new TGTextEntry(gframe, "fMother[0] == -1 && Pt() > 1");
56     mParticleSelection->Resize(entryw, wH);
57     lh = new TGXYLayoutHints(x, y, entryw, wH,0);  lh->SetPadLeft(2); lh->SetPadRight(2);
58     gframe->AddFrame(mParticleSelection,lh);
59     x += entryw+1;
60   
61     TGTextButton* but = new TGTextButton(gframe, "Select");
62     but->Resize(butw, wH);
63     but->SetTextJustify(kTextCenterX | kTextCenterY);
64     lh = new TGXYLayoutHints(x, y, butw, wH,0);  lh->SetPadLeft(4); lh->SetPadRight(2);
65     gframe->AddFrame(but,lh);
66     but->Connect("Pressed()", "Reve::VSDSelector", this, "SelectParticles()");
67    
68     UInt_t rbw = 11;
69     x = x + butw + 0.5;
70     fRecursiveSelect = new TGCheckButton(gframe, "Recursive");
71     fRecursiveSelect->Resize(rbw, wH);
72     lh = new TGXYLayoutHints(x, y, rbw, wH,0);  lh->SetPadLeft(4); lh->SetPadRight(2);
73     gframe->AddFrame(fRecursiveSelect,lh);
74   }
75   x = 2.;
76   y+= wH;  y+= 1.;
77
78
79   {    // hits
80     TGLabel* label = new TGLabel(gframe, "HitSelection");
81     label->Resize(labelw, wH);
82     label->SetTextJustify(kTextLeft | kTextCenterY);
83     lh = new TGXYLayoutHints(x, y, labelw, wH,0);  lh->SetPadLeft(2); lh->SetPadRight(2);
84     gframe->AddFrame(label,lh);
85     x += labelw;
86   
87     mHitSelection  = new TGTextEntry(gframe, "det_id == 0");
88     mHitSelection->Resize(entryw, wH);
89     lh = new TGXYLayoutHints(x, y, entryw, wH,0);  lh->SetPadLeft(2); lh->SetPadRight(2);
90     gframe->AddFrame(mHitSelection,lh);
91     x += entryw +1;
92   
93     TGTextButton* but = new TGTextButton(gframe, "Select");
94     but->Resize(butw, wH);
95     but->SetTextJustify(kTextCenterX | kTextCenterY);
96     lh = new TGXYLayoutHints(x, y, butw, wH,0);  lh->SetPadLeft(4); lh->SetPadRight(2);
97     gframe->AddFrame(but,lh);
98     but->Connect("Pressed()", "Reve::VSDSelector", this, "SelectHits()");
99
100   }
101
102   x = 2.;
103   y+= wH;  y+= 1.;
104
105   {    // particle selection
106     TGLabel* label = new TGLabel(gframe, "ClusterSelection");
107     label->Resize(labelw, wH);
108     label->SetTextJustify(kTextLeft | kTextCenterY);
109     lh = new TGXYLayoutHints(x, y, labelw, wH,0);  lh->SetPadLeft(2); lh->SetPadRight(2);
110     gframe->AddFrame(label,lh);
111     x += labelw;
112   
113     mClusterSelection = new TGTextEntry(gframe, "R()< 70");
114     mClusterSelection->Resize(entryw, wH);
115     lh = new TGXYLayoutHints(x, y, entryw, wH,0);  lh->SetPadLeft(2); lh->SetPadRight(2);
116     gframe->AddFrame(mClusterSelection,lh);
117     x += entryw +1;
118   
119     TGTextButton* but = new TGTextButton(gframe, "Select");
120     but->Resize(butw, wH);
121     but->SetTextJustify(kTextCenterX | kTextCenterY);
122     lh = new TGXYLayoutHints(x, y, butw, wH,0);  lh->SetPadLeft(4); lh->SetPadRight(2);
123     gframe->AddFrame(but,lh);
124     but->Connect("Pressed()", "Reve::VSDSelector", this, "SelectClusters()");
125   } x = 2.;
126   y+= wH;  y+= 1.;
127
128   {    // reconstructed tracks selection
129     TGLabel* label = new TGLabel(gframe, "RecSelection");
130     label->Resize(labelw, wH);
131     label->SetTextJustify(kTextLeft | kTextCenterY);
132     lh = new TGXYLayoutHints(x, y, labelw, wH,0);  lh->SetPadLeft(2); lh->SetPadRight(2);
133     gframe->AddFrame(label,lh);
134     x += labelw;
135   
136     mRecSelection = new TGTextEntry(gframe, "Pt() > 1");
137     mRecSelection->Resize(entryw, wH);
138     lh = new TGXYLayoutHints(x, y, entryw, wH,0);  lh->SetPadLeft(2); lh->SetPadRight(2);
139     gframe->AddFrame(mRecSelection,lh);
140     x += entryw +1;
141   
142     TGTextButton* but = new TGTextButton(gframe, "Select");
143     but->Resize(butw, wH);
144     but->SetTextJustify(kTextCenterX | kTextCenterY);
145     lh = new TGXYLayoutHints(x, y, butw, wH,0);  lh->SetPadLeft(4); lh->SetPadRight(2);
146     gframe->AddFrame(but,lh);
147     but->Connect("Pressed()", "Reve::VSDSelector", this, "SelectRecTracks()");
148   }
149
150   gframe->Resize(60, 30); // resize to default size 
151   gframe->MapSubwindows();
152   gframe->MapWindow();
153   tFrame->MapSubwindows();
154
155 }
156
157 /**************************************************************************/
158
159 void VSDSelector::LoadVSD(const Text_t* vsd_file_name,
160                           const Text_t* dir_name)
161 {
162   VSD::LoadVSD(vsd_file_name, dir_name);
163   fListTree->AddItem(0, dir_name); 
164 }
165
166 /**************************************************************************/
167 //  selection methods
168 /**************************************************************************/
169
170 void VSDSelector::SelectParticles(const Text_t* selection)
171 {
172   static const Exc_t eH("VSDSelector::SelectParticles ");
173
174   if(mTreeK == 0) 
175     throw (eH + "kinematics not available.");
176
177   if(selection == 0)
178     selection = mParticleSelection->GetText();
179
180   
181   TGListTreeItem*  parent = fListTree->FindItemByPathname("Event0");
182   if(parent == 0) return;
183
184
185   TTreeQuery evl;
186   Int_t n = evl.Select(mTreeK, selection);
187   // printf("%d entries in selection '%s'.\n", n,  selection);
188
189   if(n == 0)
190     throw (eH + "no entries found for selection in kinematics.");
191
192   
193   TrackList* cont = new TrackList();
194   TrackRnrStyle* rs =  new TrackRnrStyle();
195   cont->SetRnrStyle(rs);
196   rs->SetColor(4);
197   TGListTreeItem *holder = fListTree->AddItem(parent, Form("MCTracks %s [%d]",selection,n));
198   holder->SetUserData(cont);
199   // printf("%d entries in selection '%s'.\n", n,  selection);
200
201   if(n > 0) {
202     Reve::PadHolder pHolder(true, gReve->GetCC());
203     for(Int_t i=0; i<n; i++) {
204       Int_t label = evl.GetEntry(i);
205       mTreeK->GetEntry(label);
206       Track* track = new Track(mpK, cont->GetRnrStyle());
207
208       TGListTreeItem* di = fListTree->AddItem
209         (holder, Form("%s daughters:%d", mK.GetName(), mK.GetNDaughters()), track);
210       di->SetUserData(track);  
211       cont->AddElement(track);
212       // printf("select daugters %s selection %s\n",mpK->GetName(),Form("fMother[0] == %d", track->GetLabel()));
213       if(fRecursiveSelect->IsOn()) {
214         if(mK.GetNDaughters())
215           ImportDaughtersRec(di, cont, mK.GetFirstDaughter(), mK.GetLastDaughter());
216         // add decay point to path marks
217         if(mK.decayed) {
218           Reve::PathMark* pm = new Reve::PathMark(Reve::PathMark::Decay);
219           pm->V.x = mK.V_decay.x;
220           pm->V.y = mK.V_decay.y;
221           pm->V.z = mK.V_decay.z;
222           track->fPathMarks.push_back(pm);
223         }
224       }
225       track->MakeTrack();
226     }
227     cont->MakeMarkers();
228     NotifyBrowser(parent);
229   }
230 }
231
232 /**************************************************************************/
233
234 void VSDSelector::ImportDaughtersRec(TGListTreeItem* parent, TrackList* cont,
235                                      Int_t first, Int_t last)
236 {
237   Track* mother = (Track*)parent->GetUserData();
238
239   for(Int_t i=first; i<=last; i++) {
240     mTreeK->GetEntry(i); 
241     Track* track = new Track(mpK, cont->GetRnrStyle());
242
243     TGListTreeItem* di = fListTree->AddItem
244       (parent, Form("%s daughters:%d", mK.GetName(), mK.GetNDaughters()), track);
245     di->SetUserData(track);  
246     cont->AddElement(track);
247     if(mK.GetNDaughters())
248       ImportDaughtersRec(di, cont, mK.GetFirstDaughter(), mK.GetLastDaughter());
249
250     // add daughter mark to mother
251     Reve::PathMark* dam = new Reve::PathMark(Reve::PathMark::Daughter);
252     dam->V.x = mK.Vx();
253     dam->V.y = mK.Vy();
254     dam->V.z = mK.Vz();
255     mother->fPathMarks.push_back(dam);
256
257     if(mK.decayed) {
258       Reve::PathMark* decm = new Reve::PathMark(Reve::PathMark::Decay);
259       decm->V.x = mK.V_decay.x;
260       decm->V.y = mK.V_decay.y;
261       decm->V.z = mK.V_decay.z;
262       track->fPathMarks.push_back(decm);
263
264     }
265     track->MakeTrack();
266   }
267 }
268 /**************************************************************************/
269
270 void VSDSelector::SelectHits()
271 {
272   static const Exc_t eH("VSDSelector::SelectHits ");
273
274   if(mTreeH == 0) 
275     throw (eH + "hits not available.");
276
277   const Text_t* selection;
278   if(mHitSelection)
279     selection  = mHitSelection->GetText();
280   else 
281     selection  ="det_id == 0";
282
283   TTreeQuery evl;
284   Int_t n = evl.Select(mTreeH, selection);
285   // printf("ImportHitsWithSelection %d entries for selection %s\n", n, selection);
286   
287   if(n==0)
288     throw(eH + "no hits matching selection.");
289
290   PointSet* container = new PointSet
291     (Form("Hits %s", selection), n);
292   for(Int_t i=0; i<n; i++) {
293     const Int_t entry = evl.GetEntry(i);
294     mTreeH->GetEntry(entry);
295     container->SetPoint(i, mH.V.x, mH.V.y, mH.V.z);
296   }
297
298   container->SetMarkerColor((Color_t)2);
299   container->SetMarkerStyle((Style_t)6);
300   gReve->AddRenderElement(container);
301
302   return; //!!!! this is commenting-out old impl below
303
304   {
305     Reve::PadHolder pHolder(true, gReve->GetCC());
306     container->SetMarkerColor((Color_t)2);
307     container->SetMarkerStyle((Style_t)6);
308     container->Draw();
309   }
310
311   TGListTreeItem*  parent = fListTree->FindItemByPathname("Event0");
312   TGListTreeItem* iholder = fListTree->AddItem(parent, Form("Hits %s", selection) ,container);
313   iholder->SetUserData(container);
314   NotifyBrowser(parent);
315 }
316
317 /**************************************************************************/
318
319 void VSDSelector::SelectClusters()
320 {
321   static const Exc_t eH("VSDSelector::SelectClusters ");
322
323   if(mTreeC == 0) 
324     throw (eH + "clusters not available.");
325
326   const Text_t* selection;
327   if (mClusterSelection)
328     selection = mClusterSelection->GetText();
329   else 
330     selection  ="V.R()<70";
331
332   TTreeQuery evl;
333   Int_t n = evl.Select(mTreeC, selection);
334   printf(" cluster Selection %d entries for selection %s\n", n, selection);
335   
336   if(n==0)
337     throw(eH + "no clusters matching selection.");
338
339   PointSet* container = new PointSet
340     (Form("Clusters %s", selection), n);
341   for(Int_t i=0; i<n; i++) {
342     const Int_t entry = evl.GetEntry(i);
343     mTreeC->GetEntry(entry);
344     container->SetPoint(i, mC.V.x, mC.V.y, mC.V.z);
345   }
346
347   {
348     Reve::PadHolder pHolder(true, gReve->GetCC());
349     container->SetMarkerColor((Color_t)9);
350     container->SetMarkerStyle((Style_t)7);
351     container->Draw();
352   }
353
354   TGListTreeItem*  parent = fListTree->FindItemByPathname("Event0");
355   TGListTreeItem* iholder = fListTree->AddItem(parent, Form("Clusters %s", selection) ,container);
356   iholder->SetUserData(container);
357   NotifyBrowser(parent);
358 }
359 /**************************************************************************/
360
361 void VSDSelector::SelectRecTracks()
362 {
363   static const Exc_t eH("VSDSelector::SelectRecTracks ");
364
365   if(mTreeR == 0) 
366     throw (eH + "reconstructed tracks not available.");
367
368   const Text_t* selection;
369   if(mRecSelection)
370     selection = mRecSelection->GetText();
371   else 
372     selection = "Pt() > 1";
373   
374   TTreeQuery evl;
375   Int_t n = evl.Select(mTreeR, selection);
376   // printf("%d entries in selection %s \n", n,  selection);
377
378   if (n == 0)
379     throw (eH + "No entries found in ESD data.");
380
381   if(n > 0) {
382     Reve::PadHolder pHolder(true, gReve->GetCC());
383
384     TGListTreeItem* parent = fListTree->FindItemByPathname("Event0");
385     TrackList* cont = new TrackList(); 
386     TrackRnrStyle* rs =  new TrackRnrStyle();
387     cont->SetRnrStyle(rs);
388     rs->SetColor(6);
389     TGListTreeItem *holder =  fListTree->AddItem(parent, Form("RecTracks %s [%d]",selection, n));
390     holder->SetUserData(cont);
391     for (Int_t i=0; i<n; i++) {
392       Int_t label = evl.GetEntry(i);
393       mTreeR->GetEntry(label);
394       Track* track = new Track(mpR, cont->GetRnrStyle());
395       track->MakeTrack();
396       track->Draw();
397
398       TGListTreeItem* di = 
399         fListTree->AddItem(holder, "RecTrack", track);
400       di->SetUserData(track);  
401       cont->AddElement(track);
402     }
403
404     cont->MakeMarkers();
405     NotifyBrowser(parent);
406   }
407 }
408
409 /**************************************************************************/
410
411 void VSDSelector::NotifyBrowser(TGListTreeItem* parent)
412 {
413   Long_t args[2];
414   args[0] = (Long_t)parent;
415   args[1] = 0;
416
417   fListTree->Emit("Clicked(TGListTreeItem*, Int_t)", args);
418   fListTree->OpenItem(parent);
419 }