// ESAF : Euso Simulation and Analysis Framework // $Id: LowtranRadiativeProcessesCalculator.hh,v 1.20 2005/11/02 14:20:54 moreggia Exp $ // Sylvain Moreggia created Jan, 29 2004 #ifndef __LOWTRANRADIATIVEPROCESSESCALCULATOR_HH_ #define __LOWTRANRADIATIVEPROCESSESCALCULATOR_HH_ #include "euso.hh" #include "RadiativeProcessesCalculator.hh" class EsafDirection; class BunchOfPhotons; class SinglePhoton; struct LowtranTransferOutput; class Ground; class DetectorGeometry; class ListPhotonsInAtmosphere; class LowtranRadiativeProcessesCalculator : public RadiativeProcessesCalculator { public: // ctor LowtranRadiativeProcessesCalculator(); // dtor virtual ~LowtranRadiativeProcessesCalculator(); // Pre-process for bunch transmission // Initialization of tables for a step by step transfer process void PreProcess(const BunchOfPhotons&); // Preprocess for SinglePhoton list propagation void MakeVerticalDatacard(const Ground*,Double_t); // Preprocess for SinglePhoton list propagation, in case RT decoupled mode is used void MakeTrackToDetectorDatacard(const Ground* ground, const EarthVector& detector, const ListPhotonsInAtmosphere& track); // Total transmission between singlephoton position and finalpos (EUSO() by default) // Details of transmission components stored into coeff[4] if required virtual Double_t Trans(const SinglePhoton&, const EarthVector& finalpos, Double_t* coeff=0) const; // Total transmission between two positions (for bunches) virtual void Trans(const BunchOfPhotons&,const EarthVector&,vector&) const; // get ready for next event void Reset(); private: // Change of frame to match lowtran // v1 is the reference, v2 is the transformed one EarthVector InLowtranFrame(const EarthVector&,const EarthVector&) const; // Call lowtran (100 wavelength processed) void CallLowtran100(const EarthVector&,const EarthVector&,struct LowtranTransferOutput&) const; // Clean fLocalCeff void CleanBuffer(string); // Interpolation for step by step processes Double_t Interpolate(Int_t,Int_t,const EarthVector&) const; // Interpolation of transmission coefficients as a function of wavelength Double_t InterpolWl(string,Double_t,Double_t,Double_t,Double_t,Double_t) const; // switch on/off fVertical flag inline void SetVertical(Bool_t vert=true) {fVertical = vert;} Bool_t fFlag; // to know if PreProcess(BunchOfPhotons) has been run Bool_t fVertical; // tell if fToDetectorCoeff for vertical path (otherwise along track) EarthVector fInitPos; // position where transmission tables start Int_t fNbwl; // nb of wavelength treated for the bunch process Float_t fWlArray[100]; // wavelengths treated by lowtran vector >*> fAlongTrackCoeff; // 3D-list [Nbstep][4][fNbwl] of transmission (4 kinds) along track vector >*> fToDetectorCoeff; // 3D-list [nbstep][4][fNbwl] of VERTICAL transmission to detector const ListPhotonsInAtmosphere* fTrack; // copy of the list containing the light track (used in single propagation) EarthVector fImpact; // track impact for SinglePhoton transmission Double_t fStep_along_track; // step for lowtran datacard along track (used by BunchRT) Double_t fStep_detector; // step for lowtran datacard to detector Double_t fDetectorAlt; // detector altitude (for fToDetectorCoeff[][][] datacard) mutable Double_t fNbSinglesFarFromTrack; // should be less than fNbSinglesCorrected of 02_CS propagators (DEBUG var.) ClassDef(LowtranRadiativeProcessesCalculator,0) }; #endif /* __LOWTRANRADIATIVEPROCESSESCALCULATOR_HH_ */