1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
19 ///////////////////////////////////////////////
20 // Manager and hits classes for set:MUON //
21 ////////////////////////////////////////////////
23 #include "Riostream.h"
28 #include <TDirectory.h>
30 #include <TGeometry.h>
34 #include <TObjArray.h>
36 #include <TObjectTable.h>
38 #include <TParticle.h>
41 #include <TRotMatrix.h>
46 #include <TVirtualMC.h>
49 #include "AliHeader.h"
50 #include "AliHitMap.h"
51 #include "AliLoader.h"
53 #include "AliESDMuonTrack.h"
54 #include "AliMUONLoader.h"
56 #include "AliMUONTriggerTrack.h"
57 #include "AliMUONEventReconstructor.h"
58 #include "AliMUONTrack.h"
59 #include "AliMUONTrackParam.h"
60 #include "AliMUONChamberTrigger.h"
61 #include "AliMUONClusterFinderVS.h"
62 #include "AliMUONClusterInput.h"
63 #include "AliMUONConstants.h"
64 #include "AliMUONDigit.h"
65 #include "AliMUONGlobalTrigger.h"
66 #include "AliMUONHit.h"
67 #include "AliMUONHitMapA1.h"
68 #include "AliMUONLocalTrigger.h"
69 #include "AliMUONMerger.h"
70 #include "AliMUONPadHit.h"
71 #include "AliMUONRawCluster.h"
72 #include "AliMUONTransientDigit.h"
73 #include "AliMUONTriggerCircuit.h"
74 #include "AliMUONTriggerDecision.h"
75 #include "AliMUONVGeometryBuilder.h"
77 #include "AliMUONDigitizerv1.h"
80 // Defaults parameters for Z positions of chambers
81 // taken from values for "stations" in AliMUON::AliMUON
82 // const Float_t zch[7]={528, 690., 975., 1249., 1449., 1610, 1710.};
83 // and from array "dstation" in AliMUONv1::CreateGeometry
84 // Float_t dstation[5]={20., 20., 20, 20., 20.};
85 // for tracking chambers,
86 // according to (Z1 = zch - dstation) and (Z2 = zch + dstation)
87 // for the first and second chambers in the station, respectively,
88 // and from "DTPLANES" in AliMUONv1::CreateGeometry
89 // const Float_t DTPLANES = 15.;
90 // for trigger chambers,
91 // according to (Z1 = zch) and (Z2 = zch + DTPLANES)
92 // for the first and second chambers in the station, respectively
95 //__________________________________________________________________
98 // Default Constructor
104 fGeometryBuilders = 0;
105 fTriggerCircuits = 0;
114 //__________________________________________________________________
115 AliMUON::AliMUON(const char *name, const char *title)
116 : AliDetector(name,title)
120 <img src="gif/alimuon.gif">
127 fNCh = AliMUONConstants::NCh();
128 fNTrackingCh = AliMUONConstants::NTrackingCh();
130 SetMarkerColor(kRed);//
132 // Creating List of Chambers
134 fChambers = new TObjArray(AliMUONConstants::NCh());
135 fGeometryBuilders = new TObjArray(AliMUONConstants::NCh());
137 // Loop over stations
138 for (Int_t st = 0; st < AliMUONConstants::NCh() / 2; st++) {
139 // Loop over 2 chambers in the station
140 for (Int_t stCH = 0; stCH < 2; stCH++) {
143 // Default Parameters for Muon Tracking Stations
145 if (ch < AliMUONConstants::NTrackingCh()) {
146 fChambers->AddAt(new AliMUONChamber(ch),ch);
148 fChambers->AddAt(new AliMUONChamberTrigger(ch),ch);
150 AliMUONChamber* chamber = (AliMUONChamber*) fChambers->At(ch);
151 //chamber->SetGid(0);
152 // Default values for Z of chambers
153 chamber->SetZ(AliMUONConstants::DefaultChamberZ(ch));
155 chamber->InitGeo(AliMUONConstants::DefaultChamberZ(ch));
156 // Set chamber inner and outer radius to default
157 chamber->SetRInner(AliMUONConstants::Dmin(st)/2);
158 chamber->SetROuter(AliMUONConstants::Dmax(st)/2);
160 } // Chamber stCH (0, 1) in
161 } // Station st (0...)
163 // Negatives values are ignored by geant3 CONS200 in the calculation of the tracking parameters
176 // cp new design of AliMUONTriggerDecision
177 fTriggerCircuits = new TObjArray(AliMUONConstants::NTriggerCircuit());
178 for (Int_t circ=0; circ<AliMUONConstants::NTriggerCircuit(); circ++) {
179 fTriggerCircuits->AddAt(new AliMUONTriggerCircuit(),circ);
183 //____________________________________________________________________
184 AliMUON::AliMUON(const AliMUON& rMUON):AliDetector(rMUON)
186 // Dummy copy constructor
190 //____________________________________________________________________
194 if(fDebug) printf("%s: Calling AliMUON destructor !!!\n",ClassName());
196 if (fMerger) delete fMerger;
198 if (fGeometryBuilders){
199 fGeometryBuilders->Delete();
200 delete fGeometryBuilders;
203 //_____________________________________________________________________________
204 void AliMUON::AddGeometryBuilder(AliMUONVGeometryBuilder* geomBuilder)
206 // Adds the geometry builder to the list
209 fGeometryBuilders->Add(geomBuilder);
211 //____________________________________________________________________
212 void AliMUON::BuildGeometry()
214 // Geometry for event display
215 for (Int_t i=0; i<7; i++) {
216 for (Int_t j=0; j<2; j++) {
218 this->Chamber(id-1).SegmentationModel(1)->Draw("eventdisplay");
222 //___________________________________________________________________
223 Int_t AliMUON::DistancetoPrimitive(Int_t , Int_t )
227 //__________________________________________________________________
228 void AliMUON::SetTreeAddress()
230 GetMUONData()->SetLoader(fLoader);
231 GetMUONData()->SetTreeAddress("H,D,RC");
232 fHits = GetMUONData()->Hits(); // Added by Ivana to use the methods FisrtHit, NextHit of AliDetector
235 //____________________________________________________________________
236 void AliMUON::SetPadSize(Int_t id, Int_t isec, Float_t p1, Float_t p2)
238 // Set the pad size for chamber id and cathode isec
240 ((AliMUONChamber*) fChambers->At(i)) ->SetPadSize(isec,p1,p2);
241 ((AliMUONChamber*) fChambers->At(i+1))->SetPadSize(isec,p1,p2);
244 //___________________________________________
245 void AliMUON::SetChambersZ(const Float_t *Z)
247 // Set Z values for all chambers (tracking and trigger)
248 // from the array pointed to by "Z"
249 for (Int_t ch = 0; ch < AliMUONConstants::NCh(); ch++)
250 ((AliMUONChamber*) fChambers->At(ch))->SetZ(Z[ch]);
253 //_________________________________________________________________
254 void AliMUON::SetChambersZToDefault()
256 // Set Z values for all chambers (tracking and trigger)
258 SetChambersZ(AliMUONConstants::DefaultChamberZ());
261 //_________________________________________________________________
262 void AliMUON::SetChargeSlope(Int_t id, Float_t p1)
264 // Set the inverse charge slope for chamber id
265 Int_t i=2*(id-1); //PH ((AliMUONChamber*) (*fChambers)[i])->SetSigmaIntegration(p1);
266 //PH ((AliMUONChamber*) (*fChambers)[i+1])->SetSigmaIntegration(p1);
267 ((AliMUONChamber*) fChambers->At(i))->SetChargeSlope(p1);
268 ((AliMUONChamber*) fChambers->At(i+1))->SetChargeSlope(p1);
270 //__________________________________________________________________
271 void AliMUON::SetChargeSpread(Int_t id, Float_t p1, Float_t p2)
273 // Set sigma of charge spread for chamber id
275 ((AliMUONChamber*) fChambers->At(i))->SetChargeSpread(p1,p2);
276 ((AliMUONChamber*) fChambers->At(i+1))->SetChargeSpread(p1,p2);
278 //___________________________________________________________________
279 void AliMUON::SetSigmaIntegration(Int_t id, Float_t p1)
281 // Set integration limits for charge spread
283 ((AliMUONChamber*) fChambers->At(i))->SetSigmaIntegration(p1);
284 ((AliMUONChamber*) fChambers->At(i+1))->SetSigmaIntegration(p1);
287 //__________________________________________________________________
288 void AliMUON::SetMaxAdc(Int_t id, Int_t p1)
290 // Set maximum number for ADCcounts (saturation)
292 ((AliMUONChamber*) fChambers->At(i))->SetMaxAdc(p1);
293 ((AliMUONChamber*) fChambers->At(i+1))->SetMaxAdc(p1);
295 //__________________________________________________________________
296 void AliMUON::SetMaxStepGas(Float_t p1)
298 // Set stepsize in gas
301 //__________________________________________________________________
302 void AliMUON::SetMaxStepAlu(Float_t p1)
304 // Set step size in Alu
307 //__________________________________________________________________
308 void AliMUON::SetMaxDestepGas(Float_t p1)
310 // Set maximum step size in Gas
313 //__________________________________________________________________
314 void AliMUON::SetMaxDestepAlu(Float_t p1)
316 // Set maximum step size in Alu
319 //___________________________________________________________________
320 void AliMUON::SetAcceptance(Bool_t acc, Float_t angmin, Float_t angmax)
322 // Set acceptance cuts
324 fAccMin=angmin*TMath::Pi()/180;
325 fAccMax=angmax*TMath::Pi()/180;
328 for (Int_t st = 0; st < AliMUONConstants::NCh() / 2; st++) {
329 // Loop over 2 chambers in the station
330 for (Int_t stCH = 0; stCH < 2; stCH++) {
332 // Set chamber inner and outer radius according to acceptance cuts
333 Chamber(ch).SetRInner(TMath::Abs(AliMUONConstants::DefaultChamberZ(ch)*TMath::Tan(fAccMin)));
334 Chamber(ch).SetROuter(TMath::Abs(AliMUONConstants::DefaultChamberZ(ch)*TMath::Tan(fAccMax)));
340 //____________________________________________________________________
341 Float_t AliMUON::GetMaxStepGas() const
343 // Return stepsize in gas
348 //____________________________________________________________________
349 Float_t AliMUON::GetMaxStepAlu() const
351 // Return step size in Alu
356 //____________________________________________________________________
357 Float_t AliMUON::GetMaxDestepGas() const
359 // Return maximum step size in Gas
361 return fMaxDestepGas;
364 //____________________________________________________________________
365 Float_t AliMUON::GetMaxDestepAlu() const
367 // Return maximum step size in Gas
369 return fMaxDestepAlu;
372 //____________________________________________________________________
373 void AliMUON::SetSegmentationModel(Int_t id, Int_t isec, AliSegmentation *segmentation)
375 // Set the segmentation for chamber id cathode isec
376 ((AliMUONChamber*) fChambers->At(id))->SetSegmentationModel(isec, segmentation);
379 //____________________________________________________________________
380 void AliMUON::SetResponseModel(Int_t id, AliMUONResponse *response)
382 // Set the response for chamber id
383 ((AliMUONChamber*) fChambers->At(id))->SetResponseModel(response);
385 //____________________________________________________________________
386 void AliMUON::SetReconstructionModel(Int_t id, AliMUONClusterFinderVS *reconst)
388 // Set ClusterFinder for chamber id
389 ((AliMUONChamber*) fChambers->At(id))->SetReconstructionModel(reconst);
391 //____________________________________________________________________
392 void AliMUON::SetNsec(Int_t id, Int_t nsec)
394 // Set number of segmented cathods for chamber id
395 ((AliMUONChamber*) fChambers->At(id))->SetNsec(nsec);
397 //____________________________________________________________________
398 AliDigitizer* AliMUON::CreateDigitizer(AliRunDigitizer* manager) const
400 return new AliMUONDigitizerv1(manager);
402 //_____________________________________________________________________
403 void AliMUON::SDigits2Digits()
409 if (gAlice->GetDebug()>0) {
410 cerr<<"AliMUON::SDigits2Digits: create default AliMUONMerger "<<endl;
411 cerr<<" no merging, just digitization of 1 event will be done"<<endl;
413 fMerger = new AliMUONMerger();
418 // sprintf(hname,"TreeD%d",fLoader->GetHeader()->GetEvent());
419 fLoader->TreeD()->Write(hname,TObject::kOverwrite);
420 fLoader->TreeD()->Reset();
423 //_______________________________________________________________________
424 AliLoader* AliMUON::MakeLoader(const char* topfoldername)
426 //builds standard getter (AliLoader type)
427 //if detector wants to use castomized getter, it must overload this method
431 "Creating standard getter for detector %s. Top folder is %s.",
432 GetName(),topfoldername);
434 fLoader = new AliLoader(GetName(),topfoldername);
435 fMUONData = new AliMUONData(fLoader,GetName(),GetName());
436 fMUONData->SetSplitLevel(fSplitLevel);
440 //_______________________________________________________________________
441 void AliMUON::Trigger(Int_t nev){
442 // call the Trigger Algorithm and fill TreeR
444 Int_t singlePlus[3] = {0,0,0};
445 Int_t singleMinus[3] = {0,0,0};
446 Int_t singleUndef[3] = {0,0,0};
447 Int_t pairUnlike[3] = {0,0,0};
448 Int_t pairLike[3] = {0,0,0};
451 AliMUONTriggerDecision* decision= new AliMUONTriggerDecision(1);
453 decision->GetGlobalTrigger(singlePlus, singleMinus, singleUndef,
454 pairUnlike, pairLike);
456 // add a local trigger in the list
457 GetMUONData()->AddGlobalTrigger(singlePlus, singleMinus, singleUndef, pairUnlike, pairLike);
460 for (Int_t icirc=0; icirc<AliMUONConstants::NTriggerCircuit(); icirc++) {
461 if(decision->GetITrigger(icirc)==1) {
462 Int_t localtr[7]={0,0,0,0,0,0,0};
463 Int_t loLpt[2]={0,0}; Int_t loHpt[2]={0,0}; Int_t loApt[2]={0,0};
464 decision->GetLutOutput(icirc, loLpt, loHpt, loApt);
466 localtr[1] = decision->GetStripX11(icirc);
467 localtr[2] = decision->GetDev(icirc);
468 localtr[3] = decision->GetStripY11(icirc);
469 for (i=0; i<2; i++) { // convert the Lut output in 1 digit
470 localtr[4] = localtr[4]+Int_t(loLpt[i]*TMath::Power(2,i));
471 localtr[5] = localtr[5]+Int_t(loHpt[i]*TMath::Power(2,i));
472 localtr[6] = localtr[6]+Int_t(loApt[i]*TMath::Power(2,i));
474 GetMUONData()->AddLocalTrigger(localtr); // add a local trigger in the list
480 // fLoader->TreeR()->Fill();
481 GetMUONData()->Fill("GLT"); //Filling Global and Local Trigger GLT
483 // sprintf(hname,"TreeR%d",nev);
484 // fLoader->TreeR()->Write(hname,TObject::kOverwrite);
485 // fLoader->TreeR()->Reset();
486 fLoader->WriteRecPoints("OVERWRITE");
488 printf("\n End of trigger for event %d", nev);
491 //____________________________________________________________________
492 void AliMUON::Digits2Reco()
495 Int_t nev = gAlice->GetHeader()->GetEvent();
496 GetMUONData()->Fill("RC"); //Filling Reconstructed Cluster
497 fLoader->WriteRecPoints("OVERWRITE");
498 GetMUONData()->ResetRawClusters();
499 Info("Digits2Reco","End of cluster finding for event %d", nev);
501 //____________________________________________________________________
502 void AliMUON::FindClusters()
505 // Perform cluster finding
507 TClonesArray *dig1, *dig2;
509 dig1 = new TClonesArray("AliMUONDigit",1000);
510 dig2 = new TClonesArray("AliMUONDigit",1000);
512 // Loop on chambers and on cathode planes
515 TClonesArray * muonDigits;
517 for (Int_t ich = 0; ich < 10; ich++) {
518 //PH AliMUONChamber* iChamber = (AliMUONChamber*) (*fChambers)[ich];
519 AliMUONChamber* iChamber = (AliMUONChamber*) fChambers->At(ich);
520 AliMUONClusterFinderVS* rec = iChamber->ReconstructionModel();
523 GetMUONData()->GetCathode(0);
525 muonDigits = GetMUONData()->Digits(ich);
526 ndig=muonDigits->GetEntriesFast();
527 printf("\n 1 Found %d digits in %p chamber %d", ndig, muonDigits,ich);
528 TClonesArray &lhits1 = *dig1;
530 for (k = 0; k < ndig; k++) {
531 digit = (AliMUONDigit*) muonDigits->UncheckedAt(k);
532 if (rec->TestTrack(digit->Track(0)))
533 new(lhits1[n++]) AliMUONDigit(*digit);
535 GetMUONData()->ResetDigits();
536 GetMUONData()->GetCathode(1);
537 muonDigits = GetMUONData()->Digits(ich);
538 ndig=muonDigits->GetEntriesFast();
539 printf("\n 2 Found %d digits in %p %d", ndig, muonDigits, ich);
540 TClonesArray &lhits2 = *dig2;
543 for (k=0; k<ndig; k++) {
544 digit= (AliMUONDigit*) muonDigits->UncheckedAt(k);
545 if (rec->TestTrack(digit->Track(0)))
546 new(lhits2[n++]) AliMUONDigit(*digit);
550 AliMUONClusterInput::Instance()->SetDigits(ich, dig1, dig2);
551 rec->FindRawClusters();
559 //______________________________________________________________________
561 void AliMUON::Streamer(TBuffer &R__b)_
563 // Stream an object of class AliMUON.
564 AliMUONChamber *iChamber;
565 AliMUONTriggerCircuit *iTriggerCircuit;
566 AliSegmentation *segmentation;
567 AliMUONResponse *response;
568 TClonesArray *digitsaddress;
569 TClonesArray *rawcladdress;
571 if (R__b.IsReading()) {
572 Version_t R__v = R__b.ReadVersion(); if (R__v) { }
573 AliDetector::Streamer(R__b);
575 R__b >> fPadHits; // diff
576 R__b >> fNLocalTrigger;
577 R__b >> fLocalTrigger;
578 R__b >> fNGlobalTrigger;
579 R__b >> fGlobalTrigger;
581 R__b >> fRawClusters;
582 R__b.ReadArray(fNdch);
583 R__b.ReadArray(fNrawch);
588 R__b >> fTriggerCircuits;
589 for (i =0; i<AliMUONConstants::NTriggerCircuit(); i++) {
590 iTriggerCircuit=(AliMUONTriggerCircuit*) (*fTriggerCircuits)[i];
591 iTriggerCircuit->Streamer(R__b);
593 // Stream chamber related information
594 for (i =0; i<AliMUONConstants::NCh(); i++) {
595 iChamber=(AliMUONChamber*) (*fChambers)[i];
596 iChamber->Streamer(R__b);
597 if (iChamber->Nsec()==1) {
598 segmentation=iChamber->SegmentationModel(1);
600 segmentation->Streamer(R__b);
602 segmentation=iChamber->SegmentationModel(1);
604 segmentation->Streamer(R__b);
606 segmentation=iChamber->SegmentationModel(2);
607 segmentation->Streamer(R__b);
609 response=iChamber->ResponseModel();
611 response->Streamer(R__b);
612 digitsaddress=(TClonesArray*) (*fDchambers)[i];
613 digitsaddress->Streamer(R__b);
614 if (i < AliMUONConstants::NTrackingCh()) {
615 rawcladdress=(TClonesArray*) (*fRawClusters)[i];
616 rawcladdress->Streamer(R__b);
621 R__b.WriteVersion(AliMUON::IsA());
622 AliDetector::Streamer(R__b);
624 R__b << fPadHits; // diff
625 R__b << fNLocalTrigger;
626 R__b << fLocalTrigger;
627 R__b << fNGlobalTrigger;
628 R__b << fGlobalTrigger;
630 R__b << fRawClusters;
631 R__b.WriteArray(fNdch, AliMUONConstants::NCh());
632 R__b.WriteArray(fNrawch, AliMUONConstants::NTrackingCh());
639 R__b << fTriggerCircuits;
640 for (i =0; i<AliMUONConstants::NTriggerCircuit(); i++) {
641 iTriggerCircuit=(AliMUONTriggerCircuit*) (*fTriggerCircuits)[i];
642 iTriggerCircuit->Streamer(R__b);
644 for (i =0; i<AliMUONConstants::NCh(); i++) {
645 iChamber=(AliMUONChamber*) (*fChambers)[i];
646 iChamber->Streamer(R__b);
647 if (iChamber->Nsec()==1) {
648 segmentation=iChamber->SegmentationModel(1);
650 segmentation->Streamer(R__b);
652 segmentation=iChamber->SegmentationModel(1);
654 segmentation->Streamer(R__b);
655 segmentation=iChamber->SegmentationModel(2);
657 segmentation->Streamer(R__b);
659 response=iChamber->ResponseModel();
661 response->Streamer(R__b);
662 digitsaddress=(TClonesArray*) (*fDchambers)[i];
663 digitsaddress->Streamer(R__b);
664 if (i < AliMUONConstants::NTrackingCh()) {
665 rawcladdress=(TClonesArray*) (*fRawClusters)[i];
666 rawcladdress->Streamer(R__b);
672 //_______________________________________________________________________
673 AliMUONPadHit* AliMUON::FirstPad(AliMUONHit* hit, TClonesArray *clusters)
676 // Initialise the pad iterator
677 // Return the address of the first padhit for hit
678 TClonesArray *theClusters = clusters;
679 Int_t nclust = theClusters->GetEntriesFast();
680 if (nclust && hit->PHlast() > 0) {
681 AliMUON::fMaxIterPad=hit->PHlast();
682 AliMUON::fCurIterPad=hit->PHfirst();
683 return (AliMUONPadHit*) clusters->UncheckedAt(AliMUON::fCurIterPad-1);
688 //_______________________________________________________________________
689 AliMUONPadHit* AliMUON::NextPad(TClonesArray *clusters)
692 // Get next pad (in iterator)
694 AliMUON::fCurIterPad++;
695 if (AliMUON::fCurIterPad <= AliMUON::fMaxIterPad) {
696 return (AliMUONPadHit*) clusters->UncheckedAt(AliMUON::fCurIterPad-1);
701 //_______________________________________________________________________
703 AliMUONRawCluster *AliMUON::RawCluster(Int_t ichamber, Int_t icathod, Int_t icluster)
706 // Return rawcluster (icluster) for chamber ichamber and cathode icathod
708 TClonesArray *muonRawCluster = GetMUONData()->RawClusters(ichamber);
710 TTree *treeR = fLoader->TreeR();
711 Int_t nent=(Int_t)treeR->GetEntries();
712 treeR->GetEvent(nent-2+icathod-1);
713 //treeR->GetEvent(icathod);
714 //Int_t nrawcl = (Int_t)muonRawCluster->GetEntriesFast();
716 AliMUONRawCluster * mRaw = (AliMUONRawCluster*)muonRawCluster->UncheckedAt(icluster);
717 //printf("RawCluster _ nent nrawcl icluster mRaw %d %d %d%p\n",nent,nrawcl,icluster,mRaw);
721 //________________________________________________________________________
722 void AliMUON::SetMerger(AliMUONMerger* merger)
724 // Set pointer to merger
727 //________________________________________________________________________
728 AliMUONMerger* AliMUON::Merger()
730 // Return pointer to merger
733 //________________________________________________________________________
734 AliMUON& AliMUON::operator = (const AliMUON& /*rhs*/)
740 //________________________________________________________________________
741 void AliMUON::Reconstruct() const
743 // reconstruct clusters
745 AliLoader* loader = GetLoader();
746 AliRunLoader* runLoader = loader->GetRunLoader();
747 Int_t nEvents = runLoader->GetNumberOfEvents();
749 for (Int_t i = 0; i < 10; i++) {
750 AliMUONClusterFinderVS *RecModel = new AliMUONClusterFinderVS();
751 RecModel->SetGhostChi2Cut(10);
752 const_cast<AliMUON*>(this)->SetReconstructionModel(i,RecModel);
755 AliMUONEventReconstructor* reco = new AliMUONEventReconstructor();
757 loader->LoadRecPoints("RECREATE");
758 loader->LoadTracks("RECREATE");
759 loader->LoadDigits("READ");
763 for(Int_t ievent = 0; ievent < nEvents; ievent++) {
764 printf("event %d\n",ievent);
765 runLoader->GetEvent(ievent);
767 //---------------------------- digit2Reco & Trigger ---------------------
768 if (!loader->TreeR()) loader->MakeRecPointsContainer();
771 fMUONData->MakeBranch("RC");
772 fMUONData->SetTreeAddress("D,RC");
773 const_cast<AliMUON*>(this)->Digits2Reco();
776 fMUONData->MakeBranch("GLT");
777 fMUONData->SetTreeAddress("D,GLT");
778 const_cast<AliMUON*>(this)->Trigger(ievent);
780 //---------------------------- Track & TriggerTrack ---------------------
781 if (!loader->TreeT()) loader->MakeTracksContainer();
783 fMUONData->MakeBranch("RT"); //track
784 fMUONData->SetTreeAddress("RT");
785 reco->EventReconstruct();
786 for(Int_t i=0; i<reco->GetNRecTracks(); i++) {
787 AliMUONTrack * track = (AliMUONTrack*) reco->GetRecTracksPtr()->At(i);
788 fMUONData->AddRecTrack(*track);
790 fMUONData->Fill("RT");
792 fMUONData->MakeBranch("RL"); //trigger track
793 fMUONData->SetTreeAddress("RL");
794 reco->EventReconstructTrigger();
795 for(Int_t i=0; i<reco->GetNRecTriggerTracks(); i++) {
796 AliMUONTriggerTrack * triggertrack = (AliMUONTriggerTrack*) reco->GetRecTriggerTracksPtr()->At(i);
797 fMUONData->AddRecTriggerTrack(*triggertrack);
799 fMUONData->Fill("RL");
801 loader->WriteTracks("OVERWRITE");
803 //--------------------------- Resetting branches -----------------------
804 fMUONData->ResetDigits();
805 fMUONData->ResetRawClusters();
806 fMUONData->ResetTrigger();
807 fMUONData->ResetRecTracks();
808 fMUONData->ResetRecTriggerTracks();
810 loader->UnloadDigits();
811 loader->UnloadRecPoints();
812 loader->UnloadTracks();
814 //________________________________________________________________________
815 void AliMUON::FillESD(AliESD* event) const
818 TClonesArray * recTracksArray;
820 //YS AliLoader* loader = GetLoader();
821 AliRunLoader* runLoader = fLoader->GetRunLoader(); //YS loader->GetRunLoader();
822 fLoader->LoadTracks("READ"); //YS
831 Double_t bendingSlope, nonBendingSlope, fInverseBendingMomentum;
832 Double_t fXRec, fYRec, fZRec;
834 Float_t x11, y11, thetaX,thetaY ;
836 //YS Int_t nEvents = runLoader->GetNumberOfEvents();
838 // setting pointer for tracks, triggertracks& trackparam at vertex
839 AliMUONTrack * rectrack;
840 AliMUONTriggerTrack * rectriggertrack;
841 AliMUONTrackParam *trackParam;
843 ievent = runLoader->GetEventNumber() ; //YS
844 //YS for (ievent = 0; ievent < nEvents; ievent++) {
845 runLoader->GetEvent(ievent);
847 // setting ESD MUON class
848 AliESDMuonTrack* ESDTrack = new AliESDMuonTrack() ;
850 // -------------------- tracks-------------
851 fMUONData->SetTreeAddress("RT");
852 fMUONData->GetRecTracks();
853 recTracksArray = fMUONData->RecTracks();
855 nrectracks = (Int_t) recTracksArray->GetEntriesFast(); //
857 // printf(">>> Event %d Number of Recconstructed tracks %d \n",ievent, nrectracks);
860 for (Int_t irectracks = 0; irectracks < nrectracks; irectracks++) {
862 rectrack = (AliMUONTrack*) recTracksArray->At(irectracks);
864 trackParam = rectrack->GetTrackParamAtVertex();
866 bendingSlope = trackParam->GetBendingSlope();
867 nonBendingSlope = trackParam->GetNonBendingSlope();
868 fInverseBendingMomentum = trackParam->GetInverseBendingMomentum();
869 fXRec = trackParam->GetNonBendingCoor();
870 fYRec = trackParam->GetBendingCoor();
871 fZRec = trackParam->GetZ();
873 ntrackhits = rectrack->GetNTrackHits();
874 fitfmin = rectrack->GetFitFMin();
876 // setting data member of ESD MUON
877 ESDTrack->SetInverseBendingMomentum(fInverseBendingMomentum);
878 ESDTrack->SetThetaX(TMath::ATan(nonBendingSlope));
879 ESDTrack->SetThetaY(TMath::ATan(bendingSlope));
880 ESDTrack->SetZ(fZRec);
881 ESDTrack->SetBendingCoor(fYRec);
882 ESDTrack->SetNonBendingCoor(fXRec);
883 ESDTrack->SetChi2(fitfmin);
884 ESDTrack->SetNHit(ntrackhits);
887 // // -------------------- trigger tracks-------------
888 fMUONData->SetTreeAddress("RL");
889 fMUONData->GetRecTriggerTracks();
890 recTracksArray = fMUONData->RecTriggerTracks();
892 Int_t ntrectracks = (Int_t) recTracksArray->GetEntriesFast(); //YS
894 // printf(">>> Event %d Number of Recconstructed tracks %d \n",ievent, nrectracks);
896 // read trigger track infos
897 for (Int_t irectracks = 0; irectracks < ntrectracks; irectracks++) {
899 rectriggertrack = (AliMUONTriggerTrack*) recTracksArray->At(irectracks);
901 x11 = rectriggertrack->GetY11();
902 y11 = rectriggertrack->GetY11();
903 thetaX = rectriggertrack->GetThetax();
904 thetaY = rectriggertrack->GetThetay();
906 // setting data member of ESD MUON trigger
907 ESDTrack->SetThetaX11(thetaX);
908 ESDTrack->SetThetaY11(thetaY);
909 ESDTrack->SetX11(x11);
910 ESDTrack->SetY11(y11);
913 // storing ESD MUON Track into ESD Event & reset muondata
914 if (ntrectracks+ntrectracks != 0) //YS
915 event->AddMuonTrack(ESDTrack);
916 fMUONData->ResetRecTracks();
917 fMUONData->ResetRecTriggerTracks();
919 //YS } // end loop on event
920 fLoader->UnloadTracks(); //YS