diff --git a/src/THcParmList.cxx b/src/THcParmList.cxx index 60e1f2b161f48bd720dbf65bb8b832fbdf5d3fb0..0f6f9d44bf489b8aa47718d4deff285508918133 100644 --- a/src/THcParmList.cxx +++ b/src/THcParmList.cxx @@ -628,39 +628,65 @@ Int_t THcParmList::LoadCCDBDirectory(const char* directory, // To what extent is there duplication here with Load() method? - // Retrieve the data as floats - vector<vector<double> > data; - CCDB_obj->GetCalib(data, namepaths[iname]); - for(UInt_t row=0; row<data.size(); row++) { - for(UInt_t col=0;col<data[0].size(); col++) { - cout << data[row][col] << "\t"; - } - cout << endl; - } - - if(data[0].size()==1) { // Only handle single column tables - // Could stuff 2d arrays in, and assume that the application knows - // the number of columns. Then the matrix stuff would just need to - // see if the variable exists, then copy the data into the right kind - // of structure instead of reading from the recon files. + // Retrieve assignment + Assignment* assignment = CCDB_obj->GetAssignment(namepaths[iname], true); + ConstantsTypeColumn::ColumnTypes ccdbtype=assignment->GetValueType(0); + Int_t ccdbncolumns=assignment->GetTypeTable()->GetNColumns(); + Int_t ccdbnrows=assignment->GetTypeTable()->GetNRows(); + std::string title = assignment->GetTypeTable()->GetComment(); + + // Only load single column tables + if(ccdbncolumns == 1) { + THaVar* existingvar=Find(varname.c_str()); - if(existingvar) { - // Does the array of data need to deleted too? - RemoveName(varname.c_str()); - } - Double_t* fp = new Double_t[data.size()]; - for(UInt_t row=0;row<data.size(); row++) { - fp[row] = data[row][0]; - } // Need to append [size] to end of varname char sizestring[20]; - sprintf(sizestring,"[%d]",(Int_t) data.size()); + sprintf(sizestring,"[%d]",ccdbnrows); std::string size_str (sizestring); varname.append(size_str); - Define(varname.c_str(), "comment", *fp); - } - } + // Select data type + if(ccdbtype==ConstantsTypeColumn::cIntColumn) { + vector<vector<int> > data; + CCDB_obj->GetCalib(data, namepaths[iname]); + + if(existingvar) { + RemoveName(varname.c_str()); + } + + Int_t* ip = new Int_t[data.size()]; + for(UInt_t row=0;row<data.size(); row++) { + ip[row] = data[row][0]; + } + Define(varname.c_str(), title.c_str(), *ip); + + } else if (ccdbtype==ConstantsTypeColumn::cDoubleColumn) { + vector<vector<double> > data; + CCDB_obj->GetCalib(data, namepaths[iname]); + + if(existingvar) { + RemoveName(varname.c_str()); + } + + Double_t* fp = new Double_t[data.size()]; + for(UInt_t row=0;row<data.size(); row++) { + fp[row] = data[row][0]; + } + Define(varname.c_str(), title.c_str(), *fp); + } else if (ccdbtype==ConstantsTypeColumn::cStringColumn) { + if(ccdbnrows > 1) { + cout << namepaths[iname] << ": Only first element of CCDB string array loaded." << endl; + } + vector<vector<string> > data; + CCDB_obj->GetCalib(data, namepaths[iname]); + AddString(varname, data[0][0]); + } else { + cout << namepaths[iname] << ": Unsupported CCDB data type: " << ccdbtype << endl; + } + } else { + cout << namepaths[iname] << ": Multicolumn CCDB variables not supported" << endl; + } + } } return 0; }