Files
geant4/examples/advanced/ChargeExchangeMC/include/CexmcReconstructor.hh
2017-12-08 12:52:30 +01:00

394 lines
12 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: CexmcReconstructor.hh
*
* Description: reconstructor base class
*
* Version: 1.0
* Created: 02.12.2009 15:44:12
* Revision: none
* Compiler: gcc
*
* Author: Alexey Radkov (),
* Company: PNPI
*
* =============================================================================
*/
#ifndef CEXMC_RECONSTRUCTOR_HH
#define CEXMC_RECONSTRUCTOR_HH
#include <G4ThreeVector.hh>
#include <G4AffineTransform.hh>
#include "CexmcSetup.hh"
#include "CexmcCommon.hh"
class CexmcReconstructorMessenger;
struct CexmcEnergyDepositStore;
class CexmcReconstructor
{
public:
explicit CexmcReconstructor();
virtual ~CexmcReconstructor();
public:
virtual void Reconstruct( const CexmcEnergyDepositStore * edStore );
public:
void SetCalorimeterEntryPointDefinitionAlgorithm(
CexmcCalorimeterEntryPointDefinitionAlgorithm algo );
void SetCalorimeterEntryPointDepthDefinitionAlgorithm(
CexmcCalorimeterEntryPointDepthDefinitionAlgorithm algo );
void SetCrystalSelectionAlgorithm(
CexmcCrystalSelectionAlgorithm algo );
void UseInnerRefCrystal( G4bool on = true );
void SetCalorimeterEntryPointDepth( G4double depth );
CexmcCalorimeterEntryPointDefinitionAlgorithm
GetCalorimeterEntryPointDefinitionAlgorithm( void ) const;
CexmcCalorimeterEntryPointDepthDefinitionAlgorithm
GetCalorimeterEntryPointDepthDefinitionAlgorithm( void ) const;
CexmcCrystalSelectionAlgorithm
GetCrystalSelectionAlgorithm( void ) const;
G4bool IsInnerRefCrystalUsed( void ) const;
G4double GetCalorimeterEntryPointDepth( void ) const;
public:
const G4ThreeVector & GetCalorimeterEPLeftPosition( void ) const;
const G4ThreeVector & GetCalorimeterEPRightPosition( void ) const;
const G4ThreeVector & GetCalorimeterEPLeftDirection( void ) const;
const G4ThreeVector & GetCalorimeterEPRightDirection( void ) const;
const G4ThreeVector & GetTargetEPPosition( void ) const;
const G4ThreeVector & GetTargetEPDirection( void ) const;
const G4ThreeVector & GetCalorimeterEPLeftWorldPosition( void ) const;
const G4ThreeVector & GetCalorimeterEPRightWorldPosition( void ) const;
const G4ThreeVector & GetCalorimeterEPLeftWorldDirection( void ) const;
const G4ThreeVector & GetCalorimeterEPRightWorldDirection( void )
const;
const G4ThreeVector & GetTargetEPWorldPosition( void ) const;
const G4ThreeVector & GetTargetEPWorldDirection( void ) const;
G4double GetTheAngle( void ) const;
public:
G4bool HasBasicTrigger( void ) const;
virtual G4bool HasFullTrigger( void ) const;
protected:
void ReconstructEntryPoints(
const CexmcEnergyDepositStore * edStore );
void ReconstructTargetPoint( void );
void ReconstructAngle( void );
private:
void CollectEDInAdjacentCrystals(
const CexmcEnergyDepositCalorimeterCollection & edHits,
G4int row, G4int column, G4double & ed );
void CalculateWeightedEPPosition(
const CexmcEnergyDepositCalorimeterCollection & edHits,
G4int row, G4int column, G4double & x, G4double & y,
G4double & ed );
void TransformToAdjacentInnerCrystal( G4int & column,
G4int & row ) const;
protected:
G4bool hasBasicTrigger;
protected:
CexmcCalorimeterEntryPointDefinitionAlgorithm epDefinitionAlgorithm;
CexmcCalorimeterEntryPointDepthDefinitionAlgorithm
epDepthDefinitionAlgorithm;
CexmcCrystalSelectionAlgorithm csAlgorithm;
G4bool useInnerRefCrystal;
G4double epDepth;
protected:
G4ThreeVector calorimeterEPLeftPosition;
G4ThreeVector calorimeterEPRightPosition;
G4ThreeVector calorimeterEPLeftDirection;
G4ThreeVector calorimeterEPRightDirection;
G4ThreeVector targetEPPosition;
G4ThreeVector targetEPDirection;
G4ThreeVector calorimeterEPLeftWorldPosition;
G4ThreeVector calorimeterEPRightWorldPosition;
G4ThreeVector calorimeterEPLeftWorldDirection;
G4ThreeVector calorimeterEPRightWorldDirection;
G4ThreeVector targetEPWorldPosition;
G4ThreeVector targetEPWorldDirection;
G4double theAngle;
protected:
G4double calorimeterEDLeftAdjacent;
G4double calorimeterEDRightAdjacent;
G4bool collectEDInAdjacentCrystals;
private:
CexmcSetup::CalorimeterGeometryData calorimeterGeometry;
G4AffineTransform calorimeterLeftTransform;
G4AffineTransform calorimeterRightTransform;
G4AffineTransform targetTransform;
G4bool targetEPInitialized;
private:
CexmcReconstructorMessenger * messenger;
};
inline void CexmcReconstructor::SetCalorimeterEntryPointDefinitionAlgorithm(
CexmcCalorimeterEntryPointDefinitionAlgorithm algo )
{
epDefinitionAlgorithm = algo;
}
inline void
CexmcReconstructor::SetCalorimeterEntryPointDepthDefinitionAlgorithm(
CexmcCalorimeterEntryPointDepthDefinitionAlgorithm algo )
{
epDepthDefinitionAlgorithm = algo;
}
inline void CexmcReconstructor::SetCrystalSelectionAlgorithm(
CexmcCrystalSelectionAlgorithm algo )
{
csAlgorithm = algo;
}
inline void CexmcReconstructor::UseInnerRefCrystal( G4bool on )
{
useInnerRefCrystal = on;
}
inline void CexmcReconstructor::SetCalorimeterEntryPointDepth(
G4double depth )
{
epDepth = depth;
}
inline CexmcCalorimeterEntryPointDefinitionAlgorithm
CexmcReconstructor::GetCalorimeterEntryPointDefinitionAlgorithm( void )
const
{
return epDefinitionAlgorithm;
}
inline CexmcCalorimeterEntryPointDepthDefinitionAlgorithm
CexmcReconstructor::GetCalorimeterEntryPointDepthDefinitionAlgorithm(
void ) const
{
return epDepthDefinitionAlgorithm;
}
inline CexmcCrystalSelectionAlgorithm
CexmcReconstructor::GetCrystalSelectionAlgorithm( void ) const
{
return csAlgorithm;
}
inline G4bool CexmcReconstructor::IsInnerRefCrystalUsed( void ) const
{
return useInnerRefCrystal;
}
inline G4double CexmcReconstructor::GetCalorimeterEntryPointDepth( void ) const
{
return epDepth;
}
inline const G4ThreeVector &
CexmcReconstructor::GetCalorimeterEPLeftPosition( void ) const
{
return calorimeterEPLeftPosition;
}
inline const G4ThreeVector &
CexmcReconstructor::GetCalorimeterEPRightPosition( void ) const
{
return calorimeterEPRightPosition;
}
inline const G4ThreeVector &
CexmcReconstructor::GetCalorimeterEPLeftDirection( void ) const
{
return calorimeterEPLeftDirection;
}
inline const G4ThreeVector &
CexmcReconstructor::GetCalorimeterEPRightDirection( void ) const
{
return calorimeterEPRightDirection;
}
inline const G4ThreeVector &
CexmcReconstructor::GetTargetEPPosition( void ) const
{
return targetEPPosition;
}
inline const G4ThreeVector &
CexmcReconstructor::GetTargetEPDirection( void ) const
{
return targetEPDirection;
}
inline const G4ThreeVector &
CexmcReconstructor::GetCalorimeterEPLeftWorldPosition( void ) const
{
return calorimeterEPLeftWorldPosition;
}
inline const G4ThreeVector &
CexmcReconstructor::GetCalorimeterEPRightWorldPosition( void ) const
{
return calorimeterEPRightWorldPosition;
}
inline const G4ThreeVector &
CexmcReconstructor::GetCalorimeterEPLeftWorldDirection( void ) const
{
return calorimeterEPLeftWorldDirection;
}
inline const G4ThreeVector &
CexmcReconstructor::GetCalorimeterEPRightWorldDirection( void ) const
{
return calorimeterEPRightWorldDirection;
}
inline const G4ThreeVector &
CexmcReconstructor::GetTargetEPWorldPosition( void ) const
{
return targetEPWorldPosition;
}
inline const G4ThreeVector &
CexmcReconstructor::GetTargetEPWorldDirection( void ) const
{
return targetEPWorldDirection;
}
inline G4double CexmcReconstructor::GetTheAngle( void ) const
{
return theAngle;
}
inline G4bool CexmcReconstructor::HasBasicTrigger( void ) const
{
return hasBasicTrigger;
}
inline void CexmcReconstructor::TransformToAdjacentInnerCrystal(
G4int & column, G4int & row ) const
{
if ( column == 0 )
++column;
if ( column == calorimeterGeometry.nCrystalsInRow - 1 )
--column;
if ( row == 0 )
++row;
if ( row == calorimeterGeometry.nCrystalsInColumn - 1 )
--row;
}
#endif