0

一个前提,我不是程序员,我是物理学家,我使用 c++ 作为分析数据的工具(ROOT 包)。我的知识可能有限!

我有这种情况,我从文件中读取数据并将它们存储在向量中(没问题)

vector<double> data;

有了这个数据,我想绘制一个相关图,所以我需要将它们分成两个不同的子集,其中一个是 2D 直方图的 X 条目,另一个是 Y 条目。

拆分必须如下,我有这张表(我只复制了一小部分只是为了说明问题)

************* LBA - LBC **************
--------------------------------------
Cell Name  |  Channel   |    PMT     |
D0         |          0 |          1 |
A1-L       |          1 |          2 |
BC1-R      |          2 |          3 |
BC1-L      |          3 |          4 |
A1-R       |          4 |          5 |
A2-L       |          5 |          6 |
BC2-R      |          6 |          7 |
BC2-L      |          7 |          8 |
A2-R       |          8 |          9 |
A3-L       |          9 |         10 |
A3-R       |         10 |         11 |
BC3-L      |         11 |         12 |
BC3-R      |         12 |         13 |
D1-L       |         13 |         14 |
D1-R       |         14 |         15 |
A4-L       |         15 |         16 |
BC4-R      |         16 |         17 |
BC4-L      |         17 |         18 |
A4-R       |         18 |         19 |
A5-L       |         19 |         20 |
...
None       |         31 |         32 |

如您所见,有类似的条目A1-LA1-R它对应于一个单元格的左侧和右侧,与此左侧和右侧相关联int,对应于通道,在本例中为 1 和 4。我希望这些左侧和右侧在我的二维直方图的 X 和 Y 轴上。

然后问题是以某种方式关联到该表的数据向量,以便我可以选择属于同一单元格的通道并将它们放在 X 轴上,另一个放在 Y 轴上。更复杂的是,还有一些单元格没有像本例中那样的合作伙伴,D0以及没有关联单元格的通道,如通道 31。


我尝试的解决方案是创建一个索引向量

vector<int> indexing = (0, 1, 4, ....);

和一个有序的数据向量

vector<double> data_ordered;

并用类似的东西填充有序向量

for( vector<int> iterator it = indexing.begin(); it != indexing.end(); ++it)
    data_ordered.push_back(data.at(*it));

然后将偶数索引data_ordered放在 X 轴上,将奇数值放在 Y 轴上,但我遇到了D0单元格和空单元格的问题!

我的另一个想法是创建一个struct

struct cell{
    string cell_name;
    int left_channel;
    int right_channel;
    double data;
    ....
    other informations
};

然后尝试使用它,但是我缺乏 C++ 知识!有人可以给我一个关于如何解决这个问题的提示吗?我希望我的问题足够清楚,并且尊重本网站的规则!

编辑 - - - - -

为了澄清这个问题,我尝试用一​​个例子来解释它

vector<double> data = (data0, data1, data2, data3, data4, ...);

dodata0有索引 0,如果我去表我看到它对应于cell D0没有其他合作伙伴的,假设现在可以忽略。具有索引 1 并且它对应于( )data1的左侧部分,因此我需要找到表中索引为 4 的正确伙伴,并且理想情况下引导我从包含数据的向量中进行选择。我希望这至少能澄清一点情况!cell A1A1-Ldata4

4

1 回答 1

1

这是一个大致可以满足您需求的引擎:

#include <vector>
#include <map>
#include <string>
#include <iostream>

enum sub_entry { left, right, only };

struct DataType {
  std::string cell;
  sub_entry sub;
  DataType( DataType const& o ): cell(o.cell), sub(o.sub) {};
  DataType( const char* c, sub_entry s=only ):
    cell( c ),
    sub( s )
  {}
  DataType(): cell("UNUSED"), sub(only) {};
  // lexographic weak ordering:
  bool operator<( DataType const& o ) const {
    if (cell != o.cell)
      return cell < o.cell;
    return sub < o.sub;
  }
};

typedef std::vector< double > RawData;
typedef std::vector< DataType > LookupTable;
typedef std::map< DataType, double > OrganizedData;

OrganizedData organize( RawData const& raw, LookupTable const& table )
{
  OrganizedData retval;
  for( unsigned i = 0; i < raw.size() && i < table.size(); ++i ) {
    DataType d = table[i];
    retval[d] = raw[i];
  }
  return retval;
}

void PrintOrganizedData( OrganizedData const& data ) {
  for (OrganizedData::const_iterator it = data.begin(); it != data.end(); ++it ) {
    std::cout << (*it).first.cell;
    switch( (*it).first.sub ) {
      case left: {
        std::cout << "-L";
      } break;
      case right: {
        std::cout << "-R";
      } break;
      case only: {
      } break;
    }
    std::cout << " is " << (*it).second << "\n";
  }
}

int main() {
  RawData test;
  test.push_back(3.14);
  test.push_back(2.8);
  test.push_back(-1);
  LookupTable table;
  table.resize(3);
  table[0] = DataType("A1", left);
  table[1] = "D0";
  table[2] = DataType("A1", right);
  OrganizedData org = organize( test, table );
  PrintOrganizedData( org );
}

查找表存储什么通道映射到什么单元名称和边。

查找表中未使用的条目应设置为DataType(),这将标记它们的值以存储在某个"UNUSED"位置。(它仍然会被存储,但你可以在之后丢弃它)。

其结果是从数据(CellName, Side)double数据的映射。我包括一个简单的打印机,它只是转储数据。如果你有绘图软件,你可以想办法用它制作图表。跳过"UNUSED"是一项涉及检查(*it).first.cell == "UNUSED"该打印循环的练习。

我相信一切都符合 C++03。如果你有一个 C++11 编译器,上面的一堆会变得更漂亮。

于 2013-06-26T14:27:10.143 回答