Dil
September 28, 2022, 2:10pm
1
Hello experts,
I stored TVectorD in a root file.But I cannot receive it from the root file.
Could someone help me who’s the error?
void mxtrix_multiplication(){
const int nx=3,nQ2=4,ntmin_t=10,n_weight=6;
TFile *hFile2=TFile::Open("testing_1.root");
hFile2->ls();
char MatrixName_1[64];
TVectorD Data_array_vec(6);
for(int ixB=0; ixB<nx; ixB++){
for(int iQ2=0; iQ2<nQ2; iQ2++){
for(int itmin_t=0 ; itmin_t < ntmin_t; itmin_t++){
for(int i_DATA=0; i_DATA < n_weight; i_DATA++){
sprintf(MatrixName_1,"Data_array_xB%03d_iQ2%03d_tmin%03d",ixB,iQ2,itmin_t);
Data_array_vec[i_DATA]= hFile2->Get(MatrixName_1);
}
Data_array_vec.Print();
}
}
}
}
error: assigning to 'double' from incompatible type 'TObject *'
Data_array_vec[i_DATA]= hFile2->Get(MatrixName_1);
~~~~~~~~^~~~~~~~~~~~~~~~~
Unfortunately I cannot upload my root file since it’s 5MB.
couet
September 28, 2022, 2:18pm
2
May be:
Data_array_vec[i_DATA] = (TVectorD*) hFile2->Get(MatrixName_1);
assuming Data_array_vec
is an array of TVectorD
.
Dil
September 28, 2022, 2:20pm
3
Thanks for the suggestion.But answer is No.
error: assigning to 'double' from incompatible type 'TVectorD *' (aka 'TVectorT<double> *')
Data_array_vec[i_DATA]= (TVectorD*)hFile2->Get(MatrixName_1);
TVectorD Data_array_vec[n_weight];
(Data_array_vec[i_DATA]).ResizeTo(6) = *((TVectorD*)(hFile2->Get(MatrixName_1)));
Dil
September 28, 2022, 2:28pm
5
Thank You Wile_E_Coyote .
But I cannot print this.I got following error.
error: member reference base type 'TVectorD [6]' is not a structure or union
Data_array_vec.Print();
Then I print inside the “i_Data” loop as Data_array_vec[i_Data].Print()
;
But I got wrong vectors.
Error in <TVectorT::operator=(const TVectorT &)>: vectors not compatible
Vector (0) is as follows
| 1 |
Error in <TVectorT::operator=(const TVectorT &)>: vectors not compatible
Vector (0) is as follows
| 1 |
Dil
September 28, 2022, 2:40pm
7
Thank You.It’s working now.
Dil
September 28, 2022, 2:51pm
9
Thank You @Wile_E_Coyote.This is helpful.
Do I need to follow the same method when retrieve TMatrixD matrixGEN(6,6);
?
(for future reference)
I need to multiply Tmatrix(6 x6) by TVectorD.
matrixGEN(6,6) * Data_array_vex(6)
TMatrixD matrixGEN[n_weight];
(matrixGEN[i_DATA]).ResizeTo(6, 6) = *((TMatrixD*)(hFile2->Get(MatrixName_1)));
Actually, I think you’d better use pointers.
TVectorD *Data_array_vec[n_weight];
TMatrixD *matrixGEN[n_weight];
hFile2->GetObject("saved_vector_name", Data_array_vec[i_DATA]);
hFile2->GetObject("saved_matrix_name", matrixGEN[i_DATA]);
(*matrixGEN[i_DATA]) * (*Data_array_vex[i_DATA]) /*multiplication */
delete Data_array_vec[i_DATA]; delete matrixGEN[i_DATA]; /* when no longer needed */