Mercurial > repos > cpt > cpt_intersect_adj
comparison intersect_and_adjacent.py @ 5:00aab5199327 draft default tip
planemo upload commit 6b68423e1d9bbced95ecfb92e26329a7e8d7df47
author | cpt |
---|---|
date | Mon, 12 Aug 2024 04:40:20 +0000 |
parents | 3e3b5ba626b9 |
children |
comparison
equal
deleted
inserted
replaced
4:3e3b5ba626b9 | 5:00aab5199327 |
---|---|
128 | 128 |
129 # Used to map ids back to features later | 129 # Used to map ids back to features later |
130 rec_a_map = {f.id: f for f in rec_a_i.features} | 130 rec_a_map = {f.id: f for f in rec_a_i.features} |
131 rec_b_map = {f.id: f for f in rec_b_i.features} | 131 rec_b_map = {f.id: f for f in rec_b_i.features} |
132 | 132 |
133 rec_a_hits_in_b = [] | 133 rec_a_hits_in_b = {} |
134 rec_b_hits_in_a = [] | 134 rec_b_hits_in_a = {} |
135 | 135 |
136 for feature in rec_a_i.features: | 136 for feature in rec_a_i.features: |
137 if feature.type == "remark" or feature.type == "annotation": | 137 if feature.type == "remark" or feature.type == "annotation": |
138 continue | 138 continue |
139 | 139 |
140 if not stranding: | 140 if not stranding: |
141 hits = tree_b[ | 141 hits = tree_b[ |
142 int(feature.location.start) : int(feature.location.end) | 142 int(feature.location.start) : int(feature.location.end) |
143 ] | 143 ] |
144 for hit in hits: | 144 for hit in hits: |
145 rec_a_hits_in_b.append(rec_b_map[hit.data]) | 145 rec_a_hits_in_b[hit.data] = rec_b_map[hit.data] |
146 else: | 146 else: |
147 if feature.strand > 0: | 147 if feature.strand > 0: |
148 hits = tree_b_pos[ | 148 hits = tree_b_pos[ |
149 int(feature.location.start) : int(feature.location.end) | 149 int(feature.location.start) : int(feature.location.end) |
150 ] | 150 ] |
151 else: | 151 else: |
152 hits = tree_b_neg[ | 152 hits = tree_b_neg[ |
153 int(feature.location.start) : int(feature.location.end) | 153 int(feature.location.start) : int(feature.location.end) |
154 ] | 154 ] |
155 for hit in hits: | 155 for hit in hits: |
156 rec_a_hits_in_b.append(rec_b_map[hit.data]) | 156 rec_a_hits_in_b[hit.data] = rec_b_map[hit.data] |
157 | 157 |
158 for feature in rec_b_i.features: | 158 for feature in rec_b_i.features: |
159 if feature.type == "remark" or feature.type == "annotation": | 159 if feature.type == "remark" or feature.type == "annotation": |
160 continue | 160 continue |
161 | 161 |
162 if not stranding: | 162 if not stranding: |
163 hits = tree_a[ | 163 hits = tree_a[ |
164 int(feature.location.start) : int(feature.location.end) | 164 int(feature.location.start) : int(feature.location.end) |
165 ] | 165 ] |
166 for hit in hits: | 166 for hit in hits: |
167 rec_b_hits_in_a.append(rec_a_map[hit.data]) | 167 rec_b_hits_in_a[hit.data] = rec_a_map[hit.data] |
168 else: | 168 else: |
169 if feature.strand > 0: | 169 if feature.strand > 0: |
170 hits = tree_a_pos[ | 170 hits = tree_a_pos[ |
171 int(feature.location.start) : int(feature.location.end) | 171 int(feature.location.start) : int(feature.location.end) |
172 ] | 172 ] |
173 else: | 173 else: |
174 hits = tree_a_neg[ | 174 hits = tree_a_neg[ |
175 int(feature.location.start) : int(feature.location.end) | 175 int(feature.location.start) : int(feature.location.end) |
176 ] | 176 ] |
177 for hit in hits: | 177 for hit in hits: |
178 rec_b_hits_in_a.append(rec_a_map[hit.data]) | 178 rec_b_hits_in_a[hit.data] = rec_a_map[hit.data] |
179 | 179 |
180 # Remove duplicate features using sets | 180 # Sort features by start position |
181 rec_a_out.append( | 181 rec_a_out.append( |
182 SeqRecord( | 182 SeqRecord( |
183 rec_a[iterate].seq, | 183 rec_a[iterate].seq, |
184 rec_a[iterate].id, | 184 rec_a[iterate].id, |
185 rec_a[iterate].name, | 185 rec_a[iterate].name, |
186 rec_a[iterate].description, | 186 rec_a[iterate].description, |
187 rec_a[iterate].dbxrefs, | 187 rec_a[iterate].dbxrefs, |
188 sorted(set(rec_a_hits_in_b), key=lambda feat: feat.location.start), | 188 sorted( |
189 rec_a_hits_in_b.values(), key=lambda feat: feat.location.start | |
190 ), | |
189 rec_a[iterate].annotations, | 191 rec_a[iterate].annotations, |
190 ) | 192 ) |
191 ) | 193 ) |
192 rec_b_out.append( | 194 rec_b_out.append( |
193 SeqRecord( | 195 SeqRecord( |
194 rec_b[iterate].seq, | 196 rec_b[iterate].seq, |
195 rec_b[iterate].id, | 197 rec_b[iterate].id, |
196 rec_b[iterate].name, | 198 rec_b[iterate].name, |
197 rec_b[iterate].description, | 199 rec_b[iterate].description, |
198 rec_b[iterate].dbxrefs, | 200 rec_b[iterate].dbxrefs, |
199 sorted(set(rec_b_hits_in_a), key=lambda feat: feat.location.start), | 201 sorted( |
202 rec_b_hits_in_a.values(), key=lambda feat: feat.location.start | |
203 ), | |
200 rec_b[iterate].annotations, | 204 rec_b[iterate].annotations, |
201 ) | 205 ) |
202 ) | 206 ) |
203 iterate += 1 | 207 iterate += 1 |
204 | 208 |