Logo ROOT   6.16/01
Reference Guide
TGeoMediumEditor.cxx
Go to the documentation of this file.
1// @(#):$Id: c816a00a89512fcc6cd4a75fb1343c76ebaa3c24 $
2// Author: M.Gheata
3
4/*************************************************************************
5 * Copyright (C) 1995-2002, Rene Brun and Fons Rademakers. *
6 * All rights reserved. *
7 * *
8 * For the licensing terms see $ROOTSYS/LICENSE. *
9 * For the list of contributors see $ROOTSYS/README/CREDITS. *
10 *************************************************************************/
11
12/** \class TGeoMediumEditor
13\ingroup Geometry_builder
14
15Editor class for TGeo tracking media.
16
17*/
18
19#include "TGeoMediumEditor.h"
20#include "TGeoTabManager.h"
21#include "TGeoManager.h"
22#include "TGeoMedium.h"
23#include "TGeoMaterial.h"
24#include "TPad.h"
25#include "TGTab.h"
26#include "TGComboBox.h"
27#include "TGButton.h"
28#include "TGTextEntry.h"
29#include "TGNumberEntry.h"
30#include "TGLabel.h"
31#include "TG3DLine.h"
32
34
41};
42
43////////////////////////////////////////////////////////////////////////////////
44/// Constructor for medium editor
45
47 Int_t height, UInt_t options, Pixel_t back)
48 : TGeoGedFrame(p, width, height, options | kVerticalFrame, back)
49{
50 fMedium = 0;
53 Pixel_t color;
54 TGLabel *label;
55
56 // TextEntry for medium name
57 MakeTitle("Name");
58 fMedName = new TGTextEntry(this, "", kMED_NAME);
60 fMedName->SetToolTipText("Enter the medium name");
61 fMedName->Associate(this);
63
64 TGTextEntry *nef;
65
66// Composite frame for medium ID and sensitivity
68 f1->AddFrame(new TGLabel(f1, "ID"), new TGLayoutHints(kLHintsLeft, 4, 1, 6, 0));
69 fMedId = new TGNumberEntry(f1, 0., 1, kMED_ID);
71 nef->SetToolTipText("Enter the medium ID");
72 fMedId->Associate(this);
73 f1->AddFrame(fMedId, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 2, 2, 4, 4));
74 fMedSensitive = new TGCheckButton(f1, "&Sens", kMED_SENS);
76 f1->AddFrame(fMedSensitive, new TGLayoutHints(kLHintsLeft, 2, 2, 4, 4));
77 AddFrame(f1, new TGLayoutHints(kLHintsLeft, 3, 3, 2, 2));
78
79 // Current material
81 f1->AddFrame(label = new TGLabel(f1, "Current material"), new TGLayoutHints(kLHintsLeft, 1, 1, 0, 0));
82 f1->AddFrame(new TGHorizontal3DLine(f1), new TGLayoutHints(kLHintsExpandX, 5, 5, 7, 7));
83 gClient->GetColorByName("#ff0000", color);
84 label->SetTextColor(color);
85 AddFrame(f1, new TGLayoutHints(kLHintsTop, 0, 0, 2, 0));
86 f1 = new TGCompositeFrame(this, 155, 30, kHorizontalFrame);
88 fLSelMaterial = new TGLabel(f1, "Select material");
89 gClient->GetColorByName("#0000ff", color);
94 fBSelMaterial->SetToolTipText("Replace with one of the existing materials");
96 f1->AddFrame(fBSelMaterial, new TGLayoutHints(kLHintsLeft, 1, 1, 2, 2));
97 fEditMaterial = new TGTextButton(f1, "Edit");
98 f1->AddFrame(fEditMaterial, new TGLayoutHints(kLHintsLeft, 1, 1, 2, 2));
99 fEditMaterial->SetToolTipText("Edit selected material");
102
103// Combo box for magnetic field option
105 f1->AddFrame(label = new TGLabel(f1, "Mag. field option"), new TGLayoutHints(kLHintsLeft, 1, 1, 0, 0));
106 f1->AddFrame(new TGHorizontal3DLine(f1), new TGLayoutHints(kLHintsExpandX, 5, 5, 7, 7));
107 gClient->GetColorByName("#ff0000", color);
108 label->SetTextColor(color);
109 AddFrame(f1, new TGLayoutHints(kLHintsTop, 0, 0, 2, 0));
113
114
115// Number entries for other settings
117 f1->AddFrame(label = new TGLabel(f1, "Medium cuts"), new TGLayoutHints(kLHintsLeft, 1, 1, 0, 0));
118 f1->AddFrame(new TGHorizontal3DLine(f1), new TGLayoutHints(kLHintsExpandX, 5, 5, 7, 7));
119 gClient->GetColorByName("#ff0000", color);
120 label->SetTextColor(color);
121 AddFrame(f1, new TGLayoutHints(kLHintsTop, 0, 0, 2, 0));
123
124 // Number entry for fieldm
125 f1 = new TGCompositeFrame(compxyz, 118, 10, kHorizontalFrame |
127 f1->AddFrame(new TGLabel(f1, "FIELDM"), new TGLayoutHints(kLHintsLeft, 1, 1, 4, 0));
128 fMedFieldm = new TGNumberEntry(f1, 0., 5, kMED_FIELDM);
130 nef->SetToolTipText("Maximum magnetic field [kilogauss]");
131 fMedFieldm->Associate(this);
133 f1->AddFrame(fMedFieldm, new TGLayoutHints(kLHintsRight | kFixedWidth , 2, 2, 2, 2));
134 compxyz->AddFrame(f1, new TGLayoutHints(kLHintsLeft | kLHintsExpandX , 2, 2, 1, 1));
135
136 // Number entry for tmaxfd
137 TGCompositeFrame *f2 = new TGCompositeFrame(compxyz, 118, 10, kHorizontalFrame |
139 f2->AddFrame(new TGLabel(f2, "TMAXFD"), new TGLayoutHints(kLHintsLeft, 1, 1, 4, 0));
140 fMedTmaxfd = new TGNumberEntry(f2, 0., 5, kMED_TMAX);
142 nef->SetToolTipText("Maximum angle per step due to field [deg]");
143 fMedTmaxfd->Associate(this);
145 f2->AddFrame(fMedTmaxfd, new TGLayoutHints(kLHintsRight | kFixedWidth , 2, 2, 2, 2));
146 compxyz->AddFrame(f2, new TGLayoutHints(kLHintsLeft | kLHintsExpandX , 2, 2, 1, 1));
147
148 // Number entry for stemax
149 TGCompositeFrame *f3 = new TGCompositeFrame(compxyz, 118, 10, kHorizontalFrame |
151 f3->AddFrame(new TGLabel(f3, "STEMAX"), new TGLayoutHints(kLHintsLeft, 1, 1, 4, 0));
152 fMedStemax = new TGNumberEntry(f3, 0., 5, kMED_STEMAX);
154 nef->SetToolTipText("Maximum step allowed [cm]");
155 fMedStemax->Associate(this);
157 f3->AddFrame(fMedStemax, new TGLayoutHints(kLHintsRight | kFixedWidth , 2, 2, 2, 2));
158 compxyz->AddFrame(f3, new TGLayoutHints(kLHintsLeft | kLHintsExpandX , 2, 2, 1, 1));
159
160 // Number entry for deemax
161 TGCompositeFrame *f4 = new TGCompositeFrame(compxyz, 118, 10, kHorizontalFrame |
163 f4->AddFrame(new TGLabel(f4, "DEEMAX"), new TGLayoutHints(kLHintsLeft, 1, 1, 4, 0));
164 fMedDeemax = new TGNumberEntry(f4, 0., 5, kMED_DEEMAX);
166 nef->SetToolTipText("Maximum fraction of energy lost in a step");
167 fMedDeemax->Associate(this);
169 f4->AddFrame(fMedDeemax, new TGLayoutHints(kLHintsRight | kFixedWidth , 2, 2, 2, 2));
170 compxyz->AddFrame(f4, new TGLayoutHints(kLHintsLeft | kLHintsExpandX , 2, 2, 1, 1));
171
172 // Number entry for epsil
173 TGCompositeFrame *f5 = new TGCompositeFrame(compxyz, 118, 10, kHorizontalFrame |
175 f5->AddFrame(new TGLabel(f5, "EPSIL"), new TGLayoutHints(kLHintsLeft, 1, 1, 4, 0));
176 fMedEpsil = new TGNumberEntry(f5, 0., 5, kMED_EPSIL);
178 nef->SetToolTipText("Tracking precision [cm]");
179 fMedEpsil->Associate(this);
181 f5->AddFrame(fMedEpsil, new TGLayoutHints(kLHintsRight | kFixedWidth , 2, 2, 2, 2));
182 compxyz->AddFrame(f5, new TGLayoutHints(kLHintsLeft | kLHintsExpandX , 2, 2, 1, 1));
183
184 // Number entry for stmin
185 TGCompositeFrame *f6 = new TGCompositeFrame(compxyz, 118, 10, kHorizontalFrame |
187 f6->AddFrame(new TGLabel(f6, "STMIN"), new TGLayoutHints(kLHintsLeft, 1, 1, 4, 0));
188 fMedStmin = new TGNumberEntry(f6, 0., 5, kMED_STMIN);
190 nef->SetToolTipText("Minimum step due to continuous processes [cm]");
191 fMedStmin->Associate(this);
193 f6->AddFrame(fMedStmin, new TGLayoutHints(kLHintsRight | kFixedWidth , 2, 2, 2, 2));
194 compxyz->AddFrame(f6, new TGLayoutHints(kLHintsLeft | kLHintsExpandX , 2, 2, 1, 1));
195
196 compxyz->Resize(160,50);
197 AddFrame(compxyz, new TGLayoutHints(kLHintsLeft, 2, 2, 2, 2));
198
199 // Buttons
201 fApply = new TGTextButton(f23, "&Apply");
202 f23->AddFrame(fApply, new TGLayoutHints(kLHintsLeft, 2, 2, 4, 4));
203 fApply->Associate(this);
204 fUndo = new TGTextButton(f23, " &Undo ");
205 f23->AddFrame(fUndo, new TGLayoutHints(kLHintsRight , 2, 2, 4, 4));
206 fUndo->Associate(this);
207 AddFrame(f23, new TGLayoutHints(kLHintsLeft, 2, 2, 4, 4));
208}
209
210////////////////////////////////////////////////////////////////////////////////
211/// Destructor
212
214{
215 TGFrameElement *el;
216 TIter next(GetList());
217 while ((el = (TGFrameElement *)next())) {
218 if (el->fFrame->IsA() == TGCompositeFrame::Class() ||
219 el->fFrame->IsA() == TGHorizontalFrame::Class() ||
220 el->fFrame->IsA() == TGVerticalFrame::Class())
222 }
223 Cleanup();
224}
225
226////////////////////////////////////////////////////////////////////////////////
227/// Connect signals to slots.
228
230{
231 fApply->Connect("Clicked()", "TGeoMediumEditor", this, "DoApply()");
232 fUndo->Connect("Clicked()", "TGeoMediumEditor", this, "DoUndo()");
233 fMedName->Connect("TextChanged(const char *)", "TGeoMediumEditor", this, "DoMedName()");
234 fBSelMaterial->Connect("Clicked()", "TGeoMediumEditor", this, "DoSelectMaterial()");
235 fEditMaterial->Connect("Clicked()", "TGeoMediumEditor", this, "DoEditMaterial()");
236 fMedId->GetNumberEntry()->Connect("TextChanged(const char *)", "TGeoMediumEditor", this, "DoMedId()");
237 fMedTmaxfd->GetNumberEntry()->Connect("TextChanged(const char *)", "TGeoMediumEditor", this, "DoTmaxfd()");
238 fMedStemax->GetNumberEntry()->Connect("TextChanged(const char *)", "TGeoMediumEditor", this, "DoStemax()");
239 fMedDeemax->GetNumberEntry()->Connect("TextChanged(const char *)", "TGeoMediumEditor", this, "DoDeemax()");
240 fMedEpsil->GetNumberEntry()->Connect("TextChanged(const char *)", "TGeoMediumEditor", this, "DoEpsil()");
241 fMedStmin->GetNumberEntry()->Connect("TextChanged(const char *)", "TGeoMediumEditor", this, "DoStmin()");
242 fMedSensitive->Connect("Clicked()", "TGeoMediumEditor", this, "DoToggleSensitive()");
243 fMagfldOption->Connect("Selected(Int_t)", "TGeoMediumEditor", this, "DoMagfldSelect(Int_t)");
244 fInit = kFALSE;
245}
246
247
248////////////////////////////////////////////////////////////////////////////////
249/// Connect to the selected object.
250
252{
253 if (obj == 0 || !(obj->IsA()==TGeoMedium::Class())) {
255 return;
256 }
257 fMedium = (TGeoMedium*)obj;
258 const char *sname = fMedium->GetName();
259 if (!strcmp(sname, fMedium->ClassName())) fMedName->SetText("");
260 else fMedName->SetText(sname);
261
263 Int_t isvol = (Int_t)fMedium->GetParam(0);
265
268
270 fMagfldOption->AddEntry("No field", 0);
271 fMagfldOption->AddEntry("User decision", 1);
272 fMagfldOption->AddEntry("Runge-Kutta", 2);
273 fMagfldOption->AddEntry("Helix", 3);
274 fMagfldOption->AddEntry("Helix3", 4);
275 fMagfldOption->AddEntry("Unknown option", 5);
276 }
277 Int_t ifld = (Int_t)fMedium->GetParam(1);
278 switch (ifld) {
279 case 0:
281 break;
282 case -1:
284 break;
285 case 1:
287 break;
288 case 2:
290 break;
291 case 3:
293 break;
294 default:
296 break;
297 }
298
305
308
309
311 SetActive();
312}
313
314////////////////////////////////////////////////////////////////////////////////
315/// Edit selected material.
316
318{
320}
321
322////////////////////////////////////////////////////////////////////////////////
323/// Slot for medium name.
324
326{
327 const char *name = fMedName->GetText();
328 if (!name[0] || !strcmp(name, fMedium->GetName())) return;
330}
331
332////////////////////////////////////////////////////////////////////////////////
333/// Slot for medium id.
334
336{
337}
338
339////////////////////////////////////////////////////////////////////////////////
340/// Select the material component.
341
343{
345 new TGeoMaterialDialog(fBSelMaterial, gClient->GetRoot(), 200,300);
348 else fSelectedMaterial = material;
349}
350
351////////////////////////////////////////////////////////////////////////////////
352/// Slot for sensitivity.
353
355{
357}
358
359////////////////////////////////////////////////////////////////////////////////
360/// Slot for mag. field.
361
363{
365}
366
367////////////////////////////////////////////////////////////////////////////////
368/// Slot for max field.
369
371{
373}
374
375////////////////////////////////////////////////////////////////////////////////
376/// Slot for tmaxfd.
377
379{
381}
382
383////////////////////////////////////////////////////////////////////////////////
384/// Slot for the max allowed step.
385
387{
389}
390
391////////////////////////////////////////////////////////////////////////////////
392/// Slot for the maximum allowed dedx.
393
395{
397}
398
399////////////////////////////////////////////////////////////////////////////////
400/// Slot for tracking precision.
401
403{
405}
406
407////////////////////////////////////////////////////////////////////////////////
408/// Slot for min. step.
409
411{
413}
414
415////////////////////////////////////////////////////////////////////////////////
416/// Slot for applying modifications.
417
419{
420 if (!fIsModified) return;
421 Double_t isvol = (fMedSensitive->IsOn())?1:0;
423 if (ifield>0) {
424 ifield -= 1.;
425 if (ifield < 1.) ifield -= 1.;
426 }
427 Double_t fieldm = fMedFieldm->GetNumber();
428 Double_t tmaxfd = fMedTmaxfd->GetNumber();
429 Double_t stemax = fMedStemax->GetNumber();
430 Double_t deemax = fMedDeemax->GetNumber();
431 Double_t epsil = fMedEpsil->GetNumber();
432 Double_t stmin = fMedStmin->GetNumber();
433
434 fMedium->SetParam(0,isvol);
435 fMedium->SetParam(1,ifield);
436 fMedium->SetParam(2,fieldm);
437 fMedium->SetParam(3,tmaxfd);
438 fMedium->SetParam(4,stemax);
439 fMedium->SetParam(5,deemax);
440 fMedium->SetParam(6,epsil);
441 fMedium->SetParam(7,stmin);
444}
445
446////////////////////////////////////////////////////////////////////////////////
447/// Slot for undoing last operation.
448
450{
451}
452
void Class()
Definition: Class.C:29
ULong_t Pixel_t
Definition: GuiTypes.h:39
int Int_t
Definition: RtypesCore.h:41
unsigned int UInt_t
Definition: RtypesCore.h:42
const Bool_t kFALSE
Definition: RtypesCore.h:88
double Double_t
Definition: RtypesCore.h:55
const Bool_t kTRUE
Definition: RtypesCore.h:87
#define ClassImp(name)
Definition: Rtypes.h:363
include TDocParser_001 C image html pict1_TDocParser_001 png width
Definition: TDocParser.cxx:121
@ kButtonDown
Definition: TGButton.h:54
@ kButtonUp
Definition: TGButton.h:53
#define gClient
Definition: TGClient.h:166
@ kChildFrame
Definition: TGFrame.h:57
@ kRaisedFrame
Definition: TGFrame.h:62
@ kSunkenFrame
Definition: TGFrame.h:61
@ kVerticalFrame
Definition: TGFrame.h:59
@ kDoubleBorder
Definition: TGFrame.h:63
@ kFixedWidth
Definition: TGFrame.h:65
@ kHorizontalFrame
Definition: TGFrame.h:60
@ kOwnBackground
Definition: TGFrame.h:69
@ kLHintsRight
Definition: TGLayout.h:33
@ kLHintsExpandY
Definition: TGLayout.h:38
@ kLHintsLeft
Definition: TGLayout.h:31
@ kLHintsTop
Definition: TGLayout.h:34
@ kLHintsExpandX
Definition: TGLayout.h:37
ETGeoMediumWid
@ kMED_SENS
@ kMED_MATSEL
@ kMED_TMAX
@ kMED_UNDO
@ kMED_STMIN
@ kMED_APPLY
@ kMED_CANCEL
@ kMED_STEMAX
@ kMED_ID
@ kMED_FLDOPT
@ kMED_EPSIL
@ kMED_FIELDM
@ kMED_EDIT_MAT
@ kMED_NAME
@ kMED_DEEMAX
virtual void SetToolTipText(const char *text, Long_t delayms=400)
Set tool tip text associated with this button.
Definition: TGButton.cxx:395
virtual void SetEnabled(Bool_t e=kTRUE)
Set enabled or disabled state of button.
Definition: TGButton.cxx:409
virtual Bool_t IsOn() const
Definition: TGButton.h:311
virtual void SetState(EButtonState state, Bool_t emit=kFALSE)
Set check button state.
Definition: TGButton.cxx:1200
const TGPicture * GetPicture(const char *name)
Get picture from the picture pool.
Definition: TGClient.cxx:289
virtual Int_t GetSelected() const
Definition: TGComboBox.h:134
virtual void AddEntry(TGString *s, Int_t id)
Definition: TGComboBox.h:106
virtual void Select(Int_t id, Bool_t emit=kTRUE)
Make the selected item visible in the combo box window and emit signals according to the second param...
Definition: TGComboBox.cxx:443
virtual Int_t GetNumberOfEntries() const
Definition: TGComboBox.h:127
virtual TList * GetList() const
Definition: TGFrame.h:369
TGCompositeFrame(const TGCompositeFrame &)
virtual void AddFrame(TGFrame *f, TGLayoutHints *l=0)
Add frame to the composite frame using the specified layout hints.
Definition: TGFrame.cxx:1099
virtual void Cleanup()
Cleanup and delete all objects contained in this composite frame.
Definition: TGFrame.cxx:949
TGFrame * fFrame
Definition: TGLayout.h:119
virtual void ChangeOptions(UInt_t options)
Change frame options. Options is an OR of the EFrameTypes.
Definition: TGFrame.cxx:303
virtual UInt_t GetDefaultHeight() const
Definition: TGFrame.h:238
virtual void Resize(UInt_t w=0, UInt_t h=0)
Resize the frame.
Definition: TGFrame.cxx:587
virtual void SetTextColor(Pixel_t color, Bool_t global=kFALSE)
Changes text color.
Definition: TGLabel.cxx:359
virtual void SetText(TGString *newText)
Set new text in label.
Definition: TGLabel.cxx:177
virtual void SetNumber(Double_t val)
UInt_t GetDefaultHeight() const
TGNumberEntryField * GetNumberEntry() const
virtual void Associate(const TGWindow *w)
Make w the window that will receive the generated messages.
virtual Long_t GetIntNumber() const
virtual Double_t GetNumber() const
TGClient * fClient
Definition: TGObject.h:37
virtual void SetDefaultSize(UInt_t w, UInt_t h)
Set the default / minimal size of the widget.
const char * GetText() const
Definition: TGTextEntry.h:134
virtual void SetToolTipText(const char *text, Long_t delayms=500)
Set tool tip text associated with this text entry.
virtual void SetText(const char *text, Bool_t emit=kTRUE)
Sets text entry to text, clears the selection and moves the cursor to the end of the line.
virtual void Associate(const TGWindow *w)
Definition: TGWidget.h:84
Bool_t fInit
Definition: TGedFrame.h:53
virtual void MakeTitle(const char *title)
Create attribute frame title.
Definition: TGedFrame.cxx:96
Common base class for geombuilder editors.
Definition: TGeoGedFrame.h:13
virtual void SetActive(Bool_t active=kTRUE)
Set active GUI attribute frames related to the selected object.
TGeoTabManager * fTabMgr
Definition: TGeoGedFrame.h:17
Base class describing materials.
Definition: TGeoMaterial.h:31
Editor class for TGeo tracking media.
TGComboBox * fMagfldOption
TGNumberEntry * fMedFieldm
void DoMedName()
Slot for medium name.
void DoUndo()
Slot for undoing last operation.
void DoEditMaterial()
Edit selected material.
TGTextButton * fUndo
TGNumberEntry * fMedStemax
void DoStmin()
Slot for min. step.
void DoMedId()
Slot for medium id.
TGTextButton * fApply
TGLabel * fLSelMaterial
virtual void SetModel(TObject *obj)
Connect to the selected object.
TGeoMediumEditor(const TGWindow *p=0, Int_t width=140, Int_t height=30, UInt_t options=kChildFrame, Pixel_t back=GetDefaultFrameBackground())
Constructor for medium editor.
void DoEpsil()
Slot for tracking precision.
void DoMagfldSelect(Int_t ientry)
Slot for mag. field.
void DoToggleSensitive()
Slot for sensitivity.
void DoApply()
Slot for applying modifications.
TGPictureButton * fBSelMaterial
TGeoMedium * fMedium
virtual ~TGeoMediumEditor()
Destructor.
TGNumberEntry * fMedDeemax
void DoSelectMaterial()
Select the material component.
void DoTmaxfd()
Slot for tmaxfd.
TGNumberEntry * fMedStmin
void DoStemax()
Slot for the max allowed step.
void DoDeemax()
Slot for the maximum allowed dedx.
void DoFieldm()
Slot for max field.
TGNumberEntry * fMedId
TGNumberEntry * fMedTmaxfd
TGeoMaterial * fSelectedMaterial
TGNumberEntry * fMedEpsil
virtual void ConnectSignals2Slots()
Connect signals to slots.
TGTextButton * fEditMaterial
TGTextEntry * fMedName
TGCheckButton * fMedSensitive
Media are used to store properties related to tracking and which are useful only when using geometry ...
Definition: TGeoMedium.h:24
void SetId(Int_t id)
Definition: TGeoMedium.h:54
Int_t GetId() const
Definition: TGeoMedium.h:48
void SetParam(Int_t i, Double_t val)
Definition: TGeoMedium.h:50
TGeoMaterial * GetMaterial() const
Definition: TGeoMedium.h:52
Double_t GetParam(Int_t i) const
Definition: TGeoMedium.h:49
void GetMaterialEditor(TGeoMaterial *material)
Get editor for a material.
static void Cleanup(TGCompositeFrame *frame)
Static method to cleanup hierarchically all daughters of a composite frame.
static TObject * GetSelected()
static; return selected object
virtual void SetName(const char *name)
Set the name of the TNamed.
Definition: TNamed.cxx:140
virtual const char * GetName() const
Returns name of object.
Definition: TNamed.h:47
Mother of all ROOT objects.
Definition: TObject.h:37
virtual const char * ClassName() const
Returns name of class to which the object belongs.
Definition: TObject.cxx:128
Bool_t Connect(const char *signal, const char *receiver_class, void *receiver, const char *slot)
Non-static method is used to connect from the signal of this object to the receiver slot.
Definition: TQObject.cxx:867
TF1 * f1
Definition: legend1.C:11