//
// ********************************************************************
// * 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.          *
// ********************************************************************
//
//
//
// --------------------------------------------------------------------
// GEANT 4 class header file
//
// Class Description:
//    Extends G4Track properties with information needed for the
//    channeling biasing operator.
//
// ------------------ G4ChannelingTrackData ------------------
//
// Author: M.Verderi (LLR), E. Bagli (INFN) April 2016
//
// --------------------------------------------------------------------

#ifndef G4ChannelingTrackData_hh
#define G4ChannelingTrackData_hh

class G4Channeling;
#include "G4VAuxiliaryTrackInformation.hh"
#include "G4ThreeVector.hh"

class G4ChannelingTrackData : public G4VAuxiliaryTrackInformation {
    friend class G4Channeling;
    
public:
    G4ChannelingTrackData();
    ~G4ChannelingTrackData();
    
    void Print() const;
    
private:
    const G4Channeling* fChannelingProcess;
    
public:
    void Reset(){
        fChannelingProcess = nullptr;
        fNuD = fElD = 1.;
        fPosCh = fMomCh = fDBL;
    }
    
public:
    G4double GetDensity() {return (fNuD + fElD) * 0.5;}
    
    void SetNuD(G4double aDouble) {fNuD = aDouble;};
    G4double GetNuD() {return fNuD;};
    
    void SetElD(G4double aDouble) {fElD = aDouble;};
    G4double GetElD() {return fElD;};

    void SetEFX(G4double aDouble) {fEFX = aDouble;};
    G4double GetEFX() {return fEFX;};

    void SetEFY(G4double aDouble) {fEFY = aDouble;};
    G4double GetEFY() {return fEFY;};
    
    G4ThreeVector GetMomCh() {return fMomCh;}
    void SetMomCh(G4ThreeVector a3vec) {fMomCh = a3vec;}
    
    G4ThreeVector GetPosCh() {return fPosCh;}
    void SetPosCh(G4ThreeVector a3vec) {fPosCh = a3vec;}
    
private:
    // ----------
    // DBL_MAX vector for reset
    // ----------
    G4ThreeVector fDBL;

    // ----------
    // Positiona and momentum in the crystal reference frame
    // ----------
    G4ThreeVector fMomCh;
    G4ThreeVector fPosCh;

    G4double fNuD;
    G4double fElD;

    G4double fEFX;
    G4double fEFY;
};

#endif
