MpdIts5spd.cxx 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. // -------------------------------------------------------------------------
  2. // ----- MpdIts5spd source file -----
  3. // ----- 13.12.2016 VK -----
  4. // -------------------------------------------------------------------------
  5. // Independant strip readout for each sector
  6. // Geometry: its_5spd.geo
  7. #include "MpdIts5spd.h"
  8. #include "MpdStsGeo.h"
  9. #include "MpdStsGeoPar.h"
  10. #include "MpdItsHit5spd.h"
  11. #include "MpdStsPoint.h"
  12. #include "FairGeoInterface.h"
  13. #include "FairGeoLoader.h"
  14. #include "FairGeoNode.h"
  15. #include "FairGeoRootBuilder.h"
  16. #include "FairRootManager.h"
  17. #include "MpdStack.h"
  18. #include "FairRuntimeDb.h"
  19. #include "TObjArray.h"
  20. #include "FairRun.h"
  21. #include "FairVolume.h"
  22. #include "TClonesArray.h"
  23. #include "TLorentzVector.h"
  24. #include "TParticle.h"
  25. #include "TVirtualMC.h"
  26. #include <iostream>
  27. //--------------------------------------------------------------------------
  28. MpdIts5spd::MpdIts5spd()
  29. : FairDetector("STS", kTRUE)
  30. {
  31. fStsCollection = new TClonesArray("MpdStsPoint");
  32. fPosIndex = 0;
  33. fVerboseLevel = 1;
  34. }
  35. //--------------------------------------------------------------------------
  36. MpdIts5spd::MpdIts5spd(const char* name, Bool_t active)
  37. : FairDetector(name, active)
  38. {
  39. fStsCollection = new TClonesArray("MpdStsPoint");
  40. fPosIndex = 0;
  41. fVerboseLevel = 1;
  42. }
  43. //--------------------------------------------------------------------------
  44. MpdIts5spd::~MpdIts5spd()
  45. {
  46. if(fStsCollection){ fStsCollection->Delete(); delete fStsCollection; }
  47. }
  48. //--------------------------------------------------------------------------
  49. Bool_t MpdIts5spd::ProcessHits(FairVolume* vol)
  50. {
  51. Int_t sector, layer, ladder;
  52. TString Volname;
  53. // Set parameters at entrance of volume. Reset ELoss.
  54. if (gMC->IsTrackEntering()) {
  55. fELoss = 0.;
  56. fTime = gMC->TrackTime() * 1.0e09;
  57. fLength = gMC->TrackLength();
  58. gMC->TrackPosition(fPos);
  59. gMC->TrackMomentum(fMom);
  60. //cout << gMC->GetStack()->GetCurrentTrackNumber() << " " << vol->getRealName() << endl;
  61. }
  62. // Sum energy loss for all steps in the active volume
  63. try {
  64. fELoss += gMC->Edep();
  65. }
  66. catch (...) {
  67. cout << "-E- MpdIts5spd::ProcessHits gMC->Edep() exception !!!" << ((UInt_t*)gMC) << endl;
  68. }
  69. // Create MpdStsPoint at exit of active volume
  70. if ( (gMC->IsTrackExiting() || gMC->IsTrackStop() || gMC->IsTrackDisappeared()) && fELoss > 0 ) {
  71. // Exiting volume or stopped track -> save point
  72. fTrackID = gMC->GetStack()->GetCurrentTrackNumber();
  73. Volname = vol->getRealName(); // EL
  74. //cout << fTrackID << " " << Volname << " " << gMC->CurrentVolPath() << endl;
  75. if (Volname.Contains("sector")) {
  76. // Sector geometry
  77. layer = Volname[12]-48; // Number of Layer
  78. // sectorType = Volname[11]-48; // Type of sector
  79. gMC->CurrentVolOffID(0,sector); // Copy Nr of sector
  80. gMC->CurrentVolOffID(1,ladder); // Copy Nr of ladder
  81. gMC->CurrentVolPath(); // path from cave to sts01sector
  82. fVolumeID = 0;
  83. fVolumeID |= (sector << MpdItsHit5spd::kSensorS); // # of sector on bit 0 - 6
  84. fVolumeID |= (ladder << MpdItsHit5spd::kLadderS); // # of ladder on bit 7 - 12
  85. fVolumeID |= (layer << MpdItsHit5spd::kLayerS); // # of layer on bit 13 - 15
  86. //**************************************************************************************
  87. /*
  88. cout << fTrackID << " " << Volname << " " << gMC->CurrentVolPath() << endl;
  89. cout << "Lay= " << layer << " Lad= " << ladder << " Sec= " << sector << " ID= " << fVolumeID << endl;
  90. */
  91. //*************************************************************************************
  92. }
  93. TVector3 vposIn = TVector3(fPos.X(), fPos.Y(), fPos.Z());
  94. TVector3 vmomIn = TVector3 (fMom.Px(), fMom.Py(), fMom.Pz());
  95. gMC->TrackPosition(fPos);
  96. TVector3 vposOut = TVector3(fPos.X(), fPos.Y(), fPos.Z());
  97. AddHit(fTrackID, fVolumeID, vposIn, vmomIn, vposOut, fTime, fLength, fELoss);
  98. ((MpdStack*)gMC->GetStack())->AddPoint(kSTS);
  99. ResetParameters();
  100. }
  101. return kTRUE;
  102. }
  103. //-------------------------------------------------------------------------------------------------------
  104. void MpdIts5spd::EndOfEvent()
  105. {
  106. if(fVerboseLevel) Print();
  107. fStsCollection->Delete();
  108. fPosIndex = 0;
  109. }
  110. //------------------------------------------------------------------------------------------------------
  111. void MpdIts5spd::Register(){ FairRootManager::Instance()->Register("StsPoint", "Sts", fStsCollection, kTRUE); }
  112. //-------------------------------------------------------------------------------------------------------
  113. TClonesArray* MpdIts5spd::GetCollection(Int_t iColl) const
  114. {
  115. if(iColl == 0) return fStsCollection;
  116. return NULL;
  117. }
  118. //-------------------------------------------------------------------------------------------------------
  119. void MpdIts5spd::Print() const
  120. {
  121. Int_t nHits = fStsCollection->GetEntriesFast();
  122. cout << "-I- MpdIts5spd: " << nHits << " points registered in this event." << endl;
  123. if(fVerboseLevel > 1)
  124. for(Int_t i=0; i<nHits; i++) (*fStsCollection)[i]->Print();
  125. }
  126. //-------------------------------------------------------------------------------------------------------
  127. void MpdIts5spd::Reset(){ fStsCollection->Delete(); ResetParameters(); }
  128. //-------------------------------------------------------------------------------------------------------
  129. void MpdIts5spd::CopyClones(TClonesArray* cl1, TClonesArray* cl2, Int_t offset)
  130. {
  131. Int_t nEntries = cl1->GetEntriesFast();
  132. cout << "-I- MpdIts5spd: " << nEntries << " entries to add." << endl;
  133. TClonesArray& clref = *cl2;
  134. MpdStsPoint* oldpoint = NULL;
  135. for(Int_t i=0; i<nEntries; i++)
  136. {
  137. oldpoint = (MpdStsPoint*) cl1->At(i);
  138. Int_t index = oldpoint->GetTrackID() + offset;
  139. oldpoint->SetTrackID(index);
  140. new (clref[fPosIndex]) MpdStsPoint(*oldpoint);
  141. fPosIndex++;
  142. }
  143. cout << "-I- MpdIts5spd: " << cl2->GetEntriesFast() << " merged entries." << endl;
  144. }
  145. //-------------------------------------------------------------------------------------------------------
  146. void MpdIts5spd::ConstructGeometry()
  147. {
  148. Int_t count=0;
  149. Int_t count_tot=0;
  150. FairGeoLoader* geoLoad = FairGeoLoader::Instance();
  151. FairGeoInterface* geoFace = geoLoad->getGeoInterface();
  152. MpdStsGeo* stsGeo = new MpdStsGeo();
  153. stsGeo->setGeomFile(GetGeometryFileName());
  154. geoFace->addGeoModule(stsGeo);
  155. Bool_t rc = geoFace->readSet(stsGeo);
  156. if(rc) stsGeo->create(geoLoad->getGeoBuilder());
  157. TList* volList = stsGeo->getListOfVolumes();
  158. // store geo parameter
  159. FairRun *fRun = FairRun::Instance();
  160. FairRuntimeDb *rtdb = FairRun::Instance()->GetRuntimeDb();
  161. MpdStsGeoPar* par =(MpdStsGeoPar*)(rtdb->getContainer("MpdStsGeoPar"));
  162. TObjArray *fSensNodes = par->GetGeoSensitiveNodes();
  163. TObjArray *fPassNodes = par->GetGeoPassiveNodes();
  164. FairGeoNode *node = NULL;
  165. FairGeoVolume *aVol = NULL;
  166. TListIter iter(volList);
  167. while((node = (FairGeoNode*)iter.Next()))
  168. {
  169. aVol = dynamic_cast<FairGeoVolume*> (node);
  170. if(node->isSensitive()){ fSensNodes->AddLast(aVol); count++; }
  171. else fPassNodes->AddLast(aVol);
  172. count_tot++;
  173. }
  174. par->setChanged();
  175. par->setInputVersion(fRun->GetRunId(), 1);
  176. ProcessNodes(volList);
  177. }
  178. //--------------------------------------------------------------------------------------------------------
  179. MpdStsPoint* MpdIts5spd::AddHit(Int_t trackID, Int_t detID, TVector3 posIn,
  180. TVector3 momIn, TVector3 posOut,
  181. Double_t time, Double_t length, Double_t eLoss)
  182. {
  183. TClonesArray& clref = *fStsCollection;
  184. Int_t size = clref.GetEntriesFast();
  185. return new(clref[size]) MpdStsPoint(trackID, detID, posIn, momIn,
  186. posOut, time, length, eLoss);
  187. }
  188. //--------------------------------------------------------------------------------------------------------
  189. ClassImp(MpdIts5spd)