1 //*-- Author : Valery Fine 24/03/98 2 // $Id: St_Module.cxx,v 1.18 2003/04/30 20:39:12 perev Exp $ 3 4 #include <assert.h> 5 #include <string.h> 6 #include "St_Module.h" 7 8 9 ClassImp(St_Module) 10 11 12 //////////////////////////////////////////////////////////////////////////////// 13 // // 14 // St_Module // 15 // // 16 // St_Module is a virtual base class to call the begin_html <A HREF="http://www.rhic.bnl.gov/STAR/html/ssd_l/staf_l/STAF-current/pams/pams.html">PAMS - Physics Analysis Modules</A> end_html 17 // modules from C++ programs and begin_html <A HREF="http://root.cern.ch">ROOT</A> end_html batch and interactive environments. 18 // // 19 // Note: This class uses the "default" parameter term. // 20 // The value of the default parameter is defined as follows: // 21 // // 22 // "it is either "zero" or // 23 // the last value of the "missed" parameters // 24 // // 25 // Calling St_Module::Call, St_Module::ExecuteModule methods with // 26 // any parameter = 0 means the wrapped STAR module will be called // 27 // with "default" parameter instead. // 28 // // 29 // // 30 // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/Module2Root.gif"> </P> End_Html 31 // // 32 //////////////////////////////////////////////////////////////////////////////// 33 34 //______________________________________________________________________________ 35 St_Module::St_Module() 36 : fParams(0), fHeaders(0), fName(0), fIndex(0) 37 { // Default ctor; 38 } 39 //______________________________________________________________________________ 40 St_Module::St_Module(char *, TTable *,TTable *,TTable *,TTable * 41 ,TTable *,TTable *,TTable *,TTable * 42 ,TTable *,TTable *,TTable *,TTable * 43 ,TTable *,TTable *,TTable *,TTable * 44 ,TTable *,TTable *,TTable *,TTable * 45 ,TTable *,TTable *,TTable *,TTable * 46 ,TTable *,TTable *,TTable *,TTable * 47 ,TTable *,TTable *,TTable *,TTable * 48 ,TTable *,TTable *,TTable *,TTable * 49 ,TTable *,TTable * 50 ) 51 : fParams(0), fHeaders(0), fName(0), fIndex(38) 52 // : TNamed(name) 53 {} 54 //______________________________________________________________________________ 55 St_Module::St_Module( TTable *f1,TTable *f2,TTable *f3,TTable *f4 56 ,TTable *f5,TTable *f6,TTable *f7,TTable *f8 57 ,TTable *f9,TTable *f10,TTable *f11,TTable *f12 58 ,TTable *f13,TTable *f14,TTable *f15,TTable *f16 59 ,TTable *f17,TTable *f18,TTable *f19,TTable *f20 60 ,TTable *f21,TTable *f22,TTable *f23,TTable *f24 61 ,TTable *f25,TTable *f26,TTable *f27,TTable *f28 62 ,TTable *f29,TTable *f30,TTable *f31,TTable *f32 63 ,TTable *f33,TTable *f34,TTable *f35,TTable *f36 64 ,TTable *f37,TTable *f38 65 ) 66 : fParams(0), fHeaders(0), fName(0), fIndex(38) 67 { 68 SetAllParameters( f1, f2, f3, f4, f5, f6, f7, f8, f9,f10,f11,f12 69 ,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24 70 ,f25,f26,f27,f28,f29,f30,f31,f32,f33,f34,f35,f36 71 ,f37,f38 72 ); 73 } 74 //______________________________________________________________________________ 75 St_Module::~St_Module() 76 { 77 if (fHeaders) fHeaders->Delete(); 78 SafeDelete(fHeaders); 79 SafeDelete(fParams); 80 } 81 //______________________________________________________________________________ 82 void St_Module::ClearParams() 83 { 84 if (fHeaders) { 85 fHeaders->Delete(); 86 fParams->Clear(); 87 } 88 } 89 //______________________________________________________________________________ 90 void St_Module::SetAllParameters(TTable *f1,TTable *f2,TTable *f3,TTable *f4 91 ,TTable *f5,TTable *f6,TTable *f7,TTable *f8 92 ,TTable *f9,TTable *f10,TTable *f11,TTable *f12 93 ,TTable *f13,TTable *f14,TTable *f15,TTable *f16 94 ,TTable *f17,TTable *f18,TTable *f19,TTable *f20 95 ,TTable *f21,TTable *f22,TTable *f23,TTable *f24 96 ,TTable *f25,TTable *f26,TTable *f27,TTable *f28 97 ,TTable *f29,TTable *f30,TTable *f31,TTable *f32 98 ,TTable *f33,TTable *f34,TTable *f35,TTable *f36 99 ,TTable *f37,TTable *f38 100 ) 101 { 102 ClearParams(); 103 SetParameter(f38); 104 SetParameter(f37); 105 SetParameter(f36); 106 SetParameter(f35); 107 SetParameter(f34); 108 SetParameter(f33); 109 SetParameter(f32); 110 SetParameter(f31); 111 SetParameter(f30); 112 SetParameter(f29); 113 SetParameter(f28); 114 SetParameter(f27); 115 SetParameter(f26); 116 SetParameter(f25); 117 SetParameter(f24); 118 SetParameter(f23); 119 SetParameter(f22); 120 SetParameter(f21); 121 SetParameter(f20); 122 SetParameter(f19); 123 SetParameter(f18); 124 SetParameter(f17); 125 SetParameter(f16); 126 SetParameter(f15); 127 SetParameter(f14); 128 SetParameter(f13); 129 SetParameter(f12); 130 SetParameter(f11); 131 SetParameter(f10); 132 SetParameter(f9); 133 SetParameter(f8); 134 SetParameter(f7); 135 SetParameter(f6); 136 SetParameter(f5); 137 SetParameter(f4); 138 SetParameter(f3); 139 SetParameter(f2); 140 SetParameter(f1); 141 } 142 143 //______________________________________________________________________________ 144 void St_Module::SetParameter(TTable *f) 145 { 146 if (!fIndex) return; 147 if (f) { 148 if (!fParams) { 149 fParams = new TObjArray(fIndex); 150 fHeaders = new TObjArray(fIndex); 151 } 152 fParams->AddAt(f,fIndex-1); 153 fHeaders->AddAt(new St_table_header(f),fIndex-1); 154 } 155 fIndex--; 156 } 157 //______________________________________________________________________________ 158 Int_t St_Module::CheckParameters(const Char_t *names[]) 159 { 160 //////////////////////////////////////////////////////////////////// 161 // // 162 // CheckParameters() // 163 // // 164 // Check whether all parameters are defined to call ExecutModule // 165 // properly ? // 166 // // 167 // Return: // 168 // 0 = Ok, All parameters are "well" defined // 169 // +n = the n parameters were not defined yet. // 170 // // 171 // To print the list of parameters one may call // 172 // St_Module::Print() method // 173 // // 174 //////////////////////////////////////////////////////////////////// 175 Int_t errcode = 0; 176 if (fParams) { 177 TObjArray &thisParams = *fParams; 178 Int_t thisSize = thisParams.GetSize(); 179 for (Int_t i=0;i<thisSize;i++) 180 if (!thisParams[i]) { 181 // errcode = St_Module::ExecuteModule(); 182 errcode++; 183 if (errcode == 1) 184 fprintf(stderr, "\n \t ***** Error calling module <%s> *****\n" 185 ,GetName()); 186 const Char_t *suffix[4]={"st","nd","d","th"}; 187 Int_t indx = i%10; 188 if ( (10 < i && i < 20) || indx > 3 || indx == 0) indx = 4; 189 indx--; 190 const Char_t *name = names ? names[i] : "unknown" ; 191 fprintf(stderr, "\t %i-%s table of <%s> has not been defined yet\n" 192 ,i,suffix[indx],name); 193 } 194 //===== assert (!errcode); 195 } 196 return errcode; 197 } 198 //______________________________________________________________________________ 199 Int_t St_Module::CheckResults(Int_t res, const Char_t *names[]) 200 { 201 Int_t errcode = 0; 202 if (fParams) { 203 Int_t thisSize = fParams->GetSize(); 204 for (Int_t i=0;i<thisSize;i++) { 205 Bool_t bug = kFALSE; 206 // Get header 207 table_head_st *h = GetHeader(i); 208 TTable *table = GetTable(i); 209 if (table) { 210 assert(table->GetTableSize() == h->maxlen 211 && table->GetRowSize() == h->rbytes 212 && table == (TTable *)h->dsl_pointer); 213 table->SetNRows(h->nok); 214 if (h->nok > h->maxlen){ 215 res = kFALSE; 216 errcode++; 217 bug = kTRUE; 218 } 219 table->NaN(); 220 if (errcode && bug) { 221 if (errcode == 1) 222 fprintf(stderr, 223 "\n \t ***** module <%s> returned the corrupted table %s *****\n \t * The number of the used rows more (or equal) of the allocated ones *\n" 224 ,GetName(), table->GetName()); 225 const Char_t *suffix[4]={"st","nd","rd","th"}; 226 Int_t indx = i%10; 227 if ( (10 < i && i < 20) || indx > 3 || indx == 0) indx = 4; 228 indx--; 229 const Char_t *name = names ? names[i] : "unknown" ; 230 fprintf(stderr, "\t %i-%s <%s> %s has used %d with %d allocated\n" 231 ,i+1,suffix[indx],name, table->GetName(),(int)h->nok,(int)h->maxlen); 232 } 233 } 234 ///===== assert (!errcode); 235 } 236 } 237 return res; 238 } 239 240 //______________________________________________________________________________ 241 Int_t St_Module::ExecuteModule() 242 { 243 244 Int_t errcode = 0; 245 printf(" This \"%s\" module has ", GetName()); 246 if (fParams) 247 { 248 Int_t thisSize = fParams->GetSize(); 249 if (thisSize == 1) 250 printf("only one parameter: "); 251 else 252 printf("%i parameters: ",thisSize); 253 for (Int_t i=0;i<thisSize;i++) 254 { 255 if (fParams->At(i)) printf(" %lx ",*((ULong_t *)fParams->At(i))); 256 else { 257 errcode++; 258 //yf Char_t *suffix[4]={"st","nd","d","th"}; 259 //yf Bool_t istable = i & 1; 260 printf("%i parameter has not been defined yet\n" 261 ,i+1); 262 } 263 264 if (i < thisSize-1) printf(", "); 265 } 266 printf("; \n"); 267 ///===== assert (!errcode); 268 } 269 else 270 printf(" NO parameters \n"); 271 return errcode; 272 } 273 #if 0 274 //______________________________________________________________________________ 275 void St_Module::SetEntryName() 276 { 277 st_Name = new char[strlen(GetName()+10]; 278 strcpy(st_Name,GetName()); 279 280 if (st_Name) 281 { 282 if (st_Type==kFortran) 283 { 284 #ifdef U_CASE 285 strupr(st_Name); 286 # ifdef CERNLIB_MSSTDCALL 287 char buftmp[10]; 288 strcat(st_Name,"@"); 289 atoi(buftmp,fN*4,10); 290 strcat(st_Name,buftmp); 291 # endif 292 #else //VP if defined(uscope) 293 strcat(st_Name,"_"); 294 #endif 295 } 296 } 297 SetTitle(st_Name); 298 } 299 #endif 300 //______________________________________________________________________________ 301 Int_t St_Module::InvokeModule(TTable *f1,TTable *f2,TTable *f3,TTable *f4, 302 TTable *f5,TTable *f6,TTable *f7,TTable *f8, 303 TTable *f9,TTable *f10,TTable *f11,TTable *f12, 304 TTable *f13,TTable *f14,TTable *f15,TTable *f16, 305 TTable *f17,TTable *f18,TTable *f19,TTable *f20 306 ,TTable *f21,TTable *f22,TTable *f23,TTable *f24, 307 TTable *f25,TTable *f26,TTable *f27,TTable *f28, 308 TTable *f29,TTable *f30,TTable *f31,TTable *f32, 309 TTable *f33,TTable *f34,TTable *f35,TTable *f36, 310 TTable *f37,TTable *f38 311 ) 312 { 313 fIndex = 38; 314 SetAllParameters( f1, f2, f3, f4, f5, f6, f7, f8, f9,f10,f11,f12 315 ,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24, 316 f25,f26,f27,f28,f29,f30,f31,f32,f33,f34,f35,f36, 317 f37,f38 318 ); 319 return ExecuteModule(); 320 } 321 void St_Module::Streamer(TBuffer &) 322 { assert(0);} 323 324 //________________________________________________________________________ 325 // $Log: St_Module.cxx,v $ 326 // Revision 1.18 2003/04/30 20:39:12 perev 327 // Warnings cleanup. Modified lines marked VP 328 // 329 // Revision 1.17 2001/07/16 23:58:35 fine 330 // suppressing the compilation warning 331 // 332 // Revision 1.16 2000/09/15 15:12:37 perev 333 // NaN check added 334 // 335 // Revision 1.15 2000/07/30 01:40:12 perev 336 // StMem class added 337 // 338 // Revision 1.14 2000/03/30 05:20:51 fine 339 // bug fixed 340 // 341 // Revision 1.13 2000/03/27 02:19:26 fine 342 // warning removed 343 // 344 // Revision 1.12 2000/03/26 01:59:23 fine 345 // new version of St_Module. Works for STAF module only 346 // 347 // Revision 1.11 2000/03/24 20:35:22 fine 348 // adjusted to ROOT 2.24. Doesn't work yet. Under development 349 // 350 // Revision 1.10 1999/12/21 18:57:13 fine 351 // compilation warning plus new type for SizeAttribute 352 // 353 // Revision 1.9 1999/12/07 22:26:26 fine 354 // Clean up to remove the compilation warnings 355 // 356 // Revision 1.8 1999/06/14 09:45:41 fine 357 // assert for St_Module (thanks Fisyak) 358 // 359 // Revision 1.7 1999/03/11 00:34:44 perev 360 // St_base in new maker schema 361 // 362 // Revision 1.6 1999/02/24 17:10:57 fine 363 // St_Table New and Purge method have been introdiced, some clean up for St_module as well 364 // 365 // Revision 1.5 1998/11/25 21:58:33 fisyak 366 // Cleanup 367 // 368 // Revision 1.4 1998/08/25 23:07:24 didenko 369 // New base with Tree 370 // 371 //________________________________________________________________________ 372