1 #!/usr/bin/perl -w 2 # 3 # File: InfoFingerprintsFiles.pl 4 # Author: Manish Sud <msud@san.rr.com> 5 # 6 # Copyright (C) 2024 Manish Sud. All rights reserved. 7 # 8 # This file is part of MayaChemTools. 9 # 10 # MayaChemTools is free software; you can redistribute it and/or modify it under 11 # the terms of the GNU Lesser General Public License as published by the Free 12 # Software Foundation; either version 3 of the License, or (at your option) any 13 # later version. 14 # 15 # MayaChemTools is distributed in the hope that it will be useful, but without 16 # any warranty; without even the implied warranty of merchantability of fitness 17 # for a particular purpose. See the GNU Lesser General Public License for more 18 # details. 19 # 20 # You should have received a copy of the GNU Lesser General Public License 21 # along with MayaChemTools; if not, see <http://www.gnu.org/licenses/> or 22 # write to the Free Software Foundation Inc., 59 Temple Place, Suite 330, 23 # Boston, MA, 02111-1307, USA. 24 # 25 26 use strict; 27 use FindBin; use lib "$FindBin::Bin/../lib"; 28 use Getopt::Long; 29 use File::Basename; 30 use Text::ParseWords; 31 use Benchmark; 32 use FileUtil; 33 use TextUtil; 34 use Fingerprints::FingerprintsFileUtil; 35 use Fingerprints::FingerprintsStringUtil; 36 37 my($ScriptName, %Options, $StartTime, $EndTime, $TotalTime); 38 39 # Autoflush STDOUT 40 $| = 1; 41 42 # Starting message... 43 $ScriptName = basename($0); 44 print "\n$ScriptName: Starting...\n\n"; 45 $StartTime = new Benchmark; 46 47 # Get the options and setup script... 48 SetupScriptUsage(); 49 if ($Options{help} || @ARGV < 1) { 50 die GetUsageFromPod("$FindBin::Bin/$ScriptName"); 51 } 52 53 my(@FingerprintsFilesList); 54 @FingerprintsFilesList = ExpandFileNames(\@ARGV, "sdf sd fpf fp csv tsv"); 55 56 # Process options... 57 print "Processing options...\n"; 58 my(%OptionsInfo); 59 ProcessOptions(); 60 61 # Setup information about input files... 62 print "Checking input fingerprints file(s)...\n"; 63 my(%FingerprintsFilesInfo); 64 RetrieveFingerprintsFilesInfo(); 65 66 # Process input files.. 67 my($FileIndex); 68 if (@FingerprintsFilesList > 1) { 69 print "\nProcessing fingerprints files...\n"; 70 } 71 for $FileIndex (0 .. $#FingerprintsFilesList) { 72 if ($FingerprintsFilesInfo{FileOkay}[$FileIndex]) { 73 print "\nProcessing file $FingerprintsFilesList[$FileIndex]...\n"; 74 ListFingerprintsFileInfo($FileIndex); 75 } 76 } 77 ListTotalSizeOfFiles(); 78 79 print "\n$ScriptName:Done...\n\n"; 80 81 $EndTime = new Benchmark; 82 $TotalTime = timediff ($EndTime, $StartTime); 83 print "Total time: ", timestr($TotalTime), "\n"; 84 85 ############################################################################### 86 87 # List approptiate information... 88 # 89 sub ListFingerprintsFileInfo { 90 my($FileIndex) = @_; 91 my($FileName, $FingerprintsFileIO, $InvalidFingerprintsFileData, $InvalidFingerprintsData, $DataEntryCount, $ValidDataEntryCount, $InvalidDataEntryCount, $MissingDataEntryCount, $BitVectorDataEntryCount, $VectorDataEntryCount, $FingerprintsObject, $FingerprintsType, $TotalBitDensity, $FileType, $DataEntryLabel); 92 93 $FileType = $FingerprintsFilesInfo{FileType}[$FileIndex]; 94 $DataEntryLabel = ($FileType =~ /^SD$/i) ? 'compounds' : 'lines'; 95 96 ($DataEntryCount, $ValidDataEntryCount, $InvalidDataEntryCount, $MissingDataEntryCount, $BitVectorDataEntryCount, $VectorDataEntryCount, $TotalBitDensity) = (0) x 7; 97 98 $FingerprintsFileIO = Fingerprints::FingerprintsFileUtil::NewFingerprintsFileIO(%{$FingerprintsFilesInfo{FingerprintsFileIOParameters}[$FileIndex]}); 99 $FingerprintsFileIO->Open(); 100 101 $InvalidFingerprintsFileData = $FingerprintsFileIO->IsFingerprintsFileDataValid() ? 0 : 1; 102 103 FINGERPRINTS: while ($FingerprintsFileIO->Read()) { 104 $DataEntryCount++; 105 106 # Missing data... 107 if ($InvalidFingerprintsFileData) { 108 $MissingDataEntryCount++; 109 if ($OptionsInfo{ValidateData} || $OptionsInfo{CountEmptyFingerprints}) { 110 ListEmptyOrInvalidFingerprintsDataInfo('EmptyData', $FingerprintsFileIO, $FileType); 111 } 112 next FINGERPRINTS; 113 } 114 $InvalidFingerprintsData = $FingerprintsFileIO->IsFingerprintsDataValid() ? 0 : 1; 115 116 # Invalid data... 117 if ($InvalidFingerprintsData) { 118 $InvalidDataEntryCount++; 119 if ($OptionsInfo{ValidateData}) { 120 ListEmptyOrInvalidFingerprintsDataInfo('InvalidData', $FingerprintsFileIO, $FileType); 121 } 122 next FINGERPRINTS; 123 } 124 $ValidDataEntryCount++; 125 126 $FingerprintsObject = $FingerprintsFileIO->GetFingerprints(); 127 $FingerprintsType = $FingerprintsObject->GetVectorType(); 128 129 if ($FingerprintsType =~ /^FingerprintsBitVector$/i) { 130 $BitVectorDataEntryCount++; 131 if ($OptionsInfo{ListAverageBitDensity}) { 132 $TotalBitDensity += $FingerprintsObject->GetFingerprintsBitDensity(); 133 } 134 } 135 elsif ($FingerprintsType =~ /^FingerprintsVector$/i) { 136 $VectorDataEntryCount++; 137 } 138 139 if ($OptionsInfo{ListFingerprintsDataEntryInfo}) { 140 ListFingerprintsDataEntryInfo($FingerprintsFileIO, $FileType); 141 } 142 143 } 144 $FingerprintsFileIO->Close(); 145 146 print "\nFingerprints file type: $FileType\n"; 147 if ($FileType =~ /^SD$/i) { 148 print "Number of compounds: $DataEntryCount\n"; 149 } 150 else { 151 print "Number of data lines: $DataEntryCount\n"; 152 } 153 154 ListFileTypeHeaderInfo($FingerprintsFileIO, $FileType); 155 156 print "\nNumber of $DataEntryLabel with valid fingerprints string data: $ValidDataEntryCount\n"; 157 print "Number of $DataEntryLabel with bit-vector fingerprints string data: $BitVectorDataEntryCount\n"; 158 print "Number of $DataEntryLabel with vector fingerprints string data: $VectorDataEntryCount\n"; 159 160 if ($OptionsInfo{CountEmptyFingerprints}) { 161 print "Number of $DataEntryLabel with missing fingerprints data: $MissingDataEntryCount\n"; 162 print "Number of $DataEntryLabel with invalid fingerprints data: $InvalidDataEntryCount\n"; 163 } 164 165 if ($OptionsInfo{ListAverageBitDensity} && $BitVectorDataEntryCount) { 166 my($AverageBitDensity); 167 $AverageBitDensity = $TotalBitDensity/$BitVectorDataEntryCount; 168 $AverageBitDensity = sprintf("%.2f", $AverageBitDensity) + 0; 169 print "\nAverage bit density: $AverageBitDensity\n"; 170 } 171 172 173 # File size and modification information... 174 print "\nFile size: ", FormatFileSize($FingerprintsFilesInfo{FileSize}[$FileIndex]), " \n"; 175 print "Last modified: ", $FingerprintsFilesInfo{FileLastModified}[$FileIndex], " \n"; 176 } 177 178 # List empty or invalid fingerprints file data information... 179 # 180 sub ListEmptyOrInvalidFingerprintsDataInfo { 181 my($Mode, $FingerprintsFileIO, $FileType) = @_; 182 my($ModeInfo); 183 184 $ModeInfo = ($Mode =~ /^EmptyData$/i) ? "no" : "invalid"; 185 186 if ($FileType =~ /^SD$/i) { 187 my($CmpdNum, $CmpdString); 188 189 $CmpdNum = $FingerprintsFileIO->GetCompoundNum(); 190 if ($OptionsInfo{DetailLevel} >= 3 ) { 191 $CmpdString = $FingerprintsFileIO->GetCompoundString(); 192 print "Compound number $CmpdNum contains $ModeInfo fingerprints data: $CmpdString \n"; 193 } 194 elsif ($OptionsInfo{DetailLevel} >= 1 ) { 195 print "Compound number $CmpdNum contains $ModeInfo fingerprints data...\n"; 196 } 197 } 198 else { 199 my($LineNum, $DataLine); 200 201 $LineNum = $FingerprintsFileIO->GetLineNum(); 202 if ($OptionsInfo{DetailLevel} >= 3 ) { 203 $DataLine = $FingerprintsFileIO->GetDataLine(); 204 print "Data line number $LineNum contains $ModeInfo fingerprints data: $DataLine \n"; 205 } 206 elsif ($OptionsInfo{DetailLevel} >= 1 ) { 207 print "Data line number $LineNum contains $ModeInfo fingerprints data...\n"; 208 } 209 } 210 } 211 212 # List detailed information about fingerprints data entry... 213 # 214 sub ListFingerprintsDataEntryInfo { 215 my($FingerprintsFileIO, $FileType) = @_; 216 my($FingerprintsObject, $FingerprintsString, $FingerprintsType, $FingerprintsDescription, $FingerprintsSize, $FingerprintsBitStringFormat, $FingerprintsBitOrder, $BitDensity, $NumOfOnBits, $FingerprintsVectorValuesType, $FingerprintsVectorValuesFormat, $NumOfNonZeroValues); 217 218 $FingerprintsObject = $FingerprintsFileIO->GetFingerprints(); 219 $FingerprintsString = $FingerprintsFileIO->GetFingerprintsString(); 220 221 $FingerprintsType = $FingerprintsObject->GetVectorType(); 222 223 if ($FingerprintsType =~ /^FingerprintsBitVector$/i) { 224 $BitDensity = ''; 225 $NumOfOnBits = ''; 226 227 ($FingerprintsType, $FingerprintsDescription, $FingerprintsSize, $FingerprintsBitStringFormat, $FingerprintsBitOrder) = Fingerprints::FingerprintsStringUtil::GetFingerprintsStringValues($FingerprintsString); 228 229 if ($OptionsInfo{ListBitDensity} || $OptionsInfo{ListNumOfOnBits}) { 230 if ($OptionsInfo{ListBitDensity}) { 231 $BitDensity = $FingerprintsObject->GetFingerprintsBitDensity(); 232 } 233 if ($OptionsInfo{ListNumOfOnBits}) { 234 $NumOfOnBits = $FingerprintsObject->GetNumOfSetBits(); 235 } 236 } 237 } 238 elsif ($FingerprintsType =~ /^FingerprintsVector$/i) { 239 $NumOfNonZeroValues = ''; 240 241 ($FingerprintsType, $FingerprintsDescription, $FingerprintsSize, $FingerprintsVectorValuesType, $FingerprintsVectorValuesFormat) = Fingerprints::FingerprintsStringUtil::GetFingerprintsStringValues($FingerprintsString); 242 243 if ($OptionsInfo{ListNumOfNonZeroValues}) { 244 if ($FingerprintsVectorValuesType =~ /^AlphaNumericalValues$/i) { 245 $NumOfNonZeroValues = 'NA'; 246 } 247 else { 248 $NumOfNonZeroValues = $FingerprintsObject->GetNumOfNonZeroValues(); 249 } 250 } 251 } 252 253 if ($FileType =~ /^SD$/i) { 254 print "Compound number: " . $FingerprintsFileIO->GetCompoundNum(); 255 } 256 else { 257 print "Data line number: " . $FingerprintsFileIO->GetLineNum(); 258 } 259 260 if ($OptionsInfo{ListFingerprintsType}) { 261 print "; FPType: $FingerprintsType"; 262 } 263 if ($OptionsInfo{ListFingerprintsDescription}) { 264 print "; FPDescription: $FingerprintsDescription"; 265 } 266 if ($OptionsInfo{ListFingerprintsSize}) { 267 print "; FPSize: $FingerprintsSize"; 268 } 269 270 if ($FingerprintsType =~ /^FingerprintsBitVector$/i) { 271 if ($OptionsInfo{ListFingerprintsBitStringFormat}) { 272 print "; FPBitStringFormat: $FingerprintsBitStringFormat"; 273 } 274 if ($OptionsInfo{ListFingerprintsBitOrder}) { 275 print "; FPBitOrder: $FingerprintsBitOrder"; 276 } 277 if ($OptionsInfo{ListBitDensity}) { 278 print "; BitDensity: $BitDensity"; 279 } 280 if ($OptionsInfo{ListNumOfOnBits}) { 281 print "; NumOfOnBits: $NumOfOnBits"; 282 } 283 } 284 elsif ($FingerprintsType =~ /^FingerprintsVector$/i) { 285 if ($OptionsInfo{ListFingerprintsVectorValuesType}) { 286 print "; FPVectorValuesType: $FingerprintsVectorValuesType"; 287 } 288 if ($OptionsInfo{ListFingerprintsVectorValuesFormat}) { 289 print "; FPVectorValuesFormat: $FingerprintsVectorValuesFormat"; 290 } 291 if ($OptionsInfo{ListNumOfNonZeroValues}) { 292 print "; NumOfNonZeroValues: $NumOfNonZeroValues"; 293 } 294 } 295 print "\n"; 296 } 297 298 # List file type header information... 299 # 300 sub ListFileTypeHeaderInfo { 301 my($FingerprintsFileIO, $FileType) = @_; 302 my($Key, $Value, @DataColLabels, %HeaderDataKeysAndValues); 303 304 if ($FileType =~ /^Text$/i) { 305 @DataColLabels = $FingerprintsFileIO->GetDataColLabels(); 306 print "Number of columns: " . scalar @DataColLabels . "\n"; 307 print "Column labels: ", JoinWords(\@DataColLabels, ", ", 1), "\n"; 308 } 309 elsif ($FileType =~ /^FP$/i) { 310 %HeaderDataKeysAndValues = $FingerprintsFileIO->GetHeaderDataKeysAndValues(); 311 312 print "\nFP file header data keys and values: \n#\n"; 313 for $Key ($FingerprintsFileIO->GetHeaderDataKeys()) { 314 $Value = $HeaderDataKeysAndValues{$Key}; 315 print "# $Key = $Value\n"; 316 } 317 print "#\n"; 318 } 319 } 320 321 # Total size of all the fiels... 322 sub ListTotalSizeOfFiles { 323 my($FileOkayCount, $TotalSize, $Index); 324 325 $FileOkayCount = 0; 326 $TotalSize = 0; 327 328 for $Index (0 .. $#FingerprintsFilesList) { 329 if ($FingerprintsFilesList[$Index]) { 330 $FileOkayCount++; 331 $TotalSize += $FingerprintsFilesInfo{FileSize}[$Index]; 332 } 333 } 334 if ($FileOkayCount > 1) { 335 print "\nTotal size of $FileOkayCount files: ", FormatFileSize($TotalSize), "\n"; 336 } 337 } 338 339 # Retrieve information about fingerprints files... 340 # 341 sub RetrieveFingerprintsFilesInfo { 342 my($FingerprintsFile, $Index, $FileDir, $FileExt, $FileName, $FileType, $InDelim, $ModifiedTimeString, $ModifiedDateString, %FingerprintsFileIOParameters); 343 344 %FingerprintsFilesInfo = (); 345 @{$FingerprintsFilesInfo{FileOkay}} = (); 346 @{$FingerprintsFilesInfo{FileType}} = (); 347 @{$FingerprintsFilesInfo{FileSize}} = (); 348 @{$FingerprintsFilesInfo{FileLastModified}} = (); 349 @{$FingerprintsFilesInfo{InDelim}} = (); 350 351 @{$FingerprintsFilesInfo{FingerprintsFileIOParameters}} = (); 352 353 FILELIST: for $Index (0 .. $#FingerprintsFilesList) { 354 $FingerprintsFile = $FingerprintsFilesList[$Index]; 355 356 $FingerprintsFilesInfo{FileOkay}[$Index] = 0; 357 $FingerprintsFilesInfo{FileType}[$Index] = ''; 358 $FingerprintsFilesInfo{FileSize}[$Index] = 0; 359 $FingerprintsFilesInfo{FileLastModified}[$Index] = ''; 360 $FingerprintsFilesInfo{InDelim}[$Index] = ""; 361 362 %{$FingerprintsFilesInfo{FingerprintsFileIOParameters}[$Index]} = (); 363 364 $FingerprintsFile = $FingerprintsFilesList[$Index]; 365 if (!(-e $FingerprintsFile)) { 366 warn "Warning: Ignoring file $FingerprintsFile: It doesn't exist\n"; 367 next FILELIST; 368 } 369 370 $FileType = Fingerprints::FingerprintsFileUtil::GetFingerprintsFileType($FingerprintsFile); 371 if (IsEmpty($FileType)) { 372 warn "Warning: Ignoring file $FingerprintsFile: It's not a fingerprints file\n"; 373 next FILELIST; 374 } 375 376 $FileDir = ""; $FileName = ""; $FileExt = ""; 377 ($FileDir, $FileName, $FileExt) = ParseFileName($FingerprintsFile); 378 379 $InDelim = ($FileExt =~ /^tsv$/i) ? 'Tab' : $OptionsInfo{InDelim}; 380 381 # Setup FingerprintsFileIO parameters... 382 %FingerprintsFileIOParameters = (); 383 FILEIOPARAMETERS: { 384 if ($FileType =~ /^SD$/i) { 385 %FingerprintsFileIOParameters = ('Name' => $FingerprintsFile, 'Mode' => 'Read', 'ValidateData' => $OptionsInfo{ValidateData}, 'DetailLevel' => 1, 'FingerprintsFieldLabel' => $OptionsInfo{FingerprintsFieldLabel}); 386 last FILEIOPARAMETERS; 387 } 388 if ($FileType =~ /^FP$/i) { 389 %FingerprintsFileIOParameters = ('Name' => $FingerprintsFile, 'Mode' => 'Read', 'ValidateData' => $OptionsInfo{ValidateData}, 'DetailLevel' => 1); 390 last FILEIOPARAMETERS; 391 } 392 if ($FileType =~ /^Text$/i) { 393 %FingerprintsFileIOParameters = ('Name' => $FingerprintsFile, 'Mode' => 'Read', 'ValidateData' => $OptionsInfo{ValidateData}, 'DetailLevel' => 1, 'FingerprintsCol' => $OptionsInfo{FingerprintsCol}, 'ColMode' => $OptionsInfo{ColMode}, 'InDelim' => $OptionsInfo{InDelim}); 394 last FILEIOPARAMETERS; 395 } 396 warn "Warning: File type for fingerprints file, $FingerprintsFile, is not valid. Supported file types: SD, FP or Text\n"; 397 next FILELIST; 398 } 399 400 $FingerprintsFilesInfo{FileOkay}[$Index] = 1; 401 $FingerprintsFilesInfo{FileType}[$Index] = $FileType; 402 403 $FingerprintsFilesInfo{FileSize}[$Index] = FileSize($FingerprintsFile); 404 ($ModifiedTimeString, $ModifiedDateString) = FormattedFileModificationTimeAndDate($FingerprintsFile); 405 $FingerprintsFilesInfo{FileLastModified}[$Index] = "$ModifiedTimeString; $ModifiedDateString"; 406 407 $FingerprintsFilesInfo{InDelim}[$Index] = $InDelim; 408 409 %{$FingerprintsFilesInfo{FingerprintsFileIOParameters}[$Index]} = %FingerprintsFileIOParameters; 410 } 411 } 412 413 # Process option values... 414 sub ProcessOptions { 415 %OptionsInfo = (); 416 417 $OptionsInfo{ListAverageBitDensity} = ($Options{all} || $Options{averagebitdensity}) ? 1 :0; 418 $OptionsInfo{ListBitDensity} = ($Options{all} || $Options{bitdensity}) ? 1 :0; 419 420 if ($OptionsInfo{ListAverageBitDensity}) { 421 # List bit density as well... 422 $OptionsInfo{ListBitDensity} = 1; 423 } 424 425 # By default, count number of rows containing fingerprints data... 426 $OptionsInfo{CountFingerprints} = 1; 427 $OptionsInfo{CountEmptyFingerprints} = ($Options{all} || $Options{empty}) ? 1 :0; 428 429 $OptionsInfo{ColMode} = $Options{colmode}; 430 if (IsNotEmpty($Options{fingerprintscol})) { 431 if ($Options{colmode} =~ /^ColNum$/i) { 432 if (!IsPositiveInteger($Options{fingerprintscol})) { 433 die "Error: Column value, $Options{fingerprintscol}, specified using \"--FingerprintsCol\" is not valid: Allowed integer values: > 0.\n"; 434 } 435 } 436 $OptionsInfo{FingerprintsCol} = $Options{fingerprintscol}; 437 } 438 else { 439 $OptionsInfo{FingerprintsCol} = 'AutoDetect'; 440 } 441 442 if (IsNotEmpty($Options{fingerprintsfield})) { 443 $OptionsInfo{FingerprintsFieldLabel} = $Options{fingerprintsfield}; 444 } 445 else { 446 $OptionsInfo{FingerprintsFieldLabel} = 'AutoDetect'; 447 } 448 449 $OptionsInfo{ValidateData} = ($Options{all} || $Options{datacheck}) ? 1 :0; 450 $OptionsInfo{DetailLevel} = $Options{detail}; 451 452 $OptionsInfo{ListFingerprintsType} = ($Options{all} || $Options{fingerprintstype}) ? 1 :0; 453 $OptionsInfo{ListFingerprintsDescription} = ($Options{all} || $Options{fingerprintsdescription}) ? 1 :0; 454 $OptionsInfo{ListFingerprintsSize} = ($Options{all} || $Options{fingerprintssize}) ? 1 :0; 455 456 $OptionsInfo{ListFingerprintsBitStringFormat} = ($Options{all} || $Options{fingerprintsbitstringformat}) ? 1 :0; 457 $OptionsInfo{ListFingerprintsBitOrder} = ($Options{all} || $Options{fingerprintsbitorder}) ? 1 :0; 458 459 $OptionsInfo{ListFingerprintsVectorValuesType} = ($Options{all} || $Options{fingerprintsvectorvaluestype}) ? 1 :0; 460 $OptionsInfo{ListFingerprintsVectorValuesFormat} = ($Options{all} || $Options{fingerprintsvectorvaluesformat}) ? 1 :0; 461 462 $OptionsInfo{InDelim} = $Options{indelim}; 463 464 $OptionsInfo{ListNumOfOnBits} = ($Options{all} || $Options{numofonbits}) ? 1 :0; 465 $OptionsInfo{ListNumOfNonZeroValues} = ($Options{all} || $Options{numofnonzerovalues}) ? 1 :0; 466 467 $OptionsInfo{ListFingerprintsDataEntryInfo} = ($OptionsInfo{ListFingerprintsType} || $OptionsInfo{ListFingerprintsDescription} || $OptionsInfo{ListFingerprintsSize} || $OptionsInfo{ListFingerprintsBitStringFormat} || $OptionsInfo{ListFingerprintsBitOrder} || $OptionsInfo{ListFingerprintsVectorValuesType} || $OptionsInfo{ListFingerprintsVectorValuesFormat} || $OptionsInfo{ListBitDensity} || $OptionsInfo{ListAverageBitDensity} || $OptionsInfo{ListNumOfOnBits} || $OptionsInfo{ListNumOfNonZeroValues}) ? 1 : 0; 468 469 } 470 471 # Setup script usage and retrieve command line arguments specified using various options... 472 sub SetupScriptUsage { 473 474 # Retrieve all the options... 475 %Options = (); 476 477 $Options{colmode} = 'colnum'; 478 $Options{detail} = 1; 479 $Options{indelim} = 'comma'; 480 481 if (!GetOptions(\%Options, "all|a", "averagebitdensity", "bitdensity", "count", "colmode|c=s", "detail|d=i", "datacheck", "empty|e", "fingerprintsfield=s", "fingerprintscol=s", "fingerprintstype", "fingerprintsdescription", "fingerprintssize", "fingerprintsbitstringformat", "fingerprintsbitorder", "fingerprintsvectorvaluestype", "fingerprintsvectorvaluesformat", "help|h", "indelim=s", "numofonbits", "numofnonzerovalues", "workingdir|w=s")) { 482 die "\nTo get a list of valid options and their values, use \"$ScriptName -h\" or\n\"perl -S $ScriptName -h\" command and try again...\n"; 483 } 484 if ($Options{workingdir}) { 485 if (! -d $Options{workingdir}) { 486 die "Error: The value specified, $Options{workingdir}, for option \"-w --workingdir\" is not a directory name.\n"; 487 } 488 chdir $Options{workingdir} or die "Error: Couldn't chdir $Options{workingdir}: $! \n"; 489 } 490 if ($Options{colmode} !~ /^(ColNum|ColLabel)$/i) { 491 die "Error: The value specified, $Options{colmode}, for option \"-c, --ColMode\" is not valid. Allowed values: ColNum, or ColLabel\n"; 492 } 493 if (!IsPositiveInteger($Options{detail})) { 494 die "Error: The value specified, $Options{detail}, for option \"-d, --detail\" is not valid. Allowed values: > 0 \n"; 495 } 496 if ($Options{indelim} !~ /^(comma|semicolon)$/i) { 497 die "Error: The value specified, $Options{indelim}, for option \"--InDelim\" is not valid. Allowed values: comma, or semicolon\n"; 498 } 499 } 500