1 //____________________________________________________________________
5 // Script that contains a class to get the media where a certain track
6 // was created. This is used for background studies.
8 // Use the script `Compile.C' to compile this class using ACLic.
11 #include <AliFMDHit.h>
12 #include <AliFMDInput.h>
19 #include <AliDetector.h>
21 #include <TGeoManager.h>
22 #include <TGeoVolume.h>
23 #include <TGeoMedium.h>
24 #include <TParticle.h>
27 @brief Media description
30 struct Media : public TNamed
35 Media(const char* name, const char* title)
36 : TNamed(name, title), fMeds(0)
38 fHist = new TH1D(Form("h%s",name), title, 120, -6, 6);
39 // fHist->SetFillStyle(3001);
40 fCount = new TNtuple(GetName(), GetTitle(),
41 "E:DET:RNG:SEC:STR:X:Y:Z:EDEP:PDG");
43 Media(const char* name, TArrayI* a)
44 : TNamed(name, "Media information"), fMeds(a->fN, a->fArray)
46 fHist = new TH1D(Form("h%s",name), GetTitle(), 120, -6, 6);
47 fHist->SetFillStyle(3001);
48 fHist->SetFillColor(fMeds.fN > 0 ? fMeds[0] : 0);
49 fCount = new TNtuple(GetName(), GetTitle(),
50 "E:DET:RNG:SEC:STR:X:Y:Z:EDEP:PDG");
51 std::cout << "Media list " << name << ":" << std::endl;
52 for (Int_t i = 0; i < fMeds.fN; i++) {
53 std::cout << " " << fMeds[i] << std::flush;
54 if (fMeds[i] == 0 && i > 0) break;
56 std::cout << std::endl;
58 Bool_t HasMedia(Int_t id)
60 if (fMeds.fN <= 0) return kFALSE;
61 for (Int_t i = 0; i < fMeds.fN; i++) {
62 if (fMeds[i] == id) return kTRUE;
63 if (fMeds[i] == 0 && i > 0) break;
67 void Fill(Int_t ev, AliFMDHit* hit)
71 x[1] = hit->Detector();
72 x[2] = Int_t(hit->Ring());
82 // r = TMath::Sqrt(hit->X() * hit->X() + hit->Y() * hit->Y());
83 // if(r!=0) Float_t wgt=1./(2. * 3.1415*r);
84 Double_t r = TMath::Sqrt(hit->X()*hit->X()+hit->Y()*hit->Y());
85 Double_t t = TMath::ATan2(r, hit->Z());
86 Double_t e = -TMath::Log(TMath::Tan(t/2));
92 //____________________________________________________________________
94 @brief Get media where a particle is produced
97 Root> gAlice->Init("$ALICE_ROOT/FMD/Config.C");
98 Root> .x $ALICE_ROOT/FMD/scriptsWriteMedArrays.C
103 Root> Compile("GetMedia.C")
109 class GetMedia : public AliFMDInputHits
121 //__________________________________________________________________
122 GetMedia(const char* modlist="FMD:ITS:BODY:ABSO:START:PIPE",
123 const char* output="media.root")
127 AddLoad(kKinematics);
129 fOutput = TFile::Open(output, "RECREATE");
130 fStack = new THStack("summed", "Summed hits");
131 fOther = AddMedia("other", "Unknown media");
132 fAll = AddMedia("All", "All media");
133 fPrim = AddMedia("Primary", "Primary particles");
137 fAll->fHist->SetFillColor(0);
138 fAll->fHist->SetFillStyle(3004);
139 fPrim->fHist->SetFillColor(1);
140 fPrim->fHist->SetFillStyle(3001);
141 fStack->Add(fPrim->fHist);
143 //__________________________________________________________________
144 Media* AddMedia(const char* name, const char* title, TArrayI* a=0)
147 if (!a) media = new Media(name, title);
148 else media = new Media(name, a);
151 fStack->Add(media->fHist);
155 //__________________________________________________________________
156 Media* FindMedia(Int_t med)
158 for (Int_t i = 0; i < fMedia.GetEntries(); i++) {
159 Media* media = static_cast<Media*>(fMedia.At(i));
160 if (!media) continue;
161 if (media->HasMedia(med)) return media;
165 //__________________________________________________________________
168 Bool_t ret = AliFMDInputHits::Init();
170 Error("Init", "No geometry defined - make sure you have that");
174 Error("Init", "gAlice not defined");
179 TFile* file = TFile::Open("medid.root", "READ");
181 Error("Init", "couldn't open medid.root");
185 while ((colon = fModList.Index(":", now)) >= 0) {
186 TString d(fModList(now, colon-now));
189 file->GetObject(d.Data(), a);
191 Warning("Init", "No medium array for %s", d.Data());
194 AddMedia(d.Data(),0, a);
196 if (now < fModList.Length()) {
197 colon = fModList.Length();
198 TString d(fModList(now, colon-now));
200 file->GetObject(d.Data(), a);
202 Warning("Init", "No medium array for %s", d.Data());
204 AddMedia(d.Data(),0, a);
207 if (fMedia.GetEntries() <= 0) return kFALSE;
210 //__________________________________________________________________
211 /** Begining of event
212 @param ev Event number
213 @return @c false on error */
214 Bool_t Begin(Int_t ev)
217 return AliFMDInputHits::Begin(ev);
219 //__________________________________________________________________
220 Bool_t ProcessHit(AliFMDHit* hit, TParticle* track)
222 if (!hit || !track) {
223 std::cout << "No hit or track (hit: " << hit << ", track: "
224 << track << ")" << std::endl;
227 fAll->Fill(fEv, hit);
228 if (track->IsPrimary()) {
229 fPrim->Fill(fEv, hit);
233 // Get production vertex
234 Double_t vx = track->Vx();
235 Double_t vy = track->Vy();
236 Double_t vz = track->Vz();
238 TGeoNode* prodNode = gGeoManager->FindNode(vx,vy,vz);
240 Warning("ProcessHit", "didn't find a node for production vertex");
243 //Info("ProcessHit", "Production vertex in node %s", prodNode->GetName());
246 TGeoVolume* prodVol = prodNode->GetVolume();
248 Warning("ProcessHit", "didn't find a volume for production vertex");
251 //Info("ProcessHit", "Production vertex in volume %s",prodVol->GetName());
254 TGeoMedium* prodMed = prodVol->GetMedium();
256 Warning("ProcessHit", "didn't find a medium for production vertex");
259 // Info("ProcessHit", "Production vertex in medium %s %d",
260 // prodMed->GetName(), prodMed->GetId());
263 Media* media = FindMedia(prodMed->GetId());
265 Warning("ProcessHit", "Media not found %s (%d)",
266 prodMed->GetName(), prodMed->GetId());
269 // Info("ProcessHit", "Adding to %s", media->GetName());
270 media->Fill(fEv, hit);
273 //__________________________________________________________________
287 //____________________________________________________________________