-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdb_rename.cpp
129 lines (117 loc) · 5.84 KB
/
db_rename.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* *
* Copyright (c) 2019, De Graef Group, Carnegie Mellon University *
* All rights reserved. *
* *
* Author: William C. Lenthe *
* *
* Redistribution and use in source and binary forms, with or without *
* modification, are permitted provided that the following conditions are met: *
* *
* 1. Redistributions of source code must retain the above copyright notice, this *
* list of conditions and the following disclaimer. *
* *
* 2. Redistributions in binary form must reproduce the above copyright notice, *
* this list of conditions and the following disclaimer in the documentation *
* and/or other materials provided with the distribution. *
* *
* 3. Neither the name of the copyright holder nor the names of its *
* contributors may be used to endorse or promote products derived from *
* this software without specific prior written permission. *
* *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" *
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE *
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE *
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE *
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR *
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER *
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, *
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE *
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include <iostream>
#include <fstream>
#include <sstream>
#include "sht_file.hpp"
//@brief: rename sht file following database guidelines
int main(int argc, char *argv[]) {
try {
//sanity check argument count
if(3 != argc) {
std::cout << "usage: " << argv[0] << " inputFile dbPath\n";
std::cout << "\tinputFile - spherical hamrnoics file to rename (*.sht)\n";
std::cout << "\tdbPath - path to database\n";
return EXIT_FAILURE;
}
//open file and read
sht::File file;
std::ifstream is(argv[1], std::ios::in | std::ios::binary);
file.read(is);
//get modality (root folder)
std::string dir(argv[2]);
switch(file.header.modality()) {
case sht::Modality::EBSD : dir += "/EBSD/"; break;
case sht::Modality::ECP : dir += "/ECP/" ; break;
case sht::Modality::TKD : dir += "/TKD/" ; break;
case sht::Modality::PED : dir += "/PED/" ; break;
case sht::Modality::Laue : dir += "/Laue/"; break;
case sht::Modality::Unknown:
default : throw std::runtime_error("unknown or invalid modality");
}
//get crystal system
if (file.mpData.sgEff() <= 0) throw std::runtime_error("invalid space group");
else if(file.mpData.sgEff() <= 2) dir += "Triclinic/";
else if(file.mpData.sgEff() <= 15) dir += "Monoclinic/";
else if(file.mpData.sgEff() <= 74) dir += "Orthorhombic/";
else if(file.mpData.sgEff() <= 142) dir += "Tetragonal/";
else if(file.mpData.sgEff() <= 167) dir += "Trigonal/";
else if(file.mpData.sgEff() <= 194) dir += "Hexagonal/";
else if(file.mpData.sgEff() <= 230) dir += "Cubic/";
else throw std::runtime_error("invalid space group");
//build pieces of file name
std::string frm, mat, syb;
for(const sht::CrystalData& xtal : file.mpData.xtals) {//loop over crystals
//get elements of name for this crystal
std::string xFrm = xtal.form.substr(0, xtal.formulaLen ());
std::string xMat = xtal.name.substr(0, xtal.matNameLen ());
std::string xSyb = xtal.symb.substr(0, xtal.structSymLen());
//accumulate
if(!xFrm.empty()) {
if(!frm.empty()) frm += '+';//seperate overlaped formulas with plus sign
frm += xFrm;
}
if(!xMat.empty()) {
if(!mat.empty()) mat += '+';
mat += xMat;
}
if(!xSyb.empty()) {
if(!syb.empty()) syb += '+';
syb += xSyb;
}
}
//assemble file prefix
std::string prefix = frm;
if(!mat.empty()) prefix += " (" + mat + ")";
if(!syb.empty()) prefix += " [" + syb + "]";
if(prefix.empty()) throw std::runtime_error("empty crystal name");
dir += prefix;
//handle modality specific naming (currently there are only rules for EBSD)
std::string suffix = ".sht";
if(sht::Modality::EBSD == file.header.modality()) {
std::ostringstream ss;
ss << " {" << file.header.beamEnergy() << "kV";
if(70.0f != file.header.primaryAngle()) ss << ' ' << file.header.primaryAngle() << "deg";
ss << "}";
suffix = ss.str() + suffix;
}
//assembly complete file name
std::string fn = dir + '/' + prefix + suffix;
std::cout << dir << '\n';
std::cout << fn << '\n';
} catch(std::exception& e) {
std::cout << e.what() << '\n';
}
return EXIT_SUCCESS;
}