This is plotCut.m in view mode; [Download] [Up]
/* plotCut.m by Paul Kunz November 1992 * Category extension to Plot class dealing with Cuts * * Copyright (C) 1991 The Board of Trustees of * The Leland Stanford Junior University. All Rights Reserved. */ #import "Draw.subproj/draw.h" #import "Plot.h" const char plotCut_m_rcsid[] = "$Id: plotCut.m,v 2.11.2.4 1994/08/17 18:57:49 pfkeb Exp $"; #import "HGraphicView.h" @implementation Plot(Cut) /* private methods not declared in interface file */ - (cutParmType*) getCutParms { return &cutParms; } /* public methods */ - initCutWithTuple:ht Column:(int)i { [self initPlotWithTuple: ht Type: HISTOGRAM ]; [self setCutHistFlag:YES]; [self initCutParmsForColumn:i]; return self; } - bindCuts { id copyStor; id plotList; id plot; cutStorElem *cut; dependStorElem *depend; func_id cut_func; unsigned i, j; unsigned notFound; BOOL isBound; /* We can enter here in three ways: * - dearchiving a document * - pasting into open document * - pasting into temporary document for pasteboard request * In the last two, the cut plot needs to be found before binding. * In the last case, the cut plot will not be found, so we just return */ if ( cutPlotStor ) { plotList = [graphicView plotList]; i = [cutPlotStor count]; notFound = i; while ( i-- ) { cut = [cutPlotStor elementAt:i]; if ( cut->plot == nil ) { j = [plotList count]; while ( j-- ) { plot = [plotList objectAt:j]; if ( cut->name == [plot name] ) { cut->plot = plot; notFound--; break; } } } else { notFound--; } } if ( notFound ) return self; } /* Now proceed to bind the display to cuts, since we know there are there */ if ( cutPlotStor ) { copyStor = [cutPlotStor copy ]; [cutPlotStor empty]; while ( (cut_func = h_nextCut(disp, NULL) ) ) { h_deleteCut(disp, cut_func); } isBound = NO; i = [copyStor count]; while ( i-- ) { cut = [copyStor elementAt: i]; if ( cut->plot ) { if ([self addCutPlot:cut->plot]) { break; } if ( cut->invertFlag ) { [self invertCutPlot:cut->plot]; } isBound = YES; } } if ( !isBound ) { h_setFixedBins( disp, YES ); } [copyStor free]; } if ( dependStor ) { copyStor = [dependStor copy]; [ dependStor empty]; i = [copyStor count]; while ( i-- ) { depend = [copyStor elementAt:i]; if ( depend->plot ) { plotList = [depend->plot plotList]; j = [plotList indexOf:self]; if ( j == NX_NOT_IN_LIST ) { [depend->plot addCutPlot:self]; } else { [dependStor addElement:depend]; } } else { plotList = [graphicView plotList]; j = [plotList count]; while ( j-- ) { plot = [plotList objectAt:j]; if ( depend->name == [plot name] ) { [plot addCutPlot:self]; break; } } } } [[graphicView cutList] addObjectIfAbsent:self]; } return self; } - setCutHistFlag: (BOOL) yesOrNo { if (graphicView) { if (yesOrNo && ! cutHistFlag) { [[graphicView cutList] addObject:self]; } else if (!yesOrNo && cutHistFlag) { [[graphicView cutList] removeObject:self]; } } cutHistFlag = yesOrNo; return self; } - initCutParmsForColumn: (int)i { float range; ntuple ant; cutParms.cutCode = 2; cutParms.cutFunc = NXCopyStringBuffer( "h_cut_outside" ); cutParms.varIndex = i; /* * set the cut parameters to 'no-cut' starting values */ ant = [self ntuple]; cutParms.cutValue1 = *(h_getNtLow(ant) + cutParms.varIndex); cutParms.cutValue2 = *(h_getNtHigh(ant) + cutParms.varIndex); range = cutParms.cutValue2 - cutParms.cutValue1; cutParms.cutValue2 += 0.05*range; cutParms.cutValue1 -= 0.05*range; if (cutParms.cutCode < 2) cutParms.blkSize = 2; else cutParms.blkSize = 3; h_bind(disp, XAXIS, cutParms.varIndex ); return self; } /* Methods supporting managing cutPlots to this plot */ - (int) addCutPlot: cutPlot { cutStorElem newcut, *cut; dependStorElem *depend; cutParmType *parms; unsigned i; if ( self == cutPlot ) { return 1; } if ( [cutPlot hTuple] != hTuple ) { NXRunAlertPanel( "Open", "Attempt to apply cut from different ntuple", "OK", NULL, NULL); return 1; } if ( !cutPlotStor ) { cutPlotStor = [[Storage allocFromZone:[self zone]] initCount:0 elementSize:sizeof(cutStorElem) description:"@%*"]; } /* Check if this cutPlot has already been added */ i = [cutPlotStor count]; while ( i-- ) { cut = [cutPlotStor elementAt:i]; if ( cut->plot == cutPlot ) { return 1; } } /* Add cutPlot to this plot's list of cuts */ [cutPlot addCutDepend:self ]; parms = [cutPlot getCutParms]; newcut.plot = cutPlot; newcut.name = [cutPlot name]; newcut.function = h_addCut(disp, parms->cutFunc, parms->varIndex, parms->cutValue1, parms->cutValue2); newcut.invertFlag = NO; [cutPlotStor addElement:&newcut]; /* If this plot is a cutting Plot, then add cutPlot to those plots */ if ( !dependStor ) { return 0; } i = [dependStor count]; while ( i-- ) { depend = [dependStor elementAt:i]; [depend->plot addCutPlot:cutPlot]; } return 0; } - changeCutPlot:cutPlot { cutStorElem *cut; int i, count; float low, high; count = [cutPlotStor count]; [cutPlot getCutLow:&low High:&high]; for ( i = 0; i < count; i ++ ) { cut = [cutPlotStor elementAt:i]; if ( cut->plot == cutPlot ) { h_changeCut(disp, cut->function, low, high ); break; } } isFitted = NO; return self; } - invertCutPlot:cutPlot { cutStorElem newcut, *cut = NULL; cutParmType *parms; int i, index, count; index = -1; count = [cutPlotStor count]; for ( i = 0; i < count; i++ ) { cut = [cutPlotStor elementAt:i]; if ( cut->plot == cutPlot ) { index = i; break; } } if ( index == -1 ) { return self; } newcut.plot = cut->plot; newcut.name = cut->name; parms = [cutPlot getCutParms]; if ( !cut->invertFlag ) { newcut.function = h_addCut(disp, "h_cut_in_incl", parms->varIndex, parms->cutValue1, parms->cutValue2); newcut.invertFlag = YES; } else { newcut.function = h_addCut(disp, "h_cut_outside", parms->varIndex, parms->cutValue1, parms->cutValue2); newcut.invertFlag = NO; } h_deleteCut(disp, cut->function ); [cutPlotStor replaceElementAt:index with:&newcut ]; return self; } - (BOOL) isInvertedCut:cutPlot { cutStorElem *cut; int i; i = [cutPlotStor count]; while ( i-- ) { cut = [cutPlotStor elementAt:i]; if ( cut->plot == cutPlot ) { return cut->invertFlag; } } return NO; } - removeCutPlot:cutPlot { cutStorElem *cut; int i, count; count = [cutPlotStor count]; for ( i = 0; i < count; i ++ ) { cut = [cutPlotStor elementAt:i]; if ( cut->plot == cutPlot ) { [cutPlot removeCutDepend:self]; h_deleteCut( disp, cut->function ); [cutPlotStor removeElementAt:i]; break; } } return self; } - removeAllCuts { cutStorElem *cut; int i, count; func_id cut_func; count = [cutPlotStor count]; for ( i = 0; i < count; i ++ ) { cut = [cutPlotStor elementAt:i]; [cut->plot removeCutDepend:self]; } while ( (cut_func = h_nextCut(disp, NULL) ) ) { h_deleteCut(disp, cut_func); } [cutPlotStor empty]; return self; } - cutList { cutStorElem *cut; unsigned i, count; count = [cutPlotStor count]; if ( !count ) { return nil; } if ( cutPlotList == nil ) { cutPlotList = [[List allocFromZone:[self zone]] initCount:0]; } else { [cutPlotList empty]; } for ( i = 0; i < count; i++ ) { cut = [cutPlotStor elementAt:i]; [cutPlotList addObject:cut->plot]; } return cutPlotList; } - (BOOL) hasCut { return ( [cutPlotStor count] ? YES : NO ); } /* Methods used to support plot being used for display for a cut function */ - setCutLow:(float)low High:(float)high { cutParms.cutValue1 = low; cutParms.cutValue2 = high; return self; } - getCutLow:(float *)low High:(float *)high { *low = cutParms.cutValue1; *high = cutParms.cutValue2; return self; } - addCutDepend:sender { dependStorElem new, *old; unsigned int i; if ( !dependStor ) { dependStor = [[Storage allocFromZone:[self zone]] initCount:0 elementSize:sizeof(dependStorElem) description:"@%"]; } i = [dependStor count]; while ( i-- ) { old = [dependStor elementAt:i]; if ( old->plot == sender ) { return self; } } new.plot = sender; new.name = [sender name]; [dependStor addElement:&new]; return self; } - removeCutDepend:sender { dependStorElem *old; unsigned int i; i = [dependStor count]; while ( i-- ) { old = [dependStor elementAt:i]; if ( old->plot == sender ) { [dependStor removeElementAt:i]; return self; } } return self; } - (unsigned) dependCount { if ( !dependStor ) { return 0; } return [dependStor count]; } - dependList; { dependStorElem *old; unsigned int i; if ( !dependList ) { dependList = [[List allocFromZone:[self zone]] initCount:0]; } [dependList empty]; i = [dependStor count]; while ( i-- ) { old = [dependStor elementAt:i]; [dependList addObject:old->plot]; } return dependList; } - (BOOL) isCutPlot { return cutHistFlag; } - (int) getCutColumn { return cutParms.varIndex; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.