2 #define ROOTHISTCNV_RCWNTUPLECNV_CPP
4 #define ALLOW_ALL_TYPES
30 #pragma warning(disable:1572)
49 long item_size =
sizeof(T);
50 long dimension = it->
length();
51 long ndim = it->
ndim()-1;
62 if (ind_blk != block_name) {
63 std::cerr <<
"ERROR: Index for CWNT variable " << ind_var
64 <<
" is in a different block: " << ind_blk <<
std::endl;
68 else if ( it->
dim(ndim) > 1 ) {
69 text << it->
dim(ndim);
72 for (
int i = ndim-1;
i>=0;
i-- ){
73 text <<
"][" << it->
dim(
i);
81 lowerRange = (long) it->
range().lower();
82 upperRange = (long) it->
range().upper();
90 size += item_size * dimension;
100 rtree =
new TTree(desc.c_str(), nt->
title().c_str());
101 log <<
MSG::VERBOSE <<
"created tree id: " << rtree->GetName()
102 <<
" title: "<< nt->
title() <<
" desc: " << desc <<
endmsg;
107 long lowerRange, upperRange;
109 long cursize, oldsize = 0;
118 i != cols.
end(); ++
i ) {
121 switch( (*i)->type() ) {
125 block_name,var_name,lowerRange,upperRange,size);
130 item, block_name,var_name,lowerRange,upperRange,size);
135 block_name,var_name,lowerRange,upperRange,size);
140 block_name,var_name,lowerRange,upperRange,size);
145 block_name,var_name,lowerRange,upperRange,size);
150 item, block_name,var_name,lowerRange,upperRange,size);
155 item, block_name,var_name,lowerRange,upperRange,size);
160 item, block_name,var_name,lowerRange,upperRange,size);
165 item, block_name,var_name,lowerRange,upperRange,size);
170 item, block_name,var_name,lowerRange,upperRange,size);
175 block_name,var_name,lowerRange,upperRange,size);
180 block_name,var_name,lowerRange,upperRange,size);
185 block_name,var_name,lowerRange,upperRange,size);
192 cursize = size - oldsize;
194 log <<
MSG::VERBOSE <<
"item: " << item <<
" type " << (*i)->type()
195 <<
" blk: " << block_name
196 <<
" var: " << var_name <<
" rng: " << lowerRange <<
" "
197 << upperRange <<
" sz: " << size <<
" " << cursize
198 <<
" buf_pos: " << size-cursize <<
endmsg;
210 char* buff =
new char[size];
211 log <<
MSG::VERBOSE <<
"Created buffer size: " << size <<
" at "
212 << (
void*)buff << endmsg;
215 memset (buff,0,size);
220 char *buf_pos = buff;
223 end = item_name.
end();
226 unsigned int i_item = 0;
227 for (itr=item_name.
begin(); itr!=
end; ++itr, ++i_item) {
229 buf_pos = buff + item_buf_pos[i_item];
238 #if ROOT_VERSION_CODE >= ROOT_VERSION(5,15,0)
239 TBranch *br =
new TBranch(rtree,
241 TBranch *br =
new TBranch(
243 item_fullname[i_item].c_str(),
248 if (itr->first !=
"AUTO_BLK") {
250 tit = itr->first +
"::" + br->GetTitle();
251 br->SetTitle(tit.c_str());
254 log <<
MSG::DEBUG <<
"adding TBranch " << br->GetTitle() <<
" at "
255 << (
void*) buf_pos << endmsg;
259 if ( item_range_lower[i_item] < item_range_upper[i_item] ) {
264 TObject *tobj = br->GetListOfLeaves()->FindObject( item_fullname[i_item].c_str() );
265 if (tobj->IsA()->InheritsFrom(
"TLeafI")) {
266 index =
dynamic_cast<TLeafI*
>(tobj);
269 index->SetMaximum( item_range_upper[i_item] );
273 log <<
MSG::ERROR <<
"Could dynamic cast to TLeafI: "
274 << item_fullname[i_item] <<
endmsg;
279 rtree->GetListOfBranches()->Add(br);
284 log <<
MSG::INFO <<
"Booked TTree with ID: " << desc
285 <<
" \"" << nt->
title() <<
"\" in directory "
300 char * tar = nt->
buffer();
302 switch( (*i)->type() ) {
304 tar += saveItem(tar, (
bool*)(*i)->buffer(), (*i)->length());
307 tar += saveItem(tar, (
char*)(*i)->buffer(), (*i)->length());
310 tar += saveItem(tar, (
short*)(*i)->buffer(), (*i)->length());
313 tar += saveItem(tar, (
int*)(*i)->buffer(), (*i)->length());
316 tar += saveItem(tar, (
long*)(*i)->buffer(), (*i)->length());
319 tar += saveItem(tar, (
long long*)(*i)->buffer(), (*i)->length());
322 tar += saveItem(tar, (
unsigned char*)(*i)->buffer(), (*i)->length());
325 tar += saveItem(tar, (
unsigned short*)(*i)->buffer(), (*i)->length());
328 tar += saveItem(tar, (
unsigned int*)(*i)->buffer(), (*i)->length());
331 tar += saveItem(tar, (
unsigned long*)(*i)->buffer(), (*i)->length());
334 tar += saveItem(tar, (
unsigned long long*)(*i)->buffer(), (*i)->length());
337 tar += saveItem(tar, (
float*)(*i)->buffer(), (*i)->length());
340 tar += saveItem(tar, (
double*)(*i)->buffer(), (*i)->length());
361 if (ievt >= rtree->GetEntries()) {
362 log <<
MSG::ERROR <<
"no more entries in tree to read. max: "
363 << rtree->GetEntries() <<
" current: " << ievt
368 rtree->GetEvent(ievt);
373 char * src = ntup->
buffer();
380 switch( (*i)->type() ) {
382 src += loadItem(src, (
bool*)(*i)->buffer(), (*i)->length());
385 src += loadItem(src, (
char*)(*i)->buffer(), (*i)->length());
388 src += loadItem(src, (
short*)(*i)->buffer(), (*i)->length());
391 src += loadItem(src, (
int*)(*i)->buffer(), (*i)->length());
394 src += loadItem(src, (
long*)(*i)->buffer(), (*i)->length());
397 src += loadItem(src, (
long long*)(*i)->buffer(), (*i)->length());
400 src += loadItem(src, (
unsigned char*)(*i)->buffer(), (*i)->length());
403 src += loadItem(src, (
unsigned short*)(*i)->buffer(), (*i)->length());
406 src += loadItem(src, (
unsigned int*)(*i)->buffer(), (*i)->length());
409 src += loadItem(src, (
unsigned long*)(*i)->buffer(), (*i)->length());
412 src += loadItem(src, (
unsigned long long*)(*i)->buffer(), (*i)->length());
415 src += loadItem(src, (
float*)(*i)->buffer(), (*i)->length());
418 src += loadItem(src, (
double*)(*i)->buffer(), (*i)->length());
441 log <<
MSG::VERBOSE <<
"loading CWNT " << title <<
" at: "
449 std::string itemName, indexName, item_type, itemTitle, blockName;
451 long size, totsize=0;
458 TObjArray* lbr = tree->GetListOfBranches();
460 while ( TObject *tobjb = bitr() ) {
462 TBranch* br = (TBranch*)tobjb;
463 itemTitle = br->GetTitle();
465 int ipos = itemTitle.find(
"::");
467 blockName = itemTitle.substr(0,ipos);
472 TObjArray* lf = br->GetListOfLeaves();
475 while ( TObject *tobj = litr() ) {
483 TLeaf* tl =
dynamic_cast<TLeaf*
> (tobj);
484 itemName = tl->GetName();
491 if (blockName !=
"") {
492 log <<
MSG::DEBUG <<
"loading NTuple item " << blockName <<
"/"
495 log <<
MSG::DEBUG <<
"loading NTuple item " << itemName;
499 TLeaf* indexLeaf = tl->GetLeafCounter(arraySize);
501 if (arraySize == 0) {
502 log <<
MSG::ERROR <<
"TLeaf counter size = 0. This should not happen!"
506 if (indexLeaf != 0) {
509 indexName = indexLeaf->GetName();
511 indexRange = indexLeaf->GetMaximum();
512 itemSize = indexRange * tl->GetLenType() * arraySize;
514 log <<
"[" << indexName;
517 if (arraySize != 1) {
518 log <<
"][" << arraySize;
523 itemSize = tl->GetLenType() * arraySize;
527 if (arraySize == 1) {
531 log <<
"[" << arraySize <<
"]";
543 hasRange = tl->IsRange();
549 if (tobj->IsA()->InheritsFrom(
"TLeafI")) {
551 TLeafI *tli =
dynamic_cast<TLeafI*
>(tobj);
552 if (tli->IsUnsigned()) {
553 unsigned long min=0,
max=0;
555 min = tli->GetMinimum();
556 max = tli->GetMaximum();
565 min = tli->GetMinimum();
566 max = tli->GetMaximum();
575 }
else if (tobj->IsA()->InheritsFrom(
"TLeafF")) {
578 TLeafF *tlf =
dynamic_cast<TLeafF*
>(tobj);
580 min = float(tlf->GetMinimum());
581 max = float(tlf->GetMaximum());
589 }
else if (tobj->IsA()->InheritsFrom(
"TLeafD")) {
592 TLeafD *tld =
dynamic_cast<TLeafD*
>(tobj);
594 min = tld->GetMinimum();
595 max = tld->GetMaximum();
612 <<
"Unable to create ntuple item \""
613 << itemName <<
"\"" <<
endmsg;
619 log <<
MSG::DEBUG <<
"Total buffer size of NTuple: " << totsize
622 char* buf =
new char[totsize];
629 for (; iitr!= itemList.
end(); ++iitr) {
630 TLeaf* leaf = (*iitr).first;
631 int isize = (*iitr).second;
633 log <<
MSG::VERBOSE <<
"setting TBranch " << leaf->GetBranch()->GetName()
634 <<
" buffer at " << (
void*) bufpos << endmsg;
636 leaf->GetBranch()->SetAddress((
void*)bufpos);
654 if (totsize != ts ) {
655 log <<
MSG::ERROR <<
"buffer size mismatch: " << ts <<
" " << totsize