- qD>csSdZ  dZdkZdkZdkZdkZdkZdkZdk Z dk Z dkZdk Z dk Z dk Z dkZdkTdkT dkT!y"dkZWn4#ej o%$eZ%dGH&einX(dZ*dZ0eiZ2dZ]dZgdZwd Zd Zd Zd Z d Z!dZ"de#fdYZ$dfdYZ%A de#fdYZ&N e'djoQO eei(Z)Q e*Z+R e+i,dS e%e+e)Z-T e+i.ndS(s( An annotation tool for the MACEARS MDE annotation task Copyright (C) 2002-3 Linguistic Data Consortium, U Penn. Web: http://www.ldc.upenn.edu/; Email: ldc@ldc.upenn.edu For license information, see the file `LICENSE' included with the distribution. Author: Kazuaki Maeda iN(s*sThis tool requires Pmws1.00cs246h}7t}8t}9t}:t}<x|D<]}=ti d|o>t ?t i n@ti d|oAd|d|D]3}ti||joti|Snq%Wti |i}x3|D](}ti |}t ||SqWti|SdS(N( sagsGetOutgoingAnnotationSetsancssplitsannSetsasGetAnnotationTypestypesGetAnchorOffsetsGetIncomingAnnotationSetsGetStartAnchorsanc1sgetNearestOffsetByTypeBefore(sancstypesasannSetsanc1((s ./mdeMain.pysgetNearestOffsetByTypeBefore2s  csti|i}x>|D]3}ti||joti|Snq%Wti |i}x3|D](}ti |}t ||SqWti|SdS(N( sagsGetIncomingAnnotationSetsancssplitsannSetsasGetAnnotationTypestypesGetAnchorOffsetsGetOutgoingAnnotationSets GetEndAnchorsanc1sgetNearestOffsetByTypeAfter(sancstypesasannSetsanc1((s ./mdeMain.pysgetNearestOffsetByTypeAfter2s  csti|}ti|}xPti||iD]3}ti ||joti |SnqCWdS(N( sagsGetAnchorOffsetsancsstartsGetAGIdsagIdsGetAnnotationSetByOffsetssplitsannsGetAnnotationTypestypesGetStartOffset(sancstypesstartsannsagId((s ./mdeMain.pysgetNearestOffsetByTypeBefores  csti|}ti|}xPti||iD]3}ti ||joti |SnqCWdS(N( sagsGetAnchorOffsetsancsendsGetAGIdsagIdsGetAnnotationSetByOffsetssplitsannsGetAnnotationTypestypes GetEndOffset(sancstypesendsannsagId((s ./mdeMain.pysgetNearestOffsetByTypeAfters  csti|}ti|}x_ti||iD]B}ti ||jo#ti |ti |fSnqCWdS(N( sagsGetAnchorOffsetsancsendsGetAGIdsagIdsGetAnnotationSetByOffsetssplitsannsGetAnnotationTypestypesGetStartOffsets GetEndOffset(sancstypesendsannsagId((s ./mdeMain.pysgetNearestOffsetByTypeBoths  sMyMultiListboxcsdZdZdZdZdZdZdZdZedZ ed Z d Z d Z d Z d Z dZedZdZedZRS(sB This class is a modified version of Python Cookbook Recipe 52266 c sti||g|_||_||_xC|D]8\}}t|}|i dt dt dt t|d|dddti dtt|d|dd d d dtd t}|i dt dt |ii||id |d |id|d|idd|id|d|id|dqDWt|}|i dt dtt|dddti dtt|dtd|i} | i dt dt| i|id dcs|i|iS(N(sss_selectsesy(sess((s ./mdeMain.pysss cs|i|iS(N(sss _selectB1sesy(sess((s ./mdeMain.pyssscsdS(Nsbreak((se((s ./mdeMain.pysss cs|i|i|iS(N(sss _b2motionsesxsy(sess((s ./mdeMain.pysss cs|i|i|iS(N(sss_button2sesxsy(sess((s ./mdeMain.pysssorientscommandsyscrollcommand(sFrames__init__sselfsmasterslistssannListscommandslswsframespacksLEFTsYESsBOTHsLabelsRAISEDsXsListboxsFLATsFALSEslbsappendsbindsYs ScrollbarsVERTICALs_scrollssbsset( sselfsmasterslistssannListscommandsframeslbslswssb((s ./mdeMain.pys__init__s,    ++%%csJ|idi|}|idt|i|dSdS(Nisbreak(sselfslistssnearestsysrowsselection_clearsENDs selection_set(sselfsysrow((s ./mdeMain.pys_selectscs|idi|}|idt|i|y|i|}Wnt }nX|i |dSdS(Nisbreak( sselfslistssnearestsysrowsselection_clearsENDs selection_setsannListsannsNonescommand(sselfsysannsrow((s ./mdeMain.pys _selectB1s cs;x'|iD]}|i||qWdSdS(Nsbreak(sselfslistssls scan_marksxsy(sselfsxsysl((s ./mdeMain.pys_button2s cs;x'|iD]}|i||qWdSdS(Nsbreak(sselfslistssls scan_dragtosxsy(sselfsxsysl((s ./mdeMain.pys _b2motions cs4x'|iD]}t|i|qWdS(N(sselfslistsslsapplysyviewsargs(sselfsargssl((s ./mdeMain.pys_scrolls cs|idiSdS(Ni(sselfslistss curselection(sself((s ./mdeMain.pys curselectionscs4x'|iD]}|i||qWdS(N(sselfslistsslsdeletesfirstslast(sselfsfirstslastsl((s ./mdeMain.pysdeletes csrg}x0|iD]"}|i|i||qW|ott t g|Sn|SdS(N( sresultsselfslistsslsappendsgetsfirstslastsapplysmapsNone(sselfsfirstslastsresultsl((s ./mdeMain.pysgets    cs|idi|dS(Ni(sselfslistssindex(sselfsindex((s ./mdeMain.pysindexscsexX|D]M}d}x8|iD]*}|i||||d}q,Wq WdS(Nii(selementssesisselfslistsslsinsertsindex(sselfsindexselementssesisl((s ./mdeMain.pysinserts   cs|idiSdS(Ni(sselfslistsssize(sself((s ./mdeMain.pyssizescs1x$|iD]}|i|qWdS(N(sselfslistsslsseesindex(sselfsindexsl((s ./mdeMain.pyssees cs1  x$|iD ]} |i|qWdS(N(sselfslistsslsselection_anchorsindex(sselfsindexsl((s ./mdeMain.pysselection_anchor s cs4x'|iD]}|i||qWdS(N(sselfslistsslsselection_clearsfirstslast(sselfsfirstslastsl((s ./mdeMain.pysselection_clears cs|idi|SdS(Ni(sselfslistssselection_includessindex(sselfsindex((s ./mdeMain.pysselection_includesscs4x'|iD]}|i||qWdS(N(sselfslistssls selection_setsfirstslast(sselfsfirstslastsl((s ./mdeMain.pys selection_sets (s__doc__s__init__s_selects _selectB1s_button2s _b2motions_scrolls curselectionsNonesdeletesgetsindexsinsertssizesseesselection_anchorsselection_clearsselection_includess selection_set(((s ./mdeMain.pysMyMultiListboxs$             smdeMaincsdZ!#hdZdZdZRdZdddZmdZydZd Zd Z d Z d Z d Z dZ edZdZdZEdZUedZeedZrdZdZdZdZdZdZ'dZdZdZdZ1dZ:eed Z ped!Z!d"Z"ed#Z#d$Z$d%Z%d&Z&%d'Z'=d(Z(Ud)Z)fd*Z*ed+Z+ed,Z,Hd-Z-ed.Z.9 d/Z/J d0Z0[ d1Z1 ed2Z2 ed3Z3 ed4Z4 d5Z5 ed6Z6 ed7Z7 ed8Z8RS(9s This tool requires Wsurf (WaveSurfer), Pmw and AGLIB 1.0 'master' is the master Tk object. 'opts' is a dictionary containing information for any of the following keys: soundFileName, configFileName annotationFileName c s #8;d|_=yn>tid}?|id}@|iAx5|DA]*}Bd|d}C|i i |qQWWn DEnXGynHtid}I|id}J|iKx5|DK]*}Ld|d}M|i i |qWWn NOnXQyR|i i dWn+St j oTdGHUtinXWtid d Xtid Ytid Ztid d^||_ `t||_at||i_bt||i_c|iiidddtd|iiidddtf|iidddth|idoi|d|_nk|idjold|_n$m|idjond|_nqti|iird|isd|i|_ u|i idddtxt!i"|_!{t#i$i%|ii|_&||i&idddt'|i i(d|i i(dddt)|iiddddddd|i*|_+|i+idddtt$i,|i i-|i _.t$i,|i+i-|i+_.d |_/d |_0d!|_1t2|_3|i4t5|_6t5|_7h|_8h|_9h|_:|i i;d"|i<|i=||i>|i&|i+i>|i&t?|i&id#t@dddt'tAo,|i+i.iBtiCiDd$d%d&n|id'o|i+i.iB|d'n|id(od|_En t5|_E|id)o'd*}|iG|d)|nytid+|_HWn=ytid,|_HWnd-|_HnXnX|iHotiid. o|iHtid.ssides..sspeechssp1.wavs soundFileNamesreverseChannelssannotationFileNamesAGsAGTK_TABLETRANS_SPEECH_DIRsAGTK_SPEECH_DIRs.sAGWSURF_OUT_SPEECH_DIRsAGTK_TABLETRANS_ANNOTATION_DIRsAGTK_ANNOTATION_DIRsAGTK_TABLETRANS_CONFIG_DIRN(Msselfs corpusTypesossenvironstkPathssplits tkPathListsreversesescomsmasterstksevalsTclErrorssyssexitsPmws initialises aboutversionsaboutcopyrights aboutcontactsFramesframestopsbottomspacksBOTHsoptsshas_keys numChannelssmdeTexts transEventstranssmdeAPIsmdeAGsagtksagUtilss agToolbarstoolbarsXscallsagWsurfs signalEventswsurfsagClientsneweventsacs_currentStartPositions_currentEndPositions_currentAnnotations StringVars_currentAnnotationFileNamesuninitAGsNones _modifieds _fileOpens token2segmentstoken2ws agId2speakersbind_allsbindPlaySoloToggles createMenubars AddToToolbarsEntrysLEFTsDEBUGsloadFilespathsjoinsreverseChannelss fileFormatsloadAnnotationFiles speechDirs annotationDirs configDirsgetcwdslimited(sselfsmastersoptsstkPaths fileFormatses tkPathListscom((s ./mdeMain.pys__init__#s                   ( ,   ! c s] |id o hSnto|dGHn|ddjo&|iii|i|in|ddjo|i n |ddjo hSn |ddjoH|d}|d}|d} |i ||| d SnA  |dd jo|iiid } | id o | id o0t| d |_t| d |_nh}|i|d <|i|d <|Sn  |ddjo!|d}"|d} #|d}$|d}%|d}&|iti|} '|ii|| || ||})|o *|d|_+d|_n,|Sn .|ddjo/|d}0|d} 1|d}2|d}3|d}4|iti|} 5|ii || |6| 7|8|}9d|_:|Sn <|ddjoG?|d} @|d}B|ii#|| Cd|_Dd Sn F|ddjoG|d}H|d} I|d}J|d}K|d}L|iti|} M|ii$|| || ||}O|oP||_Qd|_nR|SnT|ddjoU|d}V|d} W|d}X|d}Y|d}Z|iti|} [|ii%|| || ||}]|o^||__d|_n`|Sn4b|ddjoc|d}d|d} e|d}f|d}g|d}h|iti|} i|ii&|| || ||}k|ol||_md|_nn|Snqp|ddjoq|d}r|d} s|d}t|d}u|d}v|iti|} w|ii'|| || ||}y|oz||_{d|_n||Sn~|ddjo|d}|d} |d}|iti|} |d}|d}|ii(|| || ||}|o||_d|_n|Sn|ddjo|d}|d} |d}|d }y|d!}Wnt+}nX|d}|d}|iti|} |ii,|| ||| |||}|o||_d|_n|Sn|dd"joc|d#}|iti|} |ii-|| }|od|_n|Snk|dd$jo|d#}ti/|d%jo|t+fg}n|ii0|}g}x3|D](\}}|i3ti4|d&qg W|Sn|dd'jo>|d}|d} |d}|ii5|Sng|dd(jo`|d }|d}|d} |d}|ii6|| |}|Sn|dd)jo`|d }|d}|d} |d}|ii7|| |}|Sn|dd*jo|d}|d} nM|dd+jo|d#d jo d Sn|d#}|d }|iti|} |d,jo|ii8|| }n'|d-jo|ii:|| }n|d.jo|ii;|| }n|d/jo"|ii<|| }n|d0jo|ii=|| }nk|d1jo|ii>|| }n<|d2jo"|ii?|| }n t+}|od|_n|Snm|dd3joI|id o |id o" |i@|d  |d nnd4GHhSd S(5s/ Callback function for the transcription widgetsNamesPlaysPlaySolosStopsSetCurrentSpansStartAnnotationIdsEndAnnotationIdsPanelNs GetRegionss StartPositions EndPositionsAddFilledPauseAnnotations StartAnchors EndAnchorsDifficultDecisionsCommentsTokensiisAddUnclearAnnotationsAddInterruptionPointsTokenAnnotationIdsEDAnnotationIdsAddDiscourseMarkerAnnotations AddExplicitEditingTermAnnotationsAddAsideAnnotationsAddDePoDAnnotations&AddQuestionableTranscriptionAnnotationsAddSUAnnotationsTypesReplacesDeleteSUAnnotations AnnotationIds GetTokenTextstokenstextsGetAnnotationsInSpansExistsAnnotationTypeInSpans#ExistsAnnotationTypeInSpanExclusivesCreateAnnotationsDeleteAnnotations filledPausesdiscourseMarkersquestionableTranscriptions noRTMetadatasexplicitEditingTermsasidesdepods CommitRegions fall through(Aseventshas_keysDEBUGsselfswsurfsacsplays_currentStartPositions_currentEndPositions bindPlaySolosstartAnnsendAnnspanels_setCurrentSpans getRegionsinmsgsfloatsmsgsstartsends difficultscommentstokenss agId2speakersagsGetAGIds speakerAnnsmdeAPIsAddFilledPauseAnnotationSetsannSets_currentAnnotations _modifiedsAddUnclearAnnotationsannstokenAnnsAddIPrightedgesAddDiscourseMarkerAnnotations AddExplicitEditingTermAnnotationsAddAsideAnnotationsAddDePoDAnnotations&AddQuestionableTranscriptionAnnotationstypesreplacesNonesAddSUAnnotationsDeleteSUAnnotationsoutsGetAnnotationTypes GetWordList3stswsappends GetFeaturesGetAnnotationsInSpansExistsAnnotationTypeInSpans#ExistsAnnotationTypeInSpanExclusivesDeleteFilledPauseAnnotationsresultsDeleteDiscourseMarkerAnnotations)DeleteQuestionableTranscriptionAnnotationsDeleteUnclearAnnotations#DeleteExplicitEditingTermAnnotationsDeleteAsideAnnotationsDeleteDePoDAnnotations _commitRegion(sselfseventscommentsannSetsannsstartAnnsreplacestokenssresults speakerAnnspanelstokenAnnsendsinmsgsstartstswsmsgsoutstypesendAnns difficult((s ./mdeMain.pys transEvents       #       $                   $        $        $        $        $                                                #c sto|dGHn|ddjon|ddjon|ddjo!nr"|ddjo &y't|d} (ti|id)| i}*t }+x7|D+],},ti |djo -|}nqW.|o/|ii|n1|iii|2|i|3|iii|4|i5|iWn67d SnXnR8|dd jo9|iSn-:|dd jo;|iSn <|dd jo1=|d }>|d}?ti||Sn@|ddjoA|ii} Bd}C| djoeDti i!| }Et#i$d|}F|o-GyH|i&d}Wn IJnXnnK|SnNto NdGHnd S(s( Callback function for the wsurf widget sNames RegionChangedsStoppings PlayStartedsPlayingsCurrentPositionissegmentNsGetTimeOffsetListsGetFeatureLists GetFeatures AnnotationIdsFeaturesGetFilenameStemss ^([^\.]*)s fall through('sDEBUGseventsfloatscursagsGetAnnotationSetByOffsetsselfsAGIdsssplitsannSetsNonesannsasGetAnnotationTypestranssSetCurrentLinesacssetCurrentAnnotations_updateCurrentswsurfs setRegions_currentStartPositions_currentEndPositionsreturnStartAndEndTimess _featurelistsfeatures GetFeatures_currentAnnotationFileNamesgetsfnsstemsosspathsbasenamesfn2sresmatchsmsgroup( sselfseventsasfn2sannSetsmsfeaturesannsstemsfnscur((s ./mdeMain.pys signalEventsd           csRTVyWti|iWn XXnXZd|_[d|_\g|_]d|_^d|__d|_`|i i ddS(sD Delete AGSet, Timeline and AG in order to load an AG file. sf0.0N( sags DeleteAGSetsselfsAGSetIds timelineIdsAGIdss_currentStartPositions_currentEndPositions_currentAnnotations_currentAnnotationFileNamesset(sself((s ./mdeMain.pysuninitAGRs      ics7dgidt|d}jtd}k|SdS(s Convert a floating-point number to a string with the specified number of digits after the point. E.g., 3.00000 -> 3.000, if dig is 3. s%0.sfsformat % float(val)N(sstrsdigsformatsevalsout(sselfsvalsdigsformatsout((s ./mdeMain.pys_floatToStringdscsPmno|djo pdSnqtti|o rdSntdSdS(s check if annotation ID exists siiN(sidsintsagsExistsAnnotation(sselfsid((s ./mdeMain.pys_checkAnnotationIdms   csyz||jo {fSn|f}}ti|i}~x~|D~]s}ti|djoTti |d}||f7}ti |}||i||7}nqIW|SdS(Nstokenstext(sanc1sanc2soutsagsGetOutgoingAnnotationSetssplitsannSetsasGetAnnotationTypes GetFeaturestexts GetEndAnchorsanc3sselfs _getTokenText(sselfsanc1sanc2sasannSetstextsanc3sout((s ./mdeMain.pys _getTokenTextys   !csy)|i|}ti||_WndSnXy)|i|}ti||_ WndSnX|i t jo+|io dSn|i|_ n|i djo||i idjo<|i o|iidn|iidnW||i idjo<|i o|iidn|iidnny,|iiid|i|i Wn nXdS(Nsctsiisnull(sselfs token2segmentsstartAnnssegsagsGetStartOffsets_currentStartPositionsendAnns GetEndOffsets_currentEndPositionsNones corpusTypespanelstransstextListsreverseChannelsswsurfshighlightChannelsacs setRegion(sselfsstartAnnsendAnnspanelsseg((s ./mdeMain.pys_setCurrentSpans:     cs_|i}|i|o6ti||ti||d|_ ndS(s7 set start & end times of annotation with given values iN( sselfs_currentAnnotationsids_checkAnnotationIdsagsSetStartOffsetsstarts SetEndOffsetsends _modified(sselfsstartsendsid((s ./mdeMain.pys _commitRegions  csg}g}x6|D]+}||j o|i|nq"Wx6|D]+}||j o|i|nq^W||fSdS(s Check if two lists (or tuples) contain the same elements. Return a tuple of (diff1, diff2) where: diff1 is a list of elements that are in list1 but not in list2, and diff2 is a list of elements that are in list2 but not in list1. N(sdiff1sdiff2slist1sislist2sappend(sselfslist1slist2sdiff2sdiff1si((s ./mdeMain.pys_compareTwoListss    cs dS(N((sselfsann((s ./mdeMain.pys_updateCurrentsc syti|d}WndSnXh} ti|d}xh|D]]}|id}|d} |d}| d|}|d}|| |dGH?tiAd|_Bd|_C|ii|d S(s[ load an AG (AIF0) annotation file; delete the current AG Set, etc. before loading sAGssfalses DTDvalidationstitles Open FailedsbuttonssOKs message_textsProblem loading File: s NisctsisbnsUnknown File TypesAIF0(sselfsuninitAGsagsLoadsfilenamesAGIdssPmws MessageDialogsdsactivatesresults GetAGSetIdsAGSetIds corpusTypescopyToTextWidgetAllsmaxAnsagidscheckMaxAtlasAnnNumsmaxAn1smdeAPIsSetMaxAtlasAnnNumscopyToTextWidgetssyssexits _fileFormats _fileOpens_currentAnnotationFileNamesset(sselfsfilenamesmaxAnsresultsagidsmaxAn1sd((s ./mdeMain.pysloadAnnotationFileInAGXMLsF           csEFd}Gxti|DG]}IyJti|d}WnKLqnXMtid|}N|o?O|i d}P|t |joQt |}nnqWS|SdS(Nis _AtlasAnnID_sAnn(.*)$i( smaxsagsGetAnnotationSeqByOffsetsagIdsanns GetFeatures atlasAnnIdsresmatchsnumMatchsgroupsnumsint(sselfsagIdsnumMatchsnumsmaxs atlasAnnIdsann((s ./mdeMain.pyscheckMaxAtlasAnnNumEs    csUVXt}Y|ii}Z|djo[tidddn[]|itjo^tiddn1`|idjoa|i |nbd}c|SdS( s# bound to SaveAnnotationFile event ss message_textsFile name not set. s-Please use "Save Annotations As .." Menu ItemsFile format not selected.sAIF0iN( sNonessavedsselfs_currentAnnotationFileNamesgets currentFilesPmws MessageDialogs _fileFormatssaveAnnotationFileInAGXML(sselfsevents currentFilessaved((s ./mdeMain.pysbindSaveAnnotationFileUs  c sefgtddid|ijdddfddff}l|d joKmd |_n|i|o|ii|pti i ||_nd S( s* bound to SaveAnnotationFileAsAGXML event stitlesSave Annotations in AIF0 Files initialdirs filetypess AG XML filess*.ag.xmls All filess*ssAIF0N( sasksaveasfilenamesselfs annotationDirsfilenames _fileFormatssaveAnnotationFileInAGXMLs_currentAnnotationFileNamessetsosspathsdirname(sselfseventsfilename((s ./mdeMain.pysbindSaveAnnotationFileAsAGXMLes  ! c srswyTxt|d}yti|i}z|i|{|i |t |_ WnJ}~t i ddddddfdd }|inXd S( s save AG data to an AG XML file swstitlesSave file faileds defaultbuttonisbuttonssOKs message_textsSave File Failed:N(sopensfilenamesfsagstoXMLsselfsAGSetIdsoutswritesclosesNones _modifiedsPmws MessageDialogsdsactivate(sselfsfilenamesdsfsout((s ./mdeMain.pyssaveAnnotationFileInAGXMLrs   c s|iotidddSntddd|idddfd d ff}|tj o>|i|i t i i |i |_d |_ndS( Ns message_texts_ There is an open file --- please re-start the tool work on a new file.stitlesImport Transcription Files initialdirs filetypess txt filess*.txts All filess*i( sselfs _fileOpensPmws MessageDialogs askopenfiles annotationDirsfilesNonesimportTransFilesnamesosspathsdirname(sselfsfile((s ./mdeMain.pysbindImportTransFiles    !csn|ii|ii||ii|_|ii|_|id|iddS(Nii(sselfsmdeAPIs InitializesLoadTranscriptionFilesfilenamesAGSetIdsAGIdsscopyToTextWidget(sselfsfilename((s ./mdeMain.pysimportTransFiles c s|idjold}g}xw|iD]i} |i|ii| |d7}y't i | dd|i | ||| <@toA|i| nCti| } Dti| }Eti| d}Gtid|}H|oI|id}nKtid|}L|oM|id}nOtid|o.Q|i|| | |||tdd}nfTtid|o.V|i|| | |||tdd}n"[|i|| | |||}_||| <a| o b|}ndt!|d joe||fg}ng||fg|d }i|i"|sx{ti#|Ds]g}tti%|d joHuyvti|d }Wn!wx|i'|d yPnXz|djo{|i'|ddn||djo}|i'|ddn~|djo|i'|d dn|djo|i'|ddn]|djo|i'|ddn3|djo|i'|ddn dGHnqWqW|i(|i)|o|od|i*|}|i,|} |t j o | t j o| |}|Snt SndS( Nscategorys^~(.*)$is^\^(.*)$s vocalNoisesfgsgreens nonvocalNoiseiisSUstypesblacks statementsblues/. squestionsreds/? s backchannels/@ s incompletesbrowns/- sclausals#008000s/, s coordinatings#000080s/& sunknown SU type(/sagsGetStartAnchorsannsss GetEndAnchorsesselfsmdeAPIs GetWordList3swordListsGetAGIdsagIdslastThreeWordssNoneswsfirstWsann2swords token2segments PREPROCESSspreprocessFilledPausessstartsends GetFeaturescatsresmatchstestsgroups textWidgets InsertWordsENDstoken2wslensprocessFontColorsGetIncomingAnnotationSetsa3sGetAnnotationTypestypesaddSlashs InsertNewLines updateAndSees getYInPixelstopsgetYBottomInPixelsbottomsheight(sselfs textWidgetsanns token2segmentstoken2wswordsa3sendsagIdswordListsesstartsbottomsann2scatsheightssswslastThreeWordssteststypestopsfirstW((s ./mdeMain.pyscopySegmentToTextWidget's         ..!         cs|id||ii||iddd|id||ii||iddd|id||ii||iddd|id||ii||iddd|id||ii||id|id||ii||id|id ||ii||id|iidS( Ns filledPauseis addStarLeftsdiscourseMarkersasidesexplicitEditingTermsdepodsquestionableTranscriptions noRTMetadata(sselfscopyAnnotationsToTextsindexstransstextListstoken2wsFocusFirstToken(sselfsindex((s ./mdeMain.pysprocessAnnotationss6         cs ti|d}|djp|djp|djpr|djpe|djpX|djpK|djp>|d jp1|d jp$|d jp|d jp |d joeti|}|i|}|i i ti |ti ||f|dd}ndS(NstextsuhsumsersehsermsahsUhsUmsErsEhsErmsAhis(sags GetFeaturestokenstextsGetAGIdsagIdsselfs agId2speakers speakerAnnsmdeAPIsAddFilledPauseAnnotationsGetStartAnchors GetEndAnchorsann(sselfstokens speakerAnnstextsannsagId((s ./mdeMain.pyspreprocessFilledPausess csw|dddjp|dddjp|dddjp|dddjp|dddjp|dddjp{|dddjpf|ddd jpQ|ddd jp<|ddd jp'|ddd jp|ddd jo#|ddiddSn|dddjp|dddjp|dddjp|dddjp|dddjp|dddjp|dddjp|dddjp{|dddjpf|dddjpQ|dddjp<|dddjp'|dddjp|dddjo#|ddiddSny|dddjo|ddd jp#|ddd!jo|ddd jp|ddd"jo|ddd#jp|ddd$jo|ddd#jp|ddd"jo|dddjp{|ddd$jo|dddjpQ|ddd%jo|dddjp'|ddd&jo|dddjo;|ddid|ddiddSnWn nXy|d'dd%jo'|dddjo|dddjp<|d'dd%jo'|dddjo|dddjoS |d'did |ddid |ddid dSnWn nX|ddd(jp4|ddd)jp|ddd*jp |ddd+jp|ddd,jp|ddd-jp|ddd.jp|ddd/jp|ddd0jp|ddd1jpw|ddd2jpb|ddd3jpM|ddd4jp8|ddd5jp#|ddd6jp|ddd7jp|ddd8jp|ddd9jp|ddd:jp|ddd;jp|ddd<jp|ddd=jp{|ddd>jpf|ddd?jpQ|ddd@jp<|dddAjp'|dddBjp|dddCjo#-|ddidD.dSndS(ENisuhsumsersehsermsahsUhsUmsErsEhsErmsAhisbluesactuallysanyways basicallyslikesnowsseeswellsActuallysAnyways BasicallysLikesNowsSeesWellsredsismeansIsyousknowsYouslet'ssLet'sisuh-huhsyeahsyessyepsmm-hmsmm-hmmshmmshmsrightsohssuresokaysreallyshuhsUh-huhsYeahsYessYepsMm-hmsMm-hmmsHmmsHmsRightsOhsSuresOkaysReallysHuhs#007700(stokensssetFg(sselfstokens((s ./mdeMain.pysprocessFontColors8  * TQcsi12|i|}3y4|d}Wn56dSnX7x"|D7]}8||iqGWdS(Ns token token(sselfsgetAtlasChildrensanns atlasChildrenstokenssistoken2wsfgGray(sselfsannstoken2wstokenssis atlasChildren((s ./mdeMain.pysgrayOutChildren1s  c s:@|idjo#Ati|i|B|} n@Dg} Fx0|iDF]"} H| ti| I|7} qOWKxy| DK]n}M|djohN|i |}OyP|d}WnQRg}nXTx"|DT]} U|| iqWnX|ii|} Yg}Zx%| DZ]} [|i| dq+W]|i|}_|o`||ii||i}|djp |djondSn|iidS(NsSavedsNo(sselfs _modifiedssaveAnnotationDialogsresultsmastersquit(sselfsresult((s ./mdeMain.pys_checkSaveAndExits   cs!|iiidSdS(N(sselfstranssacsclearAllAnnotations(sself((s ./mdeMain.pysbindMenuRefreshscsti||_|iid|i_t|iidd|ii_|iiii ddd|i |iii ddd|i |iii d|iii dd d|i |iii d|iii dd d|i t|iidd|ii_|iiidd d |iii|iiii dd d|i|iii d|iii ddd|i|iii d|iii ddd|i|ii|i|iid|i_|iii ddd|ii|iii d|iii ddd|ii|iii d|iii ddd|ii|iii d |iii dd d|i |iii dd d|i |iii ddd|i|iid|i_!|iii dd#d|idS(s create a menu bar sFilestearoffislabels Open Annotation File (in AG XML)scommandsOpen Annotation Files separatorsOpen Sound FilesSavesSave Annotations As ...smenus&Save Annotations As ... (in AG Format)s Validate DatasExitsEdits-Add Annotation (Return or Right Mouse Button)sDelete Annotation (Ctl-d)sSU Annotation Windows!Show Rendered Text (All Channels)s,Show Selected Annotations (Selected Channel)s+Show List of Annotations (Selected Channel)sHelpsSee Tool Manual (Text format)N(sagUtilss agMenubarsmastersselfsmbars createMenusfilesMenusopenAnnotationFiles add_commandsbindOpenAnnotationFileInAGXMLsaddsbindOpenSoundFilesbindSaveAnnotationFilessaveAnnotationsAss add_cascadesbindSaveAnnotationFileAsAGXMLs validateAlls_checkSaveAndExitstranss AddToMenusCreateTagDialogsDeleteTagDialogsToSUAnnotationModesshowFilteredTextsshowLimitedAnnotationssshowAnnotationListshelpsshowManualText(sselfsmaster((s ./mdeMain.pys createMenubarsZ$ $  cs3%'tid}(yH)t|d}*ti|i}+|i |,|i Wn-.dSnX/tid}0d}1||d|7}2ti|}3ti|i4ddf5dd6d d }8|ii|9|id d :ti|;ti|dS( Ns.ag.xmlsws.txts-/pkg/ldc/projects/mde/scripts3/agRTValidator s> sbuttonssCloses defaultbuttonstitlesOutput of RTValidators text_statesdisabled(stempfilesmktempstmpfile1sopensfsagstoXMLsselfsAGSetIdsoutswritesclosestmpfile2scommandsosssystemstextsPmws TextDialogsmastersds_texts importfiles configuresunlink(sselfsdsfstextscommandstmpfile2stmpfile1sout((s ./mdeMain.pysrunRTValidator%s(    cs6=>tid}?yH@t|d}Ati|i}B|i |C|i WnDEdSnXFtid}Gd}H||d|7}Iti|}Jti|iKddfLddMd d }O|ii|P|id d Qti|Rti|SdS( Ns.ag.xmlsws.txts,/pkg/ldc/projects/mde/scripts3/agRTRenderer s> sbuttonssCloses defaultbuttonstitlesOutput of RTValidators text_statesdisabled(stempfilesmktempstmpfile1sopensfsagstoXMLsselfsAGSetIdsoutswritesclosestmpfile2scommandsosssystemstextsPmws TextDialogsmastersds_texts importfiles configuresunlink(sselfsdsfstextscommandstmpfile2stmpfile1sout((s ./mdeMain.pys runRTRenderer=s*    csUWddddddddd d d d d dddddddddddddf}^xatt|iD^]G}_||i|jo*`ya||SWnbcdSnXnqsWddSdS(NsAsBsCsDsEsFsGsHsIsJsKsLsMsNsOsPsQsRsSsTsUsVsWsXsYsZs?(scodessrangeslensselfsAGIdssindexsid(sselfsidsindexscodes((s ./mdeMain.pysagIdToSpeakerCodeUsW csfgg} hd} jxf|Dj][}m|ii|}n| o nqnox%|Do]}p| i |dq\WqWr| p | gjo sdSnzd}{t }}t } ~d} h}t } x| D]}ti|}| oM|i| }||d|| | d7}| || <t } nti|d}|oti|d}|djod} d} n|d jod } d} n|d jod } d} n|d jod} d} n_|djod} d} n9|djod} d} nd} d} n||jot }qn|o qnti|d} tid| p#tid| ptid| o qnti|d}|djp|djp |djo qnti|d}|o9ti|}||jo t }nqnti|d}|o9ti|}||jo t }nqnti|d}|o9ti|}||jo t }nqnti|d }|o9ti|}||jo t }nqnti|d}|o9ti|}||jo t }nqn|o qnyti|} y'|| cti|dd!7ddf?dd@dd}Bt|i}C|idddtDt%i&|}E|idddtF|i(|i'| dS(Niis filledPausesDiscourse MarkerisExplicit Editing TermisAsideisDePoDisSkip/noRTMetadatai sQuestionable Transcriptioni sbuttonssOpensCloses defaultbuttonstitlesSelect Annotations to Displaysfillsexpandstag_textsTypesssidestextsanchorsvariablesSelected Annotations()sselfslimitedsdestroysNonestranss currentTextstextListsAGIdssagIdstypeListsPmwsDialogsmastersdsFramesinteriorsf1spacksBOTHsGroupsg11sLEFTsIntVarstypeVarstypesvalssetattrs CheckbuttonsWsgetattrsactivatesresults typeList1sgetsappendsd2sframesmdeTexts ReadOnlyTextstextsrefreshLimitedAnnotations(sselfseventsf1stypeListstextsframesresultsagIdsd2stypeVarsdsvals typeList1stypesg11((s ./mdeMain.pysshowLimitedAnnotationssX   H    ,     c sTHIh}Jx$|DJ]\} }Kd||tt i|d<d?}|id:td;dd>tt}x|D]\}}} t||tt|id@|dAtdBt ||} | o| in| id:td;dqWt}x|D]\}}}} t||tt|id@|dAtdBt ||} | o| in| id:td;dqW|i&}|d6jo dSng}g} x|D]t\}}} t ||i*o3|i+||f | i+||dfn | i+||dfqpW g}  g} g} x|D ]\}}}}  t ||i*oL | i+||f |i+||f |i+|||dfn |i+|||dfqW ||_ | |_  t/|djpt/| djo  dSn g} x*|D ]} ||i2||7}q W |i3|i4 g}  g} x|D ]} g} xO| D ]D\}} y! |i+||Wn# $ |i+dCnXqzW' | i+|( |i+|dq^W* t i |i + d4dDf, d7dD- d8dE}/ t:|i1 |2 |3 |i;}4 |id;t=d:t6 x$| D6 ]}7 |i>t?|qmWdS(FNsctsiisTypestypeisTokensstokensisDifficult DicisionsdifficultToAnnotateisCommentsscomments Annotation IDs annotationIdis Children IDss ChildrenIDsi<sAtlas IDsAtlasIDi s Token IDssTokenIDsi(sAtlas Token IDss AtlasTokenIDss Start Anchors StartAnchors End Anchors EndAnchors Start Offsets StartOffsetis End Offsets EndOffsets Filled Pauses filledPausesDiscourse MarkersdiscourseMarkersExplicit Editing TermsexplicitEditingTermsDePoDsdepodsAsidesasidesSkip/NoRTMetadatas noRTMetadatasQuestionable TranscriptionsquestionableTranscriptionsbuttonssShowsCancels defaultbuttonstitles/Choose Annotation Types and Features to Displaysfillsexpandstag_textsTypesssidesFeaturesstextsanchorsvariablessClosesAnnotation List(@sselfs corpusTypestranss currentTextstextListsAGIdssagIdssshowList_columnLists columnListsshowList_typeListstypeListsPmwsDialogsmastersdsFramesinteriorsf1spacksBOTHsGroupsg11sLEFTsg12sIntVarstypeVarstype1stype2sselectssetattrs CheckbuttonsWsgetattrstmpscolVarscol1scol2swidthsactivatesresults typeList1s newTypeListsgetsappends columnList1s columnList2s newColumnListslens annDictListsagIdsgetAnnotationsssortscmpByStartOffsetOfItemsoutsout2sannDictsitemscolsMyMultiListboxsgotoSpansmlbsYESsinsertsEND( sselfseventsf1stypeListsannDictsresults annDictListscolVarstype1sselectsoutstmps newTypeLists columnList1s columnList2swidths typeList1stype2sagIdscol2scol1s columnListsmlbsout2stypeVarsdsg12sitemsagIdss newColumnListscolsg11((s ./mdeMain.pysshowAnnotationLists   a                    )           cs9 : | o ; dSn= g}> |ii|}? | o ? dSn@ x%|D@ ]}A |i|dqWWC g}D x(|DD ]}E |i|i |qWH |i i |dS(Ni( sannstokenssselfsmdeAPIs GetWordList3swlswsappendswsstokenstoken2wstranssFocusWs(sselfsannstokensstokenswsswswl((s ./mdeMain.pysgotoSpan9 s       cspJ K ti|d}L ti|d}N ||jo O dSn#P ||jo Q dSnY dSdS(Ns annotationIdiii(sagsGetStartOffsetsasaosbsbo(sselfsasbsbosao((s ./mdeMain.pyscmpByStartOffsetOfItemJ s  c s [ \ g} ] x|D] ]\} } ^ xti|| D^ ]} _ h}` | |d<a |i i | }b d}c d}d d}e xs|De ]h}f ||dd7}g ||dd7}h y%i |ti|ddd7}Wn k k nXqWm | |d<n | |d<o ||d <p yq ti| d |d  t|dd d|i dtidtdtWn  dSnXdS(s6 add items specific to the main script to the toolbar swidthis textvariablesstatessidesfillN(sEntrystoolbarsselfs_currentAnnotationFileNamesDISABLEDspacksLEFTsX(sselfstoolbar((s ./mdeMain.pys AddToToolbar s #cs-  |idjo |ii dSn |ii|iidjo\ |i o' |iid |ii n$ |iid |ii n} |ii|iidjo\ |i o' |iid |ii n$ |iid |ii ndS(Nii( sselfs numChannelsswsurfsbindPlayTogglestranss currentTextstextListsreverseChannelsshighlightChannelsbindPlayToggle1sbindPlayToggle2(sselfse((s ./mdeMain.pysbindPlaySoloToggle s   cs  |idjo |ii dSn |ii|iidjo5 |io |iin |ii nV |ii|iidjo5 |io |ii n |iindS(Nii( sselfs numChannelsswsurfsplaystranss currentTextstextListsreverseChannelssplay1splay2(sselfse((s ./mdeMain.pys bindPlaySolo s     c s   d}  | d7}  x|iD ]} xti| dD ]}  |ii| } |ii | } | o` | d7}  d} x&|D ]} ||dd7}qW | |7}  | d7} nqKWq)W | d7}  x|iD ]} xti| d D ]}  ti| d d jo |ii| } |ii| } | o` | d 7}  d} x&|D ]} ||dd7}qW | |7}  | d7} nnq-Wq W | d 7}  x|iD ]} |ii|} x|D ]}  |ii| } |ii| } | ot|djo` | d7}  d}! x&|D! ]}" ||dd7}qW# | |7} $ | d7} nq5Wq W3 ti}4 ti|i5 dd6 dt7 dd8 dd9 dddd: dd} < | it| = | idtdddS(s% Run validator functions on the data ss*Checking Discourse Marker Annotations... sdiscourseMarkers?There is a discourseMarker annotation that is not on the list. is s sChecking Backchannels... sSUstypes backchannels2There is a backchannel SU that is not on the list sChecking SUs... s?There is no SU assigned for the following segment: Is this OK? s borderframeslabelposs hull_widthis hull_heighti,s text_padxi s text_padys text_wrapsnonesfillsexpandN(soutsselfsAGIdssagIdsagsGetAnnotationSetsannsmdeAPIs GetWordList3swlsValidateDiscourseMarkerssvalidatestokenStrsws GetFeaturesValidateBackchannelssGetAnnotationSegmentListsannSetsValidateSegmentAndSUslensPmwsDialogsds ScrolledTextsinteriorsNsstsinsertsENDspacksBOTH( sselfsesannSetswlsagIdsdswstokenStrsvalidatesstsannsout((s ./mdeMain.pys validateAll sz                            (9s__doc__s__init__s transEvents signalEventsuninitAGs_floatToStrings_checkAnnotationIds _getTokenTexts_setCurrentSpans _commitRegions_compareTwoListss_updateCurrentsgetAtlasChildrensreturnStartAndEndTimessNonesbindOpenAnnotationFileInAGXMLsloadAnnotationFilesloadAnnotationFileInAGXMLscheckMaxAtlasAnnNumsbindSaveAnnotationFilesbindSaveAnnotationFileAsAGXMLssaveAnnotationFileInAGXMLsbindImportTransFilesimportTransFilescopyToTextWidgetAllsmatchTwoSegListsscopyToTextWidgetscopySegmentToTextWidgetsprocessAnnotationsspreprocessFilledPausessprocessFontColorsgrayOutChildrenscopyAnnotationsToTextsbindNewAnnotationWidgetssaveAnnotationDialogsbindOpenSoundFiles_checkSaveAndExitsbindMenuRefreshs createMenubarsrunRTValidators runRTRenderersagIdToSpeakerCodesinsertFilteredTextsshowFilteredTextsshowLimitedAnnotationssrefreshLimitedAnnotationssshowAnnotationListsgotoSpanscmpByStartOffsetOfItemsgetAnnotationssshowAnnotationGuidelinesHtmlsshowAnnotationGuidelinesTextsshowManualTexts AddToToolbarsbindPlaySoloToggles bindPlaySolos validateAll(((s ./mdeMain.pysmdeMainsr  % ?  4      0    9 1 u  ` 6    h    I `   B sListViewAnnotationscsA B dZK dZRS(NcsB C ti||D ti|F ||_G |iidtdt H t |ddI d|i idtdt dS(NsexpandsfillstextsGo toscommand( sFrames__init__sselfsmasters MultiListboxs columnListsmlbspacksYESsBOTHsButtonsgoto(sselfsmasters columnList((s ./mdeMain.pys__init__B s  cs K L dS(N((sself((s ./mdeMain.pysgotoK s(s__init__sgoto(((s ./mdeMain.pysListViewAnnotationsA s s__main__sMDE Annotation Tool(/s__doc__s PREPROCESSssyssagsstrings agtk.agUtilssagtksossos.pathsgetoptstempfiles webbrowsersmdeTextsmdeAPIsresTkinters agtk.agWsurfs tkFileDialogsPmws ImportErrorsNonesexitsAGAPPS_VERSIONsDEBUGsgetcwdsagtkPathsprocessCmdlineOptss printUsagesgetNearestOffsetBeforesgetNearestOffsetAftersgetNearestOffsetByTypeBefore2sgetNearestOffsetByTypeAfter2sgetNearestOffsetByTypeBeforesgetNearestOffsetByTypeAftersgetNearestOffsetByTypeBothsFramesMyMultiListboxsmdeMainsListViewAnnotationss__name__sargvsoptssTksrootstitlesmainsmainloop(sstringsagsprocessCmdlineOptssMyMultiListboxsgetNearestOffsetAftersrootssyss printUsages webbrowsersmdeMainsgetNearestOffsetByTypeBothsDEBUGsAGAPPS_VERSIONsgetNearestOffsetByTypeAfter2sgetNearestOffsetBeforesPmwsListViewAnnotationssmdeTextstempfilesgetNearestOffsetByTypeBefore2sagtksgetNearestOffsetByTypeBeforesresmdeAPIsoptss PREPROCESSsgetoptsmainsossgetNearestOffsetByTypeAftersagtkPath((s ./mdeMain.pys? sj                      +     e0