]> git.uio.no Git - u/mrichter/AliRoot.git/blame_incremental - MUON/AliMUON.cxx
Loading libraries needed for reading & decoding rawdata
[u/mrichter/AliRoot.git] / MUON / AliMUON.cxx
... / ...
CommitLineData
1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
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 **************************************************************************/
15
16/* $Id$ */
17
18// ------------------
19// Class AliMUON
20// ------------------
21// AliDetector class for MUON subsystem
22// providing simulation data management
23
24#include "Riostream.h"
25
26#include <AliPDG.h>
27#include <TBRIK.h>
28#include <TCanvas.h>
29#include <TDirectory.h>
30#include <TFile.h>
31#include <TGeometry.h>
32#include <TMinuit.h>
33#include <TNode.h>
34#include <TNtuple.h>
35#include <TObjArray.h>
36#include <TObject.h>
37#include <TObjectTable.h>
38#include <TPad.h>
39#include <TParticle.h>
40#include <TROOT.h>
41#include <TRandom.h>
42#include <TRotMatrix.h>
43#include <TTUBE.h>
44#include <TTUBE.h>
45#include <TTree.h>
46#include <TVector.h>
47#include <TVirtualMC.h>
48
49//#include "AliHeader.h"
50#include "AliLoader.h"
51#include "AliRunDigitizer.h"
52#include "AliMC.h"
53#include "AliRun.h"
54#include "AliMUON.h"
55#include "AliMUONChamberTrigger.h"
56#include "AliMUONConstants.h"
57#include "AliMUONHit.h"
58#include "AliMUONRawCluster.h"
59#include "AliMUONTransientDigit.h"
60#include "AliMUONTriggerCircuit.h"
61#include "AliMUONGeometry.h"
62#include "AliMUONGeometryTransformer.h"
63#include "AliMUONGeometryBuilder.h"
64#include "AliMUONCommonGeometryBuilder.h"
65#include "AliMUONVGeometryBuilder.h"
66#include "AliMUONGeometrySegmentation.h"
67#include "AliMUONDigitizerv2.h"
68#include "AliMUONSDigitizerv1.h"
69#include "AliMUONRawWriter.h"
70#include "AliMUONSegmentation.h"
71#include "AliLog.h"
72
73#include "AliMUONSDigitizerV2.h"
74#include "AliMUONDigitizerV3.h"
75
76#include "AliMUONSt1GeometryBuilderV2.h"
77#include "AliMUONSt2GeometryBuilderV2.h"
78#include "AliMUONSlatGeometryBuilder.h"
79#include "AliMUONTriggerGeometryBuilder.h"
80
81// Defaults parameters for Z positions of chambers
82// taken from values for "stations" in AliMUON::AliMUON
83// const Float_t zch[7]={528, 690., 975., 1249., 1449., 1610, 1710.};
84// and from array "dstation" in AliMUONv1::CreateGeometry
85// Float_t dstation[5]={20., 20., 20, 20., 20.};
86// for tracking chambers,
87// according to (Z1 = zch - dstation) and (Z2 = zch + dstation)
88// for the first and second chambers in the station, respectively,
89// and from "DTPLANES" in AliMUONv1::CreateGeometry
90// const Float_t DTPLANES = 15.;
91// for trigger chambers,
92// according to (Z1 = zch) and (Z2 = zch + DTPLANES)
93// for the first and second chambers in the station, respectively
94
95ClassImp(AliMUON)
96
97//__________________________________________________________________
98AliMUON::AliMUON()
99 : AliDetector(),
100 fNCh(0),
101 fNTrackingCh(0),
102 fMUONData(0),
103 fSplitLevel(0),
104 fChambers(0),
105 fTriggerCircuits(0),
106 fGeometryBuilder(0),
107 fSegmentation(0),
108 fAccCut(kFALSE),
109 fAccMin(0.),
110 fAccMax(0.),
111 fMaxStepGas(0.),
112 fMaxStepAlu(0.),
113 fMaxDestepGas(0.),
114 fMaxDestepAlu(0.),
115 fMaxIterPad(0),
116 fCurIterPad(0),
117 fTriggerScalerEvent(kFALSE),
118 fSDigitizerType(""),
119 fDigitizerType(""),
120 fRawWriter(0x0)
121{
122/// Default Constructor
123
124 AliDebug(1,Form("default (empty) ctor this=%p",this));
125 fIshunt = 0;
126}
127
128//__________________________________________________________________
129AliMUON::AliMUON(const char *name, const char *title,
130 const char* sDigitizerClassName,
131 const char* digitizerClassName)
132 : AliDetector(name,title),
133 fNCh(AliMUONConstants::NCh()),
134 fNTrackingCh(AliMUONConstants::NTrackingCh()),
135 fMUONData(0),
136 fSplitLevel(0),
137 fChambers(0),
138 fTriggerCircuits(0),
139 fGeometryBuilder(0),
140 fSegmentation(0),
141 fAccCut(kFALSE),
142 fAccMin(0.),
143 fAccMax(0.),
144 fMaxStepGas(0.1),
145 fMaxStepAlu(0.1),
146 fMaxDestepGas(-1), // Negatives values are ignored by geant3 CONS200
147 fMaxDestepAlu(-1), // in the calculation of the tracking parameters
148 fMaxIterPad(0),
149 fCurIterPad(0),
150 fTriggerScalerEvent(kFALSE),
151 fSDigitizerType(sDigitizerClassName),
152 fDigitizerType(digitizerClassName),
153 fRawWriter(0x0)
154{
155/// Standard constructor
156
157 AliDebug(1,Form("ctor this=%p",this));
158 fIshunt = 0;
159
160 SetMarkerColor(kRed);//
161
162 // Geometry builder
163 fGeometryBuilder = new AliMUONGeometryBuilder(this);
164
165 // Common geometry definitions
166 fGeometryBuilder
167 ->AddBuilder(new AliMUONCommonGeometryBuilder(this));
168
169 // By default, add also all the needed geometry builders.
170 // If you want to change this from outside, please use ResetGeometryBuilder
171 // method, followed by AddGeometryBuilder ones.
172
173 AddGeometryBuilder(new AliMUONSt1GeometryBuilderV2(this));
174 AddGeometryBuilder(new AliMUONSt2GeometryBuilderV2(this));
175 AddGeometryBuilder(new AliMUONSlatGeometryBuilder(this));
176 AddGeometryBuilder(new AliMUONTriggerGeometryBuilder(this));
177
178 //
179 // Creating List of Chambers
180 Int_t ch;
181 fChambers = new TObjArray(AliMUONConstants::NCh());
182
183 // Loop over stations
184 for (Int_t st = 0; st < AliMUONConstants::NCh() / 2; st++) {
185 // Loop over 2 chambers in the station
186 for (Int_t stCH = 0; stCH < 2; stCH++) {
187 //
188 //
189 // Default Parameters for Muon Tracking Stations
190 ch = 2 * st + stCH;
191 if (ch < AliMUONConstants::NTrackingCh()) {
192 fChambers->AddAt(new AliMUONChamber(ch),ch);
193 } else {
194 fChambers->AddAt(new AliMUONChamberTrigger(ch, GetGeometryTransformer()),ch);
195 }
196 } // Chamber stCH (0, 1) in
197 } // Station st (0...)
198
199 // cp new design of AliMUONTriggerDecision
200 fTriggerCircuits = new TObjArray(AliMUONConstants::NTriggerCircuit());
201 for (Int_t circ=0; circ<AliMUONConstants::NTriggerCircuit(); circ++) {
202 fTriggerCircuits->AddAt(new AliMUONTriggerCircuit(),circ);
203 }
204}
205
206//____________________________________________________________________
207AliMUON::AliMUON(const AliMUON& rMUON)
208 : AliDetector(rMUON)
209{
210/// Protected copy constructor
211
212 AliFatal("Not implemented.");
213}
214
215//____________________________________________________________________
216AliMUON::~AliMUON()
217{
218/// Destructor
219
220 AliDebug(1,Form("dtor this=%p",this));
221 fIshunt = 0;
222
223 if (fChambers){
224 fChambers->Delete();
225 delete fChambers;
226 }
227 if (fTriggerCircuits){
228 fTriggerCircuits->Delete();
229 delete fTriggerCircuits;
230 }
231 delete fMUONData;
232 delete fGeometryBuilder;
233 delete fSegmentation;
234 delete fRawWriter;
235}
236
237//________________________________________________________________________
238AliMUON& AliMUON::operator = (const AliMUON& rhs)
239{
240/// Protected assignement operator
241
242 if (this == &rhs) return *this;
243
244 AliFatal("Not implemented.");
245
246 return *this;
247}
248
249//_____________________________________________________________________________
250void AliMUON::AddGeometryBuilder(AliMUONVGeometryBuilder* geomBuilder)
251{
252/// Add the geometry builder to the list
253
254 fGeometryBuilder->AddBuilder(geomBuilder);
255}
256
257//____________________________________________________________________
258void AliMUON::BuildGeometry()
259{
260/// Geometry for event display
261
262
263// for (Int_t i = 0; i < AliMUONConstants::NCh(); i++)
264// this->Chamber(i).SegmentationModel2(1)->Draw("eventdisplay");// to be check !
265
266
267}
268
269//____________________________________________________________________
270const AliMUONGeometry* AliMUON::GetGeometry() const
271{
272/// Return geometry parametrisation
273
274 if ( !fGeometryBuilder) {
275 AliWarningStream() << "GeometryBuilder not defined." << std::endl;
276 return 0;
277 }
278
279 return fGeometryBuilder->GetGeometry();
280}
281
282//____________________________________________________________________
283const AliMUONGeometryTransformer* AliMUON::GetGeometryTransformer() const
284{
285/// Return geometry parametrisation
286
287 const AliMUONGeometry* kGeometry = GetGeometry();
288
289 if ( !kGeometry) return 0;
290
291 return kGeometry->GetTransformer();
292}
293
294//__________________________________________________________________
295void AliMUON::SetTreeAddress()
296{
297/// Set Hits tree address
298
299 GetMUONData()->SetLoader(fLoader);
300 // GetMUONData()->MakeBranch("D,S,RC");
301 // GetMUONData()->SetTreeAddress("H,D,S,RC");
302 GetMUONData()->SetTreeAddress("H");
303 if (fHits != GetMUONData()->Hits()) {
304 if ( gAlice->GetMCApp() )
305 if ( gAlice->GetMCApp()->GetHitLists() ) {
306 fHits = GetMUONData()->Hits();
307 gAlice->GetMCApp()->AddHitList(fHits); // For purifyKine, only necessary when Hit list is created in AliMUONData
308 }
309 }
310 fHits = GetMUONData()->Hits(); // Added by Ivana to use the methods FisrtHit, NextHit of AliDetector
311}
312
313//_________________________________________________________________
314void AliMUON::SetChargeSlope(Int_t id, Float_t p1)
315{
316/// Set the inverse charge slope for chamber id
317
318 Int_t i=2*(id-1); //PH ((AliMUONChamber*) (*fChambers)[i])->SetSigmaIntegration(p1);
319 //PH ((AliMUONChamber*) (*fChambers)[i+1])->SetSigmaIntegration(p1);
320 ((AliMUONChamber*) fChambers->At(i))->SetChargeSlope(p1);
321 ((AliMUONChamber*) fChambers->At(i+1))->SetChargeSlope(p1);
322}
323//__________________________________________________________________
324void AliMUON::SetChargeSpread(Int_t id, Float_t p1, Float_t p2)
325{
326/// Set sigma of charge spread for chamber id
327
328 Int_t i=2*(id-1);
329 ((AliMUONChamber*) fChambers->At(i))->SetChargeSpread(p1,p2);
330 ((AliMUONChamber*) fChambers->At(i+1))->SetChargeSpread(p1,p2);
331}
332//___________________________________________________________________
333void AliMUON::SetSigmaIntegration(Int_t id, Float_t p1)
334{
335/// Set integration limits for charge spread
336 Int_t i=2*(id-1);
337 ((AliMUONChamber*) fChambers->At(i))->SetSigmaIntegration(p1);
338 ((AliMUONChamber*) fChambers->At(i+1))->SetSigmaIntegration(p1);
339}
340
341//__________________________________________________________________
342void AliMUON::SetMaxAdc(Int_t id, Int_t p1)
343{
344/// Set maximum number for ADCcounts (saturation)
345
346 Int_t i=2*(id-1);
347 ((AliMUONChamber*) fChambers->At(i))->SetMaxAdc(p1);
348 ((AliMUONChamber*) fChambers->At(i+1))->SetMaxAdc(p1);
349}
350
351//__________________________________________________________________
352void AliMUON::SetMaxStepGas(Float_t p1)
353{
354/// Set stepsize in gas
355
356 fMaxStepGas=p1;
357}
358//__________________________________________________________________
359void AliMUON::SetMaxStepAlu(Float_t p1)
360{
361/// Set step size in Alu
362
363 fMaxStepAlu=p1;
364}
365//__________________________________________________________________
366void AliMUON::SetMaxDestepGas(Float_t p1)
367{
368/// Set maximum step size in Gas
369
370 fMaxDestepGas=p1;
371}
372//__________________________________________________________________
373void AliMUON::SetMaxDestepAlu(Float_t p1)
374{
375/// Set maximum step size in Alu
376
377 fMaxDestepAlu=p1;
378}
379
380//____________________________________________________________________
381Float_t AliMUON::GetMaxStepGas() const
382{
383/// Return stepsize in gas
384
385 return fMaxStepGas;
386}
387
388//____________________________________________________________________
389Float_t AliMUON::GetMaxStepAlu() const
390{
391/// Return step size in Alu
392
393 return fMaxStepAlu;
394}
395
396//____________________________________________________________________
397Float_t AliMUON::GetMaxDestepGas() const
398{
399/// Return maximum step size in Gas
400
401 return fMaxDestepGas;
402}
403
404//____________________________________________________________________
405Float_t AliMUON::GetMaxDestepAlu() const
406{
407/// Return maximum step size in Gas
408
409 return fMaxDestepAlu;
410}
411
412//____________________________________________________________________
413 void AliMUON::SetAlign(Bool_t align)
414{
415/// Set option for alignement to geometry builder
416
417 fGeometryBuilder->SetAlign(align);
418}
419
420//____________________________________________________________________
421 void AliMUON::SetAlign(const TString& fileName, Bool_t align)
422{
423/// Set option for alignement to geometry builder
424
425 fGeometryBuilder->SetAlign(fileName, align);
426}
427
428//____________________________________________________________________
429void AliMUON::SetResponseModel(Int_t id, AliMUONResponse *response)
430{
431/// Set the response for chamber id
432 ((AliMUONChamber*) fChambers->At(id))->SetResponseModel(response);
433}
434
435//____________________________________________________________________
436AliDigitizer* AliMUON::CreateDigitizer(AliRunDigitizer* manager) const
437{
438/// FIXME: the selection of the class should be done through a factory
439/// mechanism. (see also Hits2SDigits()).
440
441 AliInfo(Form("Digitizer used : %s",fDigitizerType.Data()));
442
443 if ( fDigitizerType == "digitizer:default" )
444 {
445 return new AliMUONDigitizerv2(manager);
446 }
447 else if ( fDigitizerType == "digitizer:NewDigitizerNewTrigger" )
448 {
449 return new AliMUONDigitizerV3(manager,AliMUONDigitizerV3::kTriggerElectronics);
450 }
451 else if ( fDigitizerType == "digitizer:NewDigitizerOldTrigger" )
452 {
453 return new AliMUONDigitizerV3(manager,AliMUONDigitizerV3::kTriggerDecision, kFALSE, kFALSE);
454 }
455 else if ( fDigitizerType == "digitizer:NewDigitizerEffTrigger" )
456 {
457 return new AliMUONDigitizerV3(manager,AliMUONDigitizerV3::kTriggerDecision, kTRUE, kFALSE);
458 }
459 else if ( fDigitizerType == "digitizer:NewDigitizerWithNoiseOldTrigger" )
460 {
461 return new AliMUONDigitizerV3(manager,AliMUONDigitizerV3::kTriggerDecision, kFALSE, kTRUE);
462 }
463 else
464 {
465 AliFatal(Form("Unknown digitizer type : %s",fDigitizerType.Data()));
466 }
467 return 0x0;
468}
469
470//_____________________________________________________________________
471TString
472AliMUON::SDigitizerType() const
473{
474/// Return digitizer type
475
476 return fSDigitizerType;
477}
478
479//_____________________________________________________________________
480void AliMUON::SDigits2Digits()
481{
482/// Write TreeD here only
483
484 char hname[30];
485 // sprintf(hname,"TreeD%d",fLoader->GetHeader()->GetEvent());
486 fLoader->TreeD()->Write(hname,TObject::kOverwrite);
487 fLoader->TreeD()->Reset();
488}
489
490//_____________________________________________________________________
491void AliMUON::Hits2SDigits()
492{
493/// FIXME: the selection of the sdigitizer should be done through a
494/// factory mechanism.
495
496 AliInfo(Form("SDigitizer used : %s",fSDigitizerType.Data()));
497
498 if ( fSDigitizerType == "sdigitizer:default" )
499 {
500 // Adaption of AliMUONSDigitizerv1 to be excuted by the AliSimulation framework
501 AliRunLoader* runLoader = fLoader->GetRunLoader();
502 AliRunDigitizer * manager = new AliRunDigitizer(1,1);
503 manager->SetInputStream(0,runLoader->GetFileName(),AliConfig::GetDefaultEventFolderName());
504 AliMUONDigitizer * dMUON = new AliMUONSDigitizerv1(manager);
505 fLoader->LoadHits("READ");
506 for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
507 runLoader->GetEvent(iEvent);
508 dMUON->Exec("");
509 }
510 fLoader->UnloadHits();
511 }
512 else if ( fSDigitizerType == "sdigitizer:AliMUONSDigitizerV2" )
513 {
514 TTask* sdigitizer = new AliMUONSDigitizerV2;
515 sdigitizer->ExecuteTask();
516 }
517 else
518 {
519 AliFatal(Form("Unknown sdigitizer classname : %s",fSDigitizerType.Data()));
520 }
521}
522
523//_____________________________________________________________________
524TString
525AliMUON::DigitizerType() const
526{
527/// Return digitizer type
528
529 return fDigitizerType;
530}
531
532//_____________________________________________________________________
533void AliMUON::Digits2Raw()
534{
535/// Convert digits of the current event to raw data
536
537 if (!fRawWriter)
538 {
539 fRawWriter = new AliMUONRawWriter(fMUONData);
540 if (fTriggerScalerEvent == kTRUE)
541 {
542 fRawWriter->SetScalerEvent();
543 }
544 }
545
546 if (!fRawWriter->Digits2Raw())
547 {
548 AliError("pb writting raw data");
549 }
550}
551
552//_______________________________________________________________________
553AliLoader* AliMUON::MakeLoader(const char* topfoldername)
554{
555/// Build standard getter (AliLoader type);
556/// if detector wants to use castomized getter, it must overload this method
557
558 AliDebug(1,Form("Creating standard getter for detector %s. Top folder is %s.",
559 GetName(),topfoldername));
560 fLoader = new AliLoader(GetName(),topfoldername);
561 fMUONData = new AliMUONData(fLoader,GetName(),GetName());
562 fMUONData->SetSplitLevel(fSplitLevel);
563 return fLoader;
564}
565//_______________________________________________________________________
566
567AliMUONRawCluster *AliMUON::RawCluster(Int_t ichamber, Int_t icathod, Int_t icluster)
568{
569/// Return rawcluster (icluster) for chamber ichamber and cathode icathod
570/// Obsolete ??
571
572 TClonesArray *muonRawCluster = GetMUONData()->RawClusters(ichamber);
573 ResetRawClusters();
574 TTree *treeR = fLoader->TreeR();
575 Int_t nent=(Int_t)treeR->GetEntries();
576 treeR->GetEvent(nent-2+icathod-1);
577 //treeR->GetEvent(icathod);
578 //Int_t nrawcl = (Int_t)muonRawCluster->GetEntriesFast();
579
580 AliMUONRawCluster * mRaw = (AliMUONRawCluster*)muonRawCluster->UncheckedAt(icluster);
581 //printf("RawCluster _ nent nrawcl icluster mRaw %d %d %d%p\n",nent,nrawcl,icluster,mRaw);
582
583 return mRaw;
584}
585
586//________________________________________________________________________
587void
588AliMUON::ResetGeometryBuilder()
589{
590/// Only to be used by "experts" wanting to change the geometry builders
591/// to be used.
592/// As the ctor of AliMUON now defines a default geometrybuilder, this
593/// ResetGeometryBuilder() must be called prior to call the
594/// AddGeometryBuilder()
595
596 delete fGeometryBuilder;
597 fGeometryBuilder = new AliMUONGeometryBuilder(this);
598 fGeometryBuilder
599 ->AddBuilder(new AliMUONCommonGeometryBuilder(this));
600}