function [dataStruct, columnFields, columnNames] = get_tsv_writeable_consensus_stretching_struct(clusterConsensusData)
    import CBT.Consensus.Helper.extract_aligned_cluster_consensus_components;
    [~, ~, clusterBarcodeKeys, clusterBarcodeAliases, otherBarcodeData] = extract_aligned_cluster_consensus_components(clusterConsensusData);
    columnFields = {...
        'stretchFactor';...
        'bpsPerPx_original';...
        'bpsPerPx_stretched';...
        'nmPerPx_original';...
        'nmPerPx_stretched'...
        };
    columnNames = {...
        'Stretch Factor';...
        'bps/px (original)';...
        'bps/px (stretched)';...
        'nm/px (original)';...
        'nm/px (stretched)'...
        };
    dataStruct = struct;
    dataStruct.barcodeKeys = clusterBarcodeKeys;
    dataStruct.barcodeAliases = clusterBarcodeAliases;
    numFieldsToExtract = length(columnFields);
    for fieldToExtractNum=1:numFieldsToExtract
        fieldToExtract = columnFields{fieldToExtractNum};

        hasFieldValue = cellfun(@(currStruct) (isstruct(currStruct) && isscalar(currStruct) && isfield(currStruct, fieldToExtract)), otherBarcodeData);
        cellArrayOfFieldValues = cell(size(otherBarcodeData));
        cellArrayOfFieldValues(hasFieldValue) =  cellfun(@(currStruct) currStruct.(fieldToExtract), otherBarcodeData(hasFieldValue), 'UniformOutput', false);

        dataStruct.(fieldToExtract) = cellArrayOfFieldValues;
    end
    columnFields = [{'barcodeKeys'; 'barcodeAliases'}; columnFields];
    columnNames = [{'Barcode Keys'; 'Barcode Aliases'}; columnNames];
end