import java.util.*;
import java.io.*;
/**
* This class represents the results for one system identified by its ID.
* One system has several segmentation results corresponding to the run of this system on a video.
* used in shot boundary detection task programs of TREC 2001.
*
* @author
* This software was produced by NIST, an agency of the
* U.S. government, and by statute is not subject to copyright in the
* United States. Recipients of this software assume all
* responsibilities associated with its operation, modification and
* maintenance.
*
*/
public class systemResult{
/**
* The segmentations for this system are stored in this Hashtable.
* The key is the name of the video the segmentation is done for.
*
*/
private Hashtable segmentations = new Hashtable();
/**
* The system ID of the results.
*
*/
private String sysId;
/**
* The number of frames of all the gradual-gradual intersections
*
*/
public int gradualFrameCount = 0;
/**
* The number of frames of the matching reference gradual transitions
*
*/
public int gradualRecallFrameCount = 0;
/**
* The number of frames of the matching system transitions
*
*/
public int gradualPrecisionFrameCount = 0;
/**
* The number of reference matching transitions across all segmentations
*
*/
public int referenceMatchingCount = 0;
/**
* The number of reference matching cut transitions across all
* segmentations
* po
*/
public int referenceCutMatchingCount = 0;
/**
* The number of reference matching gradual transitions across all
* segmentations
* po
*/
public int referenceGradMatchingCount = 0;
/**
* The number of system matching transitions across all segmentations
*
*/
public int systemMatchingCount = 0;
/**
* The number of system matching cut transitions across all segmentations
* po
*/
public int systemCutMatchingCount = 0;
/**
* The number of system matching gradual transitions across all
* segmentations
* po
*/
public int systemGradMatchingCount = 0;
/**
* The number of system transitions across all segmentations
*
*/
public int systemTransCount = 0;
/**
* The number of system cut transitions across all segmentations
* po
*/
public int systemCutTransCount = 0;
/**
* The number of system gradual transitions across all segmentations
* po
*/
public int systemGradTransCount = 0;
/**
* The number of reference transitions across all segmentations
*
*/
public int referenceTransCount = 0;
/**
* The number of reference cut transitions across all segmentations
* po
*/
public int referenceCutTransCount = 0;
/**
* The number of reference gradual transitions across all segmentations
* po
*/
public int referenceGradTransCount = 0;
/**
* Instanciate a systemResult object with only the given system ID.
*
*/
private int droppedCount = 0;
public systemResult(String sysId){
this.sysId = sysId;
}
/**
* Add the given segmentation to the system results.
*
*/
public void addSegmentation(Segmentation s){
if(s.getVideoName() == null){
System.out.println("PROBLEM");
}
segmentations.put(s.getVideoName(), s);
}
/**
* Returns an enumeration of segmentations.
*
*/
public Enumeration getSegmentations(){
return segmentations.elements();
}
/**
* Returns the system ID.
*
*/
public String getSysId(){
return this.sysId;
}
/**
* Returns a Vector containing video names of the segmentations.
*
*/
public Vector getSegmentationsVideoNames(){
Vector toReturn = new Vector();
Enumeration e = segmentations.elements();
while(e.hasMoreElements()){
Segmentation s = (Segmentation) e.nextElement();
toReturn.add(s.getVideoName());
}
return toReturn;
}
/**
* Process the comparison between the reference segmentations and each system segmentation.
*
*/
public void processComparison(Hashtable referenceSegmentations) throws Exception{
System.out.println(this.sysId);
//For each Segmentation
Enumeration n = this.getSegmentations();
while(n.hasMoreElements()){
Segmentation aSystemSeg = (Segmentation) n.nextElement();
this.droppedCount += aSystemSeg.getDroppedCount();
Segmentation aRefSeg = (Segmentation) referenceSegmentations.get(aSystemSeg.getVideoName());
//We compare the two segmentations
//Creation of a comparisonResult
if(aRefSeg != null){
comparisonResult aResult = aRefSeg.processComparison(this.getSysId(), aSystemSeg);
this.gradualFrameCount += aResult.gradualFrameCount;
this.gradualRecallFrameCount += aResult.gradualRecallFrameCount;
this.gradualPrecisionFrameCount += aResult.gradualPrecisionFrameCount;
this.referenceMatchingCount += aResult.referenceMatchingCount;
this.referenceCutMatchingCount += aResult.referenceCutMatchingCount;
this.referenceGradMatchingCount += aResult.referenceGradMatchingCount;
this.systemMatchingCount += aResult.systemMatchingCount;
this.systemCutMatchingCount += aResult.systemCutMatchingCount;
this.systemGradMatchingCount += aResult.systemGradMatchingCount;
this.systemTransCount += aSystemSeg.getTransitionCount();
this.systemCutTransCount += aSystemSeg.getCutCount();
this.systemGradTransCount += aSystemSeg.getTransitionCount() - aSystemSeg.getCutCount();
this.referenceTransCount += aRefSeg.getTransitionCount();
this.referenceCutTransCount += aRefSeg.getCutCount();
this.referenceGradTransCount += aRefSeg.getTransitionCount() - aRefSeg.getCutCount();
}
else{
System.out.println(" Warning: Unprocessed segmentation - No reference found for: "+
aSystemSeg.getVideoName());
}
}
}
/**
* Returns an Xml String of the system results including all segmentations.
*
*/
public String toString(){
String toReturn = ""+System.getProperty("line.separator");
Enumeration e = segmentations.elements();
while(e.hasMoreElements()){
Segmentation s = (Segmentation) e.nextElement();
toReturn += s.toString();
}
toReturn += ""+System.getProperty("line.separator");
return toReturn;
}
/**
* Write into a file the system level results
*
*/
public void save(){
File sysIdDir = new File(System.getProperty("user.dir")+System.getProperty("file.separator")+
"ComparisonResult"+System.getProperty("file.separator")+
sysId+System.getProperty("file.separator"));
sysIdDir.mkdir();
File outputXmlFile = new File(sysIdDir, sysId+".xml");
try{
FileWriter out = new FileWriter(outputXmlFile);
String nl = System.getProperty("line.separator");
out.write(""+nl);
out.write(""+nl);
out.write("");
out.close();
}
catch(IOException i){
System.out.println("A problem occured while preparing to write results");
}
}
}