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>
48 //#include "AliHeader.h"
49 #include "AliLoader.h"
50 #include "AliRunDigitizer.h"
54 #include "AliMUONChamberTrigger.h"
55 #include "AliMUONConstants.h"
56 #include "AliMUONHit.h"
57 #include "AliMUONRawCluster.h"
58 #include "AliMUONTransientDigit.h"
59 #include "AliMUONTriggerCircuit.h"
60 #include "AliMUONGeometry.h"
61 #include "AliMUONGeometryTransformer.h"
62 #include "AliMUONGeometryBuilder.h"
63 #include "AliMUONCommonGeometryBuilder.h"
64 #include "AliMUONVGeometryBuilder.h"
65 #include "AliMUONGeometrySegmentation.h"
66 #include "AliMUONDigitizerv2.h"
67 #include "AliMUONSDigitizerv1.h"
68 #include "AliMUONRawWriter.h"
69 #include "AliMUONSegmentation.h"
72 #include "AliMUONSDigitizerV2.h"
73 #include "AliMUONDigitizerV3.h"
75 // Defaults parameters for Z positions of chambers
76 // taken from values for "stations" in AliMUON::AliMUON
77 // const Float_t zch[7]={528, 690., 975., 1249., 1449., 1610, 1710.};
78 // and from array "dstation" in AliMUONv1::CreateGeometry
79 // Float_t dstation[5]={20., 20., 20, 20., 20.};
80 // for tracking chambers,
81 // according to (Z1 = zch - dstation) and (Z2 = zch + dstation)
82 // for the first and second chambers in the station, respectively,
83 // and from "DTPLANES" in AliMUONv1::CreateGeometry
84 // const Float_t DTPLANES = 15.;
85 // for trigger chambers,
86 // according to (Z1 = zch) and (Z2 = zch + DTPLANES)
87 // for the first and second chambers in the station, respectively
91 //__________________________________________________________________
111 fTriggerScalerEvent(kFALSE),
115 // Default Constructor
117 AliDebug(1,Form("default (empty) ctor this=%p",this));
121 //__________________________________________________________________
122 AliMUON::AliMUON(const char *name, const char *title,
123 const char* sDigitizerClassName,
124 const char* digitizerClassName)
125 : AliDetector(name,title),
126 fNCh(AliMUONConstants::NCh()),
127 fNTrackingCh(AliMUONConstants::NTrackingCh()),
139 fMaxDestepGas(-1), // Negatives values are ignored by geant3 CONS200
140 fMaxDestepAlu(-1), // in the calculation of the tracking parameters
143 fTriggerScalerEvent(kFALSE),
144 fSDigitizerType(sDigitizerClassName),
145 fDigitizerType(digitizerClassName)
147 AliDebug(1,Form("ctor this=%p",this));
150 SetMarkerColor(kRed);//
153 fGeometryBuilder = new AliMUONGeometryBuilder(this);
155 // Common geometry definitions
157 ->AddBuilder(new AliMUONCommonGeometryBuilder(this));
160 // Creating List of Chambers
162 fChambers = new TObjArray(AliMUONConstants::NCh());
164 // Loop over stations
165 for (Int_t st = 0; st < AliMUONConstants::NCh() / 2; st++) {
166 // Loop over 2 chambers in the station
167 for (Int_t stCH = 0; stCH < 2; stCH++) {
170 // Default Parameters for Muon Tracking Stations
172 if (ch < AliMUONConstants::NTrackingCh()) {
173 fChambers->AddAt(new AliMUONChamber(ch),ch);
175 fChambers->AddAt(new AliMUONChamberTrigger(ch, GetGeometryTransformer()),ch);
177 } // Chamber stCH (0, 1) in
178 } // Station st (0...)
180 // cp new design of AliMUONTriggerDecision
181 fTriggerCircuits = new TObjArray(AliMUONConstants::NTriggerCircuit());
182 for (Int_t circ=0; circ<AliMUONConstants::NTriggerCircuit(); circ++) {
183 fTriggerCircuits->AddAt(new AliMUONTriggerCircuit(),circ);
187 //____________________________________________________________________
188 AliMUON::AliMUON(const AliMUON& rMUON)
191 // Protected copy constructor
193 AliFatal("Not implemented.");
196 //____________________________________________________________________
200 AliDebug(1,Form("dtor this=%p",this));
207 if (fTriggerCircuits){
208 fTriggerCircuits->Delete();
209 delete fTriggerCircuits;
212 delete fGeometryBuilder;
213 delete fSegmentation;
216 //________________________________________________________________________
217 AliMUON& AliMUON::operator = (const AliMUON& rhs)
219 // Protected assignement operator
221 if (this == &rhs) return *this;
223 AliFatal("Not implemented.");
228 //_____________________________________________________________________________
229 void AliMUON::AddGeometryBuilder(AliMUONVGeometryBuilder* geomBuilder)
231 // Adds the geometry builder to the list
234 fGeometryBuilder->AddBuilder(geomBuilder);
237 //____________________________________________________________________
238 void AliMUON::BuildGeometry()
240 // Geometry for event display
243 // for (Int_t i = 0; i < AliMUONConstants::NCh(); i++)
244 // this->Chamber(i).SegmentationModel2(1)->Draw("eventdisplay");// to be check !
249 //____________________________________________________________________
250 const AliMUONGeometry* AliMUON::GetGeometry() const
252 // Return geometry parametrisation
254 if ( !fGeometryBuilder) {
255 AliWarningStream() << "GeometryBuilder not defined." << std::endl;
259 return fGeometryBuilder->GetGeometry();
262 //____________________________________________________________________
263 const AliMUONGeometryTransformer* AliMUON::GetGeometryTransformer() const
265 // Return geometry parametrisation
267 const AliMUONGeometry* kGeometry = GetGeometry();
269 if ( !kGeometry) return 0;
271 return kGeometry->GetTransformer();
274 //__________________________________________________________________
275 void AliMUON::SetTreeAddress()
277 GetMUONData()->SetLoader(fLoader);
278 // GetMUONData()->MakeBranch("D,S,RC");
279 // GetMUONData()->SetTreeAddress("H,D,S,RC");
280 GetMUONData()->SetTreeAddress("H");
281 if (fHits != GetMUONData()->Hits()) {
282 if ( gAlice->GetMCApp() )
283 if ( gAlice->GetMCApp()->GetHitLists() ) {
284 fHits = GetMUONData()->Hits();
285 gAlice->GetMCApp()->AddHitList(fHits); // For purifyKine, only necessary when Hit list is created in AliMUONData
288 fHits = GetMUONData()->Hits(); // Added by Ivana to use the methods FisrtHit, NextHit of AliDetector
291 //_________________________________________________________________
292 void AliMUON::SetChargeSlope(Int_t id, Float_t p1)
294 // Set the inverse charge slope for chamber id
295 Int_t i=2*(id-1); //PH ((AliMUONChamber*) (*fChambers)[i])->SetSigmaIntegration(p1);
296 //PH ((AliMUONChamber*) (*fChambers)[i+1])->SetSigmaIntegration(p1);
297 ((AliMUONChamber*) fChambers->At(i))->SetChargeSlope(p1);
298 ((AliMUONChamber*) fChambers->At(i+1))->SetChargeSlope(p1);
300 //__________________________________________________________________
301 void AliMUON::SetChargeSpread(Int_t id, Float_t p1, Float_t p2)
303 // Set sigma of charge spread for chamber id
305 ((AliMUONChamber*) fChambers->At(i))->SetChargeSpread(p1,p2);
306 ((AliMUONChamber*) fChambers->At(i+1))->SetChargeSpread(p1,p2);
308 //___________________________________________________________________
309 void AliMUON::SetSigmaIntegration(Int_t id, Float_t p1)
311 // Set integration limits for charge spread
313 ((AliMUONChamber*) fChambers->At(i))->SetSigmaIntegration(p1);
314 ((AliMUONChamber*) fChambers->At(i+1))->SetSigmaIntegration(p1);
317 //__________________________________________________________________
318 void AliMUON::SetMaxAdc(Int_t id, Int_t p1)
320 // Set maximum number for ADCcounts (saturation)
322 ((AliMUONChamber*) fChambers->At(i))->SetMaxAdc(p1);
323 ((AliMUONChamber*) fChambers->At(i+1))->SetMaxAdc(p1);
326 //__________________________________________________________________
327 void AliMUON::SetMaxStepGas(Float_t p1)
329 // Set stepsize in gas
332 //__________________________________________________________________
333 void AliMUON::SetMaxStepAlu(Float_t p1)
335 // Set step size in Alu
338 //__________________________________________________________________
339 void AliMUON::SetMaxDestepGas(Float_t p1)
341 // Set maximum step size in Gas
344 //__________________________________________________________________
345 void AliMUON::SetMaxDestepAlu(Float_t p1)
347 // Set maximum step size in Alu
351 //____________________________________________________________________
352 Float_t AliMUON::GetMaxStepGas() const
354 // Return stepsize in gas
359 //____________________________________________________________________
360 Float_t AliMUON::GetMaxStepAlu() const
362 // Return step size in Alu
367 //____________________________________________________________________
368 Float_t AliMUON::GetMaxDestepGas() const
370 // Return maximum step size in Gas
372 return fMaxDestepGas;
375 //____________________________________________________________________
376 Float_t AliMUON::GetMaxDestepAlu() const
378 // Return maximum step size in Gas
380 return fMaxDestepAlu;
383 //____________________________________________________________________
384 void AliMUON::SetAlign(Bool_t align)
386 // Sets option for alignement to geometry builder
388 fGeometryBuilder->SetAlign(align);
391 //____________________________________________________________________
392 void AliMUON::SetAlign(const TString& fileName, Bool_t align)
394 // Sets option for alignement to geometry builder
396 fGeometryBuilder->SetAlign(fileName, align);
399 //____________________________________________________________________
400 void AliMUON::SetResponseModel(Int_t id, AliMUONResponse *response)
402 // Set the response for chamber id
403 ((AliMUONChamber*) fChambers->At(id))->SetResponseModel(response);
405 //____________________________________________________________________
406 AliDigitizer* AliMUON::CreateDigitizer(AliRunDigitizer* manager) const
408 // FIXME: the selection of the class should be done through a factory
409 // mechanism. (see also Hits2SDigits()).
411 AliInfo(Form("Digitizer used : %s",fDigitizerType.Data()));
413 if ( fDigitizerType == "digitizer:default" )
415 return new AliMUONDigitizerv2(manager);
417 else if ( fDigitizerType == "digitizer:NewDigitizerNewTrigger" )
419 return new AliMUONDigitizerV3(manager,AliMUONDigitizerV3::kTriggerElectronics);
421 else if ( fDigitizerType == "digitizer:NewDigitizerOldTrigger" )
423 return new AliMUONDigitizerV3(manager,AliMUONDigitizerV3::kTriggerDecision);
427 AliFatal(Form("Unknown digitizer type : %s",fDigitizerType.Data()));
432 //_____________________________________________________________________
434 AliMUON::SDigitizerType() const
436 return fSDigitizerType;
439 //_____________________________________________________________________
440 void AliMUON::SDigits2Digits()
446 // sprintf(hname,"TreeD%d",fLoader->GetHeader()->GetEvent());
447 fLoader->TreeD()->Write(hname,TObject::kOverwrite);
448 fLoader->TreeD()->Reset();
451 //_____________________________________________________________________
452 void AliMUON::Hits2SDigits()
454 // FIXME: the selection of the sdigitizer should be done through a
455 // factory mechanism.
457 AliInfo(Form("SDigitizer used : %s",fSDigitizerType.Data()));
459 if ( fSDigitizerType == "sdigitizer:default" )
461 // Adaption of AliMUONSDigitizerv1 to be excuted by the AliSimulation framework
462 AliRunLoader* runLoader = fLoader->GetRunLoader();
463 AliRunDigitizer * manager = new AliRunDigitizer(1,1);
464 manager->SetInputStream(0,runLoader->GetFileName(),AliConfig::GetDefaultEventFolderName());
465 AliMUONDigitizer * dMUON = new AliMUONSDigitizerv1(manager);
466 fLoader->LoadHits("READ");
467 for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
468 runLoader->GetEvent(iEvent);
471 fLoader->UnloadHits();
473 else if ( fSDigitizerType == "sdigitizer:AliMUONSDigitizerV2" )
475 TTask* sdigitizer = new AliMUONSDigitizerV2;
476 sdigitizer->ExecuteTask();
480 AliFatal(Form("Unknown sdigitizer classname : %s",fSDigitizerType.Data()));
484 //_____________________________________________________________________
486 AliMUON::DigitizerType() const
488 return fDigitizerType;
491 //_____________________________________________________________________
492 void AliMUON::Digits2Raw()
494 // convert digits of the current event to raw data
495 AliMUONRawWriter rawData(fLoader,fMUONData);
497 if (fTriggerScalerEvent == kTRUE) rawData.SetScalerEvent();
498 if (!rawData.Digits2Raw()) AliInfo("pb writting raw data");
501 //_______________________________________________________________________
502 AliLoader* AliMUON::MakeLoader(const char* topfoldername)
504 //builds standard getter (AliLoader type)
505 //if detector wants to use castomized getter, it must overload this method
508 AliDebug(1,Form("Creating standard getter for detector %s. Top folder is %s.",
509 GetName(),topfoldername));
510 fLoader = new AliLoader(GetName(),topfoldername);
511 fMUONData = new AliMUONData(fLoader,GetName(),GetName());
512 fMUONData->SetSplitLevel(fSplitLevel);
515 //_______________________________________________________________________
517 AliMUONRawCluster *AliMUON::RawCluster(Int_t ichamber, Int_t icathod, Int_t icluster)
520 // Return rawcluster (icluster) for chamber ichamber and cathode icathod
522 TClonesArray *muonRawCluster = GetMUONData()->RawClusters(ichamber);
524 TTree *treeR = fLoader->TreeR();
525 Int_t nent=(Int_t)treeR->GetEntries();
526 treeR->GetEvent(nent-2+icathod-1);
527 //treeR->GetEvent(icathod);
528 //Int_t nrawcl = (Int_t)muonRawCluster->GetEntriesFast();
530 AliMUONRawCluster * mRaw = (AliMUONRawCluster*)muonRawCluster->UncheckedAt(icluster);
531 //printf("RawCluster _ nent nrawcl icluster mRaw %d %d %d%p\n",nent,nrawcl,icluster,mRaw);
535 //________________________________________________________________________