1 /**************************************************************************
2 * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
3 * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for *
4 * full copyright notice. *
5 **************************************************************************/
6 // Author: Mihai Niculescu 2013
10 * This script creates a collage containing all OpenGL views from a running AliEve
12 * Given Collage size (width, height), the size for all OpenGL
13 * views are computed using the same aspect ratio (width/height) as the main 3D View
17 #include <TGLViewer.h>
18 #include <TEveViewer.h>
19 #include <TEveManager.h>
22 #include <TTimeStamp.h>
23 #include <TEveElement.h>
24 #include <TIterator.h>
28 #include <STEER/ESD/AliESDEvent.h>
29 #include <STEER/ESD/AliESDRun.h>
30 #include <STEER/STEER/AliGRPObject.h>
31 #include <STEER/CDB/AliCDBEntry.h>
32 #include <STEER/CDB/AliCDBManager.h>
33 #include <RAW/RAWDatarec/AliRawReader.h>
34 #include <RAW/RAWDatabase/AliRawEventHeaderBase.h>
35 #include <EVE/EveBase/AliEveEventManager.h>
37 TString getEventInfo();
39 /***********Save all OpenGL views into one picture
40 compositeImgFileName - save final image to this file
41 showLiveBar - whether to show the LIVE bar, useful when not online (using offline)
42 width - of the collage image
43 height -of the collage image
45 void saveViews(const char* compositeImgFileName="views.png", Bool_t showLiveBar=kTRUE, Int_t width = 1440, Int_t height= 900)
47 Info("saveViews.C", "saving views to [%s]", compositeImgFileName);
49 Int_t heightInfoBar = 65; // hold height of the Information bar
51 TASImage* compositeImg=0; // this holds the final image
52 TASImage* tempImg=0; // temporary used for loading images
54 TEveViewerList* viewers = gEve->GetViewers();
55 Int_t Nviewers = viewers->NumChildren()-2; // remark: 3D view is counted twice
57 compositeImg = new TASImage(width, height);
60 Int_t width3DView = TMath::FloorNint((float)Nviewers*width/(float)(Nviewers+1)); // the width of the 3D view
61 Int_t height3DView= height-heightInfoBar; // the height of the 3D view
62 Float_t aspectRatio = (float)width3DView/(float)height3DView; // 3D View aspect ratio
65 Int_t heightChildView = TMath::FloorNint((float)height3DView/(float)Nviewers);
66 Int_t widthChildView = TMath::FloorNint(aspectRatio*heightChildView); // has the same aspect ratio as the 3D view
68 int index=0; // iteration counter
69 int x = width3DView; // x position of the child view
70 int y = 0;// y position of the child view
71 TString viewFilename; // save view to this file
73 for(TEveElement::List_i i = (++viewers->BeginChildren()); i != viewers->EndChildren(); i++)
74 { // NB: this skips the first children (first 3D View)
75 TEveViewer* view = ((TEveViewer*)*i);
76 viewFilename = Form("view-%d.png", index);
78 // Save OpenGL views in files
80 view->GetGLViewer()->SavePictureUsingFBO(viewFilename, width3DView, height3DView);
83 view->GetGLViewer()->SavePictureUsingFBO(viewFilename, widthChildView, heightChildView);
86 tempImg = new TASImage(viewFilename);
88 // copy view image in the composite image
90 tempImg->CopyArea(compositeImg, 0,0, width3DView, height3DView);
93 tempImg->CopyArea(compositeImg, 0,0, widthChildView, heightChildView, x,y);
95 // draw a border around child views
96 compositeImg->DrawRectangle(x,y, widthChildView, heightChildView, "#C0C0C0");
100 final touches inside loop
103 if(index>0) // skip 3D View
109 // Create a glow (bloom) effect
110 tempImg = (TASImage*)compositeImg->Clone("tempImg");
111 tempImg->Blur(10.0,10.0);
112 compositeImg->Merge(tempImg, "lighten");
113 delete tempImg; tempImg = 0;
119 TString tNow = ts.AsString("s"); // display date & time
121 compositeImg->Gradient( 90, "#EAEAEA #D2D2D2 #FFFFFF", 0, 75, 0, 239, 95);
122 compositeImg->Gradient( 90, "#D6D6D6 #242424 #000000", 0, 155, 60, 152, 26);
123 compositeImg->BeginPaint();
124 compositeImg->DrawRectangle(50,0, 264, 94);
125 compositeImg->DrawText(162, 6, "LIVE", 70, "#FF2D00", "FreeSansBold.otf");
126 compositeImg->DrawText(162, 65, tNow, 16, "#FFFFFF", "arial.ttf");
127 compositeImg->EndPaint();
129 tempImg = new TASImage( Form("%s/picts/2012-Jul-04-4_Color_Logo_small_CB.png", gSystem->Getenv("ALICE_ROOT")) );
130 tempImg->Scale(64,86);
131 //tempImg->CopyArea(compositeImg, 0,0, 236, 319, 59, 4);
132 compositeImg->Merge(tempImg, "alphablend", 82, 4);
133 delete tempImg; tempImg = 0;
136 // show Information bar
138 stringInfo = getEventInfo();
139 compositeImg->Gradient( 90, "#1B58BF #1D5CDF #0194FF", 0, 0, height-heightInfoBar, width, heightInfoBar);
140 compositeImg->BeginPaint();
141 compositeImg->DrawText(10, height-heightInfoBar+15, stringInfo, 28, "#FFFFFF", "FreeSansBold.otf");
142 compositeImg->EndPaint();
145 // write composite image to disk
146 compositeImg->CopyArea(compositeImg, 0,0, width, height);
147 compositeImg->WriteImage(compositeImgFileName);
154 // This function retrieves a string containing some information regarding the current event
155 TString getEventInfo()
157 // For general public please show as less or technical information as possible
159 TString rawInfo, esdInfo;
161 if (!AliEveEventManager::HasRawReader())
167 AliRawReader* rawReader = AliEveEventManager::AssertRawReader();
168 if(!rawReader) return "";
169 rawInfo.Form("Run: %d Event#: %d (%s)",
170 rawReader->GetRunNumber(),
171 AliEveEventManager::CurrentEventId(),
172 AliRawEventHeaderBase::GetTypeName(rawReader->GetType())
178 if (!AliEveEventManager::HasESD())
184 AliESDEvent* esd = AliEveEventManager::AssertESD();
186 esdInfo.Form("Colliding: %s Run: %d Event: %d (%s)",
187 esd->GetESDRun()->GetBeamType(),
189 AliEveEventManager::CurrentEventId(),
191 /*AliRawEventHeaderBase::GetTypeName(esd->GetEventType())*/