00001 #include <stdio.h>
00002 #include <stdlib.h>
00003 #include <assert.h>
00004 #include "StEvent.h"
00005 #include "StHit.h"
00006 #include "StEventHitIter.h"
00007 #include "StTpcHitCollection.h"
00008 #include "StTpcSectorHitCollection.h"
00009 #include "StTpcPadrowHitCollection.h"
00010 #include "StFtpcHitCollection.h"
00011 #include "StFtpcPlaneHitCollection.h"
00012 #include "StSsdHitCollection.h"
00013 #include "StSvtHitCollection.h"
00014 #include "StRnDHitCollection.h"
00015 #include "StEtrHitCollection.h"
00016 #include "StTofCollection.h"
00017
00018 StHitIter::StHitIter()
00019 {
00020 fCont = 0;
00021 fDowIter=0;
00022 fJIter=-1;
00023 fNIter=0;
00024 }
00025
00026 StHitIter::~StHitIter()
00027 {
00028 delete fDowIter;fDowIter=0;
00029 }
00030
00031 const TObject *StHitIter::Reset(const TObject *cont)
00032 {
00033 fCont = cont;
00034 if (!fCont) return 0;
00035 fNIter = GetSize();
00036 for (fJIter =0;fJIter<fNIter;fJIter++) {
00037 const TObject *dowCont = GetObject(fJIter);
00038 if (!dowCont) continue;
00039 if (!fDowIter) return dowCont;
00040 const TObject *to = fDowIter->Reset(dowCont);
00041 if (to) return to;
00042 }
00043 return 0;
00044 }
00045
00046 const TObject *StHitIter::Get() const
00047 {
00048 if (fJIter>=fNIter) return 0;
00049 const TObject *obj = GetObject(fJIter);
00050 if (!obj) return 0;
00051 if (!fDowIter) return obj;
00052 return fDowIter->Get();
00053 }
00054
00055 const TObject *StHitIter::operator++()
00056 {
00057 const TObject *to=0;
00058 if (fJIter>=fNIter) return 0;
00059 if (!fDowIter) {
00060 while (++fJIter<fNIter) {
00061 if ((to = GetObject(fJIter))) return to;;
00062 }
00063 return 0;
00064 }
00065
00066 if ((to= ++(*fDowIter))) return to;
00067 while(++fJIter<fNIter) {
00068 if (!(to=GetObject(fJIter))) continue;;
00069 if ( (to=fDowIter->Reset(to))) return to;
00070 }
00071 return 0;
00072 }
00073
00074 void StHitIter::UPath(ULong64_t &upath) const
00075 {
00076 if (fDowIter) fDowIter->UPath(upath);
00077 upath*=fNIter; upath+=fJIter;
00078 }
00079
00080
00081
00082 StHitIterGroup::StHitIterGroup()
00083 {
00084 fDetectorId = kUnknownId;
00085 }
00086
00087 StHitIterGroup::~StHitIterGroup()
00088 {
00089 for (int i=0;i<(int)fGroup.size();i++) { delete fGroup[i];}
00090 }
00091
00092 const TObject *StHitIterGroup::Reset(const TObject *cont)
00093 {
00094 if (cont) fCont=cont;
00095 if (!fCont) return 0;
00096 fDetectorId = kUnknownId;
00097 fNIter = fGroup.size();
00098 for (fJIter=0;fJIter<fNIter;fJIter++) {
00099 const TObject *to=fGroup[fJIter]->Reset(fCont);
00100 if (to) return to;
00101 }
00102 return 0;
00103 }
00104
00105 void StHitIterGroup::Add(StHitIter* iter)
00106 {
00107 fGroup.push_back(iter);
00108 fNIter = fGroup.size();
00109 }
00110
00111 const TObject *StHitIterGroup::GetObject (int) const
00112 { assert(0 && "In StHitIterGroup::GetObject");}
00113
00114 const TObject *StHitIterGroup::Get () const
00115 {
00116 fDetectorId = kUnknownId;
00117 if (fJIter>=fNIter) return 0;
00118 fDetectorId = fGroup[fJIter]->DetectorId();
00119 return fGroup[fJIter]->Get();
00120 }
00121
00122 const TObject *StHitIterGroup::operator++()
00123 {
00124 if (fJIter>=fNIter) return 0;
00125 const TObject *to;
00126 if ((to=++(*fGroup[fJIter]))) return to;
00127
00128 while(++fJIter<fNIter) {
00129 to = fGroup[fJIter]->Reset(fCont);
00130 if (to) return to;
00131 }
00132 return 0;
00133 }
00134
00135 UInt_t StHitIterGroup::UPath() const
00136 {
00137 ULong64_t ul=0;
00138 UPath(ul);
00139 assert(!(ul>>32));
00140 return ul;
00141 }
00142
00143 void StHitIterGroup::UPath(ULong64_t &ul) const
00144 {
00145 fGroup[fJIter]->UPath(ul);
00146 }
00147
00148
00149
00150
00151
00152
00153 class StTpcHitIter : public StHitIter {
00154 public:
00155 StTpcHitIter();
00156 virtual ~StTpcHitIter(){;}
00157 virtual const TObject *Reset(const TObject *cont);
00158 virtual const TObject *GetObject (int idx) const;
00159 virtual int GetSize () const;
00160 StDetectorId DetectorId() const {return kTpcId;}
00161 protected:
00162 };
00163
00164
00165 class StTpcSectorHitIter : public StHitIter {
00166 public:
00167 StTpcSectorHitIter(){;}
00168 virtual ~StTpcSectorHitIter(){;}
00169 virtual const TObject *GetObject (int idx) const;
00170 virtual int GetSize () const;
00171 protected:
00172 };
00173
00174 class StTpcPadrowHitIter : public StHitIter {
00175 public:
00176 StTpcPadrowHitIter(){;}
00177 virtual ~StTpcPadrowHitIter(){;}
00178 virtual const TObject *GetObject (int idx) const;
00179 virtual int GetSize () const;
00180 protected:
00181 };
00182
00183
00184 StTpcHitIter::StTpcHitIter()
00185 {
00186 StHitIter *obj=this,*hi;
00187 obj->SetDowIter((hi=new StTpcSectorHitIter())); obj = hi;
00188 obj->SetDowIter((hi=new StTpcPadrowHitIter())); obj = hi;
00189 }
00190
00191 const TObject *StTpcHitIter::Reset(const TObject *cont)
00192 {
00193 const StTpcHitCollection *to = 0;
00194 if (cont) to = ((StEvent*)cont)->tpcHitCollection();
00195 return StHitIter::Reset(to);
00196 }
00197
00198
00199 int StTpcHitIter::GetSize()const
00200 { return ((StTpcHitCollection*)fCont)->numberOfSectors();}
00201
00202
00203
00204 const TObject *StTpcHitIter::GetObject (int idx) const
00205 {
00206 return ((StTpcHitCollection*)fCont)->sector(idx);
00207 }
00208
00209 const TObject *StTpcSectorHitIter::GetObject (int idx) const
00210 {
00211 return ((StTpcSectorHitCollection*)fCont)->padrow(idx);
00212 }
00213
00214 int StTpcSectorHitIter::GetSize () const
00215 {
00216 return ((StTpcSectorHitCollection*)fCont)->numberOfPadrows();
00217 }
00218
00219 const TObject *StTpcPadrowHitIter::GetObject (int idx) const
00220 {
00221 return (const TObject*)((StTpcPadrowHitCollection*)fCont)->hits().at(idx);
00222 }
00223
00224 int StTpcPadrowHitIter::GetSize () const
00225 {
00226 return ((StTpcPadrowHitCollection*)fCont)->hits().size();
00227 }
00228
00229
00230
00231
00232
00233
00234 class StSvtHitIter : public StHitIter {
00235 public:
00236 StSvtHitIter();
00237 virtual ~StSvtHitIter(){;}
00238 virtual const TObject *Reset(const TObject *cont);
00239 virtual const TObject *GetObject (int idx) const;
00240 virtual int GetSize () const;
00241 StDetectorId DetectorId() const {return kSvtId;}
00242 protected:
00243 };
00244
00245 class StSvtBarrelHitIter : public StHitIter {
00246 public:
00247 StSvtBarrelHitIter();
00248 virtual ~StSvtBarrelHitIter(){;}
00249 virtual const TObject *GetObject (int idx) const;
00250 virtual int GetSize () const;
00251 protected:
00252 };
00253
00254 class StSvtLadderHitIter : public StHitIter {
00255 public:
00256 StSvtLadderHitIter();
00257 virtual ~StSvtLadderHitIter(){;}
00258 virtual const TObject *GetObject (int idx) const;
00259 virtual int GetSize () const;
00260 protected:
00261 };
00262
00263 class StSvtWaferHitIter : public StHitIter {
00264 public:
00265 StSvtWaferHitIter();
00266 virtual ~StSvtWaferHitIter(){;}
00267 virtual const TObject *GetObject (int idx) const;
00268 virtual int GetSize () const;
00269 protected:
00270 };
00271
00272 StSvtHitIter::StSvtHitIter()
00273 {
00274 StHitIter *iter = this,*jter=0;
00275 iter->SetDowIter((jter=new StSvtBarrelHitIter())); iter=jter;
00276 iter->SetDowIter((jter=new StSvtLadderHitIter())); iter=jter;
00277 iter->SetDowIter((jter=new StSvtWaferHitIter ())); iter=jter;
00278 }
00279
00280 const TObject *StSvtHitIter::Reset(const TObject *cont)
00281 {
00282 const StSvtHitCollection *to = 0;
00283 if (cont) to = ((StEvent*)cont)->svtHitCollection();
00284 return StHitIter::Reset(to);
00285 }
00286
00287 const TObject *StSvtHitIter::GetObject (int idx) const
00288 {
00289 return (const TObject*)((StSvtHitCollection*)fCont)->barrel(idx);
00290 }
00291
00292 int StSvtHitIter::GetSize () const
00293 {
00294 return ((StSvtHitCollection*)fCont)->numberOfBarrels();
00295 }
00296
00297
00298 const TObject *StSvtBarrelHitIter::GetObject (int idx) const
00299 {
00300 return (const TObject*)((StSvtBarrelHitCollection*)fCont)->ladder(idx);
00301 }
00302
00303 int StSvtBarrelHitIter::GetSize () const
00304 {
00305 return ((StSvtBarrelHitCollection*)fCont)->numberOfLadders();
00306 }
00307
00308 const TObject *StSvtLadderHitIter::GetObject (int idx) const
00309 {
00310 return (const TObject*)((StSvtLadderHitCollection*)fCont)->wafer(idx);
00311 }
00312
00313 int StSvtLadderHitIter::GetSize () const
00314 {
00315 return ((StSvtLadderHitCollection*)fCont)->numberOfWafers();
00316 }
00317
00318 const TObject *StSvtWaferHitIter::GetObject (int idx) const
00319 {
00320 return (const TObject*)((StSvtWaferHitCollection*)fCont)->hits().at(idx);
00321 }
00322
00323 int StSvtWaferHitIter::GetSize () const
00324 {
00325 return ((StSvtWaferHitCollection*)fCont)->hits().size();
00326 }
00327
00328
00329
00330
00331
00332 class StEtrHitIter : public StHitIter {
00333 public:
00334 StEtrHitIter(){;}
00335 virtual ~StEtrHitIter(){;}
00336 virtual const TObject *Reset(const TObject *cont);
00337 virtual const TObject *GetObject (int idx) const;
00338 virtual int GetSize () const;
00339 StDetectorId DetectorId() const {return kEtrId;}
00340 public:
00341 protected:
00342 };
00343
00344 const TObject *StEtrHitIter::Reset(const TObject *cont)
00345 {
00346 const StEtrHitCollection *to = 0;
00347 if (cont) to = ((StEvent*)cont)->etrHitCollection();
00348 return StHitIter::Reset(to);
00349 }
00350
00351 const TObject *StEtrHitIter::GetObject (int idx) const
00352 {
00353 return (const TObject*)((StEtrHitCollection*)fCont)->hits().at(idx);
00354 }
00355
00356 int StEtrHitIter::GetSize () const
00357 {
00358 return ((StEtrHitCollection*)fCont)->hits().size();
00359 }
00360
00361
00362
00363
00364 class StSsdHitIter : public StHitIter {
00365 public:
00366 StSsdHitIter();
00367 virtual ~StSsdHitIter(){;}
00368 virtual const TObject *Reset(const TObject *cont);
00369 virtual const TObject *GetObject (int idx) const;
00370 virtual int GetSize () const;
00371 StDetectorId DetectorId() const {return kSsdId;}
00372 protected:
00373 };
00374
00375 class StSsdLadderHitIter : public StHitIter {
00376 public:
00377 StSsdLadderHitIter();
00378 virtual ~StSsdLadderHitIter(){;}
00379 virtual const TObject *GetObject (int idx) const;
00380 virtual int GetSize () const;
00381 protected:
00382 };
00383
00384 class StSsdWaferHitIter : public StHitIter {
00385 public:
00386 StSsdWaferHitIter();
00387 virtual ~StSsdWaferHitIter(){;}
00388 virtual const TObject *GetObject (int idx) const;
00389 virtual int GetSize () const;
00390 protected:
00391 };
00392
00393 StSsdHitIter::StSsdHitIter()
00394 {
00395 StHitIter *iter = this,*jter=0;
00396 iter->SetDowIter((jter=new StSsdLadderHitIter())); iter=jter;
00397 iter->SetDowIter((jter=new StSsdWaferHitIter ()));
00398 }
00399
00400 const TObject *StSsdHitIter::Reset(const TObject *cont)
00401 {
00402 const StSsdHitCollection *to = 0;
00403 if (cont) to = ((StEvent*)cont)->ssdHitCollection();
00404 return StHitIter::Reset(to);
00405 }
00406
00407 const TObject *StSsdHitIter::GetObject (int idx) const
00408 {
00409 return (const TObject*)((StSsdHitCollection*)fCont)->ladder(idx);
00410 }
00411
00412 int StSsdHitIter::GetSize () const
00413 {
00414 return ((StSsdHitCollection*)fCont)->numberOfLadders();
00415 }
00416
00417
00418 const TObject *StSsdLadderHitIter::GetObject (int idx) const
00419 {
00420 return (const TObject*)((StSsdLadderHitCollection*)fCont)->wafer(idx);
00421 }
00422
00423 int StSsdLadderHitIter::GetSize () const
00424 {
00425 return ((StSsdLadderHitCollection*)fCont)->numberOfWafers();
00426 }
00427
00428 const TObject *StSsdWaferHitIter::GetObject (int idx) const
00429 {
00430 return (const TObject*)((StSsdWaferHitCollection*)fCont)->hits().at(idx);
00431 }
00432
00433 int StSsdWaferHitIter::GetSize () const
00434 {
00435 return ((StSsdWaferHitCollection*)fCont)->hits().size();
00436 }
00437
00438
00439
00440
00441
00442
00443 class StFtpcHitIter : public StHitIter {
00444 public:
00445 StFtpcHitIter();
00446 virtual ~StFtpcHitIter(){;}
00447 virtual const TObject *Reset(const TObject *cont);
00448 virtual const TObject *GetObject (int idx) const;
00449 virtual int GetSize () const;
00450 StDetectorId DetectorId() const {return kFtpcEastId;}
00451 protected:
00452 };
00453
00454
00455 class StFtpcPlaneHitIter : public StHitIter {
00456 public:
00457 StFtpcPlaneHitIter(){;}
00458 virtual ~StFtpcPlaneHitIter(){;}
00459 virtual const TObject *GetObject (int idx) const;
00460 virtual int GetSize () const;
00461 protected:
00462 };
00463
00464 class StFtpcSectorHitIter : public StHitIter {
00465 public:
00466 StFtpcSectorHitIter(){;}
00467 virtual ~StFtpcSectorHitIter(){;}
00468 virtual const TObject *GetObject (int idx) const;
00469 virtual int GetSize () const;
00470 protected:
00471 };
00472
00473
00474 StFtpcHitIter::StFtpcHitIter()
00475 {
00476 StHitIter *obj=this,*hi;
00477 obj->SetDowIter((hi=new StFtpcPlaneHitIter())); obj = hi;
00478 obj->SetDowIter((hi=new StFtpcSectorHitIter())); obj = hi;
00479 }
00480
00481 const TObject *StFtpcHitIter::Reset(const TObject *cont)
00482 {
00483 const StFtpcHitCollection *to = 0;
00484 if (cont) to = ((StEvent*)cont)->ftpcHitCollection();
00485 return StHitIter::Reset(to);
00486 }
00487
00488
00489 int StFtpcHitIter::GetSize()const
00490 { return ((StFtpcHitCollection*)fCont)->numberOfPlanes();}
00491
00492
00493
00494 const TObject *StFtpcHitIter::GetObject (int idx) const
00495 {
00496 return ((StFtpcHitCollection*)fCont)->plane(idx);
00497 }
00498
00499 const TObject *StFtpcPlaneHitIter::GetObject (int idx) const
00500 {
00501 return ((StFtpcPlaneHitCollection*)fCont)->sector(idx);
00502 }
00503
00504 int StFtpcPlaneHitIter::GetSize () const
00505 {
00506 return ((StFtpcPlaneHitCollection*)fCont)->numberOfSectors();
00507 }
00508
00509 const TObject *StFtpcSectorHitIter::GetObject (int idx) const
00510 {
00511 return (const TObject*)((StFtpcSectorHitCollection*)fCont)->hits().at(idx);
00512 }
00513
00514 int StFtpcSectorHitIter::GetSize () const
00515 {
00516 return ((StFtpcSectorHitCollection*)fCont)->hits().size();
00517 }
00518
00519
00520
00521
00522
00523 class StRnDHitIter : public StHitIter {
00524 public:
00525 StRnDHitIter(StDetectorId id){fDetectorId=id;}
00526 virtual ~StRnDHitIter(){;}
00527 virtual const TObject *Reset(const TObject *cont);
00528 virtual const TObject *GetObject (int idx) const;
00529 virtual int GetSize () const;
00530 StDetectorId DetectorId() const {return fDetectorId;}
00531 protected:
00532 StDetectorId fDetectorId;
00533 };
00534
00535 const TObject *StRnDHitIter::Reset(const TObject *cont)
00536 {
00537 const StRnDHitCollection *to = 0;
00538 if (cont) to = ((StEvent*)cont)->rndHitCollection();
00539 return StHitIter::Reset(to);
00540 }
00541
00542 const TObject *StRnDHitIter::GetObject (int idx) const
00543 {
00544 return (const TObject*)((StRnDHitCollection*)fCont)->hits().at(idx);
00545 }
00546
00547 int StRnDHitIter::GetSize () const
00548 {
00549 return ((StRnDHitCollection*)fCont)->hits().size();
00550 }
00551
00552
00553
00554
00555 #define StTofHitCollection StTofCollection
00556 #define tofHitCollection tofCollection
00557
00558 class StTofHitIter : public StHitIter {
00559 public:
00560 StTofHitIter(){;}
00561 virtual ~StTofHitIter(){;}
00562 virtual const TObject *Reset(const TObject *cont);
00563 virtual const TObject *GetObject (int idx) const;
00564 virtual int GetSize () const;
00565 StDetectorId DetectorId() const {return kTofId;}
00566 public:
00567 protected:
00568 };
00569
00570 const TObject *StTofHitIter::Reset(const TObject *cont)
00571 {
00572 const StTofHitCollection *to = 0;
00573 if (cont) to = ((StEvent*)cont)->tofHitCollection();
00574 return StHitIter::Reset(to);
00575 }
00576
00577 const TObject *StTofHitIter::GetObject (int idx) const
00578 {
00579 return (const TObject*)((StTofHitCollection*)fCont)->tofHits().at(idx);
00580 }
00581
00582 int StTofHitIter::GetSize () const
00583 {
00584 return ((StTofHitCollection*)fCont)->tofHits().size();
00585 }
00586
00587
00588
00589
00590 int StEventHitIter::AddDetector(StDetectorId detId)
00591 {
00592 switch ((int)detId) {
00593
00594 case kTpcId: Add(new StTpcHitIter());break;
00595 case kSvtId: Add(new StSvtHitIter());break;
00596 case kSsdId: Add(new StSsdHitIter());break;
00597 case kFtpcWestId:;
00598 case kFtpcEastId:
00599 Add(new StFtpcHitIter());break;
00600 case kPxlId: case kIstId: case kFgtId: case kFmsId:
00601 Add(new StRnDHitIter(detId));break;
00602
00603 case kTofId: Add(new StTofHitIter()) ;break;
00604 case kEtrId: Add(new StEtrHitIter()) ;break;
00605
00606 default: printf("StEventHitIter::AddDetector: No iterator for detectorId=%d",(int)detId);
00607 assert(0 && "No iterator for detectorId");
00608 return 1;
00609 }
00610 return 0;
00611 }