Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-06-26 08:40:25

0001 import django.db.models.deletion
0002 from django.db import migrations, models
0003 
0004 
0005 def backfill_campaign(apps, schema_editor):
0006     """Link each Dataset to its producing campaign and recompute the composed
0007     name from the campaign name. The campaign is taken from the dataset's
0008     producing task; failing that, from a Campaign whose name equals the legacy
0009     detector_version. The composed name is rebuilt from the same formula as
0010     Dataset.build_dataset_name (campaign name, falling back to detector_version),
0011     so for current data — where the two are equal — the stored name is
0012     unchanged."""
0013     Dataset = apps.get_model('pcs', 'Dataset')
0014     Campaign = apps.get_model('pcs', 'Campaign')
0015     by_name = {c.name: c for c in Campaign.objects.all()}
0016     rows = list(Dataset.objects.select_related(
0017         'physics_tag', 'evgen_tag', 'simu_tag', 'reco_tag', 'background_tag'
0018     ).prefetch_related('prod_tasks__campaign'))
0019     for ds in rows:
0020         camp = None
0021         for t in ds.prod_tasks.all():
0022             if t.campaign_id:
0023                 camp = t.campaign
0024                 break
0025         if camp is None:
0026             camp = by_name.get(ds.detector_version)
0027         ds.campaign = camp
0028         version = camp.name if camp else ds.detector_version
0029         name = (f"{ds.scope}.{version}.{ds.detector_config}"
0030                 f".{ds.physics_tag.tag_label}.{ds.evgen_tag.tag_label}"
0031                 f".{ds.simu_tag.tag_label}.{ds.reco_tag.tag_label}")
0032         if ds.background_tag_id:
0033             name = f"{name}.{ds.background_tag.tag_label}"
0034         if ds.sample_name:
0035             name = f"{name}.{ds.sample_name}"
0036         ds.composed_name = name
0037     if rows:
0038         Dataset.objects.bulk_update(
0039             rows, ['campaign', 'composed_name'], batch_size=500)
0040 
0041 
0042 def noop_reverse(apps, schema_editor):
0043     pass
0044 
0045 
0046 class Migration(migrations.Migration):
0047 
0048     dependencies = [
0049         ('pcs', '0017_dataset_composed_name'),
0050     ]
0051 
0052     operations = [
0053         migrations.AddField(
0054             model_name='dataset',
0055             name='campaign',
0056             field=models.ForeignKey(
0057                 blank=True, null=True,
0058                 on_delete=django.db.models.deletion.PROTECT,
0059                 related_name='datasets', to='pcs.campaign',
0060             ),
0061         ),
0062         migrations.RunPython(backfill_campaign, noop_reverse),
0063     ]