Skip to content
Snippets Groups Projects
  • Whitney Armstrong's avatar
    69e1d4a2
    Updated logging infrastructure · 69e1d4a2
    Whitney Armstrong authored
    - Lots of additional logging after moving spdlog out of project
    - The loggers are mostly defined in the header `analyzer/include/podd2/Logger.h`
    - Next step  is to add file logging and to set good defaults
    - The spdlog severity level (in order of importance) are:
      - critical
      - error
      - warn
      - info
      - debug
      - trace
    
    	modified:   THcHallCSpectrometer.cxx
    	modified:   THcHallCSpectrometer.h
    	modified:   THcPrimaryKine.cxx
    	modified:   THcSecondaryKine.cxx
    	modified:   THcTrigDet.cxx
    69e1d4a2
    History
    Updated logging infrastructure
    Whitney Armstrong authored
    - Lots of additional logging after moving spdlog out of project
    - The loggers are mostly defined in the header `analyzer/include/podd2/Logger.h`
    - Next step  is to add file logging and to set good defaults
    - The spdlog severity level (in order of importance) are:
      - critical
      - error
      - warn
      - info
      - debug
      - trace
    
    	modified:   THcHallCSpectrometer.cxx
    	modified:   THcHallCSpectrometer.h
    	modified:   THcPrimaryKine.cxx
    	modified:   THcSecondaryKine.cxx
    	modified:   THcTrigDet.cxx
THcPrimaryKine.cxx 7.96 KiB
/** \class THcPrimaryKine
    \ingroup PhysMods

\brief Class for the Calculate kinematics of scattering of the primary (beam) particle.
These are usually the electron kinematics.
*/

#include "THcPrimaryKine.h"
#include "THcHallCSpectrometer.h"
#include "THcGlobals.h"
#include "THcParmList.h"
#include "THaRunBase.h"
#include "THaRunParameters.h"
#include "THaBeam.h"
#include "VarDef.h"
#include "TMath.h"
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <iostream>

using namespace std;

ClassImp(THcPrimaryKine)

//_____________________________________________________________________________
THcPrimaryKine::THcPrimaryKine( const char* name, const char* description,
				const char* spectro, Double_t particle_mass,
				Double_t target_mass ) :
  THaPhysicsModule(name,description), fM(particle_mass), 
  fMA(target_mass), fSpectroName(spectro), fSpectro(NULL), fBeam(NULL)
{
  // Standard constructor. Must specify particle mass. Incident particles
  // are assumed to be along z_lab.

}

//_____________________________________________________________________________
THcPrimaryKine::THcPrimaryKine( const char* name, const char* description,
				const char* spectro, const char* beam, 
				Double_t target_mass ) 
  : THaPhysicsModule(name,description), fM(-1.0), fMA(target_mass), 
    fSpectroName(spectro), fBeamName(beam), fSpectro(NULL), fBeam(NULL)
{
  // Constructor with specification of optional beam module.
  // Particle mass will normally come from the beam module.

}
//_____________________________________________________________________________

//_____________________________________________________________________________
THcPrimaryKine::~THcPrimaryKine()
{
  // Destructor

  DefineVariables( kDelete );
}

//_____________________________________________________________________________
void THcPrimaryKine::Clear( Option_t* opt )
{
  // Clear event-by-event variables.

  THaPhysicsModule::Clear(opt);
  fQ2 = fOmega = fW = fW2 = fXbj = fScatAngle = fScatAngle_deg = fEpsilon = fQ3mag
    = fThetaQ = fPhiQ = kBig;
  // Clear the 4-vectors  
  fP0.SetXYZT(kBig,kBig,kBig,kBig);
  fP1 = fA = fA1 = fQ = fP0;
}

//_____________________________________________________________________________
Int_t THcPrimaryKine::DefineVariables( EMode mode )
{
  // Define/delete global variables.

  if( mode == kDefine && fIsSetup ) return kOK;
  fIsSetup = ( mode == kDefine );

  RVarDef vars[] = {
    { "Q2"           , "4-momentum transfer squared (GeV^2)" , "fQ2"            },
    { "omega"        , "Energy transfer (GeV)"               , "fOmega"         },
    { "W2"           , "Invariant mass (GeV^2) for Mp      " , "fW2"            },
    { "W"            , "Sqrt(Invariant mass)  for Mp      "  , "fW"             },
    { "x_bj"         , "Bjorken x"                           , "fXbj"           },
    { "scat_ang_rad" , "Scattering angle (rad)"              , "fScatAngle"     },
    { "scat_ang_deg" , "Scattering angle (deg)"              , "fScatAngle_deg" },
    { "epsilon"      , "Virtual photon polarization factor"  , "fEpsilon"       },
    { "q3m"          , "Magnitude of 3-momentum transfer"    , "fQ3mag"         },
    { "th_q"         , "Theta of 3-momentum vector (rad)"    , "fThetaQ"        },
    { "ph_q"         , "Phi of 3-momentum vector (rad)"      , "fPhiQ"          },
    { "nu"           , "Energy transfer (GeV)"               , "fOmega"         },
    { "q_x"          , "x-cmp of Photon vector in the lab"   , "fQ.X()"         },
    { "q_y"          , "y-cmp of Photon vector in the lab"   , "fQ.Y()"         },
    { "q_z"          , "z-cmp of Photon vector in the lab"   , "fQ.Z()"         },
    { 0 }
  };
  return DefineVarsFromList( vars, mode );
}

//_____________________________________________________________________________
THaAnalysisObject::EStatus THcPrimaryKine::Init( const TDatime& run_time )
{
  // Initialize the module.
  // Locate the spectrometer apparatus named in fSpectroName and save
  // pointer to it.

  fSpectro = dynamic_cast<THcHallCSpectrometer*>
    ( FindModule( fSpectroName.Data(), "THcHallCSpectrometer"));
  if( !fSpectro ) {
    fStatus = kInitError;
    return fStatus;
  }

  // Optional beam apparatus
  if( fBeamName.Length() > 0 ) {
    fBeam = dynamic_cast<THaBeamModule*>
      ( FindModule( fBeamName.Data(), "THaBeamModule") );
    if( !fBeam ) {
      fStatus = kInitError;
      return fStatus;
    }
    if( fM <= 0.0 )
      fM = fBeam->GetBeamInfo()->GetM();
  }

  // Standard initialization. Calls this object's DefineVariables().
  if( THaPhysicsModule::Init( run_time ) != kOK )
    return fStatus;

  if( fM <= 0.0 ) {
    Error( Here("Init"), "Particle mass not defined. Module "
	   "initialization failed" );
    fStatus = kInitError;
  }
  return fStatus;
}

//_____________________________________________________________________________
Int_t THcPrimaryKine::Process( const THaEvData& )
{
  // Calculate electron kinematics for the Golden Track of the spectrometer
  if( !IsOK() || !gHaRun ) return -1;

  THaTrackInfo* trkifo = fSpectro->GetTrackInfo();
  if( !trkifo || !trkifo->IsOK() ) return 1;
  // Determine 4-momentum of incident particle. 
  // If a beam module given, use it to get the beam momentum. This 
  // module may apply corrections for beam energy loss, variations, etc.

  Double_t xptar = trkifo->GetTheta() + fOopCentralOffset;
  TVector3 pvect;
  fSpectro->TransportToLab(trkifo->GetP(), xptar, trkifo->GetPhi(), pvect);

  if( fBeam ) {
    fP0.SetVectM( fBeam->GetBeamInfo()->GetPvect(), fM );
  } else {
    // If no beam given, assume beam along z_lab
    Double_t p_in  = gHaRun->GetParameters()->GetBeamP();
    fP0.SetXYZM( 0.0, 0.0, p_in, fM );
  }

  fP1.SetVectM( pvect, fM );
  fA.SetXYZM( 0.0, 0.0, 0.0, fMA );         // Assume target at rest

  // proton mass (for x_bj)
  const Double_t Mp = 0.93827;
  fMp.SetXYZM( 0.0, 0.0, 0.0, Mp );         // Assume target at rest


  // Standard electron kinematics
  fQ         = fP0 - fP1;  // cqx, cqy, cqz, omega
  fQ2        = -fQ.M2();
  fQ3mag     = fQ.P();
  fOmega     = fQ.E();
  // cqxzabs = TMath::Sqrt(fQ.X()*fQ.X() + fQ.Y()*fQ.Y());
  fA1        = fA + fQ;
  //  fW2        = fA1.M2();
  fMp1        = fMp + fQ;
  fW2        = fMp1.M2();
  if (fW2>0)  fW = TMath::Sqrt(fW2);
  fScatAngle = fP0.Angle( fP1.Vect() );
  fEpsilon   = 1.0 / ( 1.0 + 2.0*fQ3mag*fQ3mag/fQ2*
		       TMath::Power( TMath::Tan(fScatAngle/2.0), 2.0 ));
  fScatAngle_deg = fScatAngle*TMath::RadToDeg();
  fThetaQ    = fQ.Theta();
  fPhiQ      = fQ.Phi();
  fXbj       = fQ2/(2.0*Mp*fOmega);

  fDataValid = true;
  return 0;
}

Int_t THcPrimaryKine::ReadDatabase( const TDatime& date )
{

#ifdef WITH_DEBUG
  _param_logger->debug("In THcPrimaryKine::ReadDatabase()" );
#endif

  char prefix[2];

  prefix[0] = tolower(GetName()[0]);
  prefix[1] = '\0';

  _param_logger->info("THcPrimaryKine  prefix = {}", prefix );
  
  fOopCentralOffset = 0.0;
  DBRequest list[]={
    {"gtargmass_amu",          &fMA_amu,             kDouble,         0,  1},
    {Form("%s_oopcentral_offset",prefix), &fOopCentralOffset,kDouble, 0, 1},
    {0}
  };
  gHcParms->LoadParmValues((DBRequest*)&list);
    //
  fMA= fMA_amu*931.5/1000.;
  return kOK;
}
  
//_____________________________________________________________________________
void THcPrimaryKine::SetMass( Double_t m ) 
{
  if( !IsInit()) {
    fM = m;
  } else {
    PrintInitError("SetMass()");
  }
}

//_____________________________________________________________________________
void THcPrimaryKine::SetTargetMass( Double_t m ) 
{
  if( !IsInit()) {
    fMA = m;
  } else {
    PrintInitError("SetTargetMass()");
  }
}

//_____________________________________________________________________________
void THcPrimaryKine::SetSpectrometer( const char* name ) 
{
  if( !IsInit()) {
    fSpectroName = name; 
  } else {
    PrintInitError("SetSpectrometer()");
  }
}

//_____________________________________________________________________________
void THcPrimaryKine::SetBeam( const char* name ) 
{
  if( !IsInit()) {
    fBeamName = name; 
  } else {
    PrintInitError("SetBeam()");
  }
}