Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/examples/advanced/ChargeExchangeMC/src/CexmcEnergyDepositDigitizerMessenger.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:  CexmcEnergyDepositDigitizerMessenger.cc
 30  *
 31  *    Description:  energy deposit digitizer messenger
 32  *
 33  *        Version:  1.0
 34  *        Created:  29.11.2009 19:07:05
 35  *       Revision:  none
 36  *       Compiler:  gcc
 37  *
 38  *         Author:  Alexey Radkov (), 
 39  *        Company:  PNPI
 40  *
 41  * ============================================================================
 42  */
 43 
 44 #include <G4UIcmdWithADouble.hh>
 45 #include <G4UIcmdWithADoubleAndUnit.hh>
 46 #include <G4UIcmdWithAString.hh>
 47 #include <G4UIcmdWithABool.hh>
 48 #include <G4UIcmdWith3Vector.hh>
 49 #include <G4UIcmdWithoutParameter.hh>
 50 #include "CexmcEnergyDepositDigitizer.hh"
 51 #include "CexmcEnergyDepositDigitizerMessenger.hh"
 52 #include "CexmcMessenger.hh"
 53 #include "CexmcCommon.hh"
 54 
 55 
 56 CexmcEnergyDepositDigitizerMessenger::CexmcEnergyDepositDigitizerMessenger(
 57         CexmcEnergyDepositDigitizer *  energyDepositDigitizer_ ) :
 58     energyDepositDigitizer( energyDepositDigitizer_ ),
 59     setMonitorThreshold( NULL ), setVetoCountersThreshold( NULL ),
 60     setLeftVetoCounterThreshold( NULL ), setRightVetoCounterThreshold( NULL ),
 61     setCalorimetersThreshold( NULL ), setLeftCalorimeterThreshold( NULL ),
 62     setRightCalorimeterThreshold( NULL ),
 63     setCalorimeterTriggerAlgorithm( NULL ),
 64     setOuterCrystalsVetoAlgorithm( NULL ), setOuterCrystalsVetoFraction( NULL ),
 65     applyFiniteCrystalResolution( NULL ), addCrystalResolutionRange( NULL ),
 66     clearCrystalResolutionData( NULL )
 67 {
 68     setMonitorThreshold = new G4UIcmdWithADoubleAndUnit(
 69             ( CexmcMessenger::monitorEDDirName + "threshold" ).c_str(), this );
 70     setMonitorThreshold->SetGuidance( "Monitor trigger threshold" );
 71     setMonitorThreshold->SetParameterName( "MonitorThreshold", false );
 72     setMonitorThreshold->SetDefaultValue( 0 );
 73     setMonitorThreshold->SetUnitCandidates( "ev keV MeV GeV" );
 74     setMonitorThreshold->SetDefaultUnit( "MeV" );
 75     setMonitorThreshold->AvailableForStates( G4State_PreInit, G4State_Idle );
 76 
 77     setVetoCountersThreshold = new G4UIcmdWithADoubleAndUnit(
 78             ( CexmcMessenger::vetoCounterEDDirName + "threshold" ).c_str(),
 79             this );
 80     setVetoCountersThreshold->SetGuidance( "Veto counters trigger threshold" );
 81     setVetoCountersThreshold->SetParameterName( "VetoCountersThreshold",
 82                                                 false );
 83     setVetoCountersThreshold->SetDefaultValue( 0 );
 84     setVetoCountersThreshold->SetUnitCandidates( "ev keV MeV GeV" );
 85     setVetoCountersThreshold->SetDefaultUnit( "MeV" );
 86     setVetoCountersThreshold->AvailableForStates( G4State_PreInit,
 87                                                   G4State_Idle );
 88 
 89     setLeftVetoCounterThreshold = new G4UIcmdWithADoubleAndUnit(
 90             ( CexmcMessenger::vetoCounterLeftEDDirName + "threshold" ).c_str(),
 91             this );
 92     setLeftVetoCounterThreshold->SetGuidance(
 93                                     "Left veto counter trigger threshold" );
 94     setLeftVetoCounterThreshold->SetParameterName( "LeftVetoCounterThreshold",
 95                                                    false );
 96     setLeftVetoCounterThreshold->SetDefaultValue( 0 );
 97     setLeftVetoCounterThreshold->SetUnitCandidates( "ev keV MeV GeV" );
 98     setLeftVetoCounterThreshold->SetDefaultUnit( "MeV" );
 99     setLeftVetoCounterThreshold->AvailableForStates( G4State_PreInit,
100                                                      G4State_Idle );
101 
102     setRightVetoCounterThreshold = new G4UIcmdWithADoubleAndUnit(
103             ( CexmcMessenger::vetoCounterRightEDDirName + "threshold" ).c_str(),
104             this );
105     setRightVetoCounterThreshold->SetGuidance(
106                                     "Right veto counter trigger threshold" );
107     setRightVetoCounterThreshold->SetParameterName( "RightVetoCounterThreshold",
108                                                     false );
109     setRightVetoCounterThreshold->SetDefaultValue( 0 );
110     setRightVetoCounterThreshold->SetUnitCandidates( "ev keV MeV GeV" );
111     setRightVetoCounterThreshold->SetDefaultUnit( "MeV" );
112     setRightVetoCounterThreshold->AvailableForStates( G4State_PreInit,
113                                                       G4State_Idle );
114 
115     setCalorimetersThreshold = new G4UIcmdWithADoubleAndUnit(
116             ( CexmcMessenger::calorimeterEDDirName + "threshold" ).c_str(),
117             this );
118     setCalorimetersThreshold->SetGuidance( "Calorimeters trigger threshold" );
119     setCalorimetersThreshold->SetParameterName( "CalorimetersThreshold",
120                                                 false );
121     setCalorimetersThreshold->SetDefaultValue( 0 );
122     setCalorimetersThreshold->SetUnitCandidates( "ev keV MeV GeV" );
123     setCalorimetersThreshold->SetDefaultUnit( "MeV" );
124     setCalorimetersThreshold->AvailableForStates( G4State_PreInit,
125                                                   G4State_Idle );
126 
127     setLeftCalorimeterThreshold = new G4UIcmdWithADoubleAndUnit(
128             ( CexmcMessenger::calorimeterLeftEDDirName + "threshold" ).c_str(),
129             this );
130     setLeftCalorimeterThreshold->SetGuidance(
131                                     "Left calorimeter trigger threshold" );
132     setLeftCalorimeterThreshold->SetParameterName( "LeftCalorimeterThreshold",
133                                                    false );
134     setLeftCalorimeterThreshold->SetDefaultValue( 0 );
135     setLeftCalorimeterThreshold->SetUnitCandidates( "ev keV MeV GeV" );
136     setLeftCalorimeterThreshold->SetDefaultUnit( "MeV" );
137     setLeftCalorimeterThreshold->AvailableForStates( G4State_PreInit,
138                                                      G4State_Idle );
139 
140     setRightCalorimeterThreshold = new G4UIcmdWithADoubleAndUnit(
141             ( CexmcMessenger::calorimeterRightEDDirName + "threshold" ).c_str(),
142             this );
143     setRightCalorimeterThreshold->SetGuidance(
144                                     "Right calorimeter trigger threshold" );
145     setRightCalorimeterThreshold->SetParameterName( "RightCalorimeterThreshold",
146                                                     false );
147     setRightCalorimeterThreshold->SetDefaultValue( 0 );
148     setRightCalorimeterThreshold->SetUnitCandidates( "ev keV MeV GeV" );
149     setRightCalorimeterThreshold->SetDefaultUnit( "MeV" );
150     setRightCalorimeterThreshold->AvailableForStates( G4State_PreInit,
151                                                       G4State_Idle );
152 
153     setCalorimeterTriggerAlgorithm = new G4UIcmdWithAString(
154             ( CexmcMessenger::detectorDirName +
155               "calorimeterTriggerAlgorithm" ).c_str(), this );
156     setCalorimeterTriggerAlgorithm->SetGuidance( "\n"
157                 "    all - energy deposit in all crystals in a calorimeter\n"
158                 "          will be checked against calorimeter threshold "
159                           "value,\n"
160                 "    inner - energy deposit in only inner crystals\n"
161                 "            will be checked against calorimeter threshold "
162                             "value" );
163     setCalorimeterTriggerAlgorithm->SetParameterName(
164                                         "CalorimeterTriggerAlgorithm", false );
165     setCalorimeterTriggerAlgorithm->SetCandidates( "all inner" );
166     setCalorimeterTriggerAlgorithm->SetDefaultValue( "inner" );
167     setCalorimeterTriggerAlgorithm->AvailableForStates( G4State_PreInit,
168                                                         G4State_Idle );
169 
170     setOuterCrystalsVetoAlgorithm = new G4UIcmdWithAString(
171             ( CexmcMessenger::detectorDirName +
172               "outerCrystalsVetoAlgorithm" ).c_str(), this );
173     setOuterCrystalsVetoAlgorithm->SetGuidance( "\n"
174                 "    none - events will not be rejected by any algorithm,\n"
175                 "    max - reject event trigger if crystal with maximum energy "
176                     "\n          deposit is one of outer crystals,\n"
177                 "    fraction - reject event trigger if energy deposit "
178                     "fraction in\n               outer crystals is more than "
179                     "value of\n               'outerCrystalsVetoFraction'" );
180     setOuterCrystalsVetoAlgorithm->SetParameterName(
181                                         "OuterCrystalsVetoAlgorithm", false );
182     setOuterCrystalsVetoAlgorithm->SetCandidates( "none max fraction" );
183     setOuterCrystalsVetoAlgorithm->SetDefaultValue( "none" );
184     setOuterCrystalsVetoAlgorithm->AvailableForStates( G4State_PreInit,
185                                                        G4State_Idle );
186 
187     setOuterCrystalsVetoFraction = new G4UIcmdWithADouble(
188             ( CexmcMessenger::detectorDirName +
189               "outerCrystalsVetoFraction" ).c_str(), this );
190     setOuterCrystalsVetoFraction->SetGuidance( "\n    Fraction of whole energy "
191             "deposit in one calorimeter\n    that belongs to outer crystals.\n"
192             "    If 'outerCrystalsVetoAlgorithm' is 'fraction' and\n"
193             "    the outer crystals energy deposit fraction exceeds "
194                 "this\n    value then event won't trigger" );
195     setOuterCrystalsVetoFraction->SetParameterName(
196                                         "OuterCrystalsVetoFraction", false );
197     setOuterCrystalsVetoFraction->SetDefaultValue( 0 );
198     setOuterCrystalsVetoFraction->AvailableForStates( G4State_PreInit,
199                                                       G4State_Idle );
200 
201     applyFiniteCrystalResolution = new G4UIcmdWithABool(
202             ( CexmcMessenger::detectorDirName +
203               "applyFiniteCrystalResolution" ).c_str(), this );
204     applyFiniteCrystalResolution->SetGuidance( "\n     Specify if finite "
205             "energy resolution of the crystals\n     will be accounted" );
206     applyFiniteCrystalResolution->SetParameterName(
207                                         "ApplyFiniteCrystalResolution", true );
208     applyFiniteCrystalResolution->SetDefaultValue( true );
209     applyFiniteCrystalResolution->AvailableForStates( G4State_PreInit,
210                                                       G4State_Idle );
211 
212     addCrystalResolutionRange = new G4UIcmdWith3Vector(
213             ( CexmcMessenger::detectorDirName +
214               "addCrystalResolutionRange" ).c_str(), this );
215     addCrystalResolutionRange->SetGuidance( "\n     Add new energy range "
216             "(in GeV!) with fwhm percentage\n     value of crystal resolution "
217             "in this range" );
218     addCrystalResolutionRange->SetParameterName(
219             "CrystalResolutionRangeBottom", "CrystalResolutionRangeTop",
220             "CrystalResolutionRangeValue", false );
221     addCrystalResolutionRange->SetRange( "CrystalResolutionRangeBottom >= 0. "
222             "&& CrystalResolutionRangeTop >= 0. && "
223             "CrystalResolutionRangeValue >= 0." );
224     addCrystalResolutionRange->AvailableForStates( G4State_PreInit,
225                                                    G4State_Idle );
226 
227     clearCrystalResolutionData = new G4UIcmdWithoutParameter(
228             ( CexmcMessenger::detectorDirName +
229               "clearCrystalResolutionData" ).c_str(), this );
230     clearCrystalResolutionData->SetGuidance( "\n     Clear all crystal "
231               "resolution ranges.\n     Can be used to redefine crystal "
232               "resolution data" );
233     clearCrystalResolutionData->AvailableForStates( G4State_PreInit,
234                                                     G4State_Idle );
235 }
236 
237 
238 CexmcEnergyDepositDigitizerMessenger::~CexmcEnergyDepositDigitizerMessenger()
239 {
240     delete setMonitorThreshold;
241     delete setVetoCountersThreshold;
242     delete setLeftVetoCounterThreshold;
243     delete setRightVetoCounterThreshold;
244     delete setCalorimetersThreshold;
245     delete setLeftCalorimeterThreshold;
246     delete setRightCalorimeterThreshold;
247     delete setCalorimeterTriggerAlgorithm;
248     delete setOuterCrystalsVetoAlgorithm;
249     delete setOuterCrystalsVetoFraction;
250     delete applyFiniteCrystalResolution;
251     delete addCrystalResolutionRange;
252     delete clearCrystalResolutionData;
253 }
254 
255 
256 void  CexmcEnergyDepositDigitizerMessenger::SetNewValue( G4UIcommand *  cmd,
257                                                          G4String  value )
258 {
259     do
260     {
261         if ( cmd == setMonitorThreshold )
262         {
263             energyDepositDigitizer->SetMonitorThreshold(
264                         G4UIcmdWithADoubleAndUnit::GetNewDoubleValue( value ) );
265             break;
266         }
267         if ( cmd == setVetoCountersThreshold )
268         {
269             energyDepositDigitizer->SetVetoCountersThreshold(
270                         G4UIcmdWithADoubleAndUnit::GetNewDoubleValue( value ) );
271             break;
272         }
273         if ( cmd == setLeftVetoCounterThreshold )
274         {
275             energyDepositDigitizer->SetVetoCounterLeftThreshold(
276                         G4UIcmdWithADoubleAndUnit::GetNewDoubleValue( value ) );
277             break;
278         }
279         if ( cmd == setRightVetoCounterThreshold )
280         {
281             energyDepositDigitizer->SetVetoCounterRightThreshold(
282                         G4UIcmdWithADoubleAndUnit::GetNewDoubleValue( value ) );
283             break;
284         }
285         if ( cmd == setCalorimetersThreshold )
286         {
287             energyDepositDigitizer->SetCalorimetersThreshold(
288                         G4UIcmdWithADoubleAndUnit::GetNewDoubleValue( value ) );
289             break;
290         }
291         if ( cmd == setLeftCalorimeterThreshold )
292         {
293             energyDepositDigitizer->SetCalorimeterLeftThreshold(
294                         G4UIcmdWithADoubleAndUnit::GetNewDoubleValue( value ) );
295             break;
296         }
297         if ( cmd == setRightCalorimeterThreshold )
298         {
299             energyDepositDigitizer->SetCalorimeterRightThreshold(
300                         G4UIcmdWithADoubleAndUnit::GetNewDoubleValue( value ) );
301             break;
302         }
303         if ( cmd == setCalorimeterTriggerAlgorithm )
304         {
305             CexmcCalorimeterTriggerAlgorithm  calorimeterTriggerAlgorithm(
306                                     CexmcAllCrystalsMakeEDTriggerThreshold );
307             do
308             {
309                 if ( value == "inner" )
310                 {
311                     calorimeterTriggerAlgorithm =
312                                     CexmcInnerCrystalsMakeEDTriggerThreshold;
313                     break;
314                 }
315             } while ( false );
316             energyDepositDigitizer->SetCalorimeterTriggerAlgorithm(
317                                                 calorimeterTriggerAlgorithm );
318             break;
319         }
320         if ( cmd == setOuterCrystalsVetoAlgorithm )
321         {
322             CexmcOuterCrystalsVetoAlgorithm  outerCrystalsVetoAlgorithm(
323                                                     CexmcNoOuterCrystalsVeto );
324             do
325             {
326                 if ( value == "max" )
327                 {
328                     outerCrystalsVetoAlgorithm =
329                                         CexmcMaximumEDInASingleOuterCrystalVeto;
330                     break;
331                 }
332                 if ( value == "fraction" )
333                 {
334                     outerCrystalsVetoAlgorithm =
335                                         CexmcFractionOfEDInOuterCrystalsVeto;
336                     break;
337                 }
338             } while ( false );
339             energyDepositDigitizer->SetOuterCrystalsVetoAlgorithm(
340                                                 outerCrystalsVetoAlgorithm );
341             break;
342         }
343         if ( cmd == setOuterCrystalsVetoFraction )
344         {
345             energyDepositDigitizer->SetOuterCrystalsVetoFraction(
346                         G4UIcmdWithADouble::GetNewDoubleValue( value ) );
347             break;
348         }
349         if ( cmd == applyFiniteCrystalResolution )
350         {
351             energyDepositDigitizer->ApplyFiniteCrystalResolution(
352                         G4UIcmdWithABool::GetNewBoolValue( value ) );
353             break;
354         }
355         if ( cmd == addCrystalResolutionRange )
356         {
357             G4ThreeVector  vec( G4UIcmdWith3Vector::GetNew3VectorValue(
358                                                                     value ) );
359             G4double       bottom( std::min( vec.x(), vec.y() ) );
360             G4double       top( std::max( vec.x(), vec.y() ) );
361             energyDepositDigitizer->AddCrystalResolutionRange( bottom, top,
362                                                                vec.z() );
363             break;
364         }
365         if ( cmd == clearCrystalResolutionData )
366         {
367             energyDepositDigitizer->ClearCrystalResolutionData();
368             break;
369         }
370     } while ( false );
371 }
372 
373