{"id":105,"date":"2026-10-16T15:58:35","date_gmt":"2026-10-16T15:58:35","guid":{"rendered":"https:\/\/www.sergio-rodriguez.universite-paris-saclay.fr\/?page_id=105"},"modified":"2026-10-20T06:43:43","modified_gmt":"2026-10-20T06:43:43","slug":"metrics","status":"publish","type":"page","link":"https:\/\/www.sergio-rodriguez.universite-paris-saclay.fr\/index.php\/metrics\/","title":{"rendered":"research metrics"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Academic Statistics &#038; Impact<\/title>\n    <!-- Chart.js Library -->\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/chart.js\"><\/script>\n    <style>\n        * {\n            box-sizing: border-box;\n        }\n        body {\n            font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n            background-color: #f8fafc;\n            color: #333;\n            margin: 0;\n            padding: 20px;\n        }\n        .dashboard-container {\n            max-width: 900px;\n            margin: 0 auto;\n        }\n        .card {\n            background: #ffffff;\n            padding: 20px;\n            border-radius: 8px;\n            box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n            margin-bottom: 25px;\n        }\n        .text-center {\n            text-align: center;\n        }\n        .grid-3 {\n            display: grid;\n            grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n            gap: 15px;\n        }\n        .grid-2 {\n            display: grid;\n            grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n            gap: 25px;\n        }\n        .metric-card {\n            background: #fff;\n            padding: 18px 15px;\n            border-radius: 8px;\n            box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n            text-align: center;\n        }\n        .metric-title {\n            font-size: 0.8em;\n            color: #666;\n            text-transform: uppercase;\n            letter-spacing: 0.5px;\n            font-weight: 600;\n        }\n        .metric-value {\n            font-size: 2em;\n            font-weight: bold;\n            margin-top: 4px;\n        }\n        .chart-container-large {\n            position: relative;\n            height: 320px;\n            width: 100%;\n        }\n        .chart-container-small {\n            position: relative;\n            height: 260px;\n            width: 100%;\n        }\n        .insight-box {\n            background: #f8fafc;\n            padding: 15px;\n            border-radius: 6px;\n            text-align: center;\n        }\n        .insight-title {\n            font-size: 0.8em;\n            color: #64748b;\n            text-transform: uppercase;\n            font-weight: 600;\n        }\n        .insight-val {\n            font-size: 1.3em;\n            font-weight: bold;\n            margin-top: 5px;\n        }\n        #fallback-frame {\n            display: none;\n            width: 100%;\n            height: 700px;\n            border: 1px solid #cbd5e1;\n            border-radius: 8px;\n            margin-top: 15px;\n        }\n    <\/style>\n<\/head>\n<body>\n\n<div class=\"dashboard-container\">\n    <h2 class=\"text-center\" style=\"margin-bottom: 25px;\">Academic Statistics &#038; Impact<\/h2>\n    \n    <!-- Google Scholar Summary Cards -->\n    <div style=\"margin-bottom: 25px;\">\n        <div class=\"grid-3\">\n            <div class=\"metric-card\">\n                <span class=\"metric-title\">Citations<\/span>\n                <div class=\"metric-value\" style=\"color: #2563eb;\">984+<\/div>\n            <\/div>\n            <div class=\"metric-card\">\n                <span class=\"metric-title\">h-index<\/span>\n                <div class=\"metric-value\" style=\"color: #10b981;\">16<\/div>\n            <\/div>\n            <div class=\"metric-card\">\n                <span class=\"metric-title\">i10-index<\/span>\n                <div class=\"metric-value\" style=\"color: #8b5cf6;\">22<\/div>\n            <\/div>\n        <\/div>\n        <div style=\"text-align: right; margin-top: 8px;\">\n            <a href=\"https:\/\/scholar.google.fr\/citations?user=AOD98yEAAAAJ&#038;hl=en\" target=\"_blank\" rel=\"noopener\" style=\"font-size: 0.85em; color: #2563eb; text-decoration: none;\">View Google Scholar Profile &rarr;<\/a>\n        <\/div>\n    <\/div>\n\n    <!-- Main Dynamic Content \/ Charts Container -->\n    <div id=\"dynamic-charts-view\">\n        <!-- Publications by Year (Stacked) -->\n        <div class=\"card\">\n            <h4 style=\"margin-top: 0; text-align: center; color: #444;\">Publications by Year (Journals vs. Conferences vs. Others)<\/h4>\n            <div class=\"chart-container-large\">\n                <canvas id=\"pubByYearChart\"><\/canvas>\n            <\/div>\n        <\/div>\n\n        <!-- Types & Open Access -->\n        <div class=\"grid-2\" style=\"margin-bottom: 25px;\">\n            <div class=\"card\" style=\"margin-bottom: 0;\">\n                <h4 style=\"margin-top: 0; text-align: center; color: #444;\">Publication Types Distribution<\/h4>\n                <div class=\"chart-container-small\">\n                    <canvas id=\"pubTypeChart\"><\/canvas>\n                <\/div>\n            <\/div>\n\n            <div class=\"card\" style=\"margin-bottom: 0;\">\n                <h4 style=\"margin-top: 0; text-align: center; color: #444;\">Open Access Ratio<\/h4>\n                <div class=\"chart-container-small\">\n                    <canvas id=\"openAccessChart\"><\/canvas>\n                <\/div>\n            <\/div>\n        <\/div>\n\n        <!-- Analytical Insights Panel -->\n        <div class=\"card\">\n            <h4 style=\"margin-top: 0; margin-bottom: 15px; color: #444; border-bottom: 2px solid #f3f4f6; padding-bottom: 8px;\">Analytical Summary<\/h4>\n            <div class=\"grid-3\">\n                <div class=\"insight-box\">\n                    <span class=\"insight-title\">Peak Year<\/span>\n                    <div id=\"stat-peak-year\" class=\"insight-val\" style=\"color: #2563eb;\">&#8212;<\/div>\n                <\/div>\n                <div class=\"insight-box\">\n                    <span class=\"insight-title\">Avg. \/ Active Year<\/span>\n                    <div id=\"stat-avg-year\" class=\"insight-val\" style=\"color: #2563eb;\">&#8212;<\/div>\n                <\/div>\n                <div class=\"insight-box\">\n                    <span class=\"insight-title\">Open Access Rate<\/span>\n                    <div id=\"stat-oa-rate\" class=\"insight-val\" style=\"color: #10b981;\">&#8212;<\/div>\n                <\/div>\n                <div class=\"insight-box\">\n                    <span class=\"insight-title\">Active Span<\/span>\n                    <div id=\"stat-span\" class=\"insight-val\" style=\"color: #8b5cf6;\">&#8212;<\/div>\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <!-- Status & Fallback Wrapper -->\n    <p id=\"hal-status\" class=\"text-center\" style=\"color: #666; margin-top: 15px; font-size: 0.9em;\">Loading publication statistics from HAL&#8230;<\/p>\n\n    <!-- Embedded Fallback View if API Call standard fetch fails -->\n    <iframe id=\"fallback-frame\" title=\"HAL Publications List\"><\/iframe>\n<\/div>\n\n<script>\ndocument.addEventListener(\"DOMContentLoaded\", function() {\n    const halId = \"sergio-rodriguez\";\n    \n    \/\/ API endpoints\n    const rawDocsUrl = `https:\/\/api.archives-ouvertes.fr\/search\/?q=authIdHal_s:${halId}&fl=producedDateY_i,docType_s&rows=1000&wt=json`;\n    const rawFacetsUrl = `https:\/\/api.archives-ouvertes.fr\/search\/?q=authIdHal_s:${halId}&rows=0&wt=json&facet=true&facet.field=docType_s&facet.field=submitType_s`;\n\n    \/\/ Attempt direct fetch first, fallback to CORS proxy if needed\n    const proxyDocsUrl = \"https:\/\/corsproxy.io\/?\" + encodeURIComponent(rawDocsUrl);\n    const proxyFacetsUrl = \"https:\/\/corsproxy.io\/?\" + encodeURIComponent(rawFacetsUrl);\n\n    const docTypeLabels = {\n        'ART': 'Journal Article',\n        'COMM': 'Conference Paper',\n        'POSTER': 'Poster',\n        'OUV': 'Book',\n        'COUV': 'Book Chapter',\n        'DOUV': 'Book Direction',\n        'PATENT': 'Patent',\n        'REPORT': 'Report',\n        'THESE': 'PhD Thesis',\n        'HDR': 'HDR Thesis',\n        'UNDEFINED': 'Preprint \/ Working Paper'\n    };\n\n    function fetchWithFallback(url, proxyUrl) {\n        return fetch(url).then(res => {\n            if (!res.ok) throw new Error(\"Direct request failed\");\n            return res.json();\n        }).catch(() => fetch(proxyUrl).then(res => res.json()));\n    }\n\n    Promise.all([\n        fetchWithFallback(rawDocsUrl, proxyDocsUrl),\n        fetchWithFallback(rawFacetsUrl, proxyFacetsUrl)\n    ])\n    .then(([docsData, facetData]) => {\n        const docs = docsData.response ? docsData.response.docs || [] : [];\n        const totalDocs = docsData.response ? docsData.response.numFound : 0;\n\n        if (totalDocs === 0) {\n            triggerIframeFallback(\"No publications returned from API. Displaying direct HAL publication view:\");\n            return;\n        }\n\n        document.getElementById('hal-status').textContent = `Total publications indexed in HAL: ${totalDocs}`;\n\n        \/\/ Grouping data by year and publication category\n        const yearMap = {};\n        let totalPerYear = {};\n\n        docs.forEach(doc => {\n            const yr = doc.producedDateY_i;\n            const type = doc.docType_s;\n            if (!yr) return;\n\n            if (!yearMap[yr]) {\n                yearMap[yr] = { ART: 0, COMM: 0, OTHER: 0 };\n            }\n            totalPerYear[yr] = (totalPerYear[yr] || 0) + 1;\n\n            if (type === 'ART') {\n                yearMap[yr].ART++;\n            } else if (type === 'COMM') {\n                yearMap[yr].COMM++;\n            } else {\n                yearMap[yr].OTHER++;\n            }\n        });\n\n        const sortedYears = Object.keys(yearMap).sort((a, b) => a - b);\n        const artCounts = sortedYears.map(y => yearMap[y].ART);\n        const commCounts = sortedYears.map(y => yearMap[y].COMM);\n        const otherCounts = sortedYears.map(y => yearMap[y].OTHER);\n\n        \/\/ Peak year calculation\n        let peakYear = \"-\";\n        let maxCount = 0;\n        sortedYears.forEach(yr => {\n            const cnt = totalPerYear[yr];\n            if (cnt > maxCount) {\n                maxCount = cnt;\n                peakYear = `${yr} (${cnt})`;\n            }\n        });\n\n        const activeYearsCount = sortedYears.length;\n        const avgPerYear = activeYearsCount > 0 ? (totalDocs \/ activeYearsCount).toFixed(1) : 0;\n        const firstYear = sortedYears.length > 0 ? sortedYears[0] : \"-\";\n        const lastYear = sortedYears.length > 0 ? sortedYears[sortedYears.length - 1] : \"-\";\n        const spanText = activeYearsCount > 0 ? `${firstYear} \u2013 ${lastYear}` : \"-\";\n\n        \/\/ Facets processing\n        const facets = facetData.facet_counts ? facetData.facet_counts.facet_fields : {};\n        \n        const typeFacets = facets.docType_s || [];\n        const typeLabels = [];\n        const typeCounts = [];\n        for (let i = 0; i < typeFacets.length; i += 2) {\n            const code = typeFacets[i];\n            const count = typeFacets[i + 1];\n            if (count > 0) {\n                typeLabels.push(docTypeLabels[code] || code);\n                typeCounts.push(count);\n            }\n        }\n\n        const submitFacets = facets.submitType_s || [];\n        let openAccessCount = 0;\n        let metadataOnlyCount = 0;\n        for (let i = 0; i < submitFacets.length; i += 2) {\n            const type = submitFacets[i];\n            const count = submitFacets[i + 1];\n            if (type === \"file\") openAccessCount += count;\n            else if (type === \"notice\") metadataOnlyCount += count;\n        }\n\n        const oaRate = totalDocs > 0 ? ((openAccessCount \/ totalDocs) * 100).toFixed(1) + \"%\" : \"0%\";\n\n        \/\/ Populate metrics\n        document.getElementById('stat-peak-year').textContent = peakYear;\n        document.getElementById('stat-avg-year').textContent = avgPerYear;\n        document.getElementById('stat-oa-rate').textContent = oaRate;\n        document.getElementById('stat-span').textContent = spanText;\n\n        \/\/ Render Stacked Bar Chart\n        new Chart(document.getElementById('pubByYearChart'), {\n            type: 'bar',\n            data: {\n                labels: sortedYears,\n                datasets: [\n                    { label: 'Journal Articles', data: artCounts, backgroundColor: '#2563eb', borderRadius: 2 },\n                    { label: 'Conference Papers', data: commCounts, backgroundColor: '#10b981', borderRadius: 2 },\n                    { label: 'Other Publications', data: otherCounts, backgroundColor: '#f59e0b', borderRadius: 2 }\n                ]\n            },\n            options: {\n                responsive: true,\n                maintainAspectRatio: false,\n                plugins: { legend: { position: 'top' } },\n                scales: {\n                    x: { stacked: true },\n                    y: { stacked: true, beginAtZero: true, ticks: { precision: 0 } }\n                }\n            }\n        });\n\n        \/\/ Render Types Chart\n        new Chart(document.getElementById('pubTypeChart'), {\n            type: 'doughnut',\n            data: {\n                labels: typeLabels,\n                datasets: [{\n                    data: typeCounts,\n                    backgroundColor: ['#2563eb', '#10b981', '#f59e0b', '#8b5cf6', '#ec4899', '#06b6d4', '#64748b']\n                }]\n            },\n            options: { responsive: true, maintainAspectRatio: false, plugins: { legend: { position: 'bottom' } } }\n        });\n\n        \/\/ Render Open Access Chart\n        new Chart(document.getElementById('openAccessChart'), {\n            type: 'pie',\n            data: {\n                labels: ['Full Text (Open Access)', 'Metadata \/ Notice Only'],\n                datasets: [{\n                    data: [openAccessCount, metadataOnlyCount],\n                    backgroundColor: ['#10b981', '#64748b']\n                }]\n            },\n            options: { responsive: true, maintainAspectRatio: false, plugins: { legend: { position: 'bottom' } } }\n        });\n    })\n    .catch(error => {\n        console.error(\"HAL API Error:\", error);\n        triggerIframeFallback(\"Unable to load dynamic charts due to connection restrictions. Loading HAL direct list:\");\n    });\n\n    function triggerIframeFallback(msg) {\n        document.getElementById('hal-status').textContent = msg;\n        document.getElementById('dynamic-charts-view').style.display = 'none';\n        \n        const iframe = document.getElementById('fallback-frame');\n        iframe.src = `https:\/\/haltools.archives-ouvertes.fr\/Public\/afficheRequetePubli.php?idHal=${halId}&CB_auteur=oui&CB_titre=oui&CB_article=oui&CB_DOI=oui&langue=Francais&tri_exp=annee_publi&tri_exp2=typdoc&tri_exp3=date_publi&ordre_aff=TA&Fen=Aff&css=..\/css\/VisuRubriqueEncadre.css`;\n        iframe.style.display = 'block';\n    }\n});\n<\/script>\n\n<\/body>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>Academic Statistics &#038; Impact Academic Statistics &#038; Impact Citations 984+ h-index 16 i10-index 22 View Google Scholar Profile &rarr; Publications by Year (Journals vs. Conferences vs. Others) Publication Types Distribution Open Access Ratio Analytical Summary Peak Year &#8212; Avg. \/ Active Year &#8212; Open Access Rate &#8212; Active Span &#8212; Loading publication statistics from HAL&#8230;<\/p>\n","protected":false},"author":4,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-105","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.sergio-rodriguez.universite-paris-saclay.fr\/index.php\/wp-json\/wp\/v2\/pages\/105","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sergio-rodriguez.universite-paris-saclay.fr\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.sergio-rodriguez.universite-paris-saclay.fr\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.sergio-rodriguez.universite-paris-saclay.fr\/index.php\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sergio-rodriguez.universite-paris-saclay.fr\/index.php\/wp-json\/wp\/v2\/comments?post=105"}],"version-history":[{"count":3,"href":"https:\/\/www.sergio-rodriguez.universite-paris-saclay.fr\/index.php\/wp-json\/wp\/v2\/pages\/105\/revisions"}],"predecessor-version":[{"id":115,"href":"https:\/\/www.sergio-rodriguez.universite-paris-saclay.fr\/index.php\/wp-json\/wp\/v2\/pages\/105\/revisions\/115"}],"wp:attachment":[{"href":"https:\/\/www.sergio-rodriguez.universite-paris-saclay.fr\/index.php\/wp-json\/wp\/v2\/media?parent=105"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}