docs: public static LIBORMarketModelFromCovarianceModel of(
  			TimeDiscretization			liborPeriodDiscretization,
  			AnalyticModel			analyticModel,
  			ForwardCurve			forwardRateCurve,
  			DiscountCurve			discountCurve,
  			AbstractRandomVariableFactory	randomVariableFactory,
  			LIBORCovarianceModel			covarianceModel,
  			CalibrationProduct[]			calibrationProducts,
  			Map<String, ?>					properties
  			) throws CalculationException {
  
  		LIBORMarketModelFromCovarianceModel model = new LIBORMarketModelFromCovarianceModel(liborPeriodDiscretization, analyticModel, forwardRateCurve, discountCurve, randomVariableFactory, covarianceModel, properties);
  
  		// Perform calibration, if data is given
  		if(calibrationProducts != null && calibrationProducts.length > 0) {
  			Map<String,Object> calibrationParameters = null;
  			if(properties != null && properties.containsKey("calibrationParameters")) {
  				calibrationParameters	= (Map<String,Object>)properties.get("calibrationParameters");
  			}
  
  			LIBORCovarianceModelCalibrateable covarianceModelParametric = null;
  			try {
  				covarianceModelParametric = (LIBORCovarianceModelCalibrateable)covarianceModel;
  			}
  			catch(Exception e) {
  				throw new ClassCastException("Calibration restricted to covariance models implementing LIBORCovarianceModelCalibrateable.");
  			}
  
  			LIBORCovarianceModel covarianceModelCalibrated = covarianceModelParametric.getCloneCalibrated(model, calibrationProducts, calibrationParameters);
  
  			LIBORMarketModelFromCovarianceModel modelCalibrated = model.getCloneWithModifiedCovarianceModel(covarianceModelCalibrated);
  
  			return modelCalibrated;
  		}
  		else {
  			return model;
  		}
  	}