Commit 80d4fb9a authored by Giacomo Artoni's avatar Giacomo Artoni Committed by Graeme Stewart
Browse files

Coverity fixes - Updated ChangeLog - CorrectionCode::Error replaced with...

Coverity fixes - Updated ChangeLog - CorrectionCode::Error replaced with OutOfValidityRegion (MuonMomentumCorrections-01-00-17)

        * Tagging 01-00-17 version
				* Removed warning for muons above eta=3 and return OutOfValidityRange code
				* Fixed some coverity issues
				* Updated ChangeLog

2014-11-24 Giacomo Artoni <Giacomo.Artoni@cern.ch>
        * Tagging 01-00-16 version
				* Bug fix in systematics initialization

2014-11-17 Giacomo Artoni <Giacomo.Artoni@cern.ch>
        * Tagging 01-00-15 version
				* Removed unnecessary warning when correcting stand-alone muon

2014-11-15 Giacomo Artoni <Giacomo.Artoni@cern.ch>
        * Tagging 01-00-14 version
				* Introduced support for PyRoot

2014-11-10 Giacomo Artoni <Giacomo.Artoni@cern.ch>
        * Tagging 01-00-13 version
				* Added decorations for ID and MS corrected momenta
...
(Long ChangeLog diff - truncated)
parent 9a350f97
......@@ -2,8 +2,8 @@
Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
*/
#ifndef MCAST_IMUONSMEARINGTOOL_H
#define MCAST_IMUONSMEARINGTOOL_H
#ifndef MCAST_IMUONCALIBRATIONANDSMEARINGTOOL_H
#define MCAST_IMUONCALIBRATIONANDSMEARINGTOOL_H
// Framework include(s):
#include "AsgTools/IAsgTool.h"
......@@ -12,10 +12,13 @@
#include "xAODMuon/Muon.h"
// Local include(s):
#include "PATInterfaces/ISystematicsTool.h"
#include "PATInterfaces/CorrectionCode.h"
#include "PATInterfaces/SystematicVariation.h"
#include "PATInterfaces/ISystematicsTool.h"
#include "PATInterfaces/SystematicCode.h"
#include "PATInterfaces/SystematicList.h"
#include "PATInterfaces/SystematicRegistry.h"
#include "PATInterfaces/SystematicSet.h"
#include "PATInterfaces/SystematicVariation.h"
namespace CP {
......@@ -42,4 +45,4 @@ public:
} // namespace CP
#endif // MCAST_IMUONSMEARINGTOOL_H
#endif // MCAST_IMUONCALIBRATIONANDSMEARINGTOOL_H
......@@ -2,14 +2,14 @@
Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
*/
#ifndef MCAST_MUONSMEARINGTOOL_H
#define MCAST_MUONSMEARINGTOOL_H
#ifndef MCAST_MUONCALIBRATIONANDMEARINGTOOL_H
#define MCAST_MUONCALIBRATIONANDMEARINGTOOL_H
// Framework include(s):
#include "AsgTools/AsgTool.h"
// Local include(s):
#include "MuonMomentumCorrections/IMuonCalibrationAndSmearingTool.h"
// ROOT include(s)
#include "TRandom.h"
// C++ include(s)
#include <boost/unordered_map.hpp>
......@@ -18,38 +18,39 @@
#include <vector>
#include <map>
// Local include(s):
#include "MuonMomentumCorrections/IMuonCalibrationAndSmearingTool.h"
#define DEFAULT_INIT_VAL -999
#define MCAST_MAX_PT 100000000
namespace CP {
typedef enum { SMEAR_PT=1, SMEAR_QPT=2 } SMEARTYPE;
typedef enum { SCALE_DEFAULT=1, SCALE_KPKM=2, SCALE_KC=3, SCALE_K=4, SCALE_C=5 } SCALETYPE;
typedef enum { DET_MS=1, DET_ID=2, DET_CB=3 } DETTYPE;
typedef enum { ID_UP=1, ID_LOW=2, MS_UP=3, MS_LOW=4,SCALE_UP=5, SCALE_LOW=6 } SYSTTYPE;
typedef enum { DATA10=1, DATA11=2,DATA12=3 } DATATYPE;
typedef enum { MUID=1, STACO=2, MUONS=3 } ALGOTYPE;
typedef enum { REL16_6=1, REL17=2, REL17_2=3, REL17_2_REPRO=4, REL17_2_SUM13=5 } RELTYPE;
const double m_defaultInit = -999.;
namespace MCAST {
namespace DataType { enum { Data10 = 1, Data11 = 2, Data12 = 3 }; }
namespace AlgoType { enum { Muid = 1, Staco = 2, Muons = 3 }; }
namespace Release { enum { Rel16_6 = 1, Rel17 = 2, Rel17_2 = 3, Rel17_2_Repro = 4, Rel17_2_Sum13 = 5 }; }
namespace SmearingType { enum { Pt = 1, QoverPt = 2 }; }
namespace DetectorType { enum { MS = 1, ID = 2, CB = 3 }; }
namespace SystVariation { enum { Default = 0, Down = -1, Up = 1 }; }
}
class MuonCalibrationAndSmearingTool :
public virtual IMuonCalibrationAndSmearingTool,
public virtual ISystematicsTool,
public asg::AsgTool {
class MuonCalibrationAndSmearingTool : public virtual IMuonCalibrationAndSmearingTool, public virtual ISystematicsTool, public asg::AsgTool {
//::: Create a proper constructor for Athena
ASG_TOOL_CLASS2( MuonCalibrationAndSmearingTool, CP::IMuonCalibrationAndSmearingTool, CP::ISystematicsTool )
public:
//::: Create a constructor for standalone usage
//::: Constructor
MuonCalibrationAndSmearingTool( const std::string& name );
//::: Regions helpers
StatusCode Regions( std::string inRegionFile, int doMacroRegionsFlag = 0 );
void PrintRegions() const;
unsigned int GetNRegions() const;
int GetRegion( const double eta, const double phi ) const;
float GetRegionInnerEta( const int r_i ) const; //Return Eta closer to the origin
std::string GetRegionName( const int r_i ) const;
std::string GetRegionName( const double eta, const double phi ) const;
//::: Copy constructor
MuonCalibrationAndSmearingTool( const MuonCalibrationAndSmearingTool& tool );
virtual StatusCode initialize();
......@@ -67,11 +68,20 @@ public:
//::: Use specific systematic
virtual SystematicCode applySystematicVariation ( const SystematicSet& systConfig );
protected:
//::: Regions helpers
StatusCode Regions( std::string inRegionFile, int doMacroRegionsFlag = 0 );
void PrintRegions() const;
unsigned int GetNRegions() const;
int GetRegion( const double eta, const double phi ) const;
float GetRegionInnerEta( const int r_i ) const; //Return Eta closer to the origin
std::string GetRegionName( const int r_i ) const;
std::string GetRegionName( const double eta, const double phi ) const;
double GetSmearing( int, xAOD::Muon& );
double GetSystVariation( int DetType, double var );
int GetScaleRegion( xAOD::Muon& );
void CalcCBWeights( xAOD::Muon& );
double CalculatePt( const int DetType, const double inSmearID = m_defaultInit, const double inSmearMS = m_defaultInit, const double scaleVar = 0. ) const;
double CalculatePt( const int DetType, const double inSmearID = DEFAULT_INIT_VAL, const double inSmearMS = DEFAULT_INIT_VAL, const double scaleVar = 0. ) const;
StatusCode FillValues();
void Clean();
double ScaleApply( const double pt, const double S1, const double S2, double S = 1.0, const double S_EnLoss = 0. ) const;
......@@ -82,30 +92,24 @@ public:
double ExpectedResolution( const std::string& DetType, xAOD::Muon& mu, const bool mc = false ) const; //!< Expected resolution in data (or unsmeard MC if second argument is true)
double ExpectedResolution( const int DetType, xAOD::Muon& mu, const bool mc = false ) const; //!< Expected resolution in data (or unsmeard MC if second argument is true)
DATATYPE SetData( std::string );
ALGOTYPE SetAlgorithm( std::string );
RELTYPE SetRelease( std::string );
StatusCode SetData( std::string );
StatusCode SetAlgorithm( std::string );
StatusCode SetRelease( std::string );
StatusCode SetType( std::string );
private:
struct ParameterSet {
DETTYPE SubDetectorType;
double VarSmearingID;
double VarSmearingMS;
double SmearTypeID;
double SmearTypeMS;
double Scale;
};
boost::unordered_map< SystematicSet, ParameterSet > m_Parameters;
ParameterSet *m_currentParameters;
double m_pTmax;
double m_smearDeltaMS, m_smearDeltaID, m_smearDeltaCB;
std::string m_year, m_algo, m_type, m_release, m_path;
SMEARTYPE m_Tsmear;
SCALETYPE m_Tscale;
DETTYPE m_Tdet;
SYSTTYPE m_Tfun;
DATATYPE m_Tdata;
RELTYPE m_Trel;
ALGOTYPE m_Talgo;
int m_nb_regions;
std::string m_year, m_algo, m_type, m_release;
int m_Tsmear;
int m_Tdet;
int m_Tdata;
int m_Trel;
int m_Talgo;
int m_detRegion;
double m_useNsigmaForICombine;
double m_ptms, m_ptid, m_ptcb, m_eta, m_phi;
......@@ -116,24 +120,6 @@ private:
std::vector<double> m_scaleSystDw_ID, m_enLossSystDw_MS, m_scaleSystDw_MS;
std::vector<double> m_scaleBins;
std::vector<double> m_S1_ID;
std::vector<double> m_S2_ID;
std::vector<double> m_S1_MS;
std::vector<double> m_S2_MS;
std::vector<double> m_S1_CB;
std::vector<double> m_S2_CB;
std::vector<double> m_S1Corr_ID;
std::vector<double> m_S2Corr_ID;
std::vector<double> m_S1Corr_MS;
std::vector<double> m_S2Corr_MS;
std::vector<double> m_S1Corr_CB;
std::vector<double> m_S2Corr_CB;
std::vector<double> m_S1ACorr_ID;
std::vector<double> m_S2ACorr_ID;
std::vector<double> m_S1ACorr_MS;
std::vector<double> m_S2ACorr_MS;
std::vector<double> m_S1ACorr_CB;
std::vector<double> m_S2ACorr_CB;
std::vector<double> m_p1_ID, m_p2_ID, m_p2_ID_TAN, m_p0_MS, m_p1_MS, m_p2_MS;
std::vector<double> m_E_p1_ID, m_E_p2_ID, m_E_p2_ID_TAN, m_E_p0_MS, m_E_p1_MS, m_E_p2_MS;
// syst. errors on resolution parameters corrections:
......@@ -143,46 +129,26 @@ private:
std::vector<double> m_SUp_p1_ID, m_SUp_p2_ID, m_SUp_p2_ID_TAN, m_SUp_p0_MS, m_SUp_p1_MS, m_SUp_p2_MS;
std::vector<double> m_SDw_p1_ID, m_SDw_p2_ID, m_SDw_p2_ID_TAN, m_SDw_p0_MS, m_SDw_p1_MS, m_SDw_p2_MS;
std::vector<double> m_MC_p1_ID, m_MC_p2_ID, m_MC_p2_ID_TAN, m_MC_p0_MS, m_MC_p1_MS, m_MC_p2_MS;
std::vector<double> m_CorrMatC0;
std::vector<double> m_CorrMatC1;
std::vector<double> m_CorrMatC2;
std::vector<double> m_CorrMatC3;
std::vector<double> m_CorrMatC4;
std::vector<double> m_CorrMatC5;
std::vector<double> m_CorrMatTanC0;
std::vector<double> m_CorrMatTanC1;
std::vector<double> m_CorrMatTanC2;
std::vector<double> m_CorrMatTanC3;
std::vector<double> m_CorrMatTanC4;
std::vector<double> m_CorrMatTanC5;
std::ifstream m_InValues; //! don't persistify
double m_weightMS, m_weightID;
double m_g0, m_g1, m_g2, m_g3, m_g4, m_charge;
bool m_verb;
bool m_loadNames;
/* number of regions */
//int m_nb_regions;
/* eta boundaries of the regions */
std::vector<float> m_eta_min;
std::vector<float> m_eta_max;
/* phi boundaries of the regions */
std::vector<float> m_phi_min;
std::vector<float> m_phi_max;
std::vector<std::string> m_names;
//In same cases I need to collect the simple regions in macroRegions according to specific criteria
bool m_loadNames;
int m_nb_regions;
std::vector<float> m_eta_min, m_eta_max, m_phi_min, m_phi_max;
bool m_doMacroRegions;
//This maps the standard regions indexes into the indexes of the macroRegions.
std::map< int, int > m_MacroRegionIdxMap;
std::vector< std::string > m_MacroRegionName;
std::vector< double > m_MacroRegionInnerEta;
std::map<int, int> m_macroRegionIdxMap;
// The macro regions themselves are stored in a vector with their name
std::vector<std::string> m_macroRegionName;
std::vector<double> m_macroRegionInnerEta;//I need this var in few occasions
int m_scaleRegion;
boost::unordered_map< SystematicSet, ParameterSet > m_Parameters;
ParameterSet *m_currentParameters;
int m_scaleRegion;
}; // class MuonCalibrationAndSmearingTool
}; //::: class MuonCalibrationAndSmearingTool
} // namespace CP
} //::: namespace CP
#endif // MCAST_MUONSMEARINGTOOL_H
#endif
/*
Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
*/
#ifndef MUONMOMENTUMCORRECTIONS_MUONMOMENTUMCORRECTIONSDICT_H
#define MUONMOMENTUMCORRECTIONS_MUONMOMENTUMCORRECTIONSDICT_H
#if defined(__GCCXML__) and not defined(EIGEN_DONT_VECTORIZE)
#define EIGEN_DONT_VECTORIZE
#endif // __GCCXML__
#include "MuonMomentumCorrections/MuonCalibrationAndSmearingTool.h"
#endif // not MUONMOMENTUMCORRECTIONS_MUONMOMENTUMCORRECTIONSDICT_H
/*
Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
*/
#ifndef CPTOOLTESTS_ERRORCHECK_H
#define CPTOOLTESTS_ERRORCHECK_H
#define CHECK( ARG ) \
do { \
const bool result = ARG; \
if( ! result ) { \
::Error( APP_NAME, "Failed to execute: \"%s\"", \
#ARG ); \
return 1; \
} \
} while( false )
#endif // CPTOOLTESTS_ERRORCHECK_H
<lcgdict>
<class name="CP::MuonCalibrationAndSmearingTool" />
</lcgdict>
......@@ -13,7 +13,6 @@
- the recommended configurations can be found in share/MCAST_jobOptions.py and are:
alg.MuonCalibrationAndSmearingTool.Year = 'Data12'
alg.MuonCalibrationAndSmearingTool.Release = 'Rel17.2Sum13'
alg.MuonCalibrationAndSmearingTool.FilesPath = '<your path to share dir>'
- If you are running in RootCore:
- please look at util/MCAST_Tester.cxx how to use the tool
......@@ -22,5 +21,4 @@
corrTool.msg().setLevel( MSG::INFO );
corrTool.setProperty( "Year", "Data12" );
corrTool.setProperty( "Release", "Rel17.2Sum13" );
corrTool.setProperty( "FilesPath", "<your path to share dir>" );
corrTool.initialize();
......@@ -52,6 +52,7 @@ SmearingClass::SmearingClass(string Data,
SmearingClass::SmearingClass(const SmearingClass& _rhs){
const string SmearType = _rhs.Tsmear==SMEAR_QPT ? "q_pT" : "pT";
useErrMatrix = false;
m_CallSetClass=true;
m_nb_regions = 4;
Initialize(_rhs.m_DataYear,_rhs.m_Algorithm,SmearType,_rhs.m_Release,_rhs.m_Fdir);
}
......
......@@ -12,13 +12,13 @@ PACKAGE_OBJFLAGS =
PACKAGE_LDFLAGS =
PACKAGE_BINFLAGS =
PACKAGE_LIBFLAGS =
PACKAGE_DEP = AsgTools PATCore xAODMuon xAODEventInfo PATInterfaces
PACKAGE_DEP = AsgTools PATCore xAODMuon xAODEventInfo PATInterfaces PathResolver MuonSelectorTools
PACKAGE_TRYDEP =
PACKAGE_CLEAN =
PACKAGE_NOGRID =
PACKAGE_PEDANTIC = 0
PACKAGE_NOOPT = 0
PACKAGE_NOCC = 0
PACKAGE_REFLEX = 0
PACKAGE_REFLEX = 1
include $(ROOTCOREDIR)/Makefile-common
......@@ -5,26 +5,29 @@ author Giacomo Artoni <Giacomo.Artoni@cern.ch>
public
use AtlasPolicy AtlasPolicy-*
use AtlasROOT AtlasROOT-* External
use AtlasBoost AtlasBoost-* External
use AtlasReflex AtlasReflex-* External -no-auto-imports
use AsgTools AsgTools-* Control/AthToolSupport
use PATInterfaces PATInterfaces-* PhysicsAnalysis/AnalysisCommon
use xAODMuon xAODMuon-* Event/xAOD
private
use GaudiInterface GaudiInterface-* External
use AthenaBaseComps AthenaBaseComps-* Control
use xAODEventInfo xAODEventInfo-* Event/xAOD
use GaudiInterface GaudiInterface-* External
use AthenaBaseComps AthenaBaseComps-* Control
use PathResolver PathResolver-* Tools
use xAODEventInfo xAODEventInfo-* Event/xAOD
use xAODBase xAODBase-* Event/xAOD
use xAODCore xAODCore-* Event/xAOD
use MuonSelectorTools MuonSelectorTools-* PhysicsAnalysis/MuonID
end_private
# Declare the library:
library MuonMomentumCorrections *.cxx ../Root/*.cxx components/*.cxx
apply_pattern component_library
apply_pattern lcgdict dict=MuonMomentumCorrections selectionfile=selection.xml headerfiles="../MuonMomentumCorrections/MuonMomentumCorrectionsDict.h"
# Install the jobOptions:
apply_pattern declare_joboptions files=*.py
apply_pattern declare_runtime files="-s=../share *.dat"
apply_pattern declare_runtime files="../share/*.dat"
# Set up the file reading:
FNAME = "/afs/cern.ch/atlas/project/PAT/xAODs/r5591/mc14_8TeV.117050.PowhegPythia_P2011C_ttbar.recon.AOD.e1727_s1933_s1911_r5591/AOD.01494882._111853.pool.root.1"
import AthenaPoolCnvSvc.ReadAthenaPool
ServiceMgr.EventSelector.InputCollections = [ FNAME ]
algseq = CfgMgr.AthSequencer("AthAlgSeq")
# Add the MCP tool
#THIS IS THE EXAMPLE:
ToolSvc += CfgMgr.CP__MuonCalibrationAndSmearingTool("MCPTool")
algseq += CfgMgr.CP__CalibratedMuonsProvider(Input="Muons",Output="CalibratedMuons",Tool=ToolSvc.MCPTool,OutputLevel=VERBOSE)
#END OF EXAMPLE
theApp.EvtMax = 5
rho12 rho13 rho14 rho23 rho24 rho34
0.9589 0.091 -0.2658 0.1508 -0.455 0.0339
-0.126 -0.1185 -0.5028 0.0334 -0.0698 -0.3401
0.0673 -0.2014 -0.4396 -0.1685 -0.0936 0.219
-0.2246 -0.0206 -0.7692 0.0051 -0.0608 -0.0281
rho12 rho13 rho14 rho23 rho24 rho34
-0.1667 -0.1438 -0.1724 0.1656 -0.554 -0.3162
0.1281 -0.1681 0.0329 -0.0093 0.2609 -0.0555
-0.474 -0.0562 -0.783 0.5305 0.236 -0.1434
0.7283 -0.3271 -0.6717 -0.5796 -0.094 0.2953
p1_ID p2_ID p2_ID_TAN2 p1_MS p2_MS E_p1_ID E_p2_ID E_p2_ID_TAN2 E_p1_MS E_p2_MS S_p1_ID S_p2_ID S_p2_ID_TAN2 S_p1_MS S_p2_MS
0.000666 0.0002706 0 0.02051 0.000148 0.00115609 1.59274e-05 0 0.00045507 3.35885e-06 0 6.2e-06 0 0.00056 8.6e-06
0.001178 0.0007531 0 0.0496 0.0003272 0.00702667 8.1157e-05 0 0.00252489 5.25787e-05 0.00150303 7.80628e-05 0 0.00689749 6.60119e-05
0.000311 0.0007559 0 0.03179 0.0001906 0.00442998 4.9473e-05 0 0.001624 4.32351e-05 0 6.78e-05 0 0.0009 7.8e-06
0.015324 0 5.62e-05 0.02776 0.0004373 0.00412547 0 4.12971e-06 0.00498742 5.35803e-05 0 0 9.1e-06 0.00358 1.36e-05
p1_ID p2_ID p2_ID_TAN2 p1_MS p2_MS E_p1_ID E_p2_ID E_p2_ID_TAN2 E_p1_MS E_p2_MS S_p1_ID S_p2_ID S_p2_ID_TAN2 S_p1_MS S_p2_MS
0.001609 0.0002161 0 0.02989 0.0001655 0.00377807 4.85951e-05 0 0.000678788 1.75868e-05 0 1.77e-05 0 0.00068 3.5e-06
0.013634 0.0005926 0 0.08742 0.000315 0.00378039 5.42372e-05 0 0.001892 6.01835e-05 0.0168216 0.000130218 0 0.00898067 1.46322e-05
0.006463 0.0009684 0 0.03445 0.0001779 0.00544839 7.2206e-05 0 0.00312591 7.81479e-05 0 8.41e-05 0 0.00161 3.6e-06
0.005057 0 6.35e-05 0.02917 0.000407 0.00791718 0 2.95849e-06 0.00378172 4.07757e-05 0 0 2.3e-06 0.00198 1.94e-05
rho12 rho13 rho14 rho23 rho24 rho34
-0.7489 0 -0.55 0 0.7785 0
-0.1955 0 0.0378 0 -0.5037 0
-0.5271 0 0.1165 0 -0.3418 0
-0.3891 0 -0.258 0 0.9824 0
rho12 rho13 rho14 rho23 rho24 rho34
-0.278259 0 -0.164858 0 -0.850805 0
-0.328249 0 -0.651975 0 0.349588 0
-0.780203 0 -0.0513885 0 -0.249084 0
-0.623773 0 -0.00994107 0 -0.473615 0
-0.354941 0 0.000000992 0 0.0000009 0
0.0423781 0 0.000000283 0 0.0000011 0
0.00302454 0 -0.363184 0 -0.103324 0
rho12 rho13 rho14 rho23 rho24 rho34
-0.7489 0 -0.55 0 0.7785 0
-0.1955 0 0.0378 0 -0.5037 0
-0.5271 0 0.1165 0 -0.3418 0
-0.3891 0 -0.258 0 0.9824 0
rho12 rho13 rho14 rho23 rho24 rho34
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
rho12 rho13 rho14 rho23 rho24 rho34
0.603387 0 -0.233358 0 0.581431 0
-0.177294 0 0.675539 0 -0.393252 0
-0.803573 0 0.00223084 0 -0.0750297 0
-0.674 0 0.512047 0 -0.385252 0
-0.127967 0 0.00000296 0 0.00000229 0
-0.273962 0 0.102815 0 0.278935 0
-0.451665 0 -0.0032668 0 -0.00321479 0
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment