Files
geant4/examples/advanced/ChargeExchangeMC/include/CexmcEnergyDepositDigitizer.hh
2016-06-10 12:08:39 +02:00

589 lines
19 KiB
C++

//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
/*
* =============================================================================
*
* Filename: CexmcEnergyDepositDigitizer.hh
*
* Description: digitizes of energy deposit in a single event
*
* Version: 1.0
* Created: 23.11.2009 14:14:47
* Revision: none
* Compiler: gcc
*
* Author: Alexey Radkov (),
* Company: PNPI
*
* =============================================================================
*/
#ifndef CEXMC_ENERGY_DEPOSIT_DIGITIZER_HH
#define CEXMC_ENERGY_DEPOSIT_DIGITIZER_HH
#include <iosfwd>
#include <G4VDigitizerModule.hh>
#include <G4SystemOfUnits.hh>
#include "CexmcEnergyDepositStore.hh"
#include "CexmcSimpleRangeWithValue.hh"
#include "CexmcException.hh"
#include "CexmcCommon.hh"
class G4String;
class CexmcEnergyDepositDigitizerMessenger;
class CexmcEnergyDepositDigitizer : public G4VDigitizerModule
{
public:
explicit CexmcEnergyDepositDigitizer( const G4String & name );
~CexmcEnergyDepositDigitizer();
public:
void Digitize( void );
public:
G4double GetMonitorED( void ) const;
G4double GetVetoCounterEDLeft( void ) const;
G4double GetVetoCounterEDRight( void ) const;
G4double GetCalorimeterEDLeft( void ) const;
G4double GetCalorimeterEDRight( void ) const;
G4int GetCalorimeterEDLeftMaxX( void ) const;
G4int GetCalorimeterEDLeftMaxY( void ) const;
G4int GetCalorimeterEDRightMaxX( void ) const;
G4int GetCalorimeterEDRightMaxY( void ) const;
const CexmcEnergyDepositCalorimeterCollection &
GetCalorimeterEDLeftCollection( void ) const;
const CexmcEnergyDepositCalorimeterCollection &
GetCalorimeterEDRightCollection( void ) const;
public:
G4bool MonitorHasTriggered( void ) const;
G4bool HasTriggered( void ) const;
public:
void SetMonitorThreshold( G4double value,
G4bool fromMessenger = true );
void SetVetoCounterLeftThreshold( G4double value,
G4bool fromMessenger = true );
void SetVetoCounterRightThreshold( G4double value,
G4bool fromMessenger = true );
void SetVetoCountersThreshold( G4double value );
void SetCalorimeterLeftThreshold( G4double value,
G4bool fromMessenger = true );
void SetCalorimeterRightThreshold( G4double value,
G4bool fromMessenger = true );
void SetCalorimetersThreshold( G4double value );
void SetCalorimeterTriggerAlgorithm(
CexmcCalorimeterTriggerAlgorithm value,
G4bool fromMessenger = true );
void SetOuterCrystalsVetoAlgorithm(
CexmcOuterCrystalsVetoAlgorithm value,
G4bool fromMessenger = true );
void SetOuterCrystalsVetoFraction( G4double value,
G4bool fromMessenger = true );
void ApplyFiniteCrystalResolution( G4bool value,
G4bool fromMessenger = true );
void AddCrystalResolutionRange( G4double bottom, G4double top,
G4double value,
G4bool fromMessenger = true );
void ClearCrystalResolutionData( G4bool fromMessenger = true );
void SetCrystalResolutionData(
const CexmcEnergyRangeWithDoubleValueList & data );
G4double GetMonitorThreshold( void ) const;
G4double GetVetoCounterLeftThreshold( void ) const;
G4double GetVetoCounterRightThreshold( void ) const;
G4double GetCalorimeterLeftThreshold( void ) const;
G4double GetCalorimeterRightThreshold( void ) const;
CexmcCalorimeterTriggerAlgorithm
GetCalorimeterTriggerAlgorithm( void ) const;
CexmcOuterCrystalsVetoAlgorithm
GetOuterCrystalsVetoAlgorithm( void ) const;
G4double GetOuterCrystalsVetoFraction( void ) const;
G4bool IsFiniteCrystalResolutionApplied( void ) const;
const CexmcEnergyRangeWithDoubleValueList &
GetCrystalResolutionData( void ) const;
public:
G4bool IsOuterCrystal( G4int column, G4int row ) const;
private:
void InitializeData( void );
private:
G4double monitorED;
G4double vetoCounterEDLeft;
G4double vetoCounterEDRight;
CexmcEnergyDepositCalorimeterCollection calorimeterEDLeftCollection;
CexmcEnergyDepositCalorimeterCollection calorimeterEDRightCollection;
G4double calorimeterEDLeft;
G4double calorimeterEDRight;
G4int calorimeterEDLeftMaxX;
G4int calorimeterEDLeftMaxY;
G4int calorimeterEDRightMaxX;
G4int calorimeterEDRightMaxY;
G4bool monitorHasTriggered;
G4bool hasTriggered;
private:
G4double monitorEDThreshold;
G4double vetoCounterEDLeftThreshold;
G4double vetoCounterEDRightThreshold;
G4double calorimeterEDLeftThreshold;
G4double calorimeterEDRightThreshold;
CexmcCalorimeterTriggerAlgorithm calorimeterTriggerAlgorithm;
CexmcOuterCrystalsVetoAlgorithm outerCrystalsVetoAlgorithm;
G4double outerCrystalsVetoFraction;
G4double monitorEDThresholdRef;
G4double vetoCounterEDLeftThresholdRef;
G4double vetoCounterEDRightThresholdRef;
G4double calorimeterEDLeftThresholdRef;
G4double calorimeterEDRightThresholdRef;
CexmcCalorimeterTriggerAlgorithm calorimeterTriggerAlgorithmRef;
CexmcOuterCrystalsVetoAlgorithm outerCrystalsVetoAlgorithmRef;
G4double outerCrystalsVetoFractionRef;
private:
G4int nCrystalsInColumn;
G4int nCrystalsInRow;
private:
G4bool applyFiniteCrystalResolution;
CexmcEnergyRangeWithDoubleValueList crystalResolutionData;
private:
CexmcEnergyDepositDigitizerMessenger * messenger;
};
inline G4double CexmcEnergyDepositDigitizer::GetMonitorED( void ) const
{
return monitorED;
}
inline G4double CexmcEnergyDepositDigitizer::GetVetoCounterEDLeft( void ) const
{
return vetoCounterEDLeft;
}
inline G4double CexmcEnergyDepositDigitizer::GetVetoCounterEDRight( void )
const
{
return vetoCounterEDRight;
}
inline G4double CexmcEnergyDepositDigitizer::GetCalorimeterEDLeft( void ) const
{
return calorimeterEDLeft;
}
inline G4double CexmcEnergyDepositDigitizer::GetCalorimeterEDRight( void )
const
{
return calorimeterEDRight;
}
inline G4int CexmcEnergyDepositDigitizer::GetCalorimeterEDLeftMaxX( void )
const
{
return calorimeterEDLeftMaxX;
}
inline G4int CexmcEnergyDepositDigitizer::GetCalorimeterEDLeftMaxY( void )
const
{
return calorimeterEDLeftMaxY;
}
inline G4int CexmcEnergyDepositDigitizer::GetCalorimeterEDRightMaxX( void )
const
{
return calorimeterEDRightMaxX;
}
inline G4int CexmcEnergyDepositDigitizer::GetCalorimeterEDRightMaxY( void )
const
{
return calorimeterEDRightMaxY;
}
inline const CexmcEnergyDepositCalorimeterCollection &
CexmcEnergyDepositDigitizer::GetCalorimeterEDLeftCollection( void ) const
{
return calorimeterEDLeftCollection;
}
inline const CexmcEnergyDepositCalorimeterCollection &
CexmcEnergyDepositDigitizer::GetCalorimeterEDRightCollection( void ) const
{
return calorimeterEDRightCollection;
}
inline G4bool CexmcEnergyDepositDigitizer::MonitorHasTriggered( void ) const
{
return monitorHasTriggered;
}
inline G4bool CexmcEnergyDepositDigitizer::HasTriggered( void ) const
{
return hasTriggered;
}
inline void CexmcEnergyDepositDigitizer::SetMonitorThreshold(
G4double value, G4bool fromMessenger )
{
if ( fromMessenger )
ThrowExceptionIfProjectIsRead( CexmcBadThreshold,
value < monitorEDThresholdRef );
else
monitorEDThresholdRef = value;
monitorEDThreshold = value;
}
inline void CexmcEnergyDepositDigitizer::SetVetoCounterLeftThreshold(
G4double value, G4bool fromMessenger )
{
if ( fromMessenger )
ThrowExceptionIfProjectIsRead( CexmcBadThreshold,
value > vetoCounterEDLeftThresholdRef );
else
vetoCounterEDLeftThresholdRef = value;
vetoCounterEDLeftThreshold = value;
}
inline void CexmcEnergyDepositDigitizer::SetVetoCounterRightThreshold(
G4double value, G4bool fromMessenger )
{
if ( fromMessenger )
ThrowExceptionIfProjectIsRead( CexmcBadThreshold,
value > vetoCounterEDRightThresholdRef );
else
vetoCounterEDRightThresholdRef = value;
vetoCounterEDRightThreshold = value;
}
inline void CexmcEnergyDepositDigitizer::SetVetoCountersThreshold(
G4double value )
{
ThrowExceptionIfProjectIsRead( CexmcBadThreshold,
value > vetoCounterEDLeftThresholdRef ||
value > vetoCounterEDRightThresholdRef );
vetoCounterEDLeftThreshold = value;
vetoCounterEDRightThreshold = value;
}
inline void CexmcEnergyDepositDigitizer::SetCalorimeterLeftThreshold(
G4double value, G4bool fromMessenger )
{
if ( fromMessenger )
ThrowExceptionIfProjectIsRead( CexmcBadThreshold,
value < calorimeterEDLeftThresholdRef );
else
calorimeterEDLeftThresholdRef = value;
calorimeterEDLeftThreshold = value;
}
inline void CexmcEnergyDepositDigitizer::SetCalorimeterRightThreshold(
G4double value, G4bool fromMessenger )
{
if ( fromMessenger )
ThrowExceptionIfProjectIsRead( CexmcBadThreshold,
value < calorimeterEDRightThresholdRef );
else
calorimeterEDRightThresholdRef = value;
calorimeterEDRightThreshold = value;
}
inline void CexmcEnergyDepositDigitizer::SetCalorimetersThreshold(
G4double value )
{
ThrowExceptionIfProjectIsRead( CexmcBadThreshold,
value < calorimeterEDLeftThresholdRef ||
value < calorimeterEDRightThresholdRef );
calorimeterEDLeftThreshold = value;
calorimeterEDRightThreshold = value;
}
inline void CexmcEnergyDepositDigitizer::SetCalorimeterTriggerAlgorithm(
CexmcCalorimeterTriggerAlgorithm value, G4bool fromMessenger )
{
if ( fromMessenger )
ThrowExceptionIfProjectIsRead( CexmcBadCalorimeterTriggerAlgorithm,
! ( calorimeterTriggerAlgorithmRef ==
CexmcAllCrystalsMakeEDTriggerThreshold ||
value == calorimeterTriggerAlgorithmRef ) );
else
calorimeterTriggerAlgorithmRef = value;
calorimeterTriggerAlgorithm = value;
}
inline void CexmcEnergyDepositDigitizer::SetOuterCrystalsVetoAlgorithm(
CexmcOuterCrystalsVetoAlgorithm value, G4bool fromMessenger )
{
if ( fromMessenger )
ThrowExceptionIfProjectIsRead( CexmcBadOCVetoAlgorithm,
! ( outerCrystalsVetoAlgorithmRef == CexmcNoOuterCrystalsVeto ||
value == outerCrystalsVetoAlgorithmRef ) );
else
outerCrystalsVetoAlgorithmRef = value;
outerCrystalsVetoAlgorithm = value;
}
inline void CexmcEnergyDepositDigitizer::SetOuterCrystalsVetoFraction(
G4double value, G4bool fromMessenger )
{
if ( fromMessenger )
ThrowExceptionIfProjectIsRead( CexmcBadOCVetoFraction,
value > outerCrystalsVetoFractionRef );
else
outerCrystalsVetoFractionRef = value;
outerCrystalsVetoFraction = value;
}
inline void CexmcEnergyDepositDigitizer::ApplyFiniteCrystalResolution(
G4bool value, G4bool fromMessenger )
{
if ( fromMessenger )
ThrowExceptionIfProjectIsRead( CexmcCmdIsNotAllowed );
applyFiniteCrystalResolution = value;
}
inline void CexmcEnergyDepositDigitizer::AddCrystalResolutionRange(
G4double bottom, G4double top,
G4double value, G4bool fromMessenger )
{
if ( fromMessenger )
ThrowExceptionIfProjectIsRead( CexmcCmdIsNotAllowed );
/* range boundaries are given in GeV */
crystalResolutionData.push_back( CexmcEnergyRangeWithDoubleValue(
bottom * GeV, top * GeV, value ) );
}
inline void CexmcEnergyDepositDigitizer::ClearCrystalResolutionData(
G4bool fromMessenger )
{
if ( fromMessenger )
ThrowExceptionIfProjectIsRead( CexmcCmdIsNotAllowed );
crystalResolutionData.clear();
}
inline void CexmcEnergyDepositDigitizer::SetCrystalResolutionData(
const CexmcEnergyRangeWithDoubleValueList & data )
{
ClearCrystalResolutionData( false );
crystalResolutionData = data;
}
inline G4bool CexmcEnergyDepositDigitizer::IsOuterCrystal( G4int column,
G4int row ) const
{
return column == 0 || column == nCrystalsInRow - 1 ||
row == 0 || row == nCrystalsInColumn - 1;
}
inline G4double CexmcEnergyDepositDigitizer::GetMonitorThreshold( void ) const
{
return monitorEDThreshold;
}
inline G4double CexmcEnergyDepositDigitizer::GetVetoCounterLeftThreshold(
void ) const
{
return vetoCounterEDLeftThreshold;
}
inline G4double CexmcEnergyDepositDigitizer::GetVetoCounterRightThreshold(
void ) const
{
return vetoCounterEDRightThreshold;
}
inline G4double CexmcEnergyDepositDigitizer::GetCalorimeterLeftThreshold(
void ) const
{
return calorimeterEDLeftThreshold;
}
inline G4double CexmcEnergyDepositDigitizer::GetCalorimeterRightThreshold(
void ) const
{
return calorimeterEDRightThreshold;
}
inline CexmcCalorimeterTriggerAlgorithm
CexmcEnergyDepositDigitizer::GetCalorimeterTriggerAlgorithm(
void ) const
{
return calorimeterTriggerAlgorithm;
}
inline CexmcOuterCrystalsVetoAlgorithm
CexmcEnergyDepositDigitizer::GetOuterCrystalsVetoAlgorithm(
void ) const
{
return outerCrystalsVetoAlgorithm;
}
inline G4double CexmcEnergyDepositDigitizer::GetOuterCrystalsVetoFraction(
void ) const
{
return outerCrystalsVetoFraction;
}
inline G4bool CexmcEnergyDepositDigitizer::IsFiniteCrystalResolutionApplied(
void ) const
{
return applyFiniteCrystalResolution;
}
inline const CexmcEnergyRangeWithDoubleValueList &
CexmcEnergyDepositDigitizer::GetCrystalResolutionData( void ) const
{
return crystalResolutionData;
}
std::ostream & operator<<( std::ostream & out,
const CexmcEnergyDepositCalorimeterCollection & edCollection );
#endif