@@ -311,6 +311,72 @@ namespace h1 {
311311 CHECK ( id::ParticleID ( " d" ) == deuterium.identifier () );
312312 }
313313
314+ void verifyCrossSectionCovariances ( const covariance::CrossSectionCovarianceData& xs ) {
315+
316+ CHECK ( false == xs.hasCovarianceMatrix ( id::ReactionID ( " n,H1->total" ) ) );
317+ CHECK ( true == xs.hasCovarianceMatrix ( id::ReactionID ( " n,H1->capture" ) ) );
318+ CHECK ( true == xs.hasCovarianceMatrix ( id::ReactionID ( " n,H1->n,H1" ) ) );
319+ CHECK ( true == xs.hasCovarianceMatrix ( id::ReactionID ( " n,H1->n,H1" ), id::ReactionID ( " n,H1->capture" ) ) );
320+
321+ CHECK ( 2 == xs.numberReactions () );
322+ CHECK ( 2 == xs.reactionIdentifiers ().size () );
323+ CHECK ( id::ReactionID ( " n,H1->capture" ) == xs.reactionIdentifiers ()[0 ] );
324+ CHECK ( id::ReactionID ( " n,H1->n,H1" ) == xs.reactionIdentifiers ()[1 ] );
325+
326+ CHECK ( 3 == xs.numberCovarianceMatrices () );
327+ CHECK ( 3 == xs.covariances ().size () );
328+
329+ using CrossSectionCovarianceMatrix = njoy::dryad::covariance::CrossSectionCovarianceMatrix;
330+ auto variant = xs.covarianceMatrix ( id::ReactionID ( " n,H1->capture" ) );
331+ auto matrix = std::get< CrossSectionCovarianceMatrix >( variant );
332+ CHECK ( 1 == matrix.rowMetadata ().reactionIdentifiers ().size () );
333+ CHECK ( id::ReactionID ( " n,H1->capture" ) == matrix.rowMetadata ().reactionIdentifiers ()[0 ] );
334+ CHECK ( 154 == matrix.rowMetadata ().energies ().size () );
335+ CHECK_THAT ( 5e-6 , WithinRel ( matrix.rowMetadata ().energies ().front () ) );
336+ CHECK_THAT ( 2.025e+7 , WithinRel ( matrix.rowMetadata ().energies ().back () ) );
337+ CHECK ( matrix.columnMetadata () == matrix.rowMetadata () );
338+ CHECK ( 153 == matrix.covariances ().rows () );
339+ CHECK ( 153 == matrix.covariances ().cols () );
340+ CHECK ( 4.278572e-4 == matrix.covariances ()( 0 , 0 ) );
341+ CHECK ( -4.657843e-4 == matrix.covariances ()( 0 ,152 ) );
342+ CHECK ( -4.657843e-4 == matrix.covariances ()(152 , 0 ) );
343+ CHECK ( 3.473440e-2 == matrix.covariances ()(152 ,152 ) );
344+
345+ variant = xs.covarianceMatrix ( id::ReactionID ( " n,H1->n,H1" ) );
346+ matrix = std::get< CrossSectionCovarianceMatrix >( variant );
347+ CHECK ( 1 == matrix.rowMetadata ().reactionIdentifiers ().size () );
348+ CHECK ( id::ReactionID ( " n,H1->n,H1" ) == matrix.rowMetadata ().reactionIdentifiers ()[0 ] );
349+ CHECK ( 154 == matrix.rowMetadata ().energies ().size () );
350+ CHECK_THAT ( 5e-6 , WithinRel ( matrix.rowMetadata ().energies ().front () ) );
351+ CHECK_THAT ( 2.025e+7 , WithinRel ( matrix.rowMetadata ().energies ().back () ) );
352+ CHECK ( matrix.columnMetadata () == matrix.rowMetadata () );
353+ CHECK ( 153 == matrix.covariances ().rows () );
354+ CHECK ( 153 == matrix.covariances ().cols () );
355+ CHECK ( 6.954882e-5 == matrix.covariances ()( 0 , 0 ) );
356+ CHECK ( 2.361196e-6 == matrix.covariances ()( 0 ,152 ) );
357+ CHECK ( 2.361196e-6 == matrix.covariances ()(152 , 0 ) );
358+ CHECK ( 1.976707e-5 == matrix.covariances ()(152 ,152 ) );
359+
360+ variant = xs.covarianceMatrix ( id::ReactionID ( " n,H1->n,H1" ), id::ReactionID ( " n,H1->capture" ) );
361+ matrix = std::get< CrossSectionCovarianceMatrix >( variant );
362+ CHECK ( 1 == matrix.rowMetadata ().reactionIdentifiers ().size () );
363+ CHECK ( id::ReactionID ( " n,H1->n,H1" ) == matrix.rowMetadata ().reactionIdentifiers ()[0 ] );
364+ CHECK ( 154 == matrix.rowMetadata ().energies ().size () );
365+ CHECK_THAT ( 5e-6 , WithinRel ( matrix.rowMetadata ().energies ().front () ) );
366+ CHECK_THAT ( 2.025e+7 , WithinRel ( matrix.rowMetadata ().energies ().back () ) );
367+ CHECK ( 1 == matrix.columnMetadata ().reactionIdentifiers ().size () );
368+ CHECK ( id::ReactionID ( " n,H1->capture" ) == matrix.columnMetadata ().reactionIdentifiers ()[0 ] );
369+ CHECK ( 154 == matrix.columnMetadata ().energies ().size () );
370+ CHECK_THAT ( 5e-6 , WithinRel ( matrix.columnMetadata ().energies ().front () ) );
371+ CHECK_THAT ( 2.025e+7 , WithinRel ( matrix.columnMetadata ().energies ().back () ) );
372+ CHECK ( 153 == matrix.covariances ().rows () );
373+ CHECK ( 153 == matrix.covariances ().cols () );
374+ CHECK ( 3.076179e-5 == matrix.covariances ()( 0 , 0 ) );
375+ CHECK ( 1.451485e-4 == matrix.covariances ()( 0 ,152 ) );
376+ CHECK ( 9.693969e-6 == matrix.covariances ()(152 , 0 ) );
377+ CHECK ( 1.171132e-4 == matrix.covariances ()(152 ,152 ) );
378+ }
379+
314380 void verifyH1 ( const ProjectileTarget& H1, bool normalise ) {
315381
316382 verifyDocumentation ( H1.documentation () );
@@ -350,6 +416,9 @@ namespace h1 {
350416 CHECK ( std::nullopt == H1.resonances () );
351417
352418 CHECK ( std::nullopt != H1.covarianceData () );
419+
420+ CHECK ( std::nullopt != H1.covarianceData ()->crossSection () );
421+ verifyCrossSectionCovariances ( H1.covarianceData ()->crossSection ().value () );
353422 }
354423
355424} // namespace h1
0 commit comments