Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/examples/advanced/ChargeExchangeMC/src/CexmcChargeExchangeReconstructorMessenger.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  1 //
  2 // ********************************************************************
  3 // * License and Disclaimer                                           *
  4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.                             *
 10 // *                                                                  *
 11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                                                  *
 18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // ********************************************************************
 25 //
 26 /*
 27  * ============================================================================
 28  *
 29  *       Filename:  CexmcChargeExchangeReconstructorMessenger.cc
 30  *
 31  *    Description:  charge exchange reconstructor messenger
 32  *
 33  *        Version:  1.0
 34  *        Created:  14.12.2009 17:53:33
 35  *       Revision:  none
 36  *       Compiler:  gcc
 37  *
 38  *         Author:  Alexey Radkov (), 
 39  *        Company:  PNPI
 40  *
 41  * ============================================================================
 42  */
 43 
 44 #include <G4UIcmdWithABool.hh>
 45 #include <G4UIcmdWithAString.hh>
 46 #include <G4UIcmdWithADoubleAndUnit.hh>
 47 #include "CexmcChargeExchangeReconstructorMessenger.hh"
 48 #include "CexmcChargeExchangeReconstructor.hh"
 49 #include "CexmcMessenger.hh"
 50 
 51 
 52 CexmcChargeExchangeReconstructorMessenger::
 53         CexmcChargeExchangeReconstructorMessenger(
 54                         CexmcChargeExchangeReconstructor *  reconstructor_ ) :
 55             reconstructor( reconstructor_ ), useTableMass( NULL ),
 56             useMassCut( NULL ), mCutOPCenter( NULL ), mCutNOPCenter( NULL ),
 57             mCutOPWidth( NULL ), mCutNOPWidth( NULL ), mCutAngle( NULL ),
 58             useAbsorbedEnergyCut( NULL ), aeCutCLCenter( NULL ),
 59             aeCutCRCenter( NULL ), aeCutCLWidth( NULL ), aeCutCRWidth( NULL ),
 60             aeCutAngle( NULL ), setExpectedMomentumAmp( NULL ),
 61             setExpectedMomentumAmpDiff( NULL ), setEDCollectionAlgorithm( NULL )
 62 {
 63     useTableMass = new G4UIcmdWithABool(
 64         ( CexmcMessenger::reconstructorDirName + "useTableMass" ).c_str(),
 65         this );
 66     useTableMass->SetGuidance( "\n    If true then reconstructor will use "
 67         "table mass of output\n    particle when building output particle "
 68         "energy,\n    otherwise reconstructed mass will be used" );
 69     useTableMass->SetParameterName( "UseTableMass", true );
 70     useTableMass->SetDefaultValue( true );
 71     useTableMass->AvailableForStates( G4State_PreInit, G4State_Idle );
 72 
 73     useMassCut = new G4UIcmdWithABool(
 74         ( CexmcMessenger::reconstructorDirName + "useMassCut" ).c_str(), this );
 75     useMassCut->SetGuidance( "\n    Use elliptical cut for masses of output "
 76                              "particle\n    and nucleus output particle" );
 77     useMassCut->SetParameterName( "UseMassCut", true );
 78     useMassCut->SetDefaultValue( true );
 79     useMassCut->AvailableForStates( G4State_PreInit, G4State_Idle );
 80 
 81     mCutOPCenter = new G4UIcmdWithADoubleAndUnit(
 82         ( CexmcMessenger::reconstructorDirName + "mCutOPCenter" ).c_str(),
 83         this );
 84     mCutOPCenter->SetGuidance( "\n    Center of the ellipse in output particle "
 85                                "mass coordinate" );
 86     mCutOPCenter->SetParameterName( "MCutOPCenter", false );
 87     mCutOPCenter->SetDefaultValue( reconstructor->GetProductionModelData().
 88                                    outputParticle->GetPDGMass() );
 89     mCutOPCenter->SetUnitCandidates( "eV keV MeV GeV" );
 90     mCutOPCenter->SetDefaultUnit( "MeV" );
 91     mCutOPCenter->AvailableForStates( G4State_PreInit, G4State_Idle );
 92 
 93     mCutNOPCenter = new G4UIcmdWithADoubleAndUnit(
 94         ( CexmcMessenger::reconstructorDirName + "mCutNOPCenter" ).c_str(),
 95         this );
 96     mCutNOPCenter->SetGuidance( "\n    Center of the ellipse in nucleus output "
 97                                 "particle mass\n    coordinate" );
 98     mCutNOPCenter->SetParameterName( "MCutNOPCenter", false );
 99     mCutNOPCenter->SetDefaultValue( reconstructor->GetProductionModelData().
100                                     nucleusOutputParticle->GetPDGMass() );
101     mCutNOPCenter->SetUnitCandidates( "eV keV MeV GeV" );
102     mCutNOPCenter->SetDefaultUnit( "MeV" );
103     mCutNOPCenter->AvailableForStates( G4State_PreInit, G4State_Idle );
104 
105     mCutOPWidth = new G4UIcmdWithADoubleAndUnit(
106         ( CexmcMessenger::reconstructorDirName + "mCutOPWidth" ).c_str(),
107         this );
108     mCutOPWidth->SetGuidance( "\n    Width of the ellipse in output particle "
109                                "mass coordinate" );
110     mCutOPWidth->SetParameterName( "MCutOPWidth", false );
111     mCutOPWidth->SetDefaultValue( reconstructor->GetProductionModelData().
112                                   outputParticle->GetPDGMass() * 0.1 );
113     mCutOPWidth->SetUnitCandidates( "eV keV MeV GeV" );
114     mCutOPWidth->SetDefaultUnit( "MeV" );
115     mCutOPWidth->AvailableForStates( G4State_PreInit, G4State_Idle );
116 
117     mCutNOPWidth = new G4UIcmdWithADoubleAndUnit(
118         ( CexmcMessenger::reconstructorDirName + "mCutNOPWidth" ).c_str(),
119         this );
120     mCutNOPWidth->SetGuidance( "\n    Width of the ellipse in nucleus output "
121                                "particle mass\n    coordinate" );
122     mCutNOPWidth->SetParameterName( "MCutNOPWidth", false );
123     mCutNOPWidth->SetDefaultValue( reconstructor->GetProductionModelData().
124                                    nucleusOutputParticle->GetPDGMass() * 0.1 );
125     mCutNOPWidth->SetUnitCandidates( "eV keV MeV GeV" );
126     mCutNOPWidth->SetDefaultUnit( "MeV" );
127     mCutNOPWidth->AvailableForStates( G4State_PreInit, G4State_Idle );
128 
129     mCutAngle = new G4UIcmdWithADoubleAndUnit(
130         ( CexmcMessenger::reconstructorDirName + "mCutAngle" ).c_str(),
131         this );
132     mCutAngle->SetGuidance( "\n    Angle of the ellipse" );
133     mCutAngle->SetParameterName( "MCutAngle", false );
134     mCutAngle->SetDefaultValue( 0 );
135     mCutAngle->SetUnitCandidates( "deg rad" );
136     mCutAngle->SetDefaultUnit( "deg" );
137     mCutAngle->AvailableForStates( G4State_PreInit, G4State_Idle );
138 
139     useAbsorbedEnergyCut = new G4UIcmdWithABool(
140         ( CexmcMessenger::reconstructorDirName + "useAbsorbedEnergyCut" ).
141             c_str(), this );
142     useAbsorbedEnergyCut->SetGuidance( "\n    Use elliptical cut for absorbed "
143                                        "energies in\n    calorimeters" );
144     useAbsorbedEnergyCut->SetParameterName( "UseAbsorbedEnergyCut", true );
145     useAbsorbedEnergyCut->SetDefaultValue( true );
146     useAbsorbedEnergyCut->AvailableForStates( G4State_PreInit, G4State_Idle );
147 
148     aeCutCLCenter = new G4UIcmdWithADoubleAndUnit(
149         ( CexmcMessenger::reconstructorDirName + "aeCutCLCenter" ).c_str(),
150         this );
151     aeCutCLCenter->SetGuidance( "\n    Center of the ellipse in left "
152                                 "calorimeter\n    absorbed energy coordinate" );
153     aeCutCLCenter->SetParameterName( "AECutCLCenter", false );
154     aeCutCLCenter->SetDefaultValue( 0 );
155     aeCutCLCenter->SetUnitCandidates( "eV keV MeV GeV" );
156     aeCutCLCenter->SetDefaultUnit( "MeV" );
157     aeCutCLCenter->AvailableForStates( G4State_PreInit, G4State_Idle );
158 
159     aeCutCRCenter = new G4UIcmdWithADoubleAndUnit(
160         ( CexmcMessenger::reconstructorDirName + "aeCutCRCenter" ).c_str(),
161         this );
162     aeCutCRCenter->SetGuidance( "\n    Center of the ellipse in right "
163                                 "calorimeter\n    absorbed energy coordinate" );
164     aeCutCRCenter->SetParameterName( "AECutCRCenter", false );
165     aeCutCRCenter->SetDefaultValue( 0 );
166     aeCutCRCenter->SetUnitCandidates( "eV keV MeV GeV" );
167     aeCutCRCenter->SetDefaultUnit( "MeV" );
168     aeCutCRCenter->AvailableForStates( G4State_PreInit, G4State_Idle );
169 
170     aeCutCLWidth = new G4UIcmdWithADoubleAndUnit(
171         ( CexmcMessenger::reconstructorDirName + "aeCutCLWidth" ).c_str(),
172         this );
173     aeCutCLWidth->SetGuidance( "\n    Width of the ellipse in left calorimeter"
174                                "\n    absorbed energy coordinate" );
175     aeCutCLWidth->SetParameterName( "AECutCLWidth", false );
176     aeCutCLWidth->SetDefaultValue( 0 );
177     aeCutCLWidth->SetUnitCandidates( "eV keV MeV GeV" );
178     aeCutCLWidth->SetDefaultUnit( "MeV" );
179     aeCutCLWidth->AvailableForStates( G4State_PreInit, G4State_Idle );
180 
181     aeCutCRWidth = new G4UIcmdWithADoubleAndUnit(
182         ( CexmcMessenger::reconstructorDirName + "aeCutCRWidth" ).c_str(),
183         this );
184     aeCutCRWidth->SetGuidance( "\n    Width of the ellipse in right calorimeter"
185                                "\n    absorbed energy coordinate" );
186     aeCutCRWidth->SetParameterName( "AECutCRWidth", false );
187     aeCutCRWidth->SetDefaultValue( 0 );
188     aeCutCRWidth->SetUnitCandidates( "eV keV MeV GeV" );
189     aeCutCRWidth->SetDefaultUnit( "MeV" );
190     aeCutCRWidth->AvailableForStates( G4State_PreInit, G4State_Idle );
191 
192     aeCutAngle = new G4UIcmdWithADoubleAndUnit(
193         ( CexmcMessenger::reconstructorDirName + "aeCutAngle" ).c_str(),
194         this );
195     aeCutAngle->SetGuidance( "\n    Angle of the ellipse" );
196     aeCutAngle->SetParameterName( "AECutAngle", false );
197     aeCutAngle->SetDefaultValue( 0 );
198     aeCutAngle->SetUnitCandidates( "deg rad" );
199     aeCutAngle->SetDefaultUnit( "deg" );
200     aeCutAngle->AvailableForStates( G4State_PreInit, G4State_Idle );
201 
202     setExpectedMomentumAmp = new G4UIcmdWithADoubleAndUnit(
203         ( CexmcMessenger::reconstructorDirName + "momentumAmp" ).c_str(),
204         this );
205     setExpectedMomentumAmp->SetGuidance( "\n    Momentum of a beam particle "
206         "expected in the target;\n    this value may differ from original "
207         "momentum\n    of the beam as far as profile data of the beam refer\n"
208         "    to the place where it starts. This parameter is used only\n"
209         "    in reconstruction procedure");
210     setExpectedMomentumAmp->SetParameterName( "RecMomentumAmp", false );
211     setExpectedMomentumAmp->SetRange( "RecMomentumAmp > 0" );
212     setExpectedMomentumAmp->SetUnitCandidates( "eV keV MeV GeV" );
213     setExpectedMomentumAmp->SetDefaultUnit( "MeV" );
214     setExpectedMomentumAmp->AvailableForStates( G4State_PreInit, G4State_Idle );
215 
216     setExpectedMomentumAmpDiff = new G4UIcmdWithADoubleAndUnit(
217         ( CexmcMessenger::reconstructorDirName + "momentumAmpDiff" ).c_str(),
218         this );
219     setExpectedMomentumAmpDiff->SetGuidance( "\n    Expected difference "
220         "between momenta of the beam\n    on its start and in the target. This "
221         "parameter can\n    be used to automatically calculate value of the\n"
222         "    previous parameter 'momentumAmp'" );
223     setExpectedMomentumAmpDiff->SetParameterName( "RecMomentumAmpDiff", false );
224     setExpectedMomentumAmpDiff->SetDefaultValue( 0 );
225     setExpectedMomentumAmpDiff->SetUnitCandidates( "eV keV MeV GeV" );
226     setExpectedMomentumAmpDiff->SetDefaultUnit( "MeV" );
227     setExpectedMomentumAmpDiff->AvailableForStates( G4State_PreInit,
228                                                     G4State_Idle );
229 
230     setEDCollectionAlgorithm = new G4UIcmdWithAString(
231         ( CexmcMessenger::reconstructorDirName + "edCollectionAlgo" ).c_str(),
232         this );
233     setEDCollectionAlgorithm->SetGuidance(
234         "\n    Choose crystals to be selected when energy deposit collected\n"
235         "    all - all,\n"
236         "    adjacent - crystal with maximum energy deposit and\n"
237         "               adjacent crystals" );
238     setEDCollectionAlgorithm->SetParameterName( "EDCollectionAlgo", false );
239     setEDCollectionAlgorithm->SetCandidates( "all adjacent" );
240     setEDCollectionAlgorithm->SetDefaultValue( "all" );
241     setEDCollectionAlgorithm->AvailableForStates( G4State_PreInit,
242                                                   G4State_Idle );
243 }
244 
245 
246 CexmcChargeExchangeReconstructorMessenger::
247                                     ~CexmcChargeExchangeReconstructorMessenger()
248 {
249     delete useTableMass;
250     delete useMassCut;
251     delete mCutOPCenter;
252     delete mCutNOPCenter;
253     delete mCutOPWidth;
254     delete mCutNOPWidth;
255     delete mCutAngle;
256     delete useAbsorbedEnergyCut;
257     delete aeCutCLCenter;
258     delete aeCutCRCenter;
259     delete aeCutCLWidth;
260     delete aeCutCRWidth;
261     delete aeCutAngle;
262     delete setExpectedMomentumAmp;
263     delete setExpectedMomentumAmpDiff;
264     delete setEDCollectionAlgorithm;
265 }
266 
267 
268 void  CexmcChargeExchangeReconstructorMessenger::SetNewValue(
269                                         G4UIcommand *  cmd, G4String  value )
270 {
271     do
272     {
273         if ( cmd == useTableMass )
274         {
275             reconstructor->UseTableMass(
276                         G4UIcmdWithABool::GetNewBoolValue( value ) );
277             break;
278         }
279         if ( cmd == useMassCut )
280         {
281             reconstructor->UseMassCut(
282                         G4UIcmdWithABool::GetNewBoolValue( value ) );
283             break;
284         }
285         if ( cmd == mCutOPCenter )
286         {
287             reconstructor->SetMassCutOPCenter(
288                         G4UIcmdWithADoubleAndUnit::GetNewDoubleValue( value ) );
289             break;
290         }
291         if ( cmd == mCutNOPCenter )
292         {
293             reconstructor->SetMassCutNOPCenter(
294                         G4UIcmdWithADoubleAndUnit::GetNewDoubleValue( value ) );
295             break;
296         }
297         if ( cmd == mCutOPWidth )
298         {
299             reconstructor->SetMassCutOPWidth(
300                         G4UIcmdWithADoubleAndUnit::GetNewDoubleValue( value ) );
301             break;
302         }
303         if ( cmd == mCutNOPWidth )
304         {
305             reconstructor->SetMassCutNOPWidth(
306                         G4UIcmdWithADoubleAndUnit::GetNewDoubleValue( value ) );
307             break;
308         }
309         if ( cmd == mCutAngle )
310         {
311             reconstructor->SetMassCutEllipseAngle(
312                         G4UIcmdWithADoubleAndUnit::GetNewDoubleValue( value ) );
313             break;
314         }
315         if ( cmd == useAbsorbedEnergyCut )
316         {
317             reconstructor->UseAbsorbedEnergyCut(
318                         G4UIcmdWithABool::GetNewBoolValue( value ) );
319             break;
320         }
321         if ( cmd == aeCutCLCenter )
322         {
323             reconstructor->SetAbsorbedEnergyCutCLCenter(
324                         G4UIcmdWithADoubleAndUnit::GetNewDoubleValue( value ) );
325             break;
326         }
327         if ( cmd == aeCutCRCenter )
328         {
329             reconstructor->SetAbsorbedEnergyCutCRCenter(
330                         G4UIcmdWithADoubleAndUnit::GetNewDoubleValue( value ) );
331             break;
332         }
333         if ( cmd == aeCutCLWidth )
334         {
335             reconstructor->SetAbsorbedEnergyCutCLWidth(
336                         G4UIcmdWithADoubleAndUnit::GetNewDoubleValue( value ) );
337             break;
338         }
339         if ( cmd == aeCutCRWidth )
340         {
341             reconstructor->SetAbsorbedEnergyCutCRWidth(
342                         G4UIcmdWithADoubleAndUnit::GetNewDoubleValue( value ) );
343             break;
344         }
345         if ( cmd == aeCutAngle )
346         {
347             reconstructor->SetAbsorbedEnergyCutEllipseAngle(
348                         G4UIcmdWithADoubleAndUnit::GetNewDoubleValue( value ) );
349             break;
350         }
351         if ( cmd == setExpectedMomentumAmp )
352         {
353             reconstructor->SetExpectedMomentumAmp(
354                         G4UIcmdWithADoubleAndUnit::GetNewDoubleValue( value ) );
355             break;
356         }
357         if ( cmd == setExpectedMomentumAmpDiff )
358         {
359             reconstructor->SetExpectedMomentumAmpDiff(
360                         G4UIcmdWithADoubleAndUnit::GetNewDoubleValue( value ) );
361             break;
362         }
363         if ( cmd == setEDCollectionAlgorithm )
364         {
365             CexmcEDCollectionAlgoritm
366                         edCollectionAlgorithm( CexmcCollectEDInAllCrystals );
367             do
368             {
369                 if ( value == "adjacent" )
370                 {
371                     edCollectionAlgorithm = CexmcCollectEDInAdjacentCrystals;
372                     break;
373                 }
374             } while ( false );
375             reconstructor->SetEDCollectionAlgorithm( edCollectionAlgorithm );
376             break;
377         }
378     } while ( false );
379 }
380 
381