else:
            can_dupes2[cas].append(data)

    for cas in can_dupes2.keys():
        groups = can_dupes2[cas]
        if len(groups) > 1:
           print 'compound with cas=%s is considered different by OB canonical smiles'%cas
           for group in groups:
                print group[0].write('can').strip()
           print '-'*80

    union = sorted([dupe[0] for dupe in cas_dupes.values()], key=lambda mol: mol.title)
    save_mols(union, op.join(root, 'mutagenicity-all-cas-union.sdf'))
    print '\t\tUnion size=%d' % len(union)

    dest_sdf = op.join(root, 'mutagenicity-all-cas-union-prepared.sdf')
    prepare_dataset(op.join(root, 'mutagenicity-all-cas-union.sdf'), rename=False, conformations=True)

    #Depict the molecules
    depict(dest_sdf)

    #Molecular descriptors
    print 'Computing fingerprints via JCompoundMapper' #TODO: Extract-method this
    jcm_fingerprint(dest_sdf, ('ECFP', 'ECFPVariant', 'PHAP3POINT2D', 'SHED', 'DFS', 'RAD2D'))
    jcm_fingerprint(dest_sdf, ('LSTAR', 'RAD3D', 'PHAP3POINT3D'))
    print 'Computing descriptors via CDKDescUI'
    cdkdescuiprops(dest_sdf, desc_types=('constitutional',))
    print 'Computing spectrophores'
    spectrophores(dest_sdf)
    print 'Saving in several data analysis tools file formats'
    prop4da(dest_sdf)