/** Loop over all filenames in replica_filenames, set up TrajectoryIO. */ int TrajIOarray::SetupIOarray(ArgList& argIn, TrajFrameCounter& counter, CoordinateInfo& cInfo, Topology* trajParm) { // Sanity check if (!IOarray_.empty()) { mprinterr("Internal Error: SetupIOarray() has been called twice.\n"); return 1; } // Save arguments that have not been processed so they can be passed // to each replica in turn. Only the lowest replica will use argIn. ArgList argCopy( argIn ); bool lowestRep = true; int rep0Frames = TrajectoryIO::TRAJIN_UNK; // Total frames in replica 0 int totalFrames = TrajectoryIO::TRAJIN_UNK; // Total # frames to be read from ensemble TrajectoryFile::TrajFormatType lastRepFmt = TrajectoryFile::UNKNOWN_TRAJ; // Right now enforce that all replicas have the same metadata as lowest // replica, e.g. if replica 0 has temperature, replica 1 does too etc. for (File::NameArray::const_iterator repfile = replica_filenames_.begin(); repfile != replica_filenames_.end(); ++repfile) { // Detect format TrajectoryFile::TrajFormatType repformat = TrajectoryFile::UNKNOWN_TRAJ; TrajectoryIO* replica0 = TrajectoryFile::DetectFormat( *repfile, repformat ); if ( replica0 == 0 ) { mprinterr("Error: Could not set up replica file %s\n", repfile->full()); return 1; } if (repformat != lastRepFmt) mprintf("\tReading '%s' as %s\n", repfile->full(), TrajectoryFile::FormatString(repformat)); lastRepFmt = repformat; replica0->SetDebug( debug_ ); // Pushing replica0 here allows the destructor to handle it on errors IOarray_.push_back( replica0 ); // Process format-specific read args. Do not exit on error in case // replicas have different formats supporting different args. if (lowestRep) { replica0->processReadArgs( argIn ); } else { ArgList argtmp( argCopy ); replica0->processReadArgs( argtmp ); } // Set up replica for reading and get the number of frames. int nframes = replica0->setupTrajin( *repfile, trajParm ); if (nframes == TrajectoryIO::TRAJIN_ERR) { mprinterr("Error: Could not set up %s for reading.\n", repfile->full()); return 1; } // TODO: Do not allow unknown number of frames? if (lowestRep) { cInfo = replica0->CoordInfo(); rep0Frames = nframes; totalFrames = nframes; if (cInfo.ReplicaDimensions().Ndims() > 0) { mprintf("\tReplica dimensions:\n"); for (int rd = 0; rd < cInfo.ReplicaDimensions().Ndims(); rd++) mprintf("\t\t%i: %s\n", rd+1, cInfo.ReplicaDimensions().Description(rd)); } } else { // Check total frames in this replica against lowest rep. if (nframes != rep0Frames) mprintf("Warning: Replica %s frames (%i) does not match # frames in first replica (%i).\n", repfile->base(), nframes, rep0Frames); //if (repframes < 0) { // mprinterr("Error: RemdTraj: Unknown # of frames in replica.\n"); // return 1; //} if (nframes < totalFrames) { totalFrames = nframes; mprintf("Warning: Setting total # of frames to read from replica ensemble to %i\n", totalFrames); } // Check box info against lowest rep. if ( replica0->CoordInfo().HasBox() != cInfo.HasBox() ) { mprinterr("Error: Replica %s box info does not match first replica.\n", repfile->full()); return 1; } // TODO: Check specific box type // Check velocity info against lowest rep. if ( replica0->CoordInfo().HasVel() != cInfo.HasVel() ) { mprinterr("Error: Replica %s velocity info does not match first replica.\n", repfile->full()); return 1; } // Check # dimensions and types against lowest rep if ( replica0->CoordInfo().ReplicaDimensions() != cInfo.ReplicaDimensions() ) { mprinterr("Error: Replica %s dimension info does not match first replica.\n", repfile->full()); ReplicaDimArray const& thisRepDims = replica0->CoordInfo().ReplicaDimensions(); for (int rd = 0; rd < thisRepDims.Ndims(); rd++) mprinterr("\t\t%i: %s\n", rd+1, thisRepDims.Description(rd)); return 1; } // If temperature/time info does not match set to false. if (cInfo.HasTemp() != replica0->CoordInfo().HasTemp()) cInfo.SetTemperature( false ); if (cInfo.HasTime() != replica0->CoordInfo().HasTime()) cInfo.SetTime( false ); } lowestRep = false; } // Check how many frames will actually be read if (counter.CheckFrameArgs( totalFrames, argIn )) return 1; // Check for errors. if (IOarray_.empty()) { mprinterr("Error: No replica trajectories set up.\n"); return 1; } if (IOarray_.size() != replica_filenames_.size()) { // SANITY CHECK mprinterr("Error: Not all replica files were set up.\n"); return 1; } // Update ensemble size cInfo.SetEnsembleSize( (int)IOarray_.size() ); if (debug_ > 0) cInfo.PrintCoordInfo( replica_filenames_[0].full(), trajParm->c_str() ); return 0; }
Analysis::RetType Analysis_State::Setup(ArgList& analyzeArgs, DataSetList* datasetlist, DataFileList* DFLin, int debugIn) { debug_ = debugIn; masterDSL_ = datasetlist; DataFile* outfile = DFLin->AddDataFile( analyzeArgs.GetStringKey("out"), analyzeArgs ); curveOut_ = DFLin->AddDataFile( analyzeArgs.GetStringKey("curveout"), analyzeArgs ); stateOut_ = DFLin->AddCpptrajFile( analyzeArgs.GetStringKey("stateout"), "State Output", DataFileList::TEXT, true); transOut_ = DFLin->AddCpptrajFile( analyzeArgs.GetStringKey("transout"), "Transitions Output", DataFileList::TEXT, true); normalize_ = analyzeArgs.hasKey("norm"); // Get definitions of states if present. // Define states as 'state <#>,<dataset>,<min>,<max>' std::string state_arg = analyzeArgs.GetStringKey("state"); if (!state_arg.empty()) { while (!state_arg.empty()) { // Expect form <#>,<dataset> ArgList argtmp(state_arg, ","); if (argtmp.Nargs() != 4) { mprinterr("Error: Malformed state argument '%s': expect <ID>,<dataset>,<min>,<max>\n", state_arg.c_str()); return Analysis::ERR; } std::string state_id = argtmp.GetStringNext(); // TODO: Check duplicate names if (state_id.empty()) { mprinterr("Error: In state argument, could not get ID.\n"); return Analysis::ERR; } DataSet* ds = datasetlist->GetDataSet( argtmp.GetStringNext() ); if (ds == 0) return Analysis::ERR; if (ds->Ndim() != 1) { mprinterr("Error: Only 1D data sets allowed.\n"); return Analysis::ERR; } double min = argtmp.getNextDouble(0.0); double max = argtmp.getNextDouble(0.0); if (max < min) { mprinterr("Error: max value cannot be less than min.\n"); return Analysis::ERR; } States_.push_back( StateType(state_id, (DataSet_1D*)ds, min, max) ); state_arg = analyzeArgs.GetStringKey("state"); } } if (States_.empty()) { mprinterr("Error: No states defined.\n"); return Analysis::ERR; } state_data_ = datasetlist->AddSet(DataSet::INTEGER, analyzeArgs.GetStringKey("name"), "State"); if (state_data_ == 0) return Analysis::ERR; if (outfile != 0) outfile->AddDataSet( state_data_ ); mprintf(" STATE: The following states have been set up:\n"); for (StateArray::const_iterator state = States_.begin(); state != States_.end(); ++state) mprintf("\t%u: %20s %12.4f <= %-20s < %12.4f\n", state - States_.begin(), state->DS().legend(), state->Min(), state->id(), state->Max()); mprintf("\tState data set: %s\n", state_data_->legend()); if (outfile != 0) mprintf("\tStates vs time output to file '%s'\n", outfile->DataFilename().full()); if (curveOut_ != 0) mprintf("\tCurves output to file '%s'\n", curveOut_->DataFilename().full()); mprintf("\tState output to file '%s'\n", stateOut_->Filename().full()); mprintf("\tTransitions output to file '%s'\n", transOut_->Filename().full()); if (normalize_) mprintf("\tCurves will be normalized to 1.0\n"); return Analysis::OK; }